kb.erickguedes.com
Apache HTTP Server: Configuração e Administração

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.