Compreender as políticas 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ódigo específica. Essas políticas de segurança consistem em grupos de códigos que mapeiam evidência para um conjunto de conjuntos de permissões nomeados. Frequentemente, 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 runtime 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 segue esta arquitetura de política de segurança, conforme definido pelo CLR (Common Language Runtime) do Microsoft .NET Framework. As seções a seguir descrevem os vários tipos de código no Reporting Services e a as regras de política associadas a eles.
Assemblies do servidor de relatório
Os assemblies do servidor de relatório contêm código que faz parte do produto Reporting Services. O Reporting Services é escrito com o uso de assemblies de código gerenciado. Todos esses assemblies têm nome forte (isto é, são assinados digitalmente). Os grupos de códigos desses assemblies são definidos com a 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 a essas extensões ou código de assembly nos arquivos de configuração de política associados ao componente Reporting Services que você está estendendo. As extensões fornecidas 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.
Importante
Você deve modificar os arquivos de configuração de política do Reporting Services para permitir FullTrust a qualquer extensão de terceiros. Se você não adicionar um grupo de códigos com FullTrust às extensões personalizadas, elas não poderão ser usadas pelo servidor de relatório.
Para obter mais informações sobre os arquivos de configuração de diretiva no Reporting Services, consulte Usar 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 embutidas ou métodos definidos pelo usuário dentro do elemento Code de um arquivo de linguagem de definição de relatório. Há um grupo de códigos que já está configurado nos arquivos de diretiva que concede a essas expressões a permissão Execução definida por padrão. O grupo de códigos se parece com o exemplo a seguir:
<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 Execução 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ó exige a permissão Execução. Por padrão, os métodos definidos pelo usuário no elemento Code e qualquer assembly personalizado recebem a permissão Execução no Reporting Services. Assim, para a maioria das expressões, a configuração atual não exige que você modifique nenhum arquivo de diretiva de segurança. Para conceder permissões extras a assemblies de host de expressão, um administrador precisa modificar os arquivos de configuração de diretiva do servidor de relatório e do Designer de Relatórios e alterar o grupo de códigos de expressões de relatório. Como é uma configuração global, a alteração das permissões padrão para os hosts de expressão afeta todos os relatórios. Por esse motivo, você deve colocar todo o código que requer segurança extra em um assembly personalizado. Somente esse assembly recebe as permissões necessárias.
Importante
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 Code. Fazer isso exige a concessão de FullTrust aos hosts de expressão de relatório e a concessão do acesso completo a todo o código personalizado ao CLR.
Cuidado
Não conceda FullTrust ao grupo de códigos para um host 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 outros assemblies de código, também conhecidos no Reporting Services como assemblies personalizados. O servidor de relatório espera que esses assemblies tenham, pelo menos, a permissão Execução nos arquivos de configuração de política. Por padrão, os arquivos de política fornecidos com o Reporting Services concedem a permissão Execução a todos os assemblies iniciados na zona “Meu Computador”. Você pode conceder permissões extras para assemblies personalizados, conforme necessário.
Em alguns casos, talvez seja necessário executar uma operação que exija permissões de código específicas em uma expressão de relatório. Normalmente, esse cenário significa que uma expressão de relatório precisa fazer uma chamada para 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 fazer essa chamada segura. Para executar a chamada, o código de chamada deve receber essas permissões específicas e seguras. Se você fizer a chamada em uma expressão de relatório ou no elemento Code, o assembly de host de expressão deverá 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 esse assembly personalizado as permissões específicas.