Segurança do asp.net 2.0 e asp.net 3.5 em servidores compartilhados

O .NET v1.1 não vem configurado corretamente para servidores compartilhados, como já vimos em outro artigo. O mesmo vale para o asp.net 2.0 e também o seu framework 3.5.

Por padrão, .NET 2.0 vem instalado com “Full trust”. By default .NET 2.0 is installed with Full trust. Microsoft recomenda utilizar “Medium Trust” para servidores compartilhados.

Após instalar o .Net Framework 2.0 em seu servidor, você precisará modificar algumas configurações, assim como é feito no asp.net v1.1.

Primeiramente, abra o arquivo web.config, localizado em: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG por padrão. (Você pode utilizar o notepad para abrir e editar este arquivo).

Localize o seguinte bloco de texto:

<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>
<trust level="Full" originUrl="" />
</system.web>
</location>

Nós precisaremos alterar a seguinte linha:

<location allowOverride="true">

para:

<location allowOverride="false">

isto certifica que os usuários não poderão alterar estas configurações em seus próprios web.config. Agora, mudaremos também a seguinte linha:

<trust level="Full" originUrl="" />

para

<trust level="Medium" originUrl=".*" />

Então, imediatamente após esta linha, adicione o seguinte:

<identity impersonate="true" userName="" password="" />

isto irá forçar o .NET 2.0 a rodar em “Medium Trust mode”, e ser executado sobre a conta anonima do IIS.
this is now forcing .NET 2.0 to run in Medium trust mode and to execute under the IIS anonomous user. Os principais inconvenientes de setar as configurações para Medium Trust são:

  • OleDbPermission não estará disponível. Significa que você não poderá utilizar ADO.NET e OLE DB data provider para acessar banco de dados. Entretanto, você poderá usar o SQL Server provider para acessar SQL Server databases.
  • EventLogPermission não estará disponível. Quer dizer que você não terá logs do asp.net no windows event.
  • ReflectionPermission não estará disponível. Você não poderá usar “reflection”.
  • RegistryPermission não estará disponível. Você não terá acesso ao registro.
  • WebPermission é restrita. Sua aplicação poderá se comunicar somente com a faixa de endereços que você definiu no elemento.
  • FileIOPermission é restrito. Só será possível acessar arquivos dentro da sua hierarquia da aplicação virtual.

Entretanto, ainda é possível criar um policy personalizado baseado no Medium trust, e permitir aplicações menos restritivas.Nós iremos cobrir alguns exemplos num próximo artigo.

Segurança do Asp.net em servidores compartilhados

Por padrão, o asp.net 1.1 não está bem configurado para servidores compartilhados. Um usuário que está rodando uma aplicação em .net na configuração padrão terá acesso a partes sensíveis do sistema, o que representa um problema para a segurança.

Abaixo, vou descrever como forçar o ASP.NET 1.1 a executar com a conta anonima do IIS e reduzir assim os privilégios das aplicações em ASP.NET.

Para incrementar a segurança, é recomendado executar sites em asp.net em aplication pools isoladas no IIS. Assim os códigos executados em asp.net poderão afetar apenas o contexto da aplicação (ou das permissões que envolvem o usuário da aplicação.

Para incrementar a segurança, nosso primeiro passo deverá ser forçar as aplicações a serem executadas com o usuário anonimo do IIS. Para fazer isto, vamos editar o arquivo machine.config, localizado na pasta:

C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG

Abra o arquivo no notepad e procure pela palavra impersonate. Ela estará no padrão abaixo:

<!–
identity Attributes:
impersonate="[true|false]" - Impersonate Windows User
userName="Windows user account to impersonate" | empty string implies impersonate the LOGON user specified by IIS
password="password of above specified account" | empty string
–>
<identity impersonate="false" userName="" password=""/>

troque a linha em negrito acima por todo este bloco de textos abaixo:

</system.web>
<location allowOverride="false">
<system.web>
<identity impersonate="true" userName="" password=""/>
</system.web>
</location>
<system.web>

O que estamos fazendo é setando a propriedade impersonate para true, e além disto colocando uma tag location, que informa que não será possível ao usuário alterar o valor do impersonate (algo que por padrão é possível no arquivo web.config).

Feito isto, os scripts asp.net irão ser executados pelo usuário anonimo marcado no IIS.

Não terminamos. A instalação padrão do asp.net permite executar os arquivos em Full trust mode. Isto quer dizer que qualquer assemblies chamado ou desenvolvido pelo usuário terá acesso irrestrito ao sistema (o que nós não queremos de jeito nenhum).

Procure no topo do arquivo machine.config pelo código abaixo:

<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>

Como você pode ver, ASP.NET está marcado por padrão para executar em Full trust mode. Precisamos alterar isto.

Em hosting compartilhados, o ideal é alterar para o medium trust, que permite uma certa flexibidade sem comprometer a segurança do sistema.

<location allowOverride="false">
<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="Medium" originUrl=".*" />
</system.web>
</location>