BOMBOLOM.COM

(http) Configuração de um site seguro no Apache - Debian

Hoje em dia, a necessidade de fazer login em sites remotos, ou de aceder a informação sensível é generalizada. Estas comunicações fazem-se quase sempre sem serem encriptadas, pelo que estão sujeitas a serem "ouvidas" por terceiros. Se estivermos a falar de um ambiente corporativo isto ainda é mais verdade, dado que há incentivos para serem os próprios empregados a fazerem estas escutas.

Um factor na solução destes problemas é termos estes acessos encriptados. É este aspecto que vamos discutir neste documento, aplicado ao servidor Apache.

Naturalmente que não se devem esquecer os outros factores de segurança, quer físicos, quer a nível de software (firewalls, updates do sistema, desligar os serviços desnecessários, etc...). Também se deve ter o cuidado de não esquecer que termos um site encriptado não significa automaticamente que estamos imunes a ataques, as regras de segurança devem ser sempre seguidas.

Apesar deste documento ter sido escrito específicamente para o Debian, toda a informação nele contida é facilmente aplicável a qualquer outra distribuição de Linux, uma vez que se utilizam as ferramentas do próprio OpenSSL para a maior parte da configuração. Por exemplo, no SuSE, apenas muda a forma como se configura o servidor virtual do Apache e como se activa o módulo SSL.

A configuração de um servidor virtual no Apache foi discutida noutro documento. Este documento pode ser dividido em quatro partes:

Instalar e configurar a biblioteca OpenSSL

Vamos agora, além de instalar a biblioteca, criar a infra-estrutura necessária para sermos a nossa própria autoridade certificadora (CA). Se só quisermos ter o nosso certificado assinado por uma CA (como a VeriSign), naturalmente que não criamos a nossa CA!

Se quisermos apenas fazer uma requisição de certificado para ser enviado a uma autoridade certificadora, deve-se sempre seguir os procedimentos descritos nos respectivos sites.

A instalação é muito fácil, basta fazer:

# apt-get install openssl

A seguir é necessário criar a infra-estrutura para as chaves publicas. É aqui que vai ser feita toda a administração das chaves geradas. Deve-se escolher uma directoria apropriada para o efeito:

# mkdir /arquivo/empresaCA
# cd /arquivo/empresaCA
# mkdir certs private
# chmod 0700 private
# echo '01' > serial
# touch index.txt

As chaves privadas devem sempre ser mantidas secretas, por isso mudámos as permissões da directoria private.

O ficheiro de configuração do OpenSSL que vem com o Debian é um pouco intimidante (/etc/ssl/openssl.cnf), por isso vamos criar o nosso próprio ficheiro de configuração em /arquivo/empresaCA/openssl.cnf.

[ ca ]
default_ca = empresaca

[ empresaca ]
dir             = /arquivo/empresaCA
certificate     = $dir/cacert.pem
database        = $dir/index.txt
new_certs_dir   = $dir/certs
private_key     =  $dir/private/cakey.pem
serial          =  $dir/serial

default_crl_days = 7
default_days     = 365
default_md       = md5

policy           = empresaca_policy
x509_extensions  = certificate_extensions

[ empresaca_policy ]
commonName              = supplied
stateOrProvinceName     = supplied
countryName             = supplied
emailAddress            = supplied
organizationName        = supplied
organizationalUnitName  = optional

[ certificate_extensions ]
basicConstraints = CA:false

[ req ]
default_bits       = 2048
default_keyfile    = /arquivo/empresaCA/private/cakey.pem
default_md         = md5
prompt             = no
distinguished_name = root_ca_distinguished_name
x509_extensions    = root_ca_extensions

[ root_ca_distinguished_name ]
commonName          = CA de exemplo da Empresa
stateOrProvinceName = Lisboa
countryName         = PT
emailAddress        = ca@empresaca.com
organizationName    = Autoridade de Certificacao

[ root_ca_extensions ]
basicConstraints = CA:true

Por omissão os utilitários da biblioteca vão utilizar o ficheiro de configuração que vem com o pacote. Por isso é necessário indicar o novo ficheiro de configuração:

# OPENSSL_CONF=/arquivo/empresaCA/openssl.cnf
# export OPENSSL_CONF

Notar que toda a informação necessária para criar o certificado da CA foi incluído neste ficheiro de configuração. Isto é prático dado que ficamos com um registo completo de como foi criada a CA. No entanto não podemos usar este ficheiro de configuração para criar os pedidos de certificado!

Agora podemos criar o certificado raíz (auto assinado):

# openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM
Generating a 2048 bit RSA private key
..........................................+++
.......+++
writing new private key to '/arquivo/empresaCA/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----

É pedida uma palavra passe, esta vai ser necessária para assinar os certificados que criarmos. Naturalmente que deve ser mantida absolutamente secreta!

Para verificar o conteúdo do certificado fazer:

# openssl x509 -in cacert.pem -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            ab:4b:c1:28:90:88:af:12
        Signature Algorithm: md5WithRSAEncryption
        Issuer: CN=CA de exemplo da Empresa, ST=Lisboa, C=PT/emailAddress=ca@empresaca.com, O=Autoridade de Certificacao
        Validity
            Not Before: Jun  5 10:52:27 2007 GMT
            Not After : Jul  5 10:52:27 2007 GMT
        Subject: CN=CA de exemplo da Empresa, ST=Lisboa, C=PT/emailAddress=ca@empresaca.com, O=Autoridade de Certificacao
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    00:c3:9a:a7:9f:6a:8e:89:11:d2:1b:23:69:e4:b7:
                    dd:58:bf:0d:48:f5:3a:e1:6a:f2:cb:1a:37:8c:2c:
                    de:15:33:53:7d:c3:2d:04:04:9e:6c:53:33:2c:3f:
                    a9:dd:6b:4e:57:8e:f2:ff:e7:8f:0e:d4:1e:30:d4:
                    67:f3:42:c8:1c:96:2c:e7:ad:e0:75:3a:4f:c2:90:
                    14:93:c5:7d:8b:91:e2:ef:78:e1:20:92:af:08:8c:
                    d4:7d:cf:1d:48:56:bf:3c:df:ac:af:3c:43:db:f1:
                    8e:b2:ec:3f:26:d1:51:b0:18:13:d0:dd:5b:f1:ec:
                    ff:37:fd:0d:0f:83:33:b8:f3:71:1a:fa:ca:c1:74:
                    23:18:95:6b:8e:db:6d:b7:af:92:ad:91:e4:1b:8f:
                    82:ec:99:f3:87:6e:b6:72:74:73:26:aa:1c:1a:a9:
                    7f:9b:5b:e4:93:cc:98:fd:f9:6c:0a:a7:f8:78:78:
                    cc:ff:51:36:21:bc:68:24:b8:e6:5f:55:6b:44:4c:
                    f9:c2:7e:b9:56:94:b4:49:44:80:db:47:93:d2:00:
                    40:9b:b1:46:c1:73:ae:21:a5:68:16:a9:5a:f5:e1:
                    06:3e:0e:8e:2b:bd:06:60:ac:9b:23:aa:f4:69:54:
                    5f:e0:66:05:cc:c6:6d:9b:1b:56:98:68:f1:bb:d7:
                    23:df
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: md5WithRSAEncryption
        3d:aa:42:0f:cc:cf:92:ac:7e:fe:4a:47:93:2f:b1:6e:07:50:
        22:fd:62:b2:37:03:f0:c6:82:4f:cf:a4:cf:cd:d4:88:ef:a3:
        12:9a:9e:56:8b:79:55:8b:90:8b:ff:10:92:b2:0e:2a:01:0e:
        ed:8c:8a:78:bd:f5:1e:e7:c7:69:1a:5a:7d:37:51:ff:bd:19:
        02:f8:fb:0c:c6:db:93:6c:f2:39:6e:42:fb:1f:3b:cd:1c:b5:
        34:79:71:fa:9f:6c:ff:35:47:ec:bb:1c:e5:c2:52:70:d4:0f:
        a8:9d:0a:55:35:74:3d:68:4c:ea:c3:0e:10:42:e7:c9:e7:3d:
        67:a7:66:ec:0e:6e:94:a5:c7:de:38:f8:70:5e:0f:77:e2:b7:
        e3:00:66:fa:d1:35:cc:5d:65:27:f5:1c:aa:83:58:bd:67:77:
        b3:91:bb:57:bf:af:df:6c:4c:97:d8:90:aa:c0:a5:00:55:1a:
        da:35:b4:2f:19:18:bd:60:51:c7:5c:c6:72:76:9d:32:48:75:
        3d:3a:31:c3:0a:3c:e5:86:f7:cc:68:84:50:c5:b5:64:4c:ba:
        05:45:bd:72:ae:1c:0f:f0:be:5d:fb:5f:bc:7a:8f:24:85:a4:
        06:26:35:14:d3:dc:53:16:16:61:5b:4e:e7:31:7f:4e:47:b4:
        df:51:07:62

Criar o certificado do site

Antes de termos o certificado vamos ter de gerar um pedido de certificado, que depois é enviado à CA, que por sua vez nos devolve o certificado assinado. Numa directoria diferente de /arquivo/empresaCA, e utilizando o ficheiro de configuração por omissão (usar por exemplo outra janela de consola), fazer:

# mkdir /arquivo/requests
# cd /arquivo/requests
# openssl req -newkey rsa:1024 -keyout sitekey.pem -keyform PEM -out sitereq.pem
Generating a 1024 bit RSA private key
......................................++++++
................++++++
writing new private key to 'sitekey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:PT
State or Province Name (full name) [Some-State]:Lisboa
Locality Name (eg, city) []:Lisboa
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Empresa de Exemplo
Organizational Unit Name (eg, section) []:TI
Common Name (eg, YOUR name) []:secreto.empresa-exemplo.com
Email Address []:webmaster@empresa-exemplo.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:Teste Teste Teste
An optional company name []:

Tal como para o certificado da CA, é-nos pedida uma palavra passe ao principio, esta vai ser necessária para iniciar o apache (ou qualquer outro serviço em que utilizemos o certificado). Esta palavra passe é utilizada para encriptar a chave privada. Escusado será dizer, que a palavra passe e a chave privada devem ser mantidas secretas.

Outra nota importante é o Common Name que deve corresponder ao FQDN do site para o qual estamos a requisitar o certificado.

São criados dois ficheiros:

Não esquecer de mudar as permissões da chave privada:

# chmod 0400 /arquivo/requests/sitekey.pem

A A challenge password é incluída na requisição do certificado mas, tirando isto, é ignorada pelo OpenSSL. Há no entanto algumas CA que fazem uso dela.

Podemos verificar o conteúdo da requisição fazendo:

# openssl req -in sitereq.pem -text -noout
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=PT, ST=Lisboa, L=Lisboa, O=Empresa de Exemplo, OU=TI, CN=secreto.empresa-exemplo.com/emailAddress=webmaster@empresa-exemplo.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:ab:df:42:33:0a:88:e8:dc:7a:33:5b:1b:f5:d3:
                    84:83:49:81:95:c2:9b:34:d8:88:8b:c0:0a:74:a2:
                    15:1a:d7:03:9d:6c:f8:91:8e:35:3a:16:c2:33:10:
                    5f:5f:4b:35:2f:54:6a:f7:b8:b5:ce:42:b4:21:1b:
                    e0:39:71:5e:c7:05:9d:1b:70:70:db:1c:d1:23:5b:
                    e2:92:b7:cb:46:b7:26:4c:c7:f7:26:2b:02:75:54:
                    fd:6d:68:6b:96:35:78:1c:5f:23:3f:d9:fe:fc:96:
                    e7:c3:bf:3a:45:91:2e:71:cb:6a:77:5a:af:3d:53:
                    0d:04:25:a8:bf:37:d9:7b:1d
                Exponent: 65537 (0x10001)
        Attributes:
            challengePassword        :Teste Teste Teste
    Signature Algorithm: sha1WithRSAEncryption
        a0:46:9b:85:05:51:23:2b:b1:6d:41:3d:31:88:14:40:23:33:
        17:76:26:1f:09:fc:0c:72:83:05:05:74:48:9f:9f:3f:52:cb:
        9b:1b:0f:b9:d0:1f:bf:2e:74:b8:bc:c4:d8:e8:cd:c0:98:4c:
        6c:a7:2e:1f:95:e4:0d:20:9f:c4:26:25:6c:84:90:37:1a:eb:
        de:33:6a:ae:d0:c5:12:5e:3d:9b:81:75:32:9c:c2:f7:90:53:
        81:80:31:54:7b:66:0f:55:40:b5:b7:00:06:52:71:f2:b1:89:
        dc:da:62:55:f2:47:af:ad:88:1c:02:d5:5c:2f:8b:cb:1a:ad:
        96:ee

Resta-nos agora fazer com qu a nossa CA assine a requisição de certificado. Notar que devemos garantir que o ficheiro de configuração usado neste caso vai se o da CA, i.e., /arquivo/empresaCA (se seguio a sujestão dada mais atrás basta voltar para a janela onde criou a CA, se não tem de voltar a exportar a variável da shell OPENSSL_CONF, como se mostra mais acima):

# openssl ca -in /arquivo/requests/sitereq.pem -notext
Using configuration from /arquivo/empresaCA/openssl.cnf
Enter pass phrase for /arquivo/empresaCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'PT'
stateOrProvinceName   :PRINTABLE:'Lisboa'
localityName          :PRINTABLE:'Lisboa'
organizationName      :PRINTABLE:'Empresa de Exemplo'
organizationalUnitName:PRINTABLE:'TI'
commonName            :PRINTABLE:'secreto.empresa-exemplo.com'
emailAddress          :IA5STRING:'webmaster@empresa-exemplo.com'
Certificate is to be certified until Jun  4 12:05:11 2008 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
-----BEGIN CERTIFICATE-----
MIIDKTCCAhGgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBhzEhMB8GA1UEAxMYQ0Eg
ZGUgZXhlbXBsbyBkYSBFbXByZXNhMQ8wDQYDVQQIEwZMaXNib2ExCzAJBgNVBAYT
AlBUMR8wHQYJKoZIhvcNAQkBFhBjYUBlbXByZXNhY2EuY29tMSMwIQYDVQQKExpB
dXRvcmlkYWRlIGRlIENlcnRpZmljYWNhbzAeFw0wNzA2MDUxMjA1MTFaFw0wODA2
MDQxMjA1MTFaMIGcMSQwIgYDVQQDExtzZWNyZXRvLmVtcHJlc2EtZXhlbXBsby5j
b20xDzANBgNVBAgTBkxpc2JvYTELMAkGA1UEBhMCUFQxLDAqBgkqhkiG9w0BCQEW
HXdlYm1hc3RlckBlbXByZXNhLWV4ZW1wbG8uY29tMRswGQYDVQQKExJFbXByZXNh
IGRlIEV4ZW1wbG8xCzAJBgNVBAsTAlRJMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
iQKBgQCr30IzCojo3HozWxv104SDSYGVwps02IiLwAp0ohUa1wOdbPiRjjU6FsIz
EF9fSzUvVGr3uLXOQrQhG+A5cV7HBZ0bcHDbHNEjW+KSt8tGtyZMx/cmKwJ1VP1t
aGuWNXgcXyM/2f78lufDvzpFkS5xy2p3Wq89Uw0EJai/N9l7HQIDAQABow0wCzAJ
BgNVHRMEAjAAMA0GCSqGSIb3DQEBBAUAA4IBAQAG+ZbYLca8M6LsqggRvAob06QQ
x0VVlswmFnzSl5EuTPq/ph5s+tmnz+zdGR9HHcL/2WDmzVl++g/tZG359nwyflbC
+mjLeNGVmThw77E/X1Ke1Ty+fgCgl0roS6prpmxBUrThWgmMxMUNGn6dkcW0buQX
fDjhxQAox0k3cBfOkGMR9CLLkmR17xSFD/Actzi5gK2mV2rjG1uJI9ExKxBHDLVv
bFzjFTeIzZzFAzAI+/+rLBuXMFRds8K2HhBnThIi07k1v/l99tPYDlegPHGJjSDw
AQfXeATlUb7cbXph6DpkU4/VXe/LUGQuxIYnUi5bnZpkSZNhJGCCs635E86Q
-----END CERTIFICATE-----
Data Base Updated

A palavra passe pedida é a da CA, necessária para ler a chave privada da CA, que por sua vez é utilizada para assinar a nossa requisição de certificado.

O certificado resultante foi escrito para a directoria /arquivo/empresaCA/certs. Além disto o ficheiro serial foi actualizado e o ficheiro index.txt contém informação sobre o certificado emitido.

Podemos agora copiar o certificado para a directoria /arquivo/requests:

# cp /arquivo/empresaCA/certs/01.pem /arquivo/requests/sitecert.pem

Por uma questão de organização, copiamos também o certificado da CA para a mesma directoria:

# cp /arquivo/empresaCA/cacert.pem /arquivo/requests/

Verificar o certificado resultante:

# openssl x509 -in /arquivo/requests/sitecert.pem -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: md5WithRSAEncryption
        Issuer: CN=CA de exemplo da Empresa, ST=Lisboa, C=PT/emailAddress=ca@empresaca.com, O=Autoridade de Certificacao
        Validity
            Not Before: Jun  5 12:05:11 2007 GMT
            Not After : Jun  4 12:05:11 2008 GMT
        Subject: CN=secreto.empresa-exemplo.com, ST=Lisboa, C=PT/emailAddress=webmaster@empresa-exemplo.com, O=Empresa de Exemplo, OU=TI
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:ab:df:42:33:0a:88:e8:dc:7a:33:5b:1b:f5:d3:
                    84:83:49:81:95:c2:9b:34:d8:88:8b:c0:0a:74:a2:
                    15:1a:d7:03:9d:6c:f8:91:8e:35:3a:16:c2:33:10:
                    5f:5f:4b:35:2f:54:6a:f7:b8:b5:ce:42:b4:21:1b:
                    e0:39:71:5e:c7:05:9d:1b:70:70:db:1c:d1:23:5b:
                    e2:92:b7:cb:46:b7:26:4c:c7:f7:26:2b:02:75:54:
                    fd:6d:68:6b:96:35:78:1c:5f:23:3f:d9:fe:fc:96:
                    e7:c3:bf:3a:45:91:2e:71:cb:6a:77:5a:af:3d:53:
                    0d:04:25:a8:bf:37:d9:7b:1d
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
    Signature Algorithm: md5WithRSAEncryption
        06:f9:96:d8:2d:c6:bc:33:a2:ec:aa:08:11:bc:0a:1b:d3:a4:
        10:c7:45:55:96:cc:26:16:7c:d2:97:91:2e:4c:fa:bf:a6:1e:
        6c:fa:d9:a7:cf:ec:dd:19:1f:47:1d:c2:ff:d9:60:e6:cd:59:
        7e:fa:0f:ed:64:6d:f9:f6:7c:32:7e:56:c2:fa:68:cb:78:d1:
        95:99:38:70:ef:b1:3f:5f:52:9e:d5:3c:be:7e:00:a0:97:4a:
        e8:4b:aa:6b:a6:6c:41:52:b4:e1:5a:09:8c:c4:c5:0d:1a:7e:
        9d:91:c5:b4:6e:e4:17:7c:38:e1:c5:00:28:c7:49:37:70:17:
        ce:90:63:11:f4:22:cb:92:64:75:ef:14:85:0f:f0:1c:b7:38:
        b9:80:ad:a6:57:6a:e3:1b:5b:89:23:d1:31:2b:10:47:0c:b5:
        6f:6c:5c:e3:15:37:88:cd:9c:c5:03:30:08:fb:ff:ab:2c:1b:
        97:30:54:5d:b3:c2:b6:1e:10:67:4e:12:22:d3:b9:35:bf:f9:
        7d:f6:d3:d8:0e:57:a0:3c:71:89:8d:20:f0:01:07:d7:78:04:
        e5:51:be:dc:6d:7a:61:e8:3a:64:53:8f:d5:5d:ef:cb:50:64:
        2e:c4:86:27:52:2e:5b:9d:9a:64:49:93:61:24:60:82:b3:ad:
        f9:13:ce:90

Para configurar o Apache, vão ser necessários os ficheiros cacert.pem, sitecert.pem e sitekey.pem.

Devem-se fazer backups das directorias /arquivo/requests e /arquivo/empresaCA. Este backup vai conter as nossas chaves privadas (da CA e do site), pelo que deve ser guardado em lugar seguro.

Finalmente as impressões digitais dos certificados são obtidas com:

# openssl x509 -noout -fingerprint -in /arquivo/requests/sitecert.pem -sha1
SHA1 Fingerprint=46:96:B7:79:AC:00:21:36:FC:1D:40:3C:68:A5:E0:93:54:74:B7:15
# openssl x509 -noout -fingerprint -in /arquivo/requests/sitecert.pem -md5
MD5 Fingerprint=00:BC:F5:F4:36:53:B6:6A:58:50:93:D5:FD:83:2D:AA
# openssl x509 -noout -fingerprint -in /arquivo/requests/cacert.pem -sha1
SHA1 Fingerprint=3E:29:B4:1C:50:74:C3:A8:4F:79:2B:5F:B3:2A:9B:5C:97:B2:F3:CB
# openssl x509 -noout -fingerprint -in /arquivo/requests/cacert.pem -md5
MD5 Fingerprint=FC:65:6D:61:5D:64:7E:FF:D6:55:B6:8B:AE:D1:4D:95

Estas impressões digitais são importantes para termos a certeza de estarmos a conectar ao site correcto. Quando ligamos a um site seguro, podemos ver as propriedades dos certificados. Quando fazemos isso o browser calcula as impressões digitais e mostra-as. Se as impressões digitais mostradas não forem iguais às que gerámos com os comandos anteriores, isso quer dizer que a cadeia de confiança entre o browser e o site foi quebrada e não podemos por isso garantir que ninguém esteja a monitorar a nossa ligação ou que a fidelidade da informação recebida esteja garantida.

Criar o servidor virtual seguro

Vamos seguir o procedimento descrito no documento sobre o Apache citado mais acima.

Começamos por criar as directorias que vão alojar o site:

# mkdir /arquivo/www/secreto.empresa-exemplo.com
# cd /arquivo/www/secreto.empresa-exemplo.com
# mkdir htdocs logs
# chown www-data:www-data *
# chmod o-rwx *

A seguir criamos a configuração do site virtual, em /etc/apache2/sites-available/secreto

# secreto.empresa-exemplo.com

<VirtualHost *:443>
    ServerName secreto.empresa-exemplo.com 
    ServerAdmin webmaster@empresa-exemplo.com 
    ServerRoot   /arquivo/www/secreto.empresa-exemplo.com
    DocumentRoot /arquivo/www/secreto.empresa-exemplo.com/htdocs

    # Logs
    ErrorLog /arquivo/www/secreto.empresa-exemplo.com/logs/error_log
    CustomLog /arquivo/www/secreto.empresa-exemplo.com/logs/access_log common
    CustomLog /arquivo/www/secreto.empresa-exemplo.com/logs/ssl_request_log   ssl_combined

    # Directoria de documentos
    <Directory "/arquivo/www/secreto.empresa-exemplo.com/htdocs">
        Options Indexes FollowSymLinks Includes
        # Config do htaccess
        AllowOverride All
        # Geral
        Order allow,deny
        Allow from all
    </Directory>

    # Config SSL
    SSLEngine on
    SSLProtocol all
    SSLCipherSuite HIGH:MEDIUM

    SSLCertificateFile /arquivo/requests/sitecert.pem
    SSLCertificateKeyFile /arquivo/requests/sitekey.pem 
    SSLCACertificateFile /arquivo/requests/cacert.pem

    SSLVerifyClient none

    SetEnvIf User-Agent ".*MSIE.*" \
        nokeepalive ssl-unclean-shutdown \
        downgrade-1.0 force-response-1.0
</VirtualHost>

Temos de instruir o Apache para carregar o módulo ssl:

# a2enmod ssl
Module ssl installed; run /etc/init.d/apache2 force-reload to enable.

E activar o novo servidor virtual:

# a2ensite secreto
Site secreto installed; run /etc/init.d/apache2 reload to enable.

Também é necessário indicar ao Apache para escutar na port 443. Para isso edita-se o ficheiro /etc/apache2/ports.conf, que vai ficar:

Listen 80
Listen 443

Resta-nos agora reiniciar o Apache:

# /etc/init.d/apache2 restart 
 * Forcing reload of web server (apache2)...
Apache/2.2.3 mod_ssl/2.2.3 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Server secreto.empresa-exemplo.com:443 (RSA)
Enter pass phrase:

OK: Pass Phrase Dialog successful.
                                                      [ OK ]

Verificar a instalação

Já temos o nosso servidor seguro a funcionar. Convém em absoluto verificar se de facto a ligação que estabelecemos ao servidor é segura. Podemos fazer isto de várias formas:

Instruções aos utilizadores

Para evitar confusões eu não gosto de ter os sites seguros a funcionarem no mesmo URL dos sites normais. Assim posso ter um site de apresentação com o prefixo 'www' que dá as instruções necessárias para os utilizadores se dirigirem ao site correcto. Por outro lado, esta prática torna quase impossível que um utilizador chegue ao site sem a nossa ajuda, primeiro porque não entendem a possibilidade de um URL não ter 'www' algures, é também normal esquecerem-se do 's' no https, etc, etc, etc, ad-nauseum. Assim na escolha do URL têm de se pesar estes prós e contras. O que eu normalmente faço, em termos de URLs é o seguinte:

Quando o nosso utilizador, finalmente, conseguir chegar ao site, deve saber lidar com o facto de não termos uma CA, ou melhor, com o facto de nós sermos a nossa própria CA.

Vai ser apresentado ao utilizador um aviso, por parte do browser, indicando que este não pode assegurar que o site onde está a aceder é seguro, dado que não pode verificar a validade do certificado que lhe foi oferecido. Cerca de 99% dos utilizadores vão instruir o respectivo browser para continuar, ignorando olimpicamente todos os avisos de segurança.

Aviso dado pelo Firefox



Detalhes do certificado obtido

Mesmo assim, o utilizador poderia comparar a impressão digital do certificado do site apresentada nos detalhes do certificado com aquela fornecida por nós.

A nossa obrigação neste ponto consistem em convencer os utilizadores que, a segurança informática é algo que os pode afectar profundamente. É claro que esta é uma tarefa inglória. Para mitigar os efeitos, se for exequível, deveremos instalar o certificado da nossa CA em todos os browsers da companhia. Por exemplo para o Firefox isto faz-se da seguinte forma:

  1. Fazer uma cópia do certificado da CA, mudando a extensão para 'crt' e copiar o ficheiro resultante, cacert.crt, para um site a que tenhamos acesso, por exemplo o site não seguro associado a este site seguro. Notar que não há grande problema em ter disponível publicamente este certificado, já que este apenas disponibiliza a chave publica da CA associada à informação que configuramos inicialmente para a CA;
  2. Apontar o Firefox para o certificado. Vai surgir uma janela como a seguinte:

    Dialogo para adicionar um novo certificado

  3. Verificar as impressões digitais do certificado da CA. Clicar em 'View':

    Detalhes do certificado da CA

  4. Finalmente deveremos importar o certificado da CA:

    Importar o certificado da CA

Agora a nossa CA é reconhecida pelo browser, verificando este, automaticamente, a validade do certificado do site. Se existirem dúvidas podemos sempre aceder à informação da página e verificar os certificados aceites e as respectivas impressões digitais.

Como conclusão, quero apenas reforçar a ideia que ao termos um site seguro, não estamos automaticamente imunes a ataques e quebras de segurança. A encriptação da comunicação com o site é apenas mais uma camada do esquema de segurança que devemos ter montado. Assim a mera utilização do site seguro não nos deve deixar muito mais tranquilos. As aplicações que correrem no site poderão continuar a ter vulnerabilidades, o que implica que temos de estar a tentos a todos os updates de segurança, como é normal. Devem continuar-se a fazer auditorias da actividade do sistema, a integridade física dos servidores deve continuar a ser assegurada, etc, etc...

Onde obter mais informação

03.07.2007 | Ler mais | Comentários | Tags , , , ,

Voltar à Página principal | Made with PyBlosxom