[Tuto] SSL/TLS & Perfect Forward Secrecy

La sécurité d’un serveur est primordiale, quelques soient les circonstances ! Une fois la clef privée d’un serveur quelconque compromise, un attaquant est capable de monter une attaque par interception (MITM) afin de déchiffrer toutes les communications avec le serveur compromis. Si l’attaque est détectée, le certificat sera révoqué via une CRL ou un protocole tel que OCSP. Malheureusement, l’attaquant peut aussi avoir en sa position une copie des communications passées de clients avec le serveur. Il est alors capable de déchiffrer celles-ci et y trouver des informations sensibles.

A travers ce tuto, je vais vous montrez comment bien sécuriser ses services.
Mais avant je vais définir quelques termes nécessaires pour assurer une bonne compréhension 😉

1 – Quelques notions
2 – Utilisation de OpenSSL
3 – Générer le dhparam
4 – Configuration d’OpenSSH Server
5 – Configuration d’OpenSSH client
6 – Configuration d’Apache
7 – Configuration de Nginx
8 – Configuration de Lighttpd
9 – Configuration de Postfix
10 – Configuration de Dovecot
11 – Configuration de Exim
12 – Configuration de HAProxy
13 – Configuration de ProFTPd

.

1 – Quelques notions

SSL/TLS : Transport Layer Security (TLS), et son prédécesseur Secure Sockets Layer (SSL), sont des protocoles de sécurisation des échanges sur Internet. Le protocole SSL a été développé à l’origine par Netscape. L’IETF, en a poursuivi le développement en le rebaptisant Transport Layer Security (TLS). On parle parfois de SSL/TLS pour désigner indifféremment SSL ou TLS.
TLS (ou SSL) fonctionne suivant un mode client-serveur. Il permet de satisfaire aux objectifs de sécurité suivants :
– l’authentification du serveur ;
– la confidentialité des données échangées (ou session chiffrée) ;
– l’intégrité des données échangées ;
– de manière optionnelle, l’authentification du client (mais dans la réalité celle-ci est souvent assurée par le serveur).

Perfect Forward Secrecy : permet à une information chiffrée aujourd’hui de rester confidentielle en cas de compromission future de la clef privée d’un correspondant. C’est un mécanisme assez coûteux en calculs et de nombreux serveurs font donc l’impasse sur celui-ci.

Cipher Suites : Une suite cryptographique (cipher suite en anglais) est le nom de la combinaison des algorithmes d’échange de clés, d’authentification, de chiffrement par bloc et génération du code d’authentification de message (MAC) utilisée afin d’établir le paramétrage de sécurité pour une connexion réseau utilisant le protocole de communication Secure Socket Layer (SSL) et Transport Layer Security (TLS).

Diffie-Hellman (dhparam) : Une solution qui consiste à n’utiliser la clef privée que pour l’authentification et négocier un secret partagé totalement indépendant de celle-ci. Il existe un protocole à cet effet : l’algorithme de Diffie-Hellman. Il s’agit d’une méthode d’échange de clefs ne nécessitant aucune connaissance préalable entre les deux parties.

OSCP : Le protocole OCSP permet à un client X.509 (par exemple un navigateur Web engagé dans une connexion HTTPS) de s’informer en temps réel sur l’état d’un certificat, notamment afin de savoir s’il est révoqué ou pas. Ce nouveau RFC remplace (avec de légers changements) l’ancienne norme OCSP qui était dans le RFC 2560.

HSTS : HTTP Strict Transport Security (HSTS) est un mécanisme de politique de sécurité proposé pour HTTP, permettant à un serveur web de déclarer à un agent utilisateur (comme un navigateur web), compatible, qu’il doit interagir avec lui en utilisant une connexion sécurisée (comme HTTPS). La politique est donc communiquée à l’agent utilisateur par le serveur via la réponse HTTP, dans le champ d’en-tête nommé « Strict-Transport-Security ». La politique spécifie une période de temps durant laquelle l’agent utilisateur doit accéder au serveur uniquement de façon sécurisée.

Aujourd’hui, il est recommandé d’utiliser une longueur de clé d’au moins 4096 bit, la NSA (Service de renseignement) affirme qu’ils sont capables de déchiffré les longueurs de clés jusqu’à 2048 bits.

.

2 – Utilisation de OpenSSL

Nous allons commencer par obtenir notre certificat, pour cela il va falloir dans un premier temps générer la CSR qui est un fichier contenant les informations de votre demande de certificat, y compris votre clé publique. Vous devez générer cette clé à partir de votre serveur. Le processus va créer 2 fichiers : un public en .csr et un privé en .key qu’il faudra absolument garder.

$ openssl req -nodes -newkey rsa:4096 -sha256 -keyout my.domain.tld.key -out my.domain.tld.csr

Country Name (2 letter code) [AU]: FR
State or Province Name (full name) [Some-State]: Region
Locality Name (eg, city) []: Votre ville
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Votre Société
Organizational Unit Name (eg, section) []: IT
Common Name (eg, YOUR name) []: my.domain.tld
Email Address []:
A challenge password []:
An optional company name []:

Les champs optional company name et challenge password sont facultatifs.

Il est préférable de remplir le champ Email Address.
Common Name indique l’adresse que vous voulez protéger.

Deux solutions s’offrent à vous dès à présents, soit vous signez votre certificat avec votre propre autorité de certification (auto-signé), ou soit vous la faîtes signés par une autorités de certification intermédiaire ou racine afin d’avoir un certificat valide.

