.NET - Segurança de aplicações


  Hoje vou apresentar algumas dicas relacionadas a segurança de aplicações na plataforma .NET.

A segurança das aplicações é um item extremamente importante em qualquer sistema, independentemente da plataforma utilizada, e, investir em medidas de segurança adequadas ajuda a proteger os dados dos usuários, evita violações de privacidade, impede ataques cibernéticos e preserva a reputação da sua aplicação.



Pensando nisso, vou apresentar a seguir cinco dicas básicas que você deve conhecer e que vão te ajudar a tornar o seu código mais seguro.

1- Evite conexões diretas com bancos de dados

Muitas vezes nossas aplicações requerem usar um bancos de dados, e a maneira mais fácil de usar esses bancos de dados é usar um conector em nossa aplicação.

A seguir temos um exemplo onde temos o uso de um conector MySqlConnection, e, para fazer uma conexão, usaríamos um código como este:

string connectionString = "datasource=host.com;port=3306;username=root;password=secret;database=teste;";

MySqlConnection databaseConnection = new MySqlConnection(connectionString);
 

Usar esta abordagem pode ser fácil e simples de implementar mas não é prático para segurança.Desta forma, estamos expondo nosso servidor, porta, nome de usuário e senha para qualquer pessoa que tenha acesso ao aplicativo.

Mas então quais soluções podemos adotar ?

Aqui devemos levar em consideração vários aspectos, um deles como nosso aplicativo está estruturado e suas necessidades.

De uma forma simples poderíamos aplicar as seguintes medidas:

- Não usar arquivos Universal Data Link (UDL).
- Criptografar os arquivos de configuração.
- Usar a Autenticação do Windows.
- Usar o segredo do Azure Key Vault.

E, dependendo do tipo de aplicação, se precisarmos de segurança completa e avançada, talvez uma saída seja terceirizar as conexões.

2- Faça a criptografia de dados para aumentar a segurança

Sempre que trabalhamos com dados, sejam configurações de aplicativos ou informações sobre usuários, devemos manter os dados criptografados todo o tempo.

A criptografia é uma medida de segurança importante para proteger informações confidenciais, mas a decisão de criptografar ou não os dados depende de vários fatores, incluindo o tipo de dados, o contexto de uso e os requisitos de segurança.

A criptografia é recomendada quando você precisa proteger dados sensíveis que podem ser explorados se caírem em mãos erradas. Alguns exemplos de casos em que a criptografia é essencial são:

Assim, de forma simples, se você possui informações como texto puro em arquivos de configuração pode aplicar uma criptografia para dar um pouco mais de segurança:

ArquivoSeguro.WriteAllText("exemplo.txt", "O usuário Maria foi registro em https://macoratti.com", "numsey#2023");

ArquivoSeguro.ReadAllText("exemplo.txt", "numsey#2023");

Este é um pequeno exemplo para começar a integrar a segurança e a criptografia nos dados uma aplicação manipula, tanto arquivos quanto documentos e assim por diante.

Neste exemplo vimos que a senha “numsey#2023” está no código, e isso não deveria ocorrer, e uma opção opção seria externalizar esta senha e carregá-la com segurança.

