Partilhar via


Segurança de acesso a código da integração CLR

O CLR (Common Language Runtime) oferece suporte a um modelo de segurança chamado segurança de acesso do código destinado ao código gerenciado. Nesse modelo, são concedidas permissões a assemblies com base na identidade do código. Para obter mais informações, consulte a seção "Segurança de acesso do código" no Software Development Kit do .NET Framework.

A diretiva de segurança que determina as permissões concedidas a assemblies é definida em três locais diferentes:

  • Diretiva de máquina: trata-se da diretiva em vigor para todo o código gerenciado em execução na máquina na qual o SQL Server está instalado.

  • Diretiva de usuário: trata-se da diretiva em vigor para o código gerenciado hospedado por um processo. No SQL Server, a diretiva de usuário é específica da conta do Windows na qual o serviço do SQL Server está em execução.

  • Diretiva de host: trata-se da diretiva configurada pelo host do CLR (nesse caso, SQL Server) em vigor para o código gerenciado em execução no host.

O mecanismo da segurança de acesso do código para o qual o CLR oferece suporte se baseia na pressuposição de que o tempo de execução pode hospedar tanto o código totalmente confiável quanto o parcialmente confiável. Os recursos protegidos pela segurança de acesso do código do CLR costumam estar em interfaces de programação de aplicativo gerenciadas que exigem a permissão correspondente para permitir o acesso ao recurso. A demandapela permissão só é atendida caso todos os chamadores (no nível de assembly) na pilha de chamadas tenham a permissão do recurso correspondente.

O conjunto de permissões da segurança de acesso do código concedidas ao código gerenciado em execução no SQL Server é a interseção do conjunto de permissões concedidas pelos três níveis de diretiva acima. Mesmo que o SQL Server conceda um conjunto de permissões a um assembly carregado no SQL Server, o conjunto de permissões final dado ao código do usuário pode ser restringido ainda mais com as diretivas de nível do usuário e da máquina.

Conjuntos de permissões do nível de diretiva do host do SQL Server

O conjunto de permissões da segurança de acesso do código concedidas a assemblies pelo nível de diretiva do host do SQL Server é determinado pelo conjunto de permissões especificado durante a criação do assembly. Há três conjuntos de permissões: SAFE, EXTERNAL_ACCESS e UNSAFE (especificado com o uso da opção PERMISSION_SET de CREATE ASSEMBLY (Transact-SQL)).

O SQL Server fornece um nível de diretiva de segurança no nível do host ao CLR ao hospedá-lo; essa diretiva é um nível de diretiva adicional abaixo dos dois níveis de diretiva que estão sempre em vigor. Essa diretiva é definida para todos os domínios de aplicativo criados pelo SQL Server. Essa diretiva não se destina ao domínio de aplicativo padrão que entraria em vigor quando o SQL Server criasse uma instância do CLR.

A diretiva de nível do host do SQL Server é uma combinação entre a diretiva SQL Server fixa para assemblies de sistema e a diretiva especificada pelo usuário para assemblies do usuário.

A diretiva fixa para assemblies do CLR e assemblies de sistema do SQL Server concede a eles confiança total.

A parte especificada pelo usuário da diretiva de host do SQL Server se baseia na especificação de um dos três recipientes de permissão para cada assembly pelo proprietário do assembly. Para obter mais informações sobre as permissões de segurança listadas abaixo, consulte o SDK do .NET Framework.

SAFE

Apenas o cálculo interno e o acesso a dados locais são permitidos. SAFE é o conjunto de permissões mais restritivo. O código executado por um assembly com as permissões SAFE não pode acessar recursos externos do sistema, como arquivos, rede, variáveis de ambiente ou Registro.

Os assemblies SAFE têm as seguintes permissões e valores:

Permissão

Valor(es)/descrição

SecurityPermission

Execution: permissão para executar código gerenciado.

SqlClientPermission

Context connection = true, context connection = yes: apenas a conexão de contexto pode ser usada, e a cadeia de conexão só pode especificar um valor igual a "context connection=true" ou "context connection=yes".

AllowBlankPassword = false: não são permitidas senhas em branco.

EXTERNAL_ACCESS

Assemblies EXTERNAL_ACCESS têm as mesmas permissões dos assemblies SAFE , com a capacidade adicional de acessar recursos de sistema externos como, por exemplo, redes, variáveis de ambiente e o Registro.

Os assemblies EXTERNAL_ACCESS também têm as seguintes permissões e valores:

Permissão

Valor(es)/descrição

DistributedTransactionPermission

Unrestricted: são permitidas transações distribuídas.

DNSPermission

Unrestricted: permissão para solicitar informações de servidores de nomes de domínio.

EnvironmentPermission

