Archives pour la catégorie ‘Sécurité’

Let’s Encrypt : gestion des certificats avec le client dehydrated

Ayant un peu de temps, je me suis décidé – moi et ma flemme sacrée – à virer mon certificat StartSSL. Pour les désinformés, il y a une bien triste histoire à connaître sur les pratiques de StartSSL/WoSign.

Pour gérer les certificats de Let’s Encrypt, l’installation du client CLI dehydrated permet d’automatiser leur génération et leur renouvellement étant donné leur validité de trois mois :

# apt install dehydated

Premier étape, lister les certificats et les domaines associés (1 certificat par ligne) :

# vim /etc/dehydated/domains.txt
blog.hbis.fr www.hbis.fr

Enfin, le fichier de configuration :

# vim /etc/dehydratd/conf.d/letsencrypt.sh
BASEDIR="/var/lib/letsencrypt/"
WELLKNOWN="/var/www/hbis.fr/blog/html/.well-known/acme-challenge"
CONTACT_EMAIL="postmaster@hbis.fr"

Reste à lancer la génération :

# mkdir -p /var/lib/letsencrypt /var/www/hbis.fr/blog/html/.well-known/acme-challenge
# dehydrated -c --force

Les différents services sécurisés sont à réconfigurer:

# vim /etc/nginx/ssl-enabled/hbis
ssl on;
ssl_certificate /var/lib/letsencrypt/certs/blog.hbis.fr/fullchain.pem;
ssl_certificate_key /var/lib/letsencrypt/certs/blog.hbis.fr/privkey.pem;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /var/lib/letsencrypt/certs/blog.hbis.fr/chain.pem;
# vim /etc/postfix/main.cf
smtpd_tls_CAfile = /var/lib/letsencrypt/certs/blog.hbis.fr/chain.pem
smtpd_tls_cert_file = /var/lib/letsencrypt/certs/blog.hbis.fr/cert.pem
smtpd_tls_key_file = /var/lib/letsencrypt/certs/blog.hbis.fr/privkey.pem
# vim /etc/dovecot/conf.d/10-ssl
ssl_cert = </var/lib/letsencrypt/certs/blog.hbis.fr/fullchain.pem
ssl_key = </var/lib/letsencrypt/certs/blog.hbis.fr/privkey.pem

Dernière étape, il est nécessaire de mettre en place un cron pour les renouveller automatiquement et relancer les services nécessaires:

# vim /etc/cron.montly/dehydrated
#!/bin/bash

/usr/bin/dehydrated -c &amp;amp;&amp;amp; systemctl restart nginx postfix dovecot
# chmod +x /etc/cron.montly/dehydrated

OpenSSL: récupérer la chaîne de certificats SSL d’un host

$ echo | openssl s_client -connect my.host.com:443 -showcerts 2>&1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > mycert.pem

OpenSSH : accès au prompt

Raccourci-clavier : [Entrée] + [~] + [?]

~?
Supported escape sequences:
 ~.   - terminate connection (and any multiplexed sessions)
 ~B   - send a BREAK to the remote system
 ~C   - open a command line
 ~R   - request rekey
 ~V/v - decrease/increase verbosity (LogLevel)
 ~^Z  - suspend ssh
 ~#   - list forwarded connections
 ~&   - background ssh (when waiting for connections to terminate)
 ~?   - this message
 ~~   - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

OpenSSH : récupération des clés publiques depuis un serveur OpenLDAP

Les dernières versions d’OpenSSH (version 6) permettent de récupérer les clés SSH des utilisateurs depuis une source externe. Je présente ici les étapes nécessaires à la mise en place d’une récupération des clés publiques depuis un serveur LDAP.

Installation

Sous Debian 7, il est nécessaire d’installer les packages depuis les backports Wheezy pour pouvoir bénéficier des dernirès versions d’OpenSSH :

deb http://ftp.debian.org/debian/ wheezy-backports main
# apt-cache show openssh-server
# apt-get install openssh-server=1:6.4p1-1~bpo70+1 openssh-client=1:6.4p1-1~bpo70+1

Configuration

Le script de récupération des clés publiques est le suivant :

# touch /etc/ssh/ldap-authorizedkeys.sh && chmod +x /etc/ssh/ldap-authorizedkeys.sh
# vim /etc/ssh/ldap-authorizedkeys.sh
URI="ldap://ldap1.my.domain,ldap://ldap2.my.domain"
BASE="dc=my,dc=domain"
BINDDN="cn=proxy,dc=my,dc=domain"
BINDPW="$ecret"
OPTIONS="-ZZ"

LOGIN=$1

ldapsearch -H ${URI} -D "${BINDDN}" -w "${BINDPW}" -b "${BASE}" ${OPTIONS} '(&(objectClass=posixAccount)(uid='"$LOGIN"'))' 'sshPublicKey' \
    | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'

Au niveau de la configuration du serveur SSH :

# vim /etc/ssh/sshd_config
AuthorizedKeysCommand /etc/ssh/ldap-authorizedkeys.sh
AuthorizedKeysCommandUser root

Le serveur SSH doit être redémarré :

# /etc/init.d/ssh restart

Reste à modifier la base LDAP en ajoutant l’attribut sshPublicKey contenant la clé publique à chaque objet LDAP utilisateur :

dn: uid=bhuisgen,ou=titi,ou=tata,ou=toto,dc=my,dc=domain
objectClass: ldapPublicKey
sshPublicKey: ******************

OpenSSH : connexion facile à un hôte distant

Cette astuce – d’un de mes collègues – permet de se connecter en SSH en tapant uniquement le nom d’hôte du serveur. Il faut pour cela une entrée pour chaque serveur dans le fichier /etc/hosts, ainsi que ces lignes de configuration pour votre shell :

boris.huisgen@local:~$ cat .bash_aliases
for HOST in `egrep -v "^$|#" /etc/hosts | tail -n +3 | awk '{ print $2 }'`
do
alias $HOST='ssh $USER@'$HOST
done

Reste à taper le nom d’hôte pour se connecter :

boris.huisgen@local:~$ sl-ld6-wp1

Postfix : ajout du support DMARC

Pour prendre en charge DMARC sur un MTA Postfix, il convient d’installer OpenDMARC. Çà tombe bien c’est rapide.

Installation

root@mailsrv:~# cat /etc/apt/apt.conf
APT::Default-Release "stable";
root@mailsrv:~# nano /etc/apt/apt.conf
# stable
deb http://ftp.debian.org/debian wheezy main contrib non-free
deb http://security.debian.org wheezy/updates main contrib non-free

# testing
deb http://ftp.debian.org/debian testing main contrib non-free
deb http://security.debian.org testing/updates main contrib non-free
root@mailsrv:~# apt-get update
root@mailsrv:~# apt-get dist-upgrade
root@mailsrv:~# apt-get -t testing install opendmarc

Configuration de Postfix

root@mailsrv:~# nano /etc/postfix/main.conf
smtpd_milters = inet:127.0.0.1:8893
non_smtpd_milters = inet:127.0.0.1:8893

YAPET : Yet Another Password Encryption Tool

Le logiciel ncurses idéal pour stocker les mots de passe là où on en a vraiment besoin…

Site web : http://www.guengel.ch/myapps/yapet/readme.shtml

Linux : restriction des droits sur les points de montage

/dev/mapper/vg-root /         ext4  errors=remount-ro            0  1
/dev/md0            /boot     ext2  noatime,nodev,nosuid,noexec  0  2
/dev/mapper/vg-swap none      swap  sw                           0  0
/dev/mapper/vg-var  /var      ext4  noatime,nodev,nosuid         0  2
/dev/mapper/vg-log  /var/log  ext4  noatime,nodev,nosuid         0  2
/dev/mapper/vg-tmp  /tmp      ext4  noatime,nodev,nosuid,noexec  0  2
/dev/mapper/vg-home /home     ext4  noatime,nodev,nosuid,noexec  0  2

OpenDKIM : configuration avec support multidomaines

DKIM – Domain Keys Identified Mail –  est une technique d’authentification fiable du nom de domaine d’un émetteur de messages électroniques afin d’éviter le spam et le hameçonnage. Elle se base sur une clé de chiffrement asymétrique ; la clé privée est utilisée par le MTA pour chiffrer une partie de chaque message et insérer le résultat généré dans l’en-tête DKIM associée au message :

DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=hbis.fr; s=default;
	t=1352850858; bh=6FHfDLJhwx+aojx+pYcAnVDb+BLWaDNaO8vmZtguLiI=;
	h=Message-ID:Date:From:MIME-Version:To:Content-Type:
	 Content-Transfer-Encoding;
	b=wHB33aib+Km2FQRYuaYX8xgHnvrGsllOITWQ5HI5Pc+MGHRVogsYrRjfMJwAa1DTv
	 YRlLJN/GUoS/28gPymKm/yxjMEjlORWwVnb73nTU2PrLXObS0wKaiUXO43gqMBfhv3
	 Dn3ifsXHpx043ERQlv79CLgigcdvDSU1md4QXRGw=