Outras medidas a serem tomadas seriam:

  • Em vez de armazenar as senhas em texto simples, você pode usar algoritmos de hash seguros, como bcrypt ou Argon2, para armazenar apenas os hashes das senhas. Ao comparar as senhas, você pode verificar se o hash gerado a partir da senha fornecida corresponde ao hash armazenado.
     
  • Considerar o uso de soluções de gestão de segredos, como o HashiCorp Vault ou o Azure Key Vault. Essas ferramentas permitem armazenar senhas e outros segredos de forma segura, criptografada e centralizada. Elas fornecem controle de acesso granular e registros de auditoria para monitorar o acesso aos segredos.
     
  • Implementar autenticação de dois fatores (2FA) pois isso adiciona uma camada adicional de segurança, exigindo que os usuários forneçam um segundo fator de autenticação, além da senha, para acessar o sistema.
  • 3- Use a API de proteção de dados de segurança no ASP.NET Core

    Na ASP .NET Core podemos usar IDataProtector para proteger as informações e documentos que manipulamos em nossas aplicações. A proteção de dados com o IDataProtector envolve criptografia e assinatura digital. A criptografia garante que os dados sejam mantidos em sigilo, enquanto a assinatura digital garante a integridade dos dados, evitando que sejam modificados por terceiros.

    Aqui está um exemplo de como usar o IDataProtector no ASP.NET Core:

    1. Injeção de dependência: No seu código, você precisa injetar o IDataProtectionProvider como uma dependência. Isso pode ser feito por meio da injeção de dependência nativa do ASP.NET Core. Você pode adicionar a seguinte linha ao construtor da sua classe:
    
    private readonly IDataProtector _dataProtector;
    
    public MyClass(IDataProtectionProvider dataProtectionProvider)
    {
        _dataProtector = dataProtectionProvider.CreateProtector("protectionPurpose");
    }
    

    Para proteger dados sensíveis, você pode chamar o método Protect no IDataProtector, passando o valor que deseja proteger:

    
    string originalData = "Dados confidenciais";
    string protectedData = _dataProtector.Protect(originalData);
    

    Para desproteger os dados posteriormente, utilize o método Unprotect no IDataProtector:

    
    string unprotectedData = _dataProtector.Unprotect(protectedData);
     

    O IDataProtectionProvider é responsável por fornecer uma implementação do IDataProtector adequada para o seu ambiente, garantindo que os dados estejam protegidos corretamente. Ele também permite a configuração de chaves de criptografia e outras opções de proteção de dados.

    O IDataProtector é uma ferramenta útil para proteger informações sensíveis no ASP.NET Core, mas é importante lembrar que ele é apenas uma parte do que é necessário para garantir a segurança de um sistema

    4- Atualize dependências e bibliotecas externas para melhorar a segurança

    Esta recomendação pode ser óbvia, mas poucos a levam em consideração, quando programamos na plataforma .NET utilizamos muitas bibliotecas, normalmente muitas delas oferecidas pela Microsoft, outras desenvolvidas por usuários ou empresas, como a maioria dos pacotes NUGET.

    É importante verificarmos quais bibliotecas nosso aplicativo está usando e nos informarmos sobre vulnerabilidades conhecidas ou possíveis riscos de segurança que elas possam causar.

    Uma forma de obter uma lista de pacotes desatualizados e a seguir adicionar o pacote com a versão mais atual é usar os comandos :

    dotnet list package --outdated
    dotnet add package <nome-do-pacote> --version <versão>

    Também é importante levar em consideração as versões das ferramentas e pacotes que estamos usando para nosso aplicativo, pois eles podem estar obsoletos e sem manutenção e podem representar um risco de segurança para seus aplicativos.

    A seguir temos as versões do .NET disponível para download :  ( https://dotnet.microsoft.com/download/dotnet-core )

    Para obter informações atualizadas sobre vulnerabilidades conhecidas nas bibliotecas .NET mais comuns podemos consultar :

    1. CVE (Common Vulnerabilities and Exposures):

      O CVE é um sistema que fornece uma lista padronizada de informações sobre vulnerabilidades de segurança conhecidas. Você pode acessar o site do CVE (https://cve.mitre.org/) e realizar uma pesquisa por palavras-chave relacionadas às bibliotecas .NET que você está interessado em verificar.
       
    2. NVD (National Vulnerability Database):

      O NVD é o banco de dados nacional de vulnerabilidades mantido pelo Instituto Nacional de Padrões e Tecnologia dos EUA. Ele também fornece informações detalhadas sobre vulnerabilidades conhecidas. Você pode visitar o site do NVD (https://nvd.nist.gov/) e pesquisar por bibliotecas .NET específicas para obter detalhes sobre as vulnerabilidades.
       
    3. Recursos de segurança da Microsoft:

      A Microsoft mantém um portal de segurança que inclui informações sobre vulnerabilidades e atualizações de segurança para suas bibliotecas .NET e outros produtos. Você pode consultar o site oficial de segurança da Microsoft (https://www.microsoft.com/security) e pesquisar por informações relacionadas às bibliotecas .NET específicas.

    5- Use a ofuscação de código

    A ofuscação de código é uma técnica que visa tornar o código-fonte de um aplicativo mais difícil de entender e reverter, dificultando a engenharia reversa e protegendo informações sensíveis do software.

    Na plataforma .NET, a ofuscação de código é comumente usada para proteger a propriedade intelectual, evitar a exploração de vulnerabilidades e dificultar a criação de versões não autorizadas ou piratas do software.

    A ofuscação de código pode ser realizada por meio de ferramentas específicas que aplicam uma série de transformações no código-fonte para torná-lo menos legível, sem alterar sua funcionalidade. Essas transformações incluem:

    1. Renomeação de símbolos: Nomes de classes, métodos, variáveis e outros elementos do código são alterados para nomes sem sentido ou criptografados, dificultando a compreensão do código e a identificação de sua função.
    2. Inserção de instruções falsas: Instruções de código falsas são adicionadas ao código-fonte para confundir e desencorajar análises e tentativas de engenharia reversa.
    3. Reorganização de estruturas de controle: O fluxo lógico do código pode ser modificado, tornando-o mais complexo e difícil de seguir. Isso dificulta a compreensão do funcionamento interno do software.
    4. Remoção de metadados: Metadados do assembly, como informações de depuração e comentários, podem ser removidos para reduzir a quantidade de informações disponíveis para os atacantes.
    5. Criptografia de strings e recursos: Strings e recursos sensíveis, como chaves de API ou URLs, podem ser criptografados para evitar que sejam facilmente identificados em análises do código.

    É importante mencionar que a ofuscação de código não é uma solução de segurança completa e não impede ataques certos ou altamente sofisticados. No entanto, ela adiciona uma camada adicional de complexidade e dificuldade para tentativas de engenharia reversa.

    Existem várias ferramentas de ofuscação disponíveis para a plataforma .NET, como o Dotfuscator, o ConfuserEx e o Obfuscator-LLVM. Essas ferramentas geralmente oferecem opções configuráveis para personalizar o processo de ofuscação de acordo com as necessidades do aplicativo.

    No entanto, é importante considerar que a ofuscação de código pode dificultar a depuração e o diagnóstico de problemas em um ambiente de produção. Portanto, é recomendável fazer testes extensivos após a aplicação da ofuscação para garantir que o aplicativo ainda funcione corretamente.

    Conclusão

    Assim, a segurança de uma aplicação é um processo contínuo pois as ameaças estão sempre evoluindo. Portanto, é fundamental ficar atualizado com as melhores práticas de segurança e adaptar suas estratégias de acordo com as mudanças no cenário de segurança.

    E estamos conversados...

    "E houve também entre eles contenda, sobre qual deles parecia ser o maior.
    E ele lhes disse: Os reis dos gentios dominam sobre eles, e os que têm autoridade sobre eles são chamados benfeitores. Mas não sereis vós assim; antes o maior entre vós seja como o menor; e quem governa como quem serve."
    Lucas 22:24-26

    Referências:


    José Carlos Macoratti