A segurança de acesso ao código é um modelo de restrição de recursos que permite aos administradores determinar se e como um certo código é capaz de acessar recursos especificados e realizar outras operações privilegiadas. Este módulo concentra–se na configuração da diretiva de segurança de acesso ao código do ASP.NET e mostra como superar alguns dos principais obstáculos que podem ser encontrados no desenvolvimento de aplicativos da Web parcialmente confiáveis.
Os elementos práticos da segurança de acesso ao código serão explicados detalhadamente, e você aprenderá como desenvolver aplicativos da Web de média confiabilidade que se beneficiam da proteção de segurança proporcionada pela segurança de acesso ao código, mas que ainda são capazes de usar componentes que exigem confiabilidade total.
O módulo também apresenta informações sobre como criar diretivas confiáveis do ASP.NET e contém duas listas valiosíssimas:
| • | Os conjuntos do sistema que têm o APTCA (AllowPartiallyTrustedCallersAttribute) aplicado. |
| • | As permissões de diretiva e níveis de confiança padrão do ASP.NET. Este padrão especifica quais as principais restrições impostas por cada nível de confiança ASP.NET. |
Use este módulo para:
| • | Aprender como funcionam os arquivos de diretivas do ASP.NET e como criar uma diretiva personalizada. |
| • | Desenvolver aplicativos da Web parcialmente confiáveis. |
| • | Utilizar o OLE DB, o log de eventos, os Web Services e o Registro a partir de aplicativos da Web parcialmente confiáveis. |
| • | Colocar códigos privilegiados no modo seguro. |
| • | Saber quando usar o modo seguro e quando personalizar as diretivas de confiança do ASP.NET que já existem. |
Este módulo aplica–se aos produtos e tecnologias a seguir:
| • | Microsoft® Windows® 2000 Server e Microsoft Windows Server™ 2003 |
| • | Microsoft .NET Framework 1.1 e ASP.NET 1.1 |
Este módulo não trata dos fundamentos da segurança de acesso ao código. Pressupõe–se um certo conhecimento prévio, embora os conceitos principais sejam reiterados quando for necessário. Para obter mais informações sobre a segurança de acesso ao código do .NET Framework, consulte, "Segurança do Acesso ao Código na Prática".
Use este módulo para aprender como usar a segurança de acesso ao código para bloquear os seus aplicativos da Web e tornar o seu servidor mais resistente a ataques potenciais.
Se você gerencia ambientes de hospedagem compartilhados ou trabalha em um ISP (Provedor de Serviços de Internet) que executa vários aplicativos de diferentes empresas no mesmo servidor da Web, pode usar a segurança de acesso ao código para:
| • | Isolar os aplicativos entre si. |
| • | Isolar aplicativos de recursos do sistema. |
Observe também que o Windows Server 2003 e o IIS 6.0 (Internet Information Services) proporcionam ainda mais isolamento de processos para aplicativos da Web. O isolamento de processos aliado à segurança de acesso ao código é o modelo recomendado para o isolamento de aplicativos.
Para obter mais informações, consulte, "Hospedando Vários Aplicativos da Web".
A segurança tradicional baseada em objetos de segurança, como a que é oferecida pelo sistema operacional, autoriza o acesso aos recursos com base na identidade do usuário.
Com o Microsoft .NET Framework versão 1.1, os administradores podem configurar diretivas para aplicativos da Web e Web Services ASP.NET, que podem consistir em vários conjuntos. Elas também podem conceder permissões de segurança de acesso ao código para permitir que o aplicativo tenha acesso a tipos específicos de recursos e possa realizar operações privilegiadas específicas.
Por exemplo:
| • | Um administrador pode decidir que o código baixado da Internet não deve ter permissão de acessar nenhum recurso, enquanto códigos de aplicativos da Web desenvolvidos por uma determinada empresa devem receber um nível mais alto de confiança e, por exemplo, poder acessar o sistema de arquivos, o log de eventos, e os bancos de dados Microsoft SQL Server. |
| • | Programas iniciados por um administrador local não têm limitações na máquina local. Infelizmente, se a identidade do administrador for falsificada e um usuário conseguir executar códigos utilizando o contexto de segurança do administrador, o usuário mal–intencionado também não terá nenhuma restrição. |
Essas áreas estão onde a segurança de acesso ao código é importante, pois ela pode estabelecer outras restrições além da segurança com base no próprio código, e não no usuário que está executando o código.
Obervação Os aplicativos da Web e os Web Services criados com o .NET Framework versão 1.0 sempre funcionam com permissões totais de acesso ao código. Isso não pode ser configurado.
Todo o acesso aos recursos a partir dos aplicativos ASP.NET e de códigos gerenciados em geral está sujeito às duas camadas de segurança seguintes:
| • | Segurança de acesso ao código. Essa camada de segurança verifica se todo o código na pilha de chamadas atual até o código de acesso aos recursos, inclusive, está autorizado a acessar o recurso. O administrador usa a diretiva de segurança de acesso ao código para conceder permissões a conjuntos. As permissões determinam exatamente quais tipos de recursos o conjunto poderá acessar. Vários tipos de permissões correspondem aos diferentes tipos de recursos que podem ser acessados. Esses tipos são o sistema de arquivos, o Registro, o log de eventos, os serviços de diretório, o Microsoft SQL Server™, fontes de dados OLE DB e recursos de rede. |
| • | Segurança do sistema operacional/plataforma. Esta camada de segurança verifica se o contexto de segurança do segmento solicitante pode ter acesso ao recurso. Se o segmento estiver representando, será usado o símbolo de representação do segmento. Caso contrário, o identificador do processo será usado e comparado com a ACL (Lista de Controle de Acesso) anexa ao recurso para determinar se a operação solicitada pode ou não ser realizada e se o recurso pode ou não ser acessado. |
Ambas as verificações devem ser bem–sucedidas para que o recurso seja acessado com êxito. Todos os tipos de recurso expostos pelas classes do .NET Framework são protegidos por permissões de acesso ao código. A Figura 9.1 mostra uma série de tipos comuns de recursos que são acessados por aplicativos da Web, além da permissão de acesso ao código associada necessária para a tentativa de acesso ser bem–sucedida.

Figura 9.1
Tipos comuns de recurso acessados por aplicativos da Web ASP.NET e tipos associados de permissões
Por padrão, os aplicativos da Web funcionam com confiança total. Os aplicativos de confiança total recebem permissões irrestritas de acesso ao código da diretiva de segurança de acesso ao código. Essas permissões são as permissões internas de sistema e as permissões personalizadas. Isso significa que a segurança de acesso ao código não impedirá que o seu aplicativo acesse qualquer um dos tipos protegidos de recursos mostrados na Figura 9.1. O sucesso ou o fracasso da tentativa de acesso ao recurso é determinado simplesmente pela segurança no nível de sistema operacional. Os aplicativos da Web que funcionam com confiança total são todos os aplicativos ASP.NET criados por meio do .NET Framework versão 1.0. Por padrão, os aplicativos criados com o .NET Framework versão 1.1 funcionam com confiança total, mas o nível de confiança pode ser configurado com o elemento <trust>, descrito mais adiante neste módulo.
Se um aplicativo for configurado com um nível de confiança que não seja "Total", ele será denominado aplicativo parcialmente confiável. Os aplicativos parcialmente confiáveis têm permissões restritas, o que limita a sua capacidade de acessar recursos protegidos.
Importante: aplicativos da Web criados com o .NET Framework versão 1.0 sempre funcionam com confiança total, pois os tipos do System.Web exigem chamadores com confiança total.
Por padrão, os aplicativos da Web que funcionam com confiança total não têm qualquer restrição de permissões. Para modificar os níveis de confiança da segurança de acesso ao código no ASP.NET, você precisa estabelecer um parâmetro no Machine.config ou no Web.config e configurar o aplicativo como um aplicativo parcialmente confiável.
O elemento <trust> em Machine.config controla se a segurança de acesso ao código será ativada ou não para um aplicativo da Web. Abra Machine.config, procure "<trust>", e você verá o seguinte.
<system.web>
<!-- level="[Full|High|Medium|Low|Minimal]" -->
<trust level="Full" originUrl=""/>
</system.web>
Com o nível de confiança definido como "Full", a segurança de acesso ao código é efetivamente desativada porque nenhuma exigência de permissões fica no caminho das tentativas de acesso aos recursos. Esta é a única opção para os aplicativos da Web ASP.NET criados com o .NET Framework versão 1.0. Descendo na lista de "Full" até "Minimal", cada nível retira mais permissões, restringindo ainda mais a capacidade do seu aplicativo de acessar recursos protegidos e realizar operações privilegiadas. Conforme o nível, maior será o isolamento do aplicativo. A Tabela 9.1 mostra os níveis de confiança predefinidos e indica as principais restrições em relação ao nível anterior.
Tabela 9.1 Restrições impostas pelos níveis de confiança do ASP.NET
| Nível de confiança do ASP.NET | Principais restrições |
Full | Permissões irrestritas. Os aplicativos podem acessar qualquer recurso que esteja sujeito à segurança do sistema operacional. Todas as operações privilegiadas são permitidas. |
Elevado | Não chama código não gerenciado. |
Média | Além do que já foi citado, o acesso aos arquivos é restrito à diretiva do aplicativo atual e o acesso ao registro não é permitido. |
Acessível | Além do que já foi citado, o aplicativo não é capaz de conectar–se ao SQL Server e o código não pode chamar o CodeAccessPermission.Assert (nenhuma permissão de segurança de declaração). |
Mínimo | Apenas a permissão de execução está disponível. |
Se o administrador do servidor de Web quiser usar a segurança de acesso ao código para garantir o isolamento do aplicativo e restringir o acesso aos recursos do sistema, ele pode definir a diretiva de segurança da máquina e impedir que aplicativos individuais a substituam.
Provedores de serviços de aplicativo ou qualquer outro responsável pela execução de vários aplicativos da Web no mesmo servidor devem bloquear o nível de confiança de todos os aplicativos da Web. Para isso, delimite o elemento <trust> em Machine.config com uma marca <location> e defina o atributo allowOverride como false, como mostra o exemplo a seguir.
<location allowOverride="false">
<system.web>
<!-- level="[Full|High|Medium|Low|Minimal]" -->
<trust level="Medium" originUrl=""/>
</system.web>
</location>
Você também pode usar um atributo path no elemento <location> para aplicar uma configuração a um site ou aplicativo da Web específico que não possa ser substituído. Para obter mais informações sobre o elemento <location>, consulte, "Protegendo seus Aplicativos ASP.NET e Web Services".
Cada nível de confiança é ligado a um arquivo de diretiva XML individual, o qual lista o conjunto de permissões concedidos por cada nível de confiança. Os arquivos de diretivas encontram–se no seguinte diretório:
%windir%\Microsoft.NET\Framework\{versão}\CONFIG
Os níveis de confiança são direcionados aos arquivos de diretivas pelos elementos <trustLevel> em Machine.config, que se encontram logo acima do elemento <trust>, como mostra o exemplo a seguir.
<location allowOverride="true">
<system.web>
<securityPolicy>
<trustLevel name="Full" policyFile="internal"/>
<trustLevel name="High" policyFile="web_hightrust.config"/>
<trustLevel name="Medium" policyFile="web_mediumtrust.config"/>
<trustLevel name="Low" policyFile="web_lowtrust.config"/>
<trustLevel name="Minimal" policyFile="web_minimaltrust.config"/>
</securityPolicy>
<!-- level="[Full|High|Medium|Low|Minimal]" -->
<trust level="Full" originUrl=""/>
</system.web>
</location>
Observação: não há nenhum arquivo de diretivas para o nível de confiança total. Esse é um caso especial que simplesmente indica o conjunto irrestrito de todas as permissões.
A diretiva do ASP.NET é totalmente configurável. Além dos níveis padrão de diretivas, os administradores podem criar arquivos personalizados de permissões e configurá–los por meio do elemento <trust>, que será descrito mais adiante neste módulo. O arquivo de diretivas associado ao nível personalizado também precisa ser definido por um elemento <trustLevel> no Machine.config.
A diretiva de segurança de acesso ao código é hierárquica, sendo administrada em vários níveis. A diretiva pode ser criada para os níveis de domínio de empresa, máquina, usuário e aplicativo. A diretiva de segurança de acesso ao código do ASP.NET é um exemplo da diretiva de domínio de aplicativo.
Os parâmetros de um arquivo de configuração XML separado definem a diretiva para cada nível. As diretivas de empresa, máquina e usuário podem ser configuradas por meio da ferramenta de configuração do Microsoft .NET Framework, mas os arquivos de diretivas do ASP.NET devem ser editados manualmente por meio de um editor XML ou de texto.
Cada arquivo de diretiva de nível de confiança do ASP.NET diz quais permissões podem ser concedidas aos aplicativos configurados em um determinado nível de confiança. As permissões reais concedidas a um aplicativo ASP.NET são determinadas pela intersecção das permissões concedidas em todos os níveis de diretivas, inclusive empresa, máquina, usuário e na diretiva do (domínio do aplicativo) ASP.NET.
Como a diretiva é avaliada desde o nível superior (empresa) até o nível inferior (aplicativo ASP.NET), não é possível conceder permissões, apenas negá–las. Você não pode incluir uma permissão no ASP.NET sem que antes um nível superior conceda a permissão. Essa abordagem garante que o administrador corporativo sempre tenha a palavra final e que códigos mal–intencionados executados em um domínio de aplicativo não consigam solicitar e receber mais permissões que os configurados pelo administrador.
Para obter mais informações sobre a avaliação de diretivas, consulte o, "Segurança do Acesso ao Código na Prática."
Para ver quais permissões são definidas por um determinado nível de confiança, abra o arquivo de diretivas em questão no Bloco de Notas ou (de preferência) em um editor de XML e localize o "ASP.NET" denominado conjunto de permissões. Esse conjunto de permissões lista as permissões configuradas para o aplicativo no nível de confiança atual.
Observação: você também verá os conjuntos de permissão "FullTrust" e "Nothing". Esses conjuntos não contêm nenhum elemento de permissão porque "FullTrust" implica todas as permissões e "Nothing" não contém nenhuma permissão.
O fragmento a seguir mostra os principais elementos de um arquivo de diretivas ASP.NET:
<configuration>
<mscorlib>
<security>
<policy>
<PolicyLevel version="1">
<SecurityClasses>
... list of security classes, permission types,
and code group types ...
</SecurityClasses>
<NamedPermissionSets>
<PermissionSet Name="FullTrust" ... />
<PermissionSet Name="Nothing" .../>
<PermissionSet Name="ASP.NET" ...
... This is the interesting part ...
... List of individual permissions...
<IPermission
class="AspNetHostingPermission"
version="1"
Level="High" />
<IPermission
class="DnsPermission"
version="1"
Unrestricted="true" />
...Continued list of permissions...
</PermissionSet>
</PolicyLevel version="1">
</policy>
</security>
</mscorlib>
</configuration>
Observe que cada permissão é definida por um elemento <IPermission>, que define o nome do tipo de permissão, a versão e se ela está ou não no estado irrestrito.
Muitas permissões possuem um estado, usado para o ajuste fino dos direitos de acesso especificados pela permissão. O estado determina exatamente o que a permissão permite que o seu aplicativo faça. Por exemplo, FileIOPermission pode especificar um diretório e um tipo de acesso (leitura, gravação, e assim por diante). A permissão a seguir exige que o código de chamada receba a permissão de leitura para acessar o diretório C:\SomeDir:
(new FileIOPermission(FileIOPermissionAccess.Read, @"C:\SomeDir")).Demand();
No seu estado irrestrito, FileIOPermission permite qualquer tipo de acesso a qualquer área do sistema de arquivos (naturalmente, a segurança do sistema operacional ainda é válida). A permissão a seguir exige que o código de chamada receba a FileIOPermission irrestrita:
(new FileIOPermission(PermissionState.Unrestricted)).Demand();
Os arquivos de diretivas ASP.NET contêm um conjunto de permissões nomeado "ASP.NET". Esse conjunto define o conjunto de permissões concedido pela diretiva do domínio do aplicativo aos aplicativos associados.
A diretiva ASP.NET também introduz uma AspNetHostingPermission personalizada, que possui um atributo Level associado correspondente a um dos níveis padrão. Todos os tipos públicos em System.Web e em System.Web.Mobile são protegidos por exigências do nível Mínimo desta permissão. Essa estratégia de redução de riscos foi criada para garantir que o código do aplicativo da Web não possa ser usado em outros ambientes parcialmente confiáveis sem uma configuração específica de diretiva feita pelo administrador.
Se você editar um dos arquivos de diretivas ASP.NET, perceberá que alguns dos elementos de permissão contêm parâmetros de substituição ($AppDirUrl$, $CodeGen$ e $Gac$). Esses parâmetros permitem que você configure as permissões a conjuntos que fazem parte do seu aplicativo da Web, mas que são carregados de lugares diferentes. Cada parâmetro de substituição é substituído por um valor real no momento da avaliação da diretiva de segurança. Isso ocorre quando o seu conjunto de aplicativos da Web é carregado pela primeira vez. O seu aplicativo da Web pode consistir nos três tipos de conjunto a seguir:
| • | Conjuntos particulares, compilados no tempo da criação e instalados no diretório bin do aplicativo Importante: esse tipo de conjunto não pode ter um nome de alta segurança. Conjuntos com nomes de alta segurança usados por aplicativos da Web ASP.NET devem ser instalados no cache de conjunto global. Essa restrição se faz necessária devido ao funcionamento interno do processo do operador do domínio de vários aplicativos. |
| • | Conjuntos compilados dinamicamente que são gerados em resposta a uma solicitação de página |
| • | Conjuntos compartilhados que são carregados do cache de conjunto global do computador |
Cada um desses tipos de conjuntos possui um parâmetro de substituição associado, conforme resume a Tabela 9.2.
Tabela 9.2 Parâmetros de substituição da diretiva de segurança de acesso ao código ASP.NET
| Parâmetro | Representa |
$AppDirUrl$ | O diretório raiz virtual do aplicativo. Isso permite a aplicação das permissões ao código localizado no diretório bin do aplicativo. Por exemplo, se um diretório virtual for ligado a C:\YourWebApp, $AppDirUrl$ será igual a C:\YourWebApp. |
$CodeGen$ | O diretório que contém conjuntos gerados dinamicamente (por exemplo, o resultado de compilações de páginas .aspx). Isto pode ser configurado individualmente por aplicativo, e assume o valor padrão |
$Gac$ | Qualquer conjunto que seja instalado no GAC (Cache de Conjunto Global) do computador (%windir%\assembly). Isso permite a concessão de permissões a conjuntos com nomes de alta segurança carregados do GAC pelo aplicativo da Web. |
Os aplicativos da Web parcialmente confiáveis são aplicativos que não têm confiança total e contam com um conjunto restrito de permissões de acesso ao código, determinado pela diretiva de segurança de acesso ao código. O resultado disso é que os aplicativos parcialmente confiáveis são limitados na sua capacidade de acessar recursos protegidos e executar outras operações privilegiadas. Certas permissões são negadas aos aplicativos parcialmente confiáveis, portanto os recursos que exigem essas permissões não poderão ser acessados diretamente. Outras permissões são concedidas com restrições, de forma que os recursos que exigem essas permissões podem estar acessíveis, mas com limitações. Por exemplo, uma FileIOPermission restrita pode especificar que o aplicativo pode ter acesso ao sistema de arquivos, mas somente aos diretórios abaixo da raiz do diretório virtual do aplicativo.
Configurando um aplicativo ou um Web Service como parcialmente confiável, você pode restringir capacidade do aplicativo de acessar recursos essenciais do sistema ou recursos pertencentes a outros aplicativos da Web. Concedendo apenas as permissões de que o aplicativo precisa e nada mais, você pode criar aplicativos da Web menos privilegiados e limitar o potencial de danos caso o aplicativo da Web seja comprometido por um ataque de injeção de código.
Se você tomar um aplicativo da Web existente e reconfigurá–lo para funcionar com um nível de confiança parcial, poderá encontrar os seguintes problemas a menos que o aplicativo seja extremamente limitado nos recursos a que pode ter acesso:
| • | O seu aplicativo não é capaz de chamar conjuntos com nomes de alta segurança que não são comentados com AllowPartiallyTrustedCallersAttribute (APTCA) . Sem o APTCA, os conjuntos com nomes de alta segurança emitem uma solicitação de confiança total, que falhará quando a solicitação chegar ao seu aplicativo da Web parcialmente confiável. Muitos conjuntos do sistema permitem apenas chamadores de confiança total. A lista a seguir mostra quais conjuntos do .NET Framework permitem chamadores parcialmente confiáveis e quais podem ser chamados diretamente por aplicativos da Web parcialmente confiáveis sem precisar de conjuntos wrapper no modo seguro. Observação: o uso do modo seguro será discutido detalhadamente mais adiante neste módulo. Os seguintes conjuntos de sistema têm o APTCA aplicado. Isso significa que podem ser chamados por aplicativos parcialmente confiáveis da Web ou por qualquer código parcialmente confiável:
O seu aplicativo parcialmente confiável falha porque chama um conjunto com nome de alta segurança que não está marcado com APTCA, e uma SecurityException é gerada. Neste caso, a exceção não contém nenhuma informação adicional para indicar que a chamada falhou devido a uma solicitação mal–sucedida de confiança total. | ||||||||||||||||||||||
| • | As solicitações de permissão podem começar a falhar. O nível de confiança configurado pode não conhecer a permissão necessária para que o seu aplicativo acesse um tipo específico de recurso. A seguir são apresentadas algumas situações comuns nas quais isso pode acabar sendo problemático:
|
Se você planeja transferir um aplicativo existente para um nível de confiança parcial, uma boa solução é reduzir as permissões de forma incremental para que você possa ver quais partes do seu aplicativo falham. Por exemplo, comece definindo o atributo de confiança level como Alto, em seguida como Médio, e assim por diante. Finalmente, o nível de confiança a que você deve visar depende do nível de restrição que você deseja estabelecer para o aplicativo. Use as seguintes orientações:
| • | Aplicativos configurados com confiança alta, média, baixa ou mínima não poderão chamar códigos não gerenciados ou componentes de serviço, gravar no log de eventos, acessar filas do Enfileiramento de mensagens, ou acessar fontes de dados do banco de dados OLE. |
| • | Aplicativos configurados com confiança alta têm acesso irrestrito ao sistema de arquivos. |
| • | Aplicativos configurados com confiança média têm acesso restrito ao sistema de arquivos. Eles podem acessar apenas os arquivos da sua própria hierarquia de diretório de aplicativos. |
| • | Aplicativos configurados com confiança baixa ou mínima não podem acessar bancos de dados SQL Server. |
| • | Aplicativos de confiança mínima não têm acesso a nenhum recurso. |
A Tabela 9.3 identifica as permissões concedidas por cada um dos níveis de confiança ASP.NET O nível full (total) foi omitido da tabela, pois ele garante todas as permissões em seus estados irrestritos
Tabela 9.3 Permissões de diretiva e níveis de confiança padrão do ASP.NET
| Permissão e estado | High | Medium | Low | Minimal |
AspNetHosting | Alta | Média | Baixa | Mínima |
DnsPermission |
|
|
|
|
EnvironmentPermission |
| TEMP; TMP; |
|
|
EventLogPermission |
|
|
|
|
FileIOPermission |
|
|
|
|
IsolatedStorageFilePermission |
|
|
|
|
OleDbClientPermission |
|
|
|
|
PrintingPermission |
|
|
|
|
ReflectionPermission |
|
|
|
|
RegistryPermission |
|
|
|
|
SecurityPermission |
|
|
|
|
SocketPermission |
|
|
|
|
SqlClientPermission |
|
|
|
|
WebPermission |
| $OriginHost$ |
|
|
Se você desenvolver um aplicativo parcialmente confiável ou permitir que um aplicativo existente seja executado em um nível de confiança parcial e encontrar problemas pelo fato de o seu aplicativo tentar acessar recursos para os quais não tenham sido concedidas as respectivas permissões, você pode adotar duas abordagens básicas:
| • | Personalizar a diretiva |
| • | Colocar o código privilegiado no modo seguro |
A abordagem certa depende do problema. Se o problema estiver relacionado ao fato de você estar tentando chamar um conjunto de sistema que não contém o AllowPartiallyTrustedCallersAttribute o problema passa a ser como conceder confiança total a um código. Nesta situação, você deve usar a abordagem da colocação no modo seguro e conceder confiança total ao conjunto wrapper colocado no modo seguro.
Observação: a personalização de diretivas é a mais fácil das duas abordagens porque não exige nenhum esforço de desenvolvimento.
Se o seu aplicativo da Web contém código que exige permissões além das concedidas por um determinado nível de confiança do ASP.NET, a opção mais fácil é personalizar um arquivo de diretivas para conceder a permissão adicional de segurança de acesso ao código ao seu aplicativo da Web. Você pode modificar um arquivo de diretivas existente e conceder mais permissões ou criar um novo arquivo com base em um arquivo de diretivas existente.
Observação: se você modificar um dos arquivos de diretivas internos, por exemplo, o arquivo de diretivas Web_mediumtrust.config de confiança média, isso afetará todos os aplicativos configurados para funcionar com um nível médio de confiança.
| • | Para personalizar a diretiva de um aplicativo específico
|
Outra abordagem que não exige a atualização para a diretiva de segurança de acesso ao código do ASP.NET é empacotar o seu código de acesso ao recurso no seu próprio conjunto wrapper e configurar a diretiva de segurança de acesso ao código do computador para conceder ao conjunto específico a permissão adequada. Então, você pode colocar no modo seguro o código mais privilegiado, usando o método CodeAccessPermission.Assert para que você não precise mudar a concessão geral de permissão do aplicativo da Web. O método Assert impede que a solicitação de segurança emitida pelo código de acesso ao recurso se propague na pilha de chamadas além dos limites do conjunto wrapper.
Você pode aplicar o seguinte padrão a qualquer código privilegiado que precise acessar um recurso restrito ou realizar outra operação privilegiada para a qual o aplicativo da Web pai não tenha permissões suficientes:
1. | Encapsule o código de acesso ao recurso em um conjunto wrapper. |
2. | Declare a respectiva permissão antes de acessar o recurso. Declarar permissões é perigoso porque significa que o código que chama o seu código pode ter acesso ao recurso encapsulado pelo seu conjunto sem precisar da respectiva permissão de acesso ao recurso. A instrução Assert diz que o seu código pode garantir a legitimidade dos chamadores. Para isso, o seu código deve solicitar uma permissão alternativa para que possa autorizar o código chamador antes de chamar a instrução Assert. Dessa forma, você permite que apenas o código possuidor da permissão alternativa tenha acesso ao recurso exposto pelo seu conjunto. O .NET Framework pode não possuir uma permissão adequada para solicitação. Nesse caso, você pode criar e solicitar uma permissão personalizada. Para obter mais informações sobre como criar uma permissão personalizada, consulte "Como: criar uma permissão de criptografia personalizada" na seção "Como" desse guia. |
3. | Comente o conjunto wrapper com o APTCA. |
4. | Instale o conjunto wrapper no GAC.
<CodeGroup
class="UnionCodeGroup"
version="1"
PermissionSetName="FullTrust>
<IMembershipCondition
class="UrlMembershipCondition"
Url="$Gac$/*"
version="1"
/>
</CodeGroup>
Observação: a diretiva de empresa e de máquina local padrão também concede confiança total a qualquer código localizado na zona Meu computador, o que inclui o código instalado no GAC. Isso é importante porque as permissões concedidas fazem intersecção com todos os níveis de diretivas. |
5. | Configure o nível de confiança do aplicativo da Web (por exemplo, em "Médio"). |
A Figura 9.2 mostra a abordagem de colocação no modo seguro.

Figura 9.2
Colocação de um código privilegiado no modo seguro no seu próprio conjunto, o que declara a respectiva permissão
É uma prática recomendável usar conjuntos separados para encapsular o acesso aos recursos, além de evitar a colocação do código de acesso ao recurso em arquivos .aspx ou códigos por trás de arquivos. Por exemplo, crie um conjunto separado de acesso a dados para encapsular o acesso a bancos de dados. Isso facilita a transferência de aplicativos para ambientes parcialmente confiáveis.
A abordagem certa depende do problema que você está tentando resolver, dependendo também do fato de você ter ou não a opção de modificar a diretiva de segurança no servidor de Web.
Esta abordagem é a mais fácil das duas e não exige nenhum esforço de desenvolvimento. Entretanto, você pode não ter a permissão para modificar diretivas no servidor de Web e, em determinadas situações, o seu código que chama a biblioteca de classes do .NET Framework pode exigir confiança total. nesses casos, você deve usar o modo seguro. Nessas situações deve ser usado o modo seguro. Por exemplo, os recursos a seguir exigem confiança total, e você deve colocar o seu código de acesso ao recurso no modo seguro ao acessá–los:
| • | Log de eventos (por meio da classe EventLog) |
| • | Fontes de dados OLE DB (por meio do provedor de dados OLE DB ADO.NET) |
| • | Fontes de dados ODBC (por meio do provedor de dados .NET ODBC ADO.NET) |
| • | Bancos de dados Oracle (por meio do provedor de dados .NET Oracle ADO.NET) |
Observação: esta lista não pretende esgotar as possibilidades, mas apresenta os tipos de recursos usados mais freqüentemente e que em condições normais exigem confiança total.
Se você colocar no modo seguro o código do seu aplicativo privilegiado em um conjunto separado, poderá conceder mais permissões ao conjunto. Como alternativa, você pode conceder a ele confiança total sem exigir que todo o seu aplicativo funcione com permissões estendidas.
Por exemplo,considere o código que usa o provedor de dados ADO.NET OLE DB e interage com a classe System.Data.OleDb.OleDbCommand Esse código requer confiança total. Embora o conjunto System.Data.dll esteja marcado com AllowPartiallyTrustedCallersAttribute, a classe System.Data.OleDb.OleDbCommand entre outras, não pode ser chamada por chamadores parcialmente confiáveis porque está protegida por uma solicitação associada de confiança total. Para ver isso, execute o comando a seguir por meio do utilitário permview no diretório %windir%\Microsoft.NET\Framework\{versão}:
permview /DECL /OUTPUT System.Data.Perms.txt System.Data.dll
A saída no System.Data.Perms.txt conterá o seguinte:
Conjunto de permissões class System.Data.OleDb.OleDbCommand LinktimeDemand:
<PermissionSet class="System.Security.PermissionSet"
version="1" Unrestricted="true"/>
Isso ilustra um conjunto de permissão irrestrita (confiança total) que é usado em uma demanda de link protetor da classe System.Data.OleDb.OleDbCommand. Em cenários como esses, configurar a diretiva não é suficiente para garantir permissões irrestritas específicas, tais como OleDbPermission a seu código parcialmente confiável. Em vez disso, você deve colocar o seu código de acesso ao recurso no modo seguro e conceder ele confiança total, e a forma mais fácil de fazer isso é instalá–lo no GAC. Use o Permview.exe para descobrir sobre as permissões necessárias de outras classes, embora esse procedimento exiba apenas atributos de segurança declarativos. Se uma classe exigir obrigatoriamente confiança total, você não poderá vê–la por meio do Permview.exe. Nesse caso, teste os requisitos de segurança da classe, chamando–a pelo código parcialmente confiável e diagnosticando todas as exceções de segurança.
Observação: só porque um conjunto está marcado com APTCA, isso não significa que todas as classes contidas admitem chamadores parcialmente confiáveis. Algumas classes podem conter solicitações explícitas de confiança total.
Se você hospeda aplicativos da Web, pode optar por implementar uma diretiva de segurança de confiança média para restringir operações privilegiadas. Esta seção concentra–se na execução de aplicativos de confiança média, e mostra como superar os problemas que provavelmente aparecerão.
As duas principais vantagens de executar um aplicativo no modo de confiança média são as seguintes:
| • | Menor área exposta a ataques |
| • | Isolamento do aplicativo |
Uma vez que confiança média não concede ao aplicativo acesso irrestrito a todas as permissões, a sua área exposta a ataques é reduzida por meio da concessão de um subconjunto do conjunto completo de permissões ao aplicativo. Muitas das permissões concedidas pela diretiva de confiança média também estão em um estado restrito. Se um atacante conseguir, de alguma forma, assumir o controle do seu aplicativo, seu espaço de atuação será limitado.
O isolamento do aplicativo por meio da segurança de acesso ao código restringe o acesso a recursos do sistema e a recursos de propriedade de outros aplicativos. Por exemplo, embora a identidade do processo tenha permissão de ler e gravar arquivos fora do diretório do aplicativo da Web, a FileIOPermission nos aplicativos de confiança média é restrita. Ela permite apenas que o aplicativo leia ou grave na sua própria hierarquia de diretório.
Se o seu aplicativo for executado em confiança média, ele enfrentará uma série de restrições, sendo as mais significativas:
| • | Ele não poderá acessar diretamente o log de eventos. |
| • | Ele terá acesso restrito ao sistema de arquivos e poderá acessar apenas os arquivos contidos na hierarquia de diretório virtual do aplicativo. |
| • | Ele não poderá acessar diretamente fontes de dados do banco de dados OLE (embora os aplicativos de confiança média tenham a SqlClientPermission que permite a eles acessarem o SQL Server). |
| • | Ele possuirá acesso limitado a Web Services. |
| • | Ele não poderá acessar diretamente o registro do Windows. |
Esta seção mostra como acessar os seguintes tipos de recursos a partir de um aplicativo da Web ou Web Service de confiança média:
| • | OLE DB |
| • | Log de eventos |
| • | Web Services |
| • | Registro |
Os aplicativos da Web de confiança média não recebem a OleDbPermission. Além disso, o provedor de dados .NET OLE DB exige, atualmente, chamadores de confiança total. Se você tiver um aplicativo que precise acessar fontes de dados OLE DB no modo de confiança média, use a abordagem da colocação no modo seguro. Coloque o seu código de acesso a dados em um conjunto separado, atribua a ele um nome de alta segurança e instale–o no GAC, o que concederá a ele confiança total.
Observação: a modificação da diretiva não funcionará a menos que você defina o nível de confiança como "Full", pois o provedor gerenciado OLE DB exige confiança total.
A Figura 9.3 mostra a disposição.