Unrestricted: é permitido o acesso completo ao sistema e às variáveis de ambiente do usuário.

EventLogPermission

Administer: As seguintes ações são permitidas: criar uma origem do evento, ler logs existentes, excluir origens do evento ou logs, responder a consultas, limpar um log de eventos, escutar eventos e acessar uma coleção de todos os logs de eventos.

FileIOPermission

Unrestricted: é permitido o acesso completo a arquivos e pastas.

KeyContainerPermission

Unrestricted: é permitido o acesso completo a contêineres de chave.

NetworkInformationPermission

Access: é permitida a execução de ping.

RegistryPermission

Ela permite a leitura de direitos para HKEY_CLASSES_ROOT, HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER, HKEY_CURRENT_CONFIG e HKEY_USERS.

SecurityPermission

Assertion: possibilidade de declarar que todos os chamadores do código tenham a permissão necessária à operação.

ControlPrincipal: possibilidade de manipular o objeto principal.

Execution: permissão para executar código gerenciado.

SerializationFormatter: possibilidade de fornecer serviços de serialização.

SmtpPermission

Access: são permitidas conexões de saída com a porta de host SMTP 25.

SocketPermission

Connect: são permitidas conexões de saída (todas as portas, todos os protocolos) em um endereço de transporte.

SqlClientPermission

Unrestricted: é permitido o acesso completo à fonte de dados.

StorePermission

Unrestricted: é permitido o acesso completo a repositórios de certificados X.509.

WebPermission

Connect: são permitidas conexões de saída com recursos da Web.

UNSAFE

UNSAFE permite que os assemblies tenham acesso irrestrito aos recursos, dentro e fora do SQL Server. O código em execução em um assembly UNSAFE também pode chamar código não gerenciado.

Os assemblies UNSAFE recebem FullTrust.

Observação sobre segurançaObservação sobre segurança

SAFE é a configuração de permissão recomendada para assemblies que realizam tarefas de computação e gerenciamento de dados sem acessar recursos fora do SQL Server. EXTERNAL_ACCESS é recomendada para assemblies que acessam recursos fora do SQL Server. Por padrão, os assemblies EXTERNAL_ACCESS são executados como a conta de serviço do SQL Server. É possível que o código EXTERNAL_ACCESS represente explicitamente o contexto de segurança da Autenticação do Windows do chamador. Como o padrão é executar como a conta do serviço do SQL Server, a permissão para executar EXTERNAL_ACCESS só deve ser dada a logons confiáveis para serem executados como a conta do serviço. De uma perspectiva da segurança, os assemblies EXTERNAL_ACCESS e UNSAFE são idênticos. No entanto, os assemblies EXTERNAL_ACCESS fornecem várias proteções de confiabilidade e eficiência que não se encontram nos assemblies UNSAFE. Especificar UNSAFE permite que o código do assembly execute operações ilegais no espaço do processo do SQL Server, o que pode comprometer a eficiência e a escalabilidade do SQL Server. Para obter mais informações sobre como criar assemblies do CLR no SQL Server, consulte Gerenciando assemblies de integração CLR.

Acessando recursos externos

Caso uma UDT (tipo definido pelo usuário), um procedimento armazenado ou outro tipo de construção seja registrado com o conjunto de permissões SAFE, o código gerenciado em execução na construção não pode acessar recursos externos. No entanto, caso os conjuntos de permissões EXTERNAL_ACCESS ou UNSAFE sejam especificados e o código gerenciado tente acessar recursos externos, o SQL Server aplica as seguintes regras:

Caso

Logo

O contexto de execução corresponda a um logon do SQL Server.

As tentativas de acessar recursos externos são negadas, e ocorre uma exceção de segurança.

O contexto de execução corresponda a um logon do Windows e seja o chamador original.

O recurso externo é acesso no contexto de segurança da conta do serviço do SQL Server.

O chamador não seja o original.

O acesso é negado, e ocorre uma exceção de segurança.

O contexto de execução corresponda a um logon do Windows e seja o chamador original, e o chamador tenha sido representado.

O acesso usa o contexto de segurança do chamador, ao invés da conta de serviço.

Resumo do conjunto de permissões

O seguinte gráfico resume as restrições e as permissões concedidas aos conjuntos de permissões SAFE, EXTERNAL_ACCESS e UNSAFE.

SAFE

EXTERNAL_ACCESS

UNSAFE

Code Access Security Permissions

Somente execução

Execução + acesso a recursos externos

Irrestrito (inclusive P/Invoke)

Programming model restrictions

Sim

Sim

Sem restrições

Verifiability requirement

Sim

Sim

Não

Local data access

Sim

Sim

Sim

Ability to call native code

Não

Não

Sim