La clé publique est publiée par champ TXT dans la zone DNS du domaine de l’émetteur. Celle-ci est récupérée par les différents MTA en destination afin de valider l’origine du mail par déchiffrement de l’en-tête DKIM.

;; QUESTION SECTION:
;default._domainkey.hbis.fr.	IN	TXT

;; ANSWER SECTION:
default._domainkey.hbis.fr. 10723 IN	TXT	"v=DKIM1\; g=*\; k=rsa\;
p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDtMiBUJ6Aq0VHi0N1FTCsau0iLnmptFrG1GK
 +KHM1/bIcPUlD+GHKekEg9Y5jyaZ4liXQy67SG48d7Z1iKuipZnzvqizEHwFGCdw/b12Q8hi3ay
 gmz1F9wJXYfklc12D2USrviO69hzKRohE7CA6LxWL905yJNXoWzFHqntaAiwQIDAQAB"

Dans le cas où le déchiffrement est impossible, le MTA peut/doit refuser la réception du message. Sinon il le délivre en ajoutant une en-tête d’authenticité :

Authentication-Results: mx.google.com; spf=pass (google.com: domain of
bhuisgen@hbis.fr designates 2001:41d0:51:1::205 as permitted sender)
smtp.mail=bhuisgen@hbis.fr; dkim=pass header.i=@hbis.fr

DKIM repose donc intégralement sur la sécurité du serveur DNS de l’émetteur, qui ne doit pas être compromis, mais elle à l’avantage d’être totalement transparente pour les utilisateurs (ce qui n’est pas le cas de PGP par exemple).

Installation

root@vks10205:~# apt-get install opendkim

Configuration

root@vks10205:~# nano /etc/opendkim.conf
Syslog			yes
UMask			002

KeyTable		/etc/opendkim/key-table
SigningTable		/etc/opendkim/signing-table
ExternalIgnoreList	/etc/opendkim/trusted-hosts
InternalHosts		/etc/opendkim/trusted-hosts
root@vks10205:~# nano /etc/default/opendkim
SOCKET="inet:12345@localhost"

Les hôtes/IP autorisés à utiliser les clés de chiffrement sont à spécifier :

root@vks10205:~# mkdir /etc/opendkim/
root@vks10205:~# nano /etc/opendkim/trusted-hosts
localhost
127.0.0.1
::1

La clé asymétrique d’un domaine est générée de cette façon :

root@vks10205:~# mkdir -p /etc/opendkim/keys/hbis.fr
root@vks10205:~# cd /etc/opendkim/keys/hbis.fr
root@vks10205:~# opendkim-genkey -r -d hbis.fr
root@vks10205:~# chown -R opendkim:opendkim /etc/opendkim/keys/hbis.fr

La clé publique est à ajouter dans la zone DNS du domaine :

root@vks10205:~# cat /etc/opendkim/keys/hbis.fr/default.txt

Le domaine peut ensuite être référencé :

root@vks10205:~# cat /etc/opendkim/key-table
default._domainkey.hbis.fr hbis.fr:default:/etc/opendkim/keys/hbis.fr/default.private
root@vks10205:~# cat /etc/opendkim/signing-table
hbis.fr default._domainkey.hbis.fr

Ces opérations sont à répéter pour chaque domaine de messagerie.

Lancement

root@vks10205:~# /etc/init.d/opendkim start

Configuration de Postfix

Le MTA doit enfin se connecter au démon OpenDKIM pour effectuer la signature des messages :

root@vks10205:~# nano /etc/postfix/main.cf
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:127.0.0.1:12345
non_smtpd_milters = inet:127.0.0.1:12345
root@vks10205:~# /etc/init.d/postfix restart

Configuration d’Amavis

Si vous utilisez Amavis pour le filtrage mail, il convient de désactiver le milter précédent suite au filtrage afin d’éviter une seconde signature DKIM :

127.0.0.1:10025 inet n  -       n       -       -       smtpd
[...]
    -o receive_override_options=no_address_mappings,no_header_body_checks,
                                no_unknown_recipient_checks,no_milters

OpenSSH : proxy SOCKS local

Afin de sécuriser vos sessions web (et autres) sur un réseau dont vous n’avez aucune confiance, OpenSSH permet de créer un proxy SOCKS local pour y rediriger et sécuriser l’ensemble de vos connexions réseau :

$ ssh user@server -ND 8080

Il convient ensuite de configurer vos applications pour utiliser le proxy SOCKS localhost:8080. Pour anonymiser les requêtes DNS de Firefox, il convient de modifier la variable de configuration network.proxy.socks_remote_dns.

Mise à jour 13/11/2012 : l’option -N permet de ne pas lancer un shell après l’établissement du tunnel SSH.

Haut de page