Figura 9.3
Acesso ao recurso OLE DB no modo seguro
Nesta abordagem, você cria um conjunto wrapper para encapsular o acesso à fonte de dados do banco de dados OLE. Esse conjunto recebe permissões de confiança total, necessárias para usar o provedor gerenciado OLE DB ADO.NET.
| • | Para criar um conjunto wrapper no modo seguro para chamar fontes de dados do banco de dados OLE
|
A classe EventLogPermission é projetada para encapsular os direitos do código de acessar o log de eventos. Atualmente, entretanto, o código deve receber confiança total para poder acessar o log de eventos. Isso significa que um aplicativo da Web de confiança média não poderá acessar diretamente o log de eventos. Para isso, você deve colocar no modo seguro o seu código de registro de eventos.
Primeiramente, verifique se a conta do processo usada para executar o seu aplicativo da Web (ou a identidade do segmento, se o seu aplicativo for representante) é capaz de criar fontes de eventos. Para isso, o processo ou a identidade do segmento deve ser capaz de criar chaves de registro abaixo da seguinte chave:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog
No mínimo, a identidade do processo ASP.NET de qualquer identidade representada deve ter as seguintes permissões nesta chave de registro:
| • | Consultar o valor da chave |
| • | Definir o valor da chave |
| • | Criar uma subchave |
| • | Enumerar subchaves |
| • | Notificar |
| • | Ler |
Esses parâmetros devem ser aplicados à chave acima e às subchaves. Como alternativa, você pode criar fontes de eventos no momento da instalação quando estiverem disponíveis direitos administrativos. Para obter mais informações sobre esta abordagem, consulte "Auditoria e registro", "Criando Páginas e Controles ASP.NET Seguros".
Para colocar no modo seguro o seu código de registro de eventos, crie um conjunto wrapper para encapsular o acesso ao log de eventos. Em seguida, instale o conjunto wrapper no GAC (Cache de Conjunto Global) para que a diretiva segurança de acesso ao código conceda a ele confiança total.
| • | Para criar um conjunto wrapper no modo seguro para gravar no log de eventos
|
Por padrão, a diretiva de confiança média concede aos aplicativos da Web ASP.NET uma WebPermission restrita. Para poder chamar Web Services a partir do seu aplicativo da Web, você deve configurar o atributo originUrl no elemento <trust> do seu aplicativo.
| • | Para chamar um único Web Service a partir de um aplicativo da Web de confiança média
|
O valor de originUrl é usado no construtor para uma classe de expressão regular System.Text.RegEx de forma que ele possa realizar uma correspondência com as URLs que podem ser acessadas pelo Web Service. Esta classe RegEx é usada junto com a classe WebPermission. O ".*" corresponde a qualquer URL que comece por "http://servername/".
O atributo originUrl é usado quando a diretiva ASP.NET é avaliada. Ela atribui um valor ao parâmetro de substituição $OriginHost$. Aqui está a definição de WebPermission a partir do Web_mediumtrust.config:
<IPermission
class="WebPermission"
version="1">
<ConnectAccess>
<URI uri="$OriginHost$"/>
</ConnectAccess>
</Ipermission>
Se você não especificar os servidores de Web acessados pelo seu aplicativo, qualquer solicitação de Web Services falhará com uma SecurityException. Para chamar um Web Service no servidor de Web local, use a seguinte configuração:
<trust level="Medium" originUrl="http://localhost/.*" />
Se o seu aplicativo precisar acessar vários Web Services em diferentes servidores, você precisará personalizar a diretiva ASP.NET porque é possível especificar apenas um originUrl no elemento <trust> de Web.config ou Machine.config.
| • | Para chamar vários Web Services a partir de um aplicativo de confiança média
|
Talvez você precise chamar um Web Service que utiliza a autenticação do Windows e especifique credenciais de autenticação por meio da cache de credenciais de proxy. Por exemplo:
proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
Neste caso, o aplicativo ASP.NET exige o EnvironmentPermission com acesso de leitura à variável de ambiente USERNAME. A diretiva–padrão de confiança média concede essa permissão aos aplicativos da Web.
Em uma situação de ASP.NET no lado do servidor, as credenciais são obtidas no segmento do aplicativo ASP.NET ou no identificador do processo. Se DefaultCredentials for usado a partir de um aplicativo de desktop, será usado o identificador interativo atual do usuário. A solicitação da EnvironmentPermission é uma estratégia de redução de riscos criada para garantir que o código não possa usar as credenciais do usuário local à vontade e expô–las à rede.
Por padrão, aplicativos da Web de confiança média não recebem a RegistryPermission. Para configurar o seu aplicativo para acessar o registro, você deve modificar a diretiva ASP.NET para conceder essa permissão ao seu aplicativo ou desenvolver um conjunto wrapper no modo seguro que tenha a permissão necessária.
A abordagem de colocação no modo seguro é a mesma descrita anteriormente para as fontes de dados do banco de dados OLE e para o log de eventos.
A maneira mais fácil de personalizar uma diretiva é criar um arquivo de diretiva personalizada com base no arquivo de diretivas de confiança média e configurar o seu aplicativo para o uso da diretiva personalizada. A diretiva personalizada concede a RegistryPermission ao aplicativo.
| • | Para criar uma diretiva personalizada a fim de liberar o acesso ao registro
|
A segurança de acesso ao código é um modelo de segurança de restrição a recursos que pode ser usado para ajudar a isolar aplicativos. Os aplicativos podem ser configurados para funcionar em vários níveis de confiança parciais. O nível de confiança determina as permissões que são concedidas ao aplicativo ASP.NET Web ou ao Web Service. Isso determina os tipos de fontes que podem ser acessadas e outros tipos de operações privilegiadas que podem ser executadas. Observe que todo acesso a recursos está, em última análise, sujeito à segurança do sistema operacional.
O modelo recomendado de isolamento utiliza os pools de aplicativos do Windows Server 2003 e oferece isolamento de processo, além de segurança de acesso ao código. No Windows 2000, o isolamento pode ser conseguido apenas por meio da segurança de acesso ao código e de identidades de segmento separadas.
Fazer a migração de um aplicativo para que ele seja executado com confiança total geralmente requer uma certa reengenharia. Talvez seja preciso fazer uma reengenharia no caso das fontes de acesso de aplicativos não serem permitidas por um nível de confiança parcial ou no caso de conjuntos com nomes de alta segurança que não contenham APTCA. Nesses casos, você pode colocar no modo seguro o acesso privilegiado a recursos em conjuntos wrapper separados. Em alguns casos, você pode criar e usar arquivos personalizados de diretivas, embora isso dependa da diretiva de segurança do seu servidor de Web.
Recomenda–se que, no projeto, o código de acesso ao recurso seja colocado em conjuntos separados e que se evite a colocação desse código em arquivos .aspx, bem como a colocação código por trás de arquivos. O uso de conjuntos separados permite que a diretiva de segurança de acesso ao código seja aplicada ao conjunto independentemente do aplicativo da Web, além de permitir que você desenvolva códigos confiáveis no modo seguro para ter acesso aos recursos.
Para obter mais informações, consulte os seguintes recursos:
| • | "Security in .NET: The Security Infrastructure of the CLR Provides Evidence, Policy, Permissions, and Enforcement Services" no MSDN Magazine em http://msdn.microsoft.com/msdnmag/issues/02/09/SecurityinNET/default.aspx (em inglês) |
| • | "Security in .NET: Enforce Code Access Rights with the Common Language Runtime" no MSDN Magazine em http://msdn.microsoft.com/msdnmag/issues/01/02/CAS/default.aspx.(em inglês) |
| • | LaMacchia, Lange, Lyons, Martin, and Price .NET Framework Security. Addison Wesley Professional, 2002. |
| • | "Como: na seção "Como Fazer" deste guia". |