SSL/TLS e Autenticação
Aula 3 de 5
SSL/TLS com mod_ssl
Habilitando mod_ssl
# Debian/Ubuntu
sudo a2enmod ssl
sudo systemctl reload apache2
# Verificar se SSL está disponível
sudo apache2ctl -M | grep ssl
# Portas de escuta (ports.conf)
Listen 443
<IfModule ssl_module>
Listen 443
</IfModule>
Configuração básica de VirtualHost SSL
<VirtualHost *:443>
ServerName site.com
DocumentRoot /var/www/site
SSLEngine on
SSLCertificateFile /etc/ssl/certs/site.crt
SSLCertificateKeyFile /etc/ssl/private/site.key
SSLCertificateChainFile /etc/ssl/certs/chain.crt
<Directory /var/www/site>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/site_ssl_error.log
CustomLog ${APACHE_LOG_DIR}/site_ssl_access.log combined
</VirtualHost>
Let's Encrypt com Certbot
# Instalar Certbot
sudo apt install certbot python3-certbot-apache -y
# Obter certificado (modo automático Apache)
sudo certbot --apache -d site.com -d www.site.com
# Obter certificado (apenas arquivos)
sudo certbot certonly --standalone -d site.com
# Renovação automática (teste)
sudo certbot renew --dry-run
# Verificar renovação automática (systemd)
sudo systemctl list-timers | grep certbot
# Listar certificados
sudo certbot certificates
# Renovação manual se necessário
sudo certbot renew
sudo systemctl reload apache2
Configuração SSL Avançada
<VirtualHost *:443>
ServerName site.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/site.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/site.com/privkey.pem
# Protocolos seguros (TLS 1.2 e 1.3 apenas)
SSLProtocol -all +TLSv1.2 +TLSv1.3
# Ciphers modernos
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES:!CAMELLIA:!DES:!RC4:!DSS:!PSK:!SRP:!kEDH
SSLHonorCipherOrder on
# OCSP Stapling
SSLUseStapling On
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors Off
SSLStaplingCache "shmcb:${APACHE_RUN_DIR}/ssl_stapling_cache(128000)"
# HSTS
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# Session cache
SSLSessionCache "shmcb:${APACHE_RUN_DIR}/ssl_cache(512000)"
SSLSessionTickets Off
</VirtualHost>
Verificação de Segurança SSL
# Testar configuração SSL
openssl s_client -connect site.com:443 -tls1_2
# Verificar certificado
openssl x509 -in /etc/ssl/certs/site.crt -text -noout
# Verificar chain
openssl s_client -connect site.com:443 -showcerts
# Testar vulnerabilidades (site externo)
curl https://www.ssllabs.com/ssltest/analyze.html?d=site.com
Autenticação Basic e Digest
Autenticação Basic
# Criar arquivo de senhas
sudo htpasswd -c /etc/apache2/.htpasswd admin
# (será solicitada a senha)
# Adicionar mais usuários
sudo htpasswd /etc/apache2/.htpasswd usuario2
# Verificar arquivo
sudo cat /etc/apache2/.htpasswd
# No VirtualHost ou .htaccess
<Location /admin>
AuthType Basic
AuthName "Área Restrita"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Location>
# Usuário específico
<Location /admin>
AuthType Basic
AuthName "Acesso Restrito"
AuthUserFile /etc/apache2/.htpasswd
Require user admin
</Location>
Autenticação Digest (mais segura que Basic)
# Criar arquivo de senhas digest
sudo htdigest -c /etc/apache2/.htdigest "Área Restrita" admin
# Habilitar módulo
sudo a2enmod auth_digest
<Location /admin>
AuthType Digest
AuthName "Área Restrita"
AuthDigestProvider file
AuthUserFile /etc/apache2/.htdigest
Require valid-user
</Location>
Autenticação com LDAP
# Habilitar módulos LDAP
sudo a2enmod ldap authnz_ldap
<Location /intranet>
AuthType Basic
AuthName "LDAP Authentication"
AuthBasicProvider ldap
AuthLDAPURL "ldap://ldap.exemplo.com:389/ou=users,dc=exemplo,dc=com?uid?sub?(objectClass=inetOrgPerson)"
AuthLDAPBindDN "cn=admin,dc=exemplo,dc=com"
AuthLDAPBindPassword "senha_segura"
Require valid-user
# Restringir a grupo específico
Require ldap-group cn=apache-access,ou=groups,dc=exemplo,dc=com
</Location>
Autenticação com Certificado de Cliente
<VirtualHost *:443>
SSLEngine on
# Certificado do servidor
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
SSLCACertificateFile /etc/ssl/certs/ca.crt
# Exigir certificado do cliente
SSLVerifyClient require
SSLVerifyDepth 2
# Opcional: não exigir, mas verificar se presente
# SSLVerifyClient optional_no_ca
<Location /admin>
Require valid-user
# Ou mapear certificado para usuário
Require ssl-verify-client
</Location>
</VirtualHost>
Lab: HTTPS com Let's Encrypt + Autenticação
Configure um site com HTTPS e área administrativa autenticada.
# 1. Instalar Certbot
sudo apt install certbot python3-certbot-apache -y
# 2. Criar VirtualHost HTTP para validação
cat << 'VHOST' | sudo tee /etc/apache2/sites-available/secure-site.conf
<VirtualHost *:80>
ServerName secure.exemplo.com
DocumentRoot /var/www/secure
<Directory /var/www/secure>
Options -Indexes
Require all granted
</Directory>
</VirtualHost>
VHOST
# 3. Habilitar e testar
sudo a2ensite secure-site.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
# 4. Obter certificado Let's Encrypt
sudo certbot --apache -d secure.exemplo.com
# 5. Configurar HSTS e SSL no VirtualHost 443
# (usar o bloco de configuração SSL avançada acima)
# 6. Criar autenticação para /admin
sudo mkdir -p /var/www/secure/admin
echo "<h1>Admin Panel</h1>" | sudo tee /var/www/secure/admin/index.html
sudo htpasswd -c /etc/apache2/.htpasswd admin
# 7. Adicionar proteção ao admin
cat << 'HTACCESS' | sudo tee /var/www/secure/admin/.htaccess
AuthType Basic
AuthName "Painel Administrativo"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
HTACCESS
# 8. Testar
curl -I https://secure.exemplo.com
curl -I https://secure.exemplo.com/admin
# (deve retornar 401 Unauthorized)
SSL/TLS não é opcional — é requisito mínimo de segurança. Use Let's Encrypt para certificados gratuitos, HSTS para forçar HTTPS e autenticação forte para áreas restritas.