Compreendendo diretivas de segurança

Qualquer código executado por um servidor de relatório deve fazer parte de uma diretiva de segurança de acesso a códigos específica. Essas diretivas de segurança consistem em grupos de códigos que mapeiam evidência para um conjunto de conjuntos de permissões nomeados. Freqüentemente, os grupos de códigos estão associados a um conjunto de permissões nomeado que especifica permissões permitidas para código nesse grupo. O tempo de execução usa a evidência fornecida por um host confiável ou pelo carregador para determinar a quais grupos de códigos o código pertence e, portanto, quais permissões conceder ao código. O Reporting Services adere a essa arquitetura de diretiva de segurança conforme definido pelo CLR (Common Language Runtime) Microsoft.NET Framework. As seções a seguir descrevem os vários tipos de código em Reporting Services e a as regras de diretiva associadas a eles.

Assemblies do Servidor de Relatório

Os assemblies do Servidor de Relatório são aqueles que contêm código que é parte do produto do Reporting Services. O Reporting Services é gravado usando assemblies de código gerenciado; todos esses assemblies têm nomes fortes (ou seja, são assinados digitalmente). Os grupos de código desses assemblies são definidos usando StrongNameMembershipCondition, que fornece evidência com base nas informações de chave pública do nome forte do assembly. O grupo de códigos recebe o conjunto de permissões FullTrust.

Extensões do servidor de relatório (renderização, dados, entrega e segurança)

As extensões do servidor de relatório são extensões de dados personalizados, entrega, renderização e segurança, criadas por você ou terceiros para ampliar a funcionalidade do Reporting Services. Você deve conceder FullTrust para essas extensões ou código de assembly nos arquivos de configuração de diretiva associados ao componente Reporting Services estendido. As extensões enviadas como parte do Reporting Services são assinadas com a chave pública do servidor de relatório e recebem o conjunto de permissões FullTrust.

Observação importanteImportante

Você deve modificar os arquivos de configuração de diretiva do Reporting Services para permitir FullTrust a qualquer extensão de terceiros. Se você não adicionar um grupo de códigos com FullTrust para suas extensões personalizadas, eles não poderão ser usados pelo servidor de relatório.

Para obter mais informações sobre os arquivos de configuração de diretiva no Reporting Services, consulte Usando arquivos de diretiva de segurança do Reporting Services.

Expressões usadas em relatórios

As expressões de relatório são expressões de código em linha ou métodos definidos pelo usuário dentro do elemento Código de um arquivo de linguagem de definição de relatório. Há um grupo de códigos já configurado nos arquivos de diretiva que concede a essas expressões a permissão Execution definida por padrão. O grupo de códigos se parece com o seguinte:

<CodeGroup
   class="UnionCodeGroup"
   version="1"
   PermissionSetName="Execution"
   Name="Report_Expressions_Default_Permissions"
   Description="This code group grants default permissions for code in report expressions and Code element. ">
    <IMembershipCondition
       class="StrongNameMembershipCondition"
       version="1"
       PublicKeyBlob="002400..."
    />
</CodeGroup>

A permissão Execution permite que o código seja executado, mas não use recursos protegidos. Todas as expressões localizadas em um relatório são compiladas em um assembly (chamado de assembly de “hosts de expressão”) armazenado como parte de um relatório compilado. Quando o relatório é executado, o servidor de relatório carrega o assembly de hosts de expressão e faz chamadas nesse assembly para executar expressões. Os assemblies de hosts de expressão são assinados com uma chave específica usada para definir o grupo de códigos para todos os hosts de expressão.

As expressões de relatório fazem referência a coleções de modelo de objeto de relatório (campos, parâmetros etc.) e executam tarefas simples como operações aritméticas e de cadeia de caracteres. O código que executa essas operações simples só requer a permissão Execution. Por padrão, os métodos definidos pelo usuário no elemento Código e a qualquer assembly personalizado recebem a permissão Execution no Reporting Services. Assim, para a maioria das expressões, a configuração atual não requer a modificação de nenhum arquivo de diretiva de segurança. Para conceder permissões adicionais a assemblies de hosts de expressão, um administrador precisa modificar os arquivos de configuração de diretiva do servidor de relatório e Designer de Relatórios, além de alterar o grupo de códigos de expressões do relatório. Como essa é uma configuração global, alterar permissões padrão para os hosts de expressão afeta todos os relatórios. Por esse motivo, é altamente recomendado que você coloque todo código que solicite segurança adicional em um assembly personalizado. Apenas a esse assembly serão concedidas as permissões necessárias.

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

O código que chama os assemblies externos ou recursos protegidos deve ser incorporado a um assembly personalizado para uso em relatórios. Ao fazer isso, você ganhará mais controle sobre as permissões solicitadas e declaradas por seu código. Você não deve fazer chamadas a métodos seguros no elemento Código. Fazer isso requer conceder FullTrust aos hosts de expressão de relatório e conceder acesso completo ao código personalizado a CLR.

Observação sobre cuidadosCuidado

Não conceda FullTrust ao grupo de códigos para hosts de expressão de relatório. Se fizer isso, você permitirá que todas as expressões de relatório façam chamadas do sistema protegidas.

Assemblies personalizados referenciados em relatórios

Algumas expressões de relatório podem chamar assemblies de código de terceiros, também conhecidos no Reporting Services como assemblies personalizados. O servidor de relatório espera esses assemblies para ter pelo menos a permissão Execution para os arquivos de configuração de diretiva. Por padrão, os arquivos de diretiva enviados com Reporting Services concedem a permissão Execution a todos os assemblies começando da zona ‘Meu Computador’. Você pode conceder permissões adicionais a assemblies personalizados conforme necessário.

Em alguns casos, pode ser necessário executar uma operação que exija permissões de código específicas em uma expressão de relatório. Geralmente isso significa que uma expressão de relatório precisa fazer uma chamada a um método de biblioteca CLR protegido (como um que acessa arquivos ou o Registro do sistema). A documentação do .NET Framework descreve as permissões de código necessárias para tornar essa chamada segura; para executar a chamada, o código de chamada deve receber essas permissões seguras específicas. Se você fizer a chamada por uma expressão de relatório ou do elemento Código, o assembly de hosts de expressão deve receber as permissões apropriadas. Entretanto, após conceder as permissões aos hosts de expressão, todos os códigos executados em qualquer expressão em qualquer relatório receberão essa permissão específica. É muito mais seguro fazer a chamada de um assembly personalizado e conceder a ele as permissões específicas.