Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O exemplo SecurityLockdown demonstra como controlar vários recursos relacionados à segurança de um serviço do WCF (Windows Communication Foundation) por meio de:
Criptografar informações confidenciais no arquivo de configuração de um serviço.
Bloquear elementos no arquivo de configuração para que os subdiretórios de serviço aninhados não possam substituir as configurações.
Controlar o registro em log de PII (Informações de Identificação Pessoal) em logs de rastreamento e mensagens.
Discussão
Cada um desses recursos pode ser usado separadamente ou em conjunto para controlar aspectos da segurança de um serviço. Este não é um guia definitivo para proteger um serviço WCF.
Os arquivos de configuração do .NET Framework podem conter informações confidenciais, como cadeias de conexão para se conectar a bancos de dados. Em cenários compartilhados hospedados pela Web, pode ser desejável criptografar essas informações no arquivo de configuração de um serviço para que os dados contidos no arquivo de configuração sejam resistentes à exibição casual. O .NET Framework 2.0 e posterior tem a capacidade de criptografar partes do arquivo de configuração usando a DPAPI (interface de programação de aplicativo) da Proteção de Dados do Windows ou o provedor de criptografia RSA. O aspnet_regiis.exe usando o DPAPI ou o RSA pode criptografar partes selecionadas de um arquivo de configuração.
Em cenários hospedados pela Web, é possível ter serviços em subdiretórios de outros serviços. A semântica padrão para determinar valores de configuração permite que os arquivos de configuração nos diretórios aninhados substituam os valores de configuração no diretório pai. Em determinadas situações, isso pode ser indesejável por várias razões. A configuração do serviço WCF dá suporte ao bloqueio de valores de configuração para que a configuração aninhada gere exceções quando um serviço aninhado é executado usando valores de configuração substituídos.
Este exemplo demonstra como controlar o registro em log de PII (Informações de Identificação Pessoal) em logs de rastreamento e mensagens, como nome de usuário e senha. Por padrão, o registro em log de PII conhecida está desabilitado, no entanto, em determinadas situações, o registro em log de PII pode ser importante na depuração de um aplicativo. Este exemplo é baseado no Começando. Além disso, este exemplo usa o rastreamento e o registro de mensagens. Para obter mais informações, consulte o exemplo de Rastreamento e Registro em Log de Mensagens.
Criptografando elementos de arquivo de configuração
Para fins de segurança em um ambiente de hospedagem da Web compartilhado, pode ser desejável criptografar determinados elementos de configuração, como cadeias de conexão de banco de dados que podem conter informações confidenciais. Um elemento de configuração pode ser criptografado usando a ferramenta aspnet_regiis.exe encontrada na pasta .NET Framework Por exemplo, %WINDIR%\Microsoft.NET\Framework\v4.0.20728.
Para criptografar os valores na seção appSettings em Web.config para o exemplo
Abra um prompt de comando usando Start-Run>.... Digite e clique em
cmdOK.Navegue até o diretório atual do .NET Framework emitindo o seguinte comando:
cd %WINDIR%\Microsoft.NET\Framework\v4.0.20728.Criptografe as configurações de appSettings na pasta Web.config emitindo o seguinte comando:
aspnet_regiis -pe "appSettings" -app "/servicemodelsamples" -prov "DataProtectionConfigurationProvider".
Mais informações sobre como criptografar seções de arquivos de configuração podem ser encontradas lendo um artigo explicando o DPAPI na configuração do ASP.NET (Criando aplicativos ASP.NET seguros: autenticação, autorização e comunicação segura) e um artigo explicando o uso de RSA na configuração do ASP.NET (Como criptografar seções de configuração no ASP.NET 2.0 usando RSA).
Bloqueio de elementos do arquivo de configuração
Em cenários hospedados pela Web, é possível ter serviços em subdiretórios de serviços. Nessas situações, os valores de configuração para o serviço no subdiretório são calculados examinando valores em Machine.config e mesclando sucessivamente com quaisquer arquivos de Web.config em diretórios pai movendo para baixo a árvore de diretório e, finalmente, mesclando o arquivo Web.config no diretório que contém o serviço. O comportamento padrão para a maioria dos elementos de configuração é permitir que arquivos de configuração em subdiretórios substituam os valores definidos em diretórios pai. Em determinadas situações, pode ser desejável impedir que arquivos de configuração em subdiretórios substituam valores definidos na configuração do diretório pai.
O .NET Framework fornece uma maneira de bloquear elementos de arquivo de configuração para que as configurações que substituem elementos de configuração bloqueados lancem exceções em tempo de execução.
Um elemento de configuração pode ser bloqueado especificando o atributo lockItem de um nó no arquivo de configuração, por exemplo, para bloquear o nó "CalculatorServiceBehavior" no arquivo de configuração, de modo que os serviços de calculadora em arquivos de configuração aninhados não possam alterar o comportamento, a seguinte configuração pode ser usada.
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior" lockItem="true">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
O bloqueio de elementos de configuração pode ser mais específico. Uma lista de elementos pode ser especificada como o valor para lockElements para bloquear um conjunto de elementos em uma coleção de subelementos. Uma lista de atributos pode ser especificada como valor para o lockAttributes, a fim de bloquear um conjunto de atributos dentro de um elemento. Uma coleção inteira de elementos ou atributos pode ser bloqueada, exceto por uma lista especificada, especificando os atributos lockAllElementsExcept ou lockAllAttributesExcept em um nó.
Configuração de Registro de Informação de Identificação Pessoal (PII)
O registro em log de PII é controlado por duas opções: uma configuração em todo o computador encontrada em Machine.config que permite que um administrador de computador permita ou negue o registro em log de PII e uma configuração de aplicativo que permite que um administrador de aplicativos alterne o registro em log de PII para cada fonte em um arquivo Web.config ou App.config.
A configuração em todo o computador é controlada ao definir enableLoggingKnownPii para true ou false, no elemento machineSettings em Machine.config. Por exemplo, o seguinte permite que os aplicativos ativem o registro de PII.
<configuration>
<system.serviceModel>
<machineSettings enableLoggingKnownPii="true" />
</system.serviceModel>
</configuration>
Observação
O arquivo Machine.config tem um local padrão: %WINDIR%\Microsoft.NET\Framework\v2.0.50727\CONFIG.
Se o atributo enableLoggingKnownPii não estiver presente no Machine.config, o registro em log de PII não será permitido.
A ativação do registro em log de PII para um aplicativo é feita definindo o atributo logKnownPii do elemento de origem como true ou false no arquivo Web.config ou App.config. Por exemplo, o seguinte permite o registro em log de PII para o registro em log de mensagens e o registro em log de rastreamento.
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel.MessageLogging" logKnownPii="true">
<listeners>
...
</listeners>
</source>
<source name="System.ServiceModel" switchValue="Verbose, ActivityTracing">
<listeners>
...
</listeners>
</source>
</sources>
</system.diagnostics>
</configuration>
Se o logKnownPii atributo não for especificado, a PII não será registrada.
A PII só é registrada se enableLoggingKnownPii estiver definido como true e logKnownPii estiver definido como true.
Observação
System.Diagnostics ignora todos os atributos em todas as fontes, exceto o primeiro listado no arquivo de configuração. A adição do logKnownPii atributo à segunda origem no arquivo de configuração não tem efeito.
Importante
Executar este exemplo envolve a modificação manual de Machine.config. Deve-se tomar cuidado ao modificar Machine.config, pois valores ou sintaxe incorretos podem impedir que todos os aplicativos do .NET Framework sejam executados.
Também é possível criptografar elementos de arquivo de configuração usando DPAPI e RSA. Para obter mais informações, consulte os seguintes links:
Criando aplicativos de ASP.NET seguros: autenticação, autorização e comunicação segura
Como criptografar seções de configuração no ASP.NET 2.0 usando o RSA
Para configurar, compilar e executar o exemplo
Verifique se você executou o Procedimento de instalação avulsa dos exemplos do Windows Communication Foundation.
Edite Machine.config para definir o atributo
enableLoggingKnownPiicomotrue, adicionando os nós pai, se necessário.Para compilar a edição .NET do C# ou do Visual Basic da solução, siga as instruções contidas em Como Compilar as Amostras do Windows Communication Foundation.
Para executar o exemplo em uma configuração de computador único ou cruzado, siga as instruções em Executar os exemplos do Windows Communication Foundation.
Para limpar a amostra
- Edite Machine.config para definir o
enableLoggingKnownPiiatributo comofalse.