Compartilhar via


Bloqueio de segurança PII

O exemplo SecurityLockdown demonstra como controlar vários recursos relacionados à segurança de um serviço Windows Communication Foundation (WCF):

  • Criptografar informações confidenciais no arquivo de configuração de um serviço.

  • Bloquear elementos no arquivo de configuração para que 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 .NET Framework podem conter informações confidenciais, como cadeias de conexão, para se conectar a bancos de dados. Em cenários compartilhados hospedados na 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. .NET Framework 2.0 e posteriores 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 que usa 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 uma variedade de 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 na Introdução. Além disso, este exemplo usa rastreamento e registro em log de mensagens. Para obter mais informações, consulte o exemplo de Rastreamento e Registro em Log de Mensagens.

Como criptografar 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 no Web.config para o exemplo

  1. Abra um prompt de comando usando Start->Run.... Digite cmd e clique em OK.

  2. Navegue até o diretório .NET Framework atual emitindo o seguinte comando: cd %WINDIR%\Microsoft.NET\Framework\v4.0.20728.

  3. Criptografe as configurações do 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 tutorial sobre DPAPI na configuração ASP.NET (Como criar aplicativos ASP.NET seguros: autenticação, autorização e comunicação segura) e um tutorial para no RSA na configuração do ASP.NET (Como criptografar seções de configuração no ASP.NET 2.0 usando RSA).

Como bloquear elementos de 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 os elementos de configuração bloqueados gerem exceções em tempo de execução.

Um elemento de configuração pode ser bloqueado especificando o atributo lockItem para um nó no arquivo de configuração, por exemplo, para bloquear o nó CalculatorServiceBehavior no arquivo de configuração para que os serviços da calculadora em arquivos de configuração aninhados não possam alterar o comportamento, a configuração a seguir pode ser usado.

<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 o valor lockAttributes para bloquear um conjunto de atributos em 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 em log de PII

O registro em log de PII é controlado por dois comutadores: 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 de todo o computador é controlada pela configuração de enableLoggingKnownPii como true ou false, no elemento machineSettings em Machine.config. Por exemplo, o seguinte permite que os aplicativos ativem o registro em log 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 atributo logKnownPii não for especificado, então a PII não será registrada em log.

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 atributo logKnownPii à segunda origem no arquivo de configuração não tem efeito.

Importante

Executar este exemplo envolve modificação manual de Machine.config. Cuidado ao modificar Machine.config como valores ou sintaxe incorretos pode impedir que todos os aplicativos .NET Framework sejam executados.

Também é possível criptografar elementos do arquivo de configuração que usa DPAPI e RSA. Para obter mais informações, consulte os seguintes links:

Para configurar, compilar e executar o exemplo

  1. Verifique se você executou o Procedimento de instalação única para os exemplos do Windows Communication Foundation.

  2. Edite Machine.config para definir o atributo enableLoggingKnownPii como true, adicionando os nós pai, se necessário.

  3. Para compilar a edição C# ou do Visual Basic .NET da solução, siga as instruções em Como compilar o exemplos do Windows Communication Foundation.

  4. Para executar o exemplo em uma configuração de computador único ou entre computadores, siga as instruções em Como executar os exemplos do Windows Communication Foundation.

Para limpar o exemplo

  1. Edite Machine.config para definir o atributo enableLoggingKnownPii como false.

Confira também