A autenticação por parte dos utilizadores em múltiplos serviços dentro da organização é uma necessidade fundamental para a operação do dia a dia. Não só a autenticação dos utilizadores é importante, com a crescente corrente de perigos e ameaças é cada vez mais fundamental a existência de um modelo de autenticação que verifique ambas as partes, tanto os utilizadores como os serviços.
Neste artigo vai ser exposto um caso exemplo, sobre como implementar uma PKI (Public Key Infrastructure) interna numa organização. Em seguida, é apresentada a configuração de um servidor web (Apache) com autenticação da parte do cliente e da parte do servidor, usando certificados digitais, e por fim, vai também ser configurado um serviço OCSP (Online Certficate Status Protocol) para verificar a validade e revogação de certificados.
NOTA: Convém salientar que esta configuração foi realizada numa máquina com o SO CentOS7 instalado; no entanto, a larga maioria dos passos/comandos endereçados são similares noutras distribuições, podendo haver pequenas alterações na sua sintaxe.
Criação de PKI com OpenSSL
Para começar, deve-se instalar o OpenSSL na máquina:
yum install openssl
Em seguida; por gosto pessoal, e para manter alguma estrutura e organização na pasta onde vão estar os ficheiros gerados para a CA (Entidade Certificadora); acedemos ao directório da CA em (/etc/pki/CA) e criam-se 3 novas directorias:
cd /etc/pki/CA #guardar as chaves; mkdir private #guardar os requests de certs a serem assinados pela CA; mkdir requests #certificados gerados; mkdir certs #pasta para os certificados no formato PKCS12; mkdir pkcs12
Depois dos pequenos passos preparatórios pode-se iniciar a criação da PKI, começando pela CA:
#Criação da Chave da CA openssl genrsa -des3 -out /etc/pki/CA/private/cakey.pem
#Criação do certificado da CA openssl req -new -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/ca.crt
#Criação do certificado x509 da CA openssl x509 -req -days 3650 -in /etc/pki/CA/ca.crt -out /etc/pki/CA/cacert.pem -signkey /etc/pki/CA/private/cakey.pem
Pode-se validar as informações no certificado x509 com o comando:
openssl x509 -in /etc/pki/CA/cacert.pem -text
Antes de prosseguir com a criação dos certificados para os serviços ou utilizadores ,deve-se ainda executar mais alguns passos adicionais, nomeadamente:
#criação da diretoriade controlo interno OpenSSL mkdir /etc/pki/CA/newcerts #Ficheiro que serve como BD ao OpenSSL com a info dos certificados emitidos touch /etc/pki/CA/index.txt #Ficheiro com o número sequencial de certificados emitidos echo 01 > /etc/pki/CA/serial
Criação de um utilizador
De seguida pode-se criar um utilizador validado pela CA interna. Para esse efeito, podemos executar os seguintes comandos:
#criação de uma chave para o utilizador openssl genrsa -des3 -out /etc/pki/CA/private/hvalentim.key #Criação de um CSRF para o utilizador openssl req -new -key /etc/pki/CA/private/hvalentim.key -out /etc/pki/CA/requests/hvalentim.csr
#emissão do certificado com base no CSR openssl ca -in /etc/pki/CA/requests/hvalentim.csr -cert /etc/pki/CA/cacert.pem -keyfile /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/certs/hvalentim.crt
#exportar certificado em formato PKCS12 openssl pkcs12 -export -out /etc/pki/CA/pkcs12/hvalentim.p12 -inkey /etc/pki/CA/private/hvalentim.key -in /etc/pki/CA/certs/hvalentim.crt -certfile /etc/pki/CA/cacert.pem
NOTA: Durante o processo de criação do certificado; no campo CN; deve-se colocar o nome do utilizador.
Apache e Certificados
Depois da criação do utilizador com sucesso, é agora altura de criar um certificado para o servidor Apache e, em seguida, configurá-lo para usar o certificado.
A criação do certificado pode ser conseguida através dos seguintes comandos:
#criação de uma chave para o Apache openssl genrsa -des3 -out /etc/pki/CA/private/web.key #Criação de um CSRF para o Apache openssl req -new -key /etc/pki/CA/private/web.key -out /etc/pki/CA/requests/web.csr #emissão do certificado com base no CSR openssl ca -in /etc/pki/CA/requests/web.csr -cert /etc/pki/CA/cacert.pem -keyfile /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/certs/web.crt
NOTA: No campo CN deve-se colocar o TLD (Top Level Domain) do servidor web, por ex. “teste.com”. Neste caso, em específico, o domínio escolhido foi “seguranca.ssl”. Posteriormente, e para a que a máquina consiga traduzir este domínio, pode-se adicionar uma entrada no ficheiro “/etc/hosts”.
Com o certificado criado, pode-se proceder com a instalação do Apache:
#INSTALAÇÃO APACHE yum install httpd systemctl start httpd systemctl enable httpd #configuração da Firewall firewall-cmd --add-port=80/tcp --permanent firewall-cmd --add-port=443/tcp --permanent firewall-cmd --reload
Em seguida, é necessário fazer alterações às configurações do ssl (https) do Apache. Para isso, é necessário ed o ficheiro “/etc/httpd/conf.d/ssl.conf” e modificar as linhas necessárias:
nano /etc/httpd/conf.d/ssl.conf SSLCertificateFile /etc/pki/CA/certs/web.crt SSLCertificateKeyFile /etc/pki/CA/private/web.key SSLCACertificateFile /etc/pki/CA/cacert.pem
Finalmente, é necessário reiniciar o serviço:
systemctl restart httpd
Nesta altura, pode-se abrir um navegador de Internet e colocar no endereço “seguranca.ssl” e ver que o apache está a funcionar, como mostrado na imagem seguinte:
Em contraste, se agora colocar na barra “https://seguranca.ssl” deve ser emitido um erro (como mostrado na imagem seguinte) devido ao facto de o certificado não ser reconhecido uma vez que foi auto-assinado (self-signed) pela CA não confiável (not trusted); e que é interna. A maneira clássica para resolver esta situação é a de adicionar uma excepção para a página clicando em “Avançado”.
Como neste caso está a ser tratado um caso de uma organização que está a criar uma PKI interna, o ideal é adicionar o certificado da CA ao navegador de Internet, assim todos os sites/utilizadores validados pela CA serão reconhecidos.
Aqui fica demonstrado como fazer essa importação com o navegador Firefox. As configurações podem depender um pouco do navegador utilizado, e os sistemas antivírus endpoint-protection também podem ter influência nessa configuração.
Para avançar com essa tarefa é necessário aceder ao menu de “Preferências” do Firefox;
De seguida, abrir a tab “Privacidade e Segurança”, e em seguida “Ver Certificados”;
Na tab “Autoridades” clicar em “importar” e escolher o certificado da CA “cacert.pem”;
Pode-se ver os detalhes do certificado no processo de importação;
Deve, de seguida, escolher o tipo de permissões para a nova CA;
Após a importação da CA para o navegador, podemos fazer refresh da página e observar que o browser reconhece agora o novo domínio como seguro.
Autenticação de Clientes
Chegou agora a altura de validar que só os utilizadores com certificados têm acesso ao servidor web (apache) que foi configurado na secção anterior.
Para tal, é necessário novamente editar o ficheiro “/etc/httpd/conf.d/ssl.conf” e descomentar as linhas seguintes:
nano /etc/httpd/conf.d/ssl.conf #UNCOMENT SSLVerifyClient require SSLVerifyDepth 10
Em seguida, deve ser reiniciado o serviço novamente:
systemctl restart httpd
Neste momento, e voltando via navegador web ao endereço “https://seguranca.ssl”, não é possível carregar a página. É apresentado um erro como o ilustrado na imagem seguinte.
Isto deve-se ao facto de neste momento o Apache apenas autorizar utilizadores com a CA configurada anteriormente aceder à página. Para resolver este problema deve-se importar o certificado do utilizador para o navegador.
Para executar essa tarefa, deve-se aceder novamente à área de gestão de certificados, e desta vez, na tab “Os seus certificados”, importar o certificado do utilizador;
Neste momento, e tentando novamente abrir a página pelo navegador de Internet, deve-se ver algo como na imagem seguinte, onde o navegador solicita ao utilizador qual o certificado que pretende utilizar (para o caso de ter mais que uma opção):
Após a validação, a página abrirá novamente.
OCSP – Revogação e validação de certificados
Com a autenticação de clientes já configurada, é altura de tratar do problema da revogação de certificados.
É comum em instituições ser necessário revogar certificados antes do fim da sua data de validade (por exemplo se um colaborador deixar de pertencer a essa instituição). A forma mais comum de informar os serviços, destas revogações é através de uma lista de revogação (CRL).
O maior problema com esta abordagem é que após a criação (ou alguma actualização) a uma CRL é necessário distribuir manualmente (embora se possa automatizar a tarefa) pelas diferentes máquinas e serviços que possam necessitar dessa informação.
Existe, no entanto, uma outra solução que é disponibilizar um serviço web que responde a pedidos dessa natureza e verifica assim a validade dos certificados revogados.
Disponibilização do serviço OCSP
A primeira etapa é disponibilizar o serviço em si. Neste cenário, tal pode ser obtido com um único comando, mas é necessário também configurar a firewall:
#Configuração da Firewall firewall-cmd --add-port=81/tcp --permanent firewall-cmd --reload #Colocar OCSP em funcionamento openssl ocsp -index /etc/pki/CA/index.txt -port 81 -rsigner /etc/pki/CA/cacert.pem -rkey /etc/pki/CA/private/cakey.pem -CA /etc/pki/CA/cacert.pem -text -out /var/log/ocsp_log.txt
Neste momento, o serviço encontra-se a correr na porta 81. Para optimização o ideal é criar um serviço para executar este comando, ou de maneira mais simples, colocar o comando num ficheiro de boot, como por exemplo o “/etc/rc.local” ( um detalhe que não será abordado neste tutorial).
Com o serviço a correr, devemos configurar o Apache para fazer a validação dos certificados via o OCSP. Para isso, devemos adicionar ao ficheiro “/etc/httpd/conf.d/ssl.conf” as seguintes linhas:
nano /etc/httpd/conf.d/ssl.conf SSLOCSPEnable on SSLOCSPDefaultResponder http://localhost:81 SSLOCSPOverrideResponder off
E reiniciar o Apache:
systemctl restart httpd
NOTA: Neste caso o campo SSLOCSPDefaultResponder tem o valor “http://localhost:81” pois o Apache e OCSP correm na mesma máquina. Em caso contrário, deve-se sempre substituir “localhost” pelo IP/Domínio da máquina onde corre o serviço OCSP.
Para além de configurar o Apache para validar a revogação dos certificados dos clientes via OCSP, também é importante configurar o navegador de Internet para validar o certificado. No caso do Firefox, tal pode ser obtido nas configurações, como mostrado na imagem seguinte.
Neste momento é a altura mais oportuna para ver o OCSP em ação na revogação de um certificado.
Para revogar o certificado usa-se o seguinte comando:
openssl ca -revoke /etc/pki/CA/certs/hvalentim.crt -keyfile /etc/pki/CA/private/cakey.pem -cert /etc/pki/CA/cacert.pem
De seguida tentando aceder pelo navegador de Internet ao endereço “https://seguranca.ssl” pode-se observar o erro de certificado revogado.
E também se pode observar o mesmo na máquina onde corre o serviço OCSP abrindo o log (definido no comando do OCSP) neste caso “/var/log/ocsp_log.txt”
Como é possível observar, combinar certificados digitais permite obter um ambiente PKI confiável para protecção robusta de identidade, um ecossistema autenticando ponto a ponto e também garantindo a integridade desse mesmo dispositivo.
Espero que achem útil mais este tutorial. Deixem os vossos comentários, sugestões e dúvidas.