$ openssl x509 -req -days 365 -in my.domain.tld.csr -signkey my.domain.tld.key -out my.domain.tld.crt

Si vous voulez faire signé votre certificat par une autorité, il faut transmettre le contenu de votre fichier .csr à votre autorité de certification
Copier le contenu du fichier my.domain.tld.csr :

$ cat domain.tld.csr

-----BEGIN CERTIFICATE REQUEST-----
...encrypted text...
...encrypted text...
...encrypted text...
-----END CERTIFICATE REQUEST-----

Il est possible d’avoir un nombre illimité de certificat SSL/TLS gratuit chez StartSSL (valable 1 ans, renouvelable) ou let’s Encrypt (valable 90 jours, renouvelable)

.

3 – Générer le dhparam :

$ openssl dhparam -out dhparam.pem 4096

.

4 – Configuration d’OpenSSH Server :

$ vim nano /etc/ssh/sshd_config

Protocol 2
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com

.

5 – Configuration d’OpenSSH client :

$ vim nano /etc/ssh/ssh_config

HashKnownHosts yes
Host github.com
Host *
ConnectTimeout 30
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
ServerAliveInterval 10
ControlMaster auto
ControlPersist yes
ControlPath ~/.ssh/socket-%r@%h:%p

.

6 – Configuration d’Apache : (Version > 2.4)

$ sudo vim /etc/apache2/sites-availables/my_virtualhost

SSLEngine on
SSLCertificateFile /etc/apache2/certs/votre_certificat.crt
SSLCertificateKeyFile /etc/apache2/certs/votre_certificat.key
SSLCACertificateFile /etc/apache2/certs/certificat_intermediaire_et_racine
SSLOpenSSLConfCmd DHParameters /etc/apache2/certs/dhparams.pem
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1
SSLHonorCipherOrder On
SSLCompression off 
SSLSessionTickets Off
SSLUseStapling on 
SSLStaplingCache "shmcb:logs/stapling-cache(150000)" 
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff

.

7 – Configuration de Nginx : (Version > 1.8)

$ sudo vim /etc/nginx/conf.d/my_virtualhost.conf

ssl_certificate /etc/nginx/certs/votre_certificat.crt;
ssl_certificate_key /etc/nginx/certs/votre_certificat.key;
ssl_trusted_certificate /etc/nginx/certs/certificat_intermediaire_et_racine;
ssl_dhparam /etc/nginx/certs/dhparams.pem;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver DNS-IP-1 DNS-IP-2 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

.

8 – Configuration de Lighttpd :

$ sudo vim /etc/lighttpd/conf.d/my_virtualhost.conf

ssl.honor-cipher-order = "enable"
ssl.cipher-list = "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"
ssl.use-compression = "disable"
setenv.add-response-header = (
    "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; preload",
    "X-Frame-Options" => "DENY",
    "X-Content-Type-Options" => "nosniff"
)
ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"
ssl.use-tlsv1 = "disable"

.

9 – Configuration de Postfix :

$ sudo vim /etc/postfix/main.cf

smtpd_use_tls=yes
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_cert_file=/etc/ssl/postfix.cert
smtpd_tls_key_file=/etc/ssl/postfix.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3,!TLSv1,!TLSv1.1
smtpd_tls_protocols=!SSLv2,!SSLv3,!TLSv1,!TLSv1.1
smtpd_tls_mandatory_ciphers = medium
tls_medium_cipherlist = AES128+EECDH:AES128+EDH

.

10 – Configuration de Dovecot : (Version > 2.2.6)

$ sudo vim /etc/dovecot/conf.d/10-ssl.conf

ssl = yes
ssl_cert =

.

11 – Configuration de Exim :

$ sudo vim /etc/exim4/update-exim4.conf

tls_certificate = /etc/ssl/exim.cert
tls_privatekey = /etc/ssl/exim.key
tls_advertise_hosts = *
tls_require_ciphers = AES128+EECDH:AES128+EDH
openssl_options = +no_sslv2 +no_sslv3 +no_tlsv1

.

12 – Configuration de HAProxy :

$ sudo vim /etc/haproxy/haproxy.cfg

global
   ssl-default-bind-options no-sslv3 no-tls-tickets force-tlsv12
   ssl-default-bind-ciphers AES128+EECDH:AES128+EDH

frontend http-in
      mode http
      option httplog
      option forwardfor
      option http-server-close
      option httpclose
      bind 192.0.2.10:80
      redirect scheme https code 301 if !{ ssl_fc }

frontend https-in
    option httplog
    option forwardfor
    option http-server-close
    option httpclose
    rspadd Strict-Transport-Security:\ max-age=31536000;\ includeSubdomains;\ preload
    rspadd X-Frame-Options:\ DENY
    bind 192.0.2.10:443 ssl crt /etc/haproxy/haproxy.pem ciphers AES128+EECDH:AES128+EDH force-tlsv12 no-sslv3

.

13 – Configuration de ProFTPd :

$ sudo vim /etc/proftpd/tls.conf

TLSEngine on
TLSLog /var/ftpd/tls.log
TLSProtocol TLSv1.2
TLSRequired on
TLSCipherSuite AES128+EECDH:AES128+EDH
TLSRSACertificateFile /etc/proftpd.cert
TLSRSACertificateKeyFile /etc/proftpd.key

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *