O
TRUSTWORTHY
propriedade de um banco de dados (quando definido como ON
) declara essencialmente ao SQL Server que o código contido nesse banco de dados e executado em um contexto representado deve ter permissão para alcançar fora desse banco de dados, mantendo esse contexto de segurança representado. Também permite todos Assemblies SQLCLR nesse banco de dados a serem definidos como EXTERNAL_ACCESS
e UNSAFE
, se esse código alcança ou não fora do servidor (fora do significado:acesso à rede, acesso ao sistema de arquivos, acesso ao registro, acesso ao ambiente, etc). É um meio bastante genérico de permitir isso, pois abrange todo o código dentro do banco de dados. O uso de certificados e/ou chaves assimétricas para assinar módulos - procs e/ou assemblies - permite um controle mais granular sobre qual código tem quais permissões.
Configurando um banco de dados para
TRUSTWORTHY
também permite que qualquer processo iniciado neste Banco de Dados alcance o nível do Servidor e/ou através de outros Bancos de Dados. Normalmente, um processo é confinado / colocado em quarentena no Banco de Dados onde foi iniciado. Se o banco de dados for de propriedade do login "sa", então qualquer processo iniciado nesse banco de dados e executado como "dbo" terá efetivamente privilégios "sa" (caramba!). Em vez de tentar descrever aqui, na quantidade de detalhes necessária para comunicar completamente os detalhes sobre a representação, estendendo a representação, módulos de assinatura, etc., recomendo ler os seguintes recursos sobre este tópico:
- POR FAVOR, por favor , pare de usar falsificação de identidade, TRUSTWORTHY e encadeamento de propriedade entre bancos de dados
- Diretrizes para usar a configuração de banco de dados TRUSTWORTHY no SQL Server
- Estendendo a representação do banco de dados usando EXECUTE AS
Este é um documento muito informativo que cobre a maioria dos aspectos deste tópico e também é referenciado na página vinculada acima. - Escada para SQLCLR Nível 4:Segurança (Assemblies EXTERNOS e NÃO SEGUROS)
Este é um artigo que escrevi como parte de uma série sobre SQLCLR que tem exemplos que ilustram as diferenças entre o método TRUSTWORTHY e o método Login baseado em assembly assinado; O registro gratuito é necessário.
Você deve evitar configurar seu banco de dados para
TRUSTWORTHY
tanto quanto possível. Se você realmente deve ter chamadas multithreading/assíncronas E se você tiver o código-fonte e estiver compilando o assembly, não consigo pensar em um motivo para usar o SET TRUSTWORTHY ON
opção. Em vez disso, você deve assinar o assembly com uma senha e use os seguintes comandos para configurar o método preferido de permitir EXTERNAL_ACCESS
e UNSAFE
montagens:USE [master];
CREATE ASYMMETRIC KEY [ClrPermissionsKey]
AUTHORIZATION [dbo]
FROM EXECUTABLE FILE = 'C:\path\to\my\assembly.dll';
CREATE LOGIN [ClrPermissionsLogin]
FROM ASYMMETRIC KEY [ClrPermissionsKey];
GRANT UNSAFE ASSEMBLY TO [ClrPermissionsLogin];
Uma vez que está no lugar, você pode ir para o banco de dados onde seu assembly foi carregado e executar:
ALTER ASSEMBLY [MyAssembly] WITH PERMISSION_SET = UNSAFE;
Ou você poderia ter incluído
WITH PERMISSION_SET = UNSAFE
no final do CREATE ASSEMBLY
comando.