ASP.NET MVC 4: Criando sistemas web seguros
Neste artigo vamos criar um Sistema web de exemplo totalmente aderente às melhores práticas de Projeto, Implementação e Testes de Sistemas Web também pela ótica da segurança utilizando o padrão ASP.NET MVC 4.
Artigo no estilo: Curso
Vamos também criar um site fictício para testes
utilizando certificados gerados pelo OpenSSL e como mesmo criar certificados
para assinar nossos assemblies e com isso poder registrar as versões estáveis
na GAC. Com relação aos Testes
Unitários, vamos gerar testes de todos os módulos e frameworks pertencentes ao
Projeto. Vamos utilizar o TDD como principal forma de trabalho, assim como
controlaremos nossa tarefa via Kanban mostrando ao nosso leitor como controlar
o cronograma do artigo através das metodologias ágeis.
Não podemos imaginar um site hoje em dia sem segurança e podemos começar diminuindo os riscos de invasão em um site criptografando todos os seus dados sensíveis já desde a interação dos usuários, para isso, utilizamos os certificados SSL.
Qualquer site sério de compras ou que se preocupe com a garantia dos dados de seus usuários necessita utilizar ao menos um certificado, posto que nem todo o site tem a necessidade de ter seus dados criptografados.
Por exemplo, podemos apenas colocar o site seguro no momento do login do usuário e o acompanhar em toda a sua navegação pelo site saindo da parte segura após o seu logoff da aplicação.
Normalmente, pode-se adquirir um certificado de autoridades certificadoras conhecidas mundialmente e o valor não é muito alto, porém, ao longo do tempo e da complexidade do projeto, este valor pode aumentar e mesmo assim, é um valor irrisório em comparação ao prejuízo que a sua falta acarreta nas partes mais sensíveis de seu Sistema.
Vamos criar uma Autoridade Certificadora, gerar um Certificado Mestre, assinar este certificado, registrar o certificado no Windows e configurar o IIS para tal.
Para tal, vamos precisar do Visual Studio 2010 ou superior, do IIS 7.0 ou superior. Vamos também utilizar o OpenSSL e outras ferramentas que demonstraremos a seguir existentes no próprio .NET Framework.
Criando um domínio fake para simular um site do mundo real
O nosso site se responderá no endereço fictício http://www.projetoowasp01.com.br. Para que este domínio possa responder, vamos atrelá-lo ao IP de nossa estação de trabalho e para isto, devemos editar o arquivo Hosts.
O arquivo Hosts é como, à grosso modo, um arquivo de resolução de nomes – DNS - embarcado no próprio Windows - c:\windows\system32\etc\drivers\Hosts. Dentro deste arquivo replique o que está na Listagem 1. Caso o arquivo Hosts não exista, este deve ser criado. Uma dica muito importante é que este arquivo, assim como foi editado facilmente pelo leitor, também pode ser acessado por aplicações espiãs ou vírus. Diante disto, devemos mantê-lo como Somente Leitura após as alterações.
Listagem 1. Configuração de Host Fake
no IIS
192.168.0.3 www.projetoowasp01.com.br #Servidor IIS Fake
No caso de nossa máquina de testes, que é uma máquina virtual, colocamos o IP da máquina servidora, que é a máquina hospedeira desta máquina virtual, porém, no caso do leitor não ter a mesma estrutura, pode-se substituir o IP 192.168.0.3 para 127.0.0.1 ou o IP de sua estação de trabalho sem quaisquer ônus. Após isso, salve e feche o arquivo.
Vamos testar se nosso domínio fake responde, para isso vamos abrir o prompt do DOS e digitar o mesmo descrito na Listagem 2.
Listagem 2. Testando o domínio Fake
cd ping www.projetoowasp01.com.br
Se tudo der certo com o que foi digitado na listagem anterior, então teremos a saída mostrada na Listagem 3.
Listagem 3. Resposta do ping para o
domínio fake
Disparando contra www.projetoowasp01.com.br [192.168.0.3] com 32 bytes de dados:
Resposta de 192.168.0.3: bytes=32 tempo=2ms TTL=128
Resposta de 192.168.0.3: bytes=32 tempo=1ms TTL=128
Resposta de 192.168.0.3: bytes=32 tempo=2ms TTL=128
Resposta de 192.168.0.3: bytes=32 tempo=1ms TTL=128
Estatísticas do Ping para 192.168.0.3:
Pacotes: Enviados = 4, Recebidos = 4, Perdidos = 0 (0% de perda),
Aproximar um número redondo de vezes em milissegundos:
Mínimo = 1ms, Máximo = 2ms, Média = 1ms
O tempo em milissegundos (ms) pode variar dependendo do processamento da máquina, mas o mais importante a ser destacado é justamente que o IP e o nome do domínio respondem à contento do que colocamos no arquivo Hosts e também que as estatísticas, temos 0% de perda, ou seja,100% de resposta para o nosso domínio fake.
De posse de nosso domínio já funcional, vamos gerar o certificado.
Recomendações importantes sobre Certificados válidos
De acordo com a OWASP (Open Web Application Security Project), para que tal site seja reconhecido como “Seguro”, faz-se necessária a compra de um certificado reconhecido internacionalmente. De posse de tal certificado, irá aparecerá o ícone de um cadeado próximo a barra de endereços do navegador, o que faz com que este cadeado apareça é justamente o certificado ser gerado com o padrão SSL v2 e seu reconhecimento quanto a qualidade deste certificado.
Criar e registrar uma Autoridade Certificadora para ser reconhecida nacional ou internacionalmente não é uma tarefa fácil e as taxas são tão altas e o esforço administrativo é tão grande que sai muito mais barato se comprar um.
Recomendamos fortemente que o leitor compre um certificado de uma Autoridade Certificadora Oficial. Na seção Links, no final deste artigo temos algumas sugestões. Deixamos bem claro que o que faremos nesta primeira seção é apenas para questões de testes, posto que não é necessária a compra de um certificado para que se use em nosso teste.
Um outro lembrete é que, para que funcione corretamente o certificado, faz-se muito importante colocar o FQDN (Full Qualified Domain Name) do servidor onde o IIS está hospedado, dentro do campo FQDN "common Name" que o programa gerador certificado solicita.
Instalando o OpenSSL
Baixe o OpenSSL do site do fabricante (vide seção Links). A versão estável existente durante a escrita deste artigo é a versão 1.0.1f.
Descompacte o OpenSSL na raiz de seu Sistema Operacional e crie alguns diretórios dentro do diretório do OpenSSL: chaves, CSRs e certificados.
Criando uma Autoridade Certificadora (CA)
Vamos criar inicialmente uma chave privada de 2048 bits, mas normalmente são criadas chaves de 1024. Podemos criar de vários tamanhos como múltiplos de 64 bits para que possamos usar em nosso CA. Vamos adicionar o caminho dos executáveis do OpenSSL ao Path do Windows com o comando da Listagem 4.
Listagem 4. Registrando o caminho do
OpenSSL no path do Sistema Operacional Windows
SET PATH=%PATH%;C:\OpenSSL-Win32\bin
O intuito deste comando é poder executar o arquivo openssl.exe de qualquer lugar dentro do console, sem a necessidade de navegarmos até o diretório onde está o openssl.exe.
Vamos navegar até o diretório do openSSL e executar o comando mostrado na Listagem 5.
Listagem 5. Navegando via console e
criando o Certificado
01 cd 02 cd OpenSSL ou cd OpenSSL-Win32 ou outro diretório escolhido
03 openssl genrsa -des3 -out chaves/CA_IIS.key 2048
Na linha 03 é executamos o comando para a nossa chave privada de onde se origina a Autoridade Certificadora. Demos o nome a ela de CA_IIS.key. Note que os diretórios que criamos facilitam e muito a organização de nosso CA. Este comando terá uma saída muito parecida com a Listagem 6.
Listagem 6. Geração do CA com saída do
Sistema
01 Loading 'screen' into random state - done
02 Generating RSA private key, 2048 bit long modulus
03 .....+++
04 ..............+++
05 e is 65537 (0x10001)
06 Enter pass phrase for chaves/CA_IIS.key: ß digite aqui a senha
07 Verifying - Enter pass phrase for chaves/CA_IIS.key: ß confirme a senha
É muito importante que tenhamos uma senha para acesso ao CA, caso contrário, virará uma grande fonte de brechas de segurança e seu certificado pode ser copiado para outros lugares e vários certificados assinados podem ser gerados caso não tenhamos uma forma de esconder a chave privada.
Lembre-se de colocar uma senha fácil de lembrar, mas difícil de se quebrar porque de nada adianta uma senha,por mais complexa que esta seja, se esta é fraca ou facilmente defectível por uma simples Engenharia Social.
Na Listagem 7 temos o conteúdo gerado de nossa chave privada.
Listagem 7. Conteúdo da Chave Privada
CA_IIS.key
C:\OpenSSL-Win32\chaves>type CA_IIS.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,8B1E6B6E96667256
H+zXJPRvlwK61Y/mQvC8hFkngT7JFO72twGIIJx2MbHZoGhOkkljNqygQaJpSYJN
4RVJ3ozrsDvTDxwEgsmc7l+FPvleryYkeMKr9z/CST2pQXk3FiLCrxbddZrDb+tF
2dazzpJhJzTBkr60ZxeFOSMMmSjWl8vbOz5VY0BDoGZzii1jc7Y9a+6WUM+3F5By
JmGmrgX3+a0s3voaTKFBrTDiRCsa/22YxTZcOUlArNlUI+NEwG1yIGqCeKM4S2iU
t/PlJ1j6AxL2a45RIrKo4sAUtB4I0f6FpjQpn1+y6AUXMJpmfda/xYTKnYSZpseb
9hOs1aPfq7OBmor1s5l22szIfi41x1e1OBFjULmgwGN5kmLSgulA2eunPoFI/6vG
gQ1NygVwnucfHGqZ7FmDBIu+ICbwNX8upYtzYa9HjFej2WwHUNuwy8YMUYy7Dsht
5RqzacEBQ8BRpu5be7mMMRZfZnuec+GIzs1aTeSlHc5+4lYTNzyCU6OFexCtqwzA
q2h4z2enYsyW+LjMZfZz8hc2QZG4JBf7F0Dsj5AqVdNOZf1RX9AIA/xJf7dudpRi
Ra+0b9NuhJgH1MMMsQ+gy3NS821Sw0BNIxEktwrJl3tLK3UrJl7KfNZw5sZvXPS+
m9hKsDngHIg/QSPDGjOgfEG1WV083+8v4fZ69g7fUKf9qSJVW4AxBmtHLUIkZsPA
6UfJf1cw+oePBLYUs8ZzD3X0Uf/Ay960+lhi9g4/BVKiv/tZRieitbTGWV7TlLOn
f4BHwuEjLJn6ZHOm+LdCQc1NmSWf96PMWnRiyAw03SVEjToZMmpUhzjY0aPFic9O
u3Q2Q2I6LLfzhDcHXJvd38szxnHhCfkOxeZSsTCSKM6UAuV8WG/IN/UW+3RzGkxh
DAwNi2Lmcmrx8gMVJuhqe1Vlt2mEHnZGOUdYK2+a1z1E1F+LioMqSciSzFckhgTO
BAZk2PGkbTVAUIk+aEcAdQkhwCRnFrbVv+UduBQlhJ5Cxy8lb6UFaY37Ju8S6kpc
gHmLMhSMLyageV6suxih58tguiH8rtoO1YOqHKT7uh7QP8XDvKAWYf3pNqiv7vOp
KSmJdCmn6WO9qerqEUSlZGmX7vIoolUH/h3uSO+dtAMnNA+kwiIfBFVwU3fj5oM8
ijjRQgKObgYVQr93+tSA/KNe6NpfQLgxChq6LpRLtBhIFRZs48UrWo0zonZJnHxm
Zhu/lEJBFa50ElK03Ywdyi2WUscXb2tptiUaNqy4ekvjgX2L8spaGJrg3SpXt5+U
OuAo5HGlkcsKVw5XDNewqfVFBN2gt84Ui4knwmDapbiga+DlGoyEhgHWWZehrSTp
W+VjxlWSsU238cpI2CJuTJPQ9QGU5t9oMqP9YhJc/a7rYlBMGRcdyYmcdjNHrfyY
/mmom5aqsMej/2F8hn/a1urfZBRqUWM3vpGIvxZ46BTHRsb8Z+osKR3bn7aSejiy
M4S9V+yQ3qBXPgU1Y4GubWrvfI8x75jC3494OTX9cUoyaxyPVNZgQdDBvgcsvN1S
fPLid+ILfnDXwRTUwQvNHfham6U8RT+/OFlTvfpa081LuSVURDzAdA==
-----END RSA PRIVATE KEY-----
Quanto maior o tamanho da chave, mais complexo é o hash e mais tempo consumirá do servidor em processar a validação ou challenging entre a Chave Pública e a Chave Privada. Temos de levar a performance em consideração quando pensarmos no tamanho das chaves.
A criptografia existe para aumentar a segurança e estabilidade, mas também pode ser um ônus à infraestrutura se não for projetada da forma correta.
Depois de criada a CA, vamos gerar o Certificado principal que é o que utilizaremos para assinar outros certificados. Informamos que o algoritmos de criptografia utilizado é o 3DES, bem seguro ainda, de acordo com informações colhidas nos sites de segurança e dos desenvolvedores do do OpenSSL.
Gerando o Certificado Mestre
Ainda no mesmo prompt vamos criar o Certificado Mestre em um diretório diferente. Na Listagem 8 temos a sintaxe de geração.
Listagem 8. Gerando certificado Master
sob o CA
01 cd ..
02 C:\OpenSSL-Win32>openssl req -new -x509 -days 365 -key chaves\CA_IIS.key -out certificados\certMasterCA_IIS.cer
Ao se executar este comando, somos forçados a preencher certos dados bem simples, mas que para a geração do certificado são muito importantes.
Como podemos ver, somos sempre forçados a utilizar a CA, utilizada em -key chaves\CA_IIS.key para a criação dos certificados e sua posterior assinatura
Ao gerarmos um certificado do tipo aceito pelo IIS, devemos preencher os dados como na Listagem 9. A linha 15 deve ser idêntica ao mostrado, já as outras perguntas podem ser respondidas de acordo com as informações pertinentes ao leitor.
Listagem 9. Informações para a geração
do certificado
01 Enter pass phrase for chaves\CA_IIS.key:
02 Loading 'screen' into random state - done
03 You are about to be asked to enter information that will be incorporated
04 into your certificate request.
05 What you are about to enter is what is called a Distinguished Name or a DN.
06 There are quite a few fields but you can leave some blank
07 For some fields there will be a default value,
08 If you enter '.', the field will be left blank.
09 -----
10 Country Name (2 letter code) [AU]:BR
11 State or Province Name (full name) [Some-State]:Rio de Janeiro
12 Locality Name (eg, city) []:Rio de Janeiro
13 Organization Name (eg, company) [Internet Widgits Pty Ltd]:DevMedia
14 Organizational Unit Name (eg, section) []:Revista .NET Magazine
15 Common Name (e.g. server FQDN or YOUR name) []:www.projetoowasp01.com.br
16 Email Address []:autorgabrielsimas@gmail.com
A primeira pergunta que foi feita ao executar este comando foi justamente a inserção da senha do CA. Já na linha 08 o openssl informa ao leitor que basta colocar o ".", sem as aspas, para que a resposta seja a padrão, porém, é obrigatória a inserção do FQDN, senão receberemos erros tais como: "A Autoridade certificadora não é reconhecida", dentre outros durante o uso dos certificados." [...] continue lendo...
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo