Afficher/cacher Sommaire
KVM Debian Stretch Yunohost cinay.pw
Package: 8 GB Mémoire, 4 CPU, 40 GB SSD, 100 Mbps
Selected Location: Paris
Debian Jessie 64
Livraison : vps-27199 93.113.206.145
- Domaine : cinay.pw
- IPv4 du serveur : 93.113.206.145
- IPv6 du serveur : 2a03:75c0:39:6a3f::1
Première connexion SSH
Connexion sur “KVM-FirstHeberg GP4 Core 4 Ram 8Go SSD 40Go”
ssh root@93.113.206.145
Màj
apt update && apt upgrade
Installer utilitaires
apt install rsync curl tmux jq figlet git mailutils dnsutils -y
Modifier hostname
hostnamectl set-hostname --static vps27199
Modifier /etc/hosts
nano /etc/hosts
127.0.0.1 localhost
93.113.206.145 cinay.pw vps27199
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Vérifications
hostname
vps27199
hostname --fqdn
cinay.pw
Locales
Locales : fr_FR.UTF-8 et en_US.UTF-8
dpkg-reconfigure locales
Generating locales (this might take a while)...
fr_FR.UTF-8... done
en_US.UTF-8... done
Generation complete.
TimeZone
Europe/Paris
dpkg-reconfigure tzdata
Current default time zone: 'Europe/Paris'
Local time is now: Wed Mar 14 13:26:39 CET 2018.
Universal Time is now: Wed Mar 14 12:26:39 UTC 2018.
Création utilisateur
Utilisateur adxo
useradd -m -d /home/adxo/ -s /bin/bash adxo
Mot de passe adxo
passwd adxo
Visudo pour les accès root via utilisateur adxo
apt install sudo
echo "adxo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
Changer le mot de passe root
passwd root
Déconnexion puis connexion ssh en mode utilisateur
ssh adxo@93.113.206.145
OpenSSH
connexion avec clé
sur l'ordinateur de bureau
Générer une paire de clé curve25519-sha256 (ECDH avec Curve25519 et SHA2) nommé kvm-cinay pour une liaison SSH avec le serveur KVM.
ssh-keygen -t ed25519 -o -a 100 -f ~/.ssh/kvm-vps-27199
Envoyer la clé publique sur le serveur KVM
scp ~/.ssh/kvm-vps-27199.pub adxo@93.113.206.145:/home/adxo/
sur le serveur KVM On se connecte
ssh adxo@93.113.206.145
Copier le contenu de la clé publique dans /home/$USER/.ssh/authorized_keys
cd ~
Sur le KVM ,créer un dossier .ssh
mkdir .ssh
cat /home/$USER/kvm-vps-27199.pub >> /home/$USER/.ssh/authorized_keys
et donner les droits
chmod 600 /home/$USER/.ssh/authorized_keys
effacer le fichier de la clé
rm /home/$USER/kvm-vps-27199.pub
Modifier la configuration serveur SSH
sudo nano /etc/ssh/sshd_config
Modifier
Port = 55027
PermitRootLogin no
PasswordAuthentication no
session SSH ne se termine pas correctement lors d'un "reboot" à distance
Si vous tentez de redémarrer/éteindre une machine distance par ssh, vous pourriez constater que votre session ne se termine pas correctement, vous laissant avec un terminal inactif jusqu’à l’expiration d’un long délai d’inactivité. Il existe un bogue 751636 à ce sujet. Pour l’instant, la solution de contournement à ce problème est d’installer :
sudo apt-get install libpam-systemd #Installer par défaut sur debian stretch
cela terminera la session ssh avant que le réseau ne tombe.
Veuillez noter qu’il est nécessaire que PAM soit activé dans sshd.
Relancer openSSH
sudo systemctl restart sshd
Accès depuis le poste distant avec la clé privée
ssh -p 55027 -i ~/.ssh/kvm-vps-27199 adxo@93.113.206.145
Exécution script sur connexion
Exécuter un fichier utilisateur nommé $HOME/.ssh/rc si présent
Pour tous les utilisateurs exécuter un fichier nommé /etc/ssh/sshrc si présent
Installer les utilitaires curl jq figlet
Le batch
nano ~/.ssh/rc
#!/bin/bash
#clear
PROCCOUNT=`ps -Afl | wc -l` # nombre de lignes
PROCCOUNT=`expr $PROCCOUNT - 5` # on ote les non concernées
GROUPZ=`users`
ipinfo=$(curl -s ipinfo.io) # info localisation format json
publicip=$(echo $ipinfo | jq -r '.ip') # extraction des données , installer préalablement "jq"
ville=$(echo $ipinfo | jq -r '.city')
pays=$(echo $ipinfo | jq -r '.country')
cpuname=`cat /proc/cpuinfo |grep 'model name' | cut -d: -f2 | sed -n 1p`
echo "\033[0m\033[1;31m"
figlet "cinay.pw"
echo "\033[0m"
echo "\033[1;35m \033[1;37mHostname \033[1;35m= \033[1;32m`hostname`
\033[1;35m \033[1;37mWired Ip \033[1;35m= \033[1;32m`ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | cut -d/ -f1`
\033[1;35m \033[1;37mKernel \033[1;35m= \033[1;32m`uname -r`
\033[1;35m \033[1;37mDebian \033[1;35m= \033[1;32m`cat /etc/debian_version`
\033[1;35m \033[1;37mUptime \033[1;35m= \033[1;32m`uptime | sed 's/.*up ([^,]*), .*/1/' | sed -e 's/^[ \t]*//'`
\033[1;35m \033[1;37mCPU \033[1;35m= \033[1;32m`echo $cpuname`
\033[1;35m\033[1;37mMemory Use \033[1;35m= \033[1;32m`free -m | awk 'NR==2{printf "%s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'`
\033[1;35m \033[1;37mUsername \033[1;35m= \033[1;32m`whoami`
\033[1;35m \033[1;37mSessions \033[1;35m= \033[1;32m`who | grep $USER | wc -l`
\033[1;35m\033[1;37mPublic Ip \033[1;35m= \033[1;32m`echo $publicip $pays`
\033[0m"
curl fr.wttr.in/Nantes?0
Effacer motd
sudo rm /etc/motd
Déconnexion puis connexion
systemd/journal
Ajout de l’utilisateur courant au groupe systemd-journal
sudo gpasswd -a $USER systemd-journal
Accès utilisateur aux fichiers log
sudo gpasswd -a $USER adm
Après déconnexion puis reconnexion , l’utilisateur a accès au journal:
journalctl
Pour avoir les lignes NON TRONQUEES
export SYSTEMD_LESS=FRXMK journalctl
Pour un mode permanent ,modifier ~/.bashrc
echo "export SYSTEMD_LESS=FRXMK journalctl" >> ~/.bashrc
Sauvegarde distante (via serveur yanspm.com )
Autoriser un serveur distant à se connecter via ssh pour y exécuter rsync
Installer rsync
sudo apt install rsync # debian
Ajout utilisateur de backupuser qui ne peut exécuter que rsync et de la clé publique du “serveur de sauvegarde”
Création utilisateur backup
sudo useradd backupuser -c "limited backup user" -m -u 4210
Dossier ssh
sudo mkdir /home/backupuser/.ssh
Ajout clé publique ssh dans le fichier authorized_keys du nouvel utilisateur
sudo nano /home/backupuser/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCrIKzB0NZOO8/XNLHWeYiZr0Yt/OW1KFvYXVO5GBcj7Ckpha95F5j5tCZxLZoY4PmbfMlN7h89QfshqnDrTpB9tTrcAbLVC3084xAUnC53B6wj6jXEn7OkNo/SOCAHTwqESq4qzARTjkwIw3uPFuqbN0LkZXg8CX61XliMxDNXFddLlwQoGDEz73ZHcKjsrGXZXUMG7obxNCbHt9zg29Widc+8mZuPM2u5YvtjV/1MHnU9GmeXBI3tKziihAnPkmRwoVPUcuEhzZLCKO98M1SDtKQs47sDwQVptqX1WVYDVeMt8vfkF8Uxj5294cB07MKB6cjVmVrQlfxf+EdGLcAR yann@shuttle
Création script bash rsync-wrapper.sh
sudo nano /home/backupuser/rsync-wrapper.sh
Contenu du script
#!/bin/sh
date > /home/backupuser/backuplog
#echo $@ >> /home/backupuser/backuplog
/usr/bin/sudo /usr/bin/rsync "$@";
Droits sur le fichier
sudo chown backupuser:backupuser /home/backupuser/rsync-wrapper.sh
sudo chmod 755 /home/backupuser/rsync-wrapper.sh
Edition fichier sudoers pour un accès root à l’exécution de rsync
sudo -s
Ajouter ligne suivante en fin de fichier,exécution en mode root de rsync
echo "backupuser ALL=NOPASSWD: /usr/bin/rsync" >> /etc/sudoers
exit
Réseau IPV4 IPV6
Configuré par défaut (FirstHeberg)
/etc/network/interfaces
# Generate by postinstall at 2018-03-12 11:43:34
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 93.113.206.145
netmask 255.255.255.0
network 93.113.206.0
broadcast 93.113.206.255
gateway 93.113.206.1
iface eth0 inet6 static
address 2a03:75c0:39:6a3f::1
netmask 64
gateway fe80::1
post-up ip route add default via fe80::1 dev eth0
Nginx PHP7 MariaDb
Script debian9-compil-nginx-php7.sh pour compiler et installer nginx + php7 sur debian stretch
Définition des chemins et fichiers de configuration nginx
/etc/nginx/conf.d/cinay.pw.conf configuration de base du domaine
Création dossier /etc/nginx/conf.d/cinay.pw.d/ pour les fichiers de configuration supplémentaires
sudo mkdir -p /etc/nginx/conf.d/cinay.pw.d
Déplacer et renommer le fichier de configuration par défaut
sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/cinay.pw.conf
Modifier le fichier
sudo nano /etc/nginx/conf.d/cinay.pw.conf
server {
listen 80;
listen [::]:80;
root /var/www/ ;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.0-fpm.sock; # PHP7.0
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
include conf.d/cinay.pw.d/*.conf;
access_log /var/log/nginx/cinay.pw.log;
error_log /var/log/nginx/cinay.pw.log;
}
Vérifier
sudo nginx -t
Recharger
sudo systemctl reload nginx
Activer le service
sudo systemctl enable nginx
MariaDb
Installer MariaDb :
sudo apt install mariadb-server -y
Initialiser le mot de passe root ( ) + sécurisation
sudo mysql_secure_installation
Enter current password for root (enter for none):
Set root password? [Y/n] y
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y
Installer le résolveur DNS Unbound
Les serveurs DNS sont des machines discutant entre elles afin de se communiquer les correspondances entre nom de domaine et adresses IP.
Passage en mode super utilisateur
sudo -s # ou su
Désinstaller bind
apt remove --purge bind* -y
rm -r /var/cache/bind/
Installation des outils dns et du paquet Unbound :
apt install dnsutils unbound -y
Téléchargement de la liste des serveurs DNS racines :
cd /var/lib/unbound/ && wget ftp://ftp.internic.net/domain/named.cache
Mise en place de cette liste pour le serveur Unbound :
mv named.cache root.hints && chown unbound:unbound root.hints
Les fichiers de configuration sont situés sous /etc/unbound/unbound.conf.d/
root-auto-trust-anchor-file.conf qui est créé par défaut à l’installation
server:
# The following line will configure unbound to perform cryptographic
# DNSSEC validation using the root trust anchor.
auto-trust-anchor-file: "/var/lib/unbound/root.key"
qname-minimisation.conf qui est créé par défaut à l’installation
server:
# Send minimum amount of information to upstream servers to enhance
# privacy. Only sends minimum required labels of the QNAME and sets
# QTYPE to NS when possible.
# See RFC 7816 "DNS Query Name Minimisation to Improve Privacy" for
# details.
qname-minimisation: yes
Ajout d’un fichier de configuration
dns-yan.conf
nano /etc/unbound/unbound.conf.d/dns-yan.conf
server:
interface: 0.0.0.0
interface: ::0
access-control: 0.0.0.0/0 allow
access-control: ::/0 allow
root-hints: "/var/lib/unbound/root.hints"
verbosity: 0
#qname-minimisation: yes
num-threads: 2
msg-cache-slabs: 4
rrset-cache-slabs: 4
infra-cache-slabs: 4
key-cache-slabs: 4
rrset-cache-size: 100m
msg-cache-size: 50m
outgoing-range: 465
so-rcvbuf: 4m
so-sndbuf: 4m
port: 53
do-ip4: yes
do-ip6: yes
do-udp: yes
do-tcp: yes
do-daemonize: yes
hide-identity: yes
hide-version: yes
harden-glue: yes
harden-dnssec-stripped: yes
harden-referral-path: yes
use-caps-for-id: yes
prefetch: yes
Redémarrer le service dnsunbound
systemctl restart unbound
Les commandes suivantes ne fonctionneront que si le paquet “dnsutils” est installé sur votre système Debian!
dig @127.0.0.1 afnic.fr +short +dnssec
192.134.5.25
A 8 2 600 20180406223409 20180307194345 64860 afnic.fr. lhw7AmNSkeZOtNN/9rJuGYxTdUcXSR3xlbsKz2xjNbFxQT5FwKILTW+E WWawrrbjo79uaG7kAvfMWrah4ijWtz9qGyd76qTr3XVdXB3+pbIsRr6X /I/ryQAy9w8tP3FvXHHU7IxihP+Ei2M5licCYitt1YZUyXuNFdNpdhq7 FRT+tq78yn1PEm121f32IRQ2Fjy9qZz9O0LU7roYZ6XFoPU9x3PU590J mpkywT9t6LpyeW5GK5zSL+Zb5eiFhfp33abkMf7b6Pc7xixcGN8h8SDQ Ry98Ne0EIqHKnyh/zzRszc1kBfP5kJXmcY/X3+4xLvKmvKNnBLT0dsn1 q1Hl1A==
Si la commande dig-command a fonctionné, vous pouvez maintenant définir Unbound comme premier résolveur DNS pour votre système de messagerie:
apt install resolvconf -y
echo "nameserver 127.0.0.1" >> /etc/resolvconf/resolv.conf.d/head
Le résultat de la commande
nslookup afnic.fr | grep Server
devrait ressembler à ceci:
Server: 127.0.0.1
Vérifier la résolution de nom à partir du serveur :
dig @127.0.0.1 afnic.fr
; <<>> DiG 9.10.3-P4-Debian <<>> @127.0.0.1 afnic.fr
; (1 server found)
...
;; SERVER: 127.0.0.1#53(127.0.0.1)
...
La résolution fonctionne
Maintenant, vous disposez de votre propre résolveur DNS.
Mise à jour automatique des serveurs DNS de la racine ,créer un bash
nano /etc/unbound/dnsunbound-update-root-dns.sh
#!/bin/sh
TmpName=$(mktemp)
TmpDiff=$(mktemp)
TmpErr=$(mktemp)
REPORT_EMAIL="admin"
URL="https://www.internic.net/domain/named.cache"
wget -nv $URL -O $TmpName 2> $TmpErr
# On intercepte toute erreur
# et on stoppe le script dans ce cas
# On continue sinon
if [ "$?" -ne 0 ];then
printf "\nScript was stopped at this point. A manual action may be required.\n" >> $TmpErr
mail -s "[DNS - $(uname -n)] Root hints file download failed" $REPORT_EMAIL < $TmpErr
rm $TmpErr
rm $TmpDiff
rm $TmpName
exit 0
else
rm $TmpErr
shaTMP=$(sha512sum $TmpName | awk '{print $1}')
shaHINTS=$(sha512sum /var/lib/unbound/root.hints | awk '{print $1}')
if [ $shaTMP = $shaHINTS ]; then
# Si le fichier récupéré est identique à celui
# utilisé par Unbound, on fait... rien
rm $TmpName
exit 0
else
printf "A new root hints file was spotted on InterNIC server.\nFile downloaded and old root.hints file replaced.\nHere is the diff:\n\n" > $Tmp$
diff $TmpName /var/lib/unbound/root.hints >> $TmpDiff
printf "\n\n" >> $TmpDiff
mv -f $TmpName /var/lib/unbound/root.hints
chown unbound: /var/lib/unbound/root.hints
chmod 644 /var/lib/unbound/root.hints
sleep 5
service unbound restart
printf "Unbound status is $(service unbound status | grep Active | awk '{print $2 " " $3}')\n" >> $TmpDiff
mail -s "[DNS - $(uname -n)] Update in Root Hints" $REPORT_EMAIL < $TmpDiff
rm $TmpDiff
fi
fi
exit 0
Droits en exécution
chmod +x /etc/unbound/dnsunbound-update-root-dns.sh
Planification journalière
crontab -e
Ajouter en fin de fichier
# Mise à jour automatique des serveurs DNS de la racine
50 02 * * * /etc/unbound/dnsunbound-update-root-dns.sh
Certificats SSL letsencrypt (acme)
Installer acme
cd ~
sudo -s # en mode super utilisateur
apt install netcat -y # prérequis
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh --install # --nocron
cd ..
rm -rf acme.sh/
Ajouter les variables pour l’accès api OVH
export OVH_AK="MyBRE3Oq2FZrLC2N"
export OVH_AS="U8rSfBLK0OYNRoeaCZvatqxUcf5aE8bj"
Génération des certificats
/root/.acme.sh/acme.sh --dns dns_ovh --issue --keylength 4096 -d cinay.pw -d smtp.cinay.pw -d imap.cinay.pw -d webmail.cinay.pw -d mail.cinay.pw -d nc.cinay.pw
Il faut s’identifier chez OVH , un lien est fourni dans le résultat Please open this link to do authentication: https://eu.api.ovh.com/auth/?credentialToken=kdfyjvuioiogg265bhbgdfbghh
Sélectionner validity : unlimited
et login , vous obtiendrez le message suivant OVH authentication Success !
.
Il faut relancer la commande et patienter quelques minutes…
/root/.acme.sh/acme.sh --dns dns_ovh --issue --keylength 4096 -d cinay.pw -d smtp.cinay.pw -d imap.cinay.pw -d webmail.cinay.pw -d mail.cinay.pw -d nc.cinay.pw
Certificats
...
[mercredi 14 mars 2018, 14:17:27 (UTC+0100)] Your cert is in /root/.acme.sh/cinay.pw/cinay.pw.cer
[mercredi 14 mars 2018, 14:17:27 (UTC+0100)] Your cert key is in /root/.acme.sh/cinay.pw/cinay.pw.key
[mercredi 14 mars 2018, 14:17:27 (UTC+0100)] The intermediate CA cert is in /root/.acme.sh/cinay.pw/ca.cer
[mercredi 14 mars 2018, 14:17:27 (UTC+0100)] And the full chain certs is there: /root/.acme.sh/cinay.pw/fullchain.cer
Création des liens sur /etc/ssl/private pour nginx
ln -s /root/.acme.sh/cinay.pw/fullchain.cer /etc/ssl/private/cinay.pw-fullchain.pem # full chain certs
ln -s /root/.acme.sh/cinay.pw/cinay.pw.key /etc/ssl/private/cinay.pw-key.pem # cert key
ln -s /root/.acme.sh/cinay.pw/cinay.pw.cer /etc/ssl/private/cinay.pw-chain.pem # cert
ln -s /root/.acme.sh/cinay.pw/ca.cer /etc/ssl/private/cinay.pw-ca.pem # intermediate CA cert
Vérification de la mise à jour automatique
crontab -e
44 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
NOTE: Sous-domaines webmail.cinay.pw -> Rainloop et nc.cinay.pw -> Nextcloud , imap smtp et mail
Nginx + SSL + header + diffie-hellmann
ssl
Il faut préalablement demander des certificats (ca+key) SSL pour le domaine auprès d’une autorité de certification (let’s encrypt ou autre)
Le fichier de configuration
sudo nano /etc/nginx/ssl_params
ssl_certificate /etc/ssl/private/cinay.pw-fullchain.pem;
ssl_certificate_key /etc/ssl/private/cinay.pw-key.pem;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:50m;
ssl_prefer_server_ciphers on;
# Ciphers with intermediate compatibility
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=nginx-1.6.2&openssl=1.0.1t&hsts=yes&profile=intermediate
# ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
# Ciphers with modern compatibility
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=nginx-1.6.2&openssl=1.0.1t&hsts=yes&profile=modern
# Uncomment the following to use modern ciphers, but remove compatibility with some old clients (android before 5.0, Internet Explorer before 10, ...)
ssl_protocols TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
Entêtes
Le fichier de configuration
sudo nano /etc/nginx/header_params
# Quelques explications https://www.alsacreations.com/article/lire/1723-tour-horizon-https-et-en-tetes-de-securite.html
#HSTS est un dispositif de sécurité par lequel un site web peut déclarer aux navigateurs qu’ils doivent communiquer avec lui en utilisant exclusivement le protocole HTTPS, au lieu du HTTP
add_header Strict-Transport-Security "max-age=31536000;";
# Seul le site utilise peut utiliser iFrame
add_header Content-Security-Policy "frame-ancestors 'self'";
#se protéger contre le détournement de clic (clickjacking)
add_header X-Frame-Options "SAMEORIGIN";
# Empêche les navigateurs de détecter incorrectement les scripts qui ne sont pas des scripts
add_header X-Content-Type-Options "nosniff";
# Bloquer les pages à charger lorsqu'elles détectent des attaques XSS
add_header X-XSS-Protection "1; mode=block";
#Supprimer les ## des lignes pour activer la fonction correspondante
#CSP permet d’autoriser seulement les domaines déclarés à exécuter du script JavaScript, une feuille de style css, etc.
# Content-Security-Policy : https://openweb.eu.org/articles/content-security-policy
## add_header Content-Security-Policy "default-src 'self'";
# Désactiver les références pour les navigateurs qui ne prennent pas en charge strict-origin-when-cross-origin
# Referrer-Policy : https://scotthelme.co.uk/a-new-security-header-referrer-policy/
# Utilise strict-origin-when-cross-origin pour les navigateurs qui le font
## add_header Referrer-Policy "no-referrer, strict-origin-when-cross-origin";
Diffie-Hellmann
Générer une clé Diffie-Hellmann
En cryptographie, l’échange de clés Diffie-Hellman, du nom de ses auteurs Whitfield Diffie et Martin Hellman, est une méthode par laquelle deux agents nommés conventionnellement A etB peuvent se mettre d’accord sur un nombre (qu’ils peuvent utiliser comme clé pour chiffrer la conversation suivante) sans qu’un troisième agent appelé D puisse découvrir le nombre, même en ayant écouté tous leurs échanges.
ATTENTION : Génération clé Diffie-Hellmann très très longue en temps , 30 minutes minimum…
Générer une clé
openssl dhparam -out /etc/ssl/private/dh4096.pem -outform PEM -2 4096
Droits pour root
sudo chmod 600 /etc/ssl/private/dh4096.pem
Le fichier de configuration
sudo nano /etc/nginx/dh_param
# Uncomment the following directive after DH generation
# > openssl dhparam -out /etc/ssl/private/dh4096.pem -outform PEM -2 4096
ssl_dhparam /etc/ssl/private/dh4096.pem;
Configuration de base avec SSL et sécurité + letsencrypt (renouvellement)
sudo nano /etc/nginx/conf.d/cinay.pw.conf
server {
listen 80;
listen [::]:80;
## redirect http to https ##
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name cinay.pw;
#### Locations
# On cache les fichiers statiques
location ~* \.(html|css|js|png|jpg|jpeg|gif|ico|svg|eot|woff|ttf)$ { expires max; }
# On interdit les dotfiles
location ~ /\. { deny all; }
include ssl_params;
include header_params;
include dh_param;
root /var/www/ ;
index index.php index.html index.htm;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.0-fpm.sock; # PHP7.0
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
include conf.d/cinay.pw.d/*.conf;
access_log /var/log/nginx/cinay.pw-access.log;
error_log /var/log/nginx/cinay.pw-error.log;
}
Vérifier
sudo nginx -t
Relancer
sudo systemctl reload nginx
Test redirection http/https avec curl depuis un poste distant
curl -I cinay.pw
HTTP/1.1 301 Moved Permanently
Server: nginx/1.13.9
Date: Mon, 12 Mar 2018 12:46:04 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: https:///
Tester le lien https://cinay.pw
Vérification headers https://securityheaders.io
Vérification complète https://observatory.mozilla.org/analyze.html?host=cinay.pw
parefeu (iptables V4 V6)
Créer un script pour mettre en place des règles de base.
cd ~
sudo nano parefeu
#!/bin/sh
# Efface toutes les règles en cours. -F toutes. -X utilisateurs
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
#
ip6tables -t filter -F
ip6tables -t filter -X
ip6tables -t mangle -F
ip6tables -t mangle -X
# stratégie (-P) par défaut : bloc tout l'entrant le forward et autorise le sortant
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT ACCEPT
#
ip6tables -t filter -P INPUT DROP
ip6tables -t filter -P FORWARD DROP
ip6tables -t filter -P OUTPUT ACCEPT
# Ne pas casser les connexions etablies
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#
ip6tables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Autoriser Loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
#
ip6tables -t filter -A INPUT -i lo -j ACCEPT
ip6tables -t filter -A OUTPUT -o lo -j ACCEPT
# Autoriser icmp
iptables -t filter -A INPUT -p icmp -j ACCEPT
ip6tables -t filter -A INPUT -p icmp -j ACCEPT
# SSH
iptables -t filter -A INPUT -p tcp --dport 55027 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 55027 -j ACCEPT
#
ip6tables -t filter -A INPUT -p tcp --dport 55027 -j ACCEPT
ip6tables -t filter -A OUTPUT -p tcp --dport 55027 -j ACCEPT
# DNS in/out
# /!\ Il faut autoriser le DNS AVANT de déclarer des hosts sinon pas de résolution de nom possible
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
#
ip6tables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
ip6tables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
ip6tables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
ip6tables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
# HTTP + HTTPS
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
ip6tables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
ip6tables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
ip6tables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
# IMAP SMTP
iptables -t filter -A INPUT -p tcp --dport 993 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 587 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
ip6tables -t filter -A INPUT -p tcp --dport 993 -j ACCEPT
ip6tables -t filter -A INPUT -p tcp --dport 587 -j ACCEPT
ip6tables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
ip6tables -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT
ip6tables -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT
ip6tables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
fichier exécutable :
sudo chmod +x parefeu
Vous pourrez le tester en l’exécutant directement en ligne de commande.
sudo -s
./parefeu
En cas d’erreur, redémarrez le serveur, les règles seront oubliées et vous permettront de reprendre la main.
En revanche, si les tests s’avèrent concluants, ajoutez le lancement des règles iptables au démarrage.
Après avoir exécuté le script précédent,vérifier la présence des règles
iptables -L
ip6tables -L
Lancement du parefeu au démarrage
apt install iptables-persistent
Faut-il enregistrer les règles IPv4 actuelles ? OUI
Faut-il enregistrer les règles IPv6 actuelles ? OUI
Les tables sont enregistrés sous /etc/iptables/ , rules.v4 pour IPv4 et rules.v6 pour IPv6
Sauvegarde/Restauration manuelle des régles iptables
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
iptables-restore < /etc/iptables/rules.v4
ip6tables-restore < /etc/iptables/rules.v6
En cas de modification pouvez sauver les nouvelles règles du pare-feu
dpkg-reconfigure iptables-persistent
Serveur de messagerie
Installation sécurisée d’un serveur de mail avec Postfix, Dovecot et Rainloop
Configure SPF and DKIM With Postfix on Debian 8
Email with Postfix, Dovecot, and MySQL
Prérequis
- Domaine : cinay.pw
- IPv4 du serveur : x.x.x.x
- IPv6 du serveur : xxxx:xxxx:xx:xxxx::1
- Courrier entrant : cinay.pw ou imap.cinay.pw sur port 993 (imaps)
- Courrier sortant : cinay.pw ou smtp.cinay.pw sur port 587 (submission)
- Compte courrier : yann@cinay.pw
- Certificats : Let’s Encrypt
- Serveur Debian Stretch + Nginx + PHP7 + MariaDb + accès SSH
- DNS de base configuré (OVH)
Par défaut ,courrier entrant et sortant sur cinay.pw
Vérifier que les enregistrements MX de votre configuration DNS du domaine cinay.pw pointent vers votre serveur:
dig +short MX cinay.pw
10 cinay.pw.
Les certificats letsencrypt
/etc/ssl/private/cinay.pw-fullchain.pem
/etc/ssl/private/cinay.pw-key.pem
/etc/ssl/private/cinay.pw-chain.pem
/etc/ssl/private/cinay.pw-ca.pem
Toutes les opérations se font en mode su
sudo -s
Postfix
On commence par installer Postfix avec le support de mysql. Les domaines, comptes utilisateurs et alias seront ainsi gérés directement au sein d’une base de données, que vous pourrez administrer grâce à vos outils habituels, comme phpMyAdmin par exemple.
apt install postfix postfix-mysql -y
Postfix, compléter les options comme ceci :
Configuration type du serveur de messagerie : Site Internet
Nom de courrier : cinay.pw
Générer les paramètres DH :
openssl dhparam -out /etc/postfix/dh_512.pem -2 -rand /var/run/egd-pool 512
openssl dhparam -out /etc/postfix/dh_2048.pem -2 -rand /var/run/egd-pool 2048 # on peur coder 2048 au lieu de 1024
Création d’une base postfix et d’un utilisateur postfix ayant tous les privilèges sur la base :
mysql -u root -p
La requête :
CREATE DATABASE postfix;
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'iq9awn3wEuUPxsi6qrdU';
GRANT ALL PRIVILEGES ON `postfix`.* TO 'postfix'@'localhost';
FLUSH PRIVILEGES;
QUIT
PostfixAdmin
Télécharger la dernière version sur le dossier /var/www
cd /var/www
wget 'http://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-3.1/postfixadmin-3.1.tar.gz/download' -O pfa.tar.gz
tar -zxvf pfa.tar.gz
mv postfixadmin-3.1 pfa
rm pfa.tar.gz
chown -R www-data. pfa
cd pfa
Il faut également télécharger php imap
apt install php7.0-imap -y
Vous n’avez plus qu’à créer le fichier config.local.php dans le répertoire de PostfixAdmin /var/www/pfa :
nano /var/www/pfa/config.local.php
<?php
$CONF['configured'] = true;
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'iq9awn3wEuUPxsi6qrdU';
$CONF['database_name'] = 'postfix';
$CONF['admin_email'] = 'admin@cinay.pw';
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
$CONF['fetchmail'] = 'NO';
$CONF['encrypt'] = 'md5crypt';
?>
Les droits
chown www-data.www-data /var/www/pfa/config.local.php
Pour éviter l’erreur lors de l’accès à setup.php : ERROR: the templates_c directory doesn’t exist or isn’t writeable for the webserver :
mkdir -p /var/www/pfa/templates_c
chown -R www-data: /var/www/pfa/templates_c/
Rendez-vous sur le setup.php de PostfixAdmin depuis votre navigateur https://cinay.pw/pfa/setup.php
Une vérification est effectué et si tout est OK ,il faut créer un “Setup password” puis générer un hash bouton “generate password hash”
Editer le fichier le fichier config.local.php pour y ajouter le hash du “Setup password” :
$CONF['setup_password'] = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
Ajouter un administrateur (Create superadmin account) nommé postfixadmin@cinay.pw
Le message suivant “You can now login to PostfixAdmin using the account you just created.” nous indique que lèon peut se connecter
Ouvrir l’interface d’administration de PostfixAdmin https://cinay.pw/pfa/login.php avec postfixadmin@cinay.pw , vous devez ajouter un nouveau domaine puis un nouveau compte courrier.
- Domaine : cinay.pw
- Compte courriel : yan@cinay.pw
- Modifier les alias abuse,postmaster,hostmaster et webmaster pour qu’ils pointent vers yan@cinay.pw
Configuration de Postfix
Maintenant nous allons devoir configurer Postfix pour qu’il prenne en charge correctement les connexions SMTP et l’envoie des messages sur le réseau pour chaque utilisateur créé via PostfixAdmin. Faites une sauvegarde du fichier de conf de Postfix /etc/postfix/main.cf :
cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
nano /etc/postfix/main.cf
Les paramètres . N’oubliez pas de modifier la valeur de myhostname et mydomain en indiquant votre FQDN.
#######################
## Paramètres généraux
#######################
compatibility_level = 2
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
delay_warning_time = 4h
mailbox_command = procmail -a "$EXTENSION"
recipient_delimiter = +
disable_vrfy_command = yes
message_size_limit = 502400000
mailbox_size_limit = 1024000000
inet_interfaces = all
inet_protocols = ipv4
myhostname = cinay.pw
mydomain = cinay.pw
mydestination = localhost
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
relayhost =
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
####################
## Paramètres TLS
####################
# Smtp ( OUTGOING / Client )
smtp_tls_loglevel = 1
smtp_tls_security_level = may
smtp_tls_CAfile = /etc/ssl/private/cinay.pw-ca.pem
smtp_tls_protocols = !SSLv3
smtp_tls_mandatory_protocols = !SSLv3
smtp_tls_mandatory_ciphers = high
smtp_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, 3DES, RC2, RC4, MD5, PSK, SRP, DSS, AECDH, ADH
smtp_tls_note_starttls_offer = yes
# ---------------------------------------------------------------------------------------------------
# Smtpd ( INCOMING / Server )
smtpd_tls_loglevel = 1
smtpd_tls_auth_only = yes
smtpd_tls_security_level = may
smtpd_tls_received_header = yes
smtpd_tls_protocols = !SSLv3
smtpd_tls_mandatory_protocols = !SSLv3
smtpd_tls_mandatory_ciphers = medium
# Infos (voir : postconf -d)
# Medium cipherlist = aNULL:-aNULL:ALL:!EXPORT:!LOW:+RC4:@STRENGTH
# High cipherlist = aNULL:-aNULL:ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH
# smtpd_tls_exclude_ciphers = NE PAS modifier cette directive pour des raisons de compatibilité
# avec les autres serveurs de mail afin d'éviter une erreur du type
# "no shared cipher" ou "no cipher overlap" puis un fallback en
# plain/text...
# smtpd_tls_cipherlist = Ne pas modifier non plus !
smtpd_tls_CAfile = $smtp_tls_CAfile
smtpd_tls_cert_file = /etc/ssl/private/cinay.pw-chain.pem
smtpd_tls_key_file = /etc/ssl/private/cinay.pw-key.pem
smtpd_tls_dh1024_param_file = $config_directory/dh_2048.pem
smtpd_tls_dh512_param_file = $config_directory/dh_512.pem
tls_preempt_cipherlist = yes
tls_random_source = dev:/dev/urandom
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
lmtp_tls_session_cache_database = btree:${data_directory}/lmtp_scache
###############################################################################################
## Paramètres de connexion SASL
## C'est ici que l'on déclare Dovecot comme une passerelle pour authentifier les utilisateurs.
## Postfix peut s'appuyer sur Dovecot pour identifier les connexions SMTP.
###############################################################################################
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = $smtpd_sasl_security_options
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes
##############################
## VIRTUALS MAPS PARAMETERS ##
##############################
# Gestion et du stockage des emails.
# Utilisateur "vmail" avec UID/GID de 5000, avec un HOME par défaut pointant sur "/var/mail".
# Postfix doit le savoir donc on lui indique avec les 4 paramètres suivants :
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_minimum_uid = 5000
virtual_mailbox_base = /var/mail
# Les 4 règles suivantes permettent à Postfix de savoir comment se connecter et lire la base de donnée
# afin de récupérer des informations sur les différents domaines, adresses virtuelles et alias.
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
smtpd_sender_login_maps = mysql:/etc/postfix/mysql-sender-login-maps.cf
######################
## ERRORS REPORTING ##
######################
# notify_classes = bounce, delay, resource, software
notify_classes = resource, software
error_notice_recipient = hostmaster@cinay.pw
# delay_notice_recipient = admin@domain.tld
# bounce_notice_recipient = admin@domain.tld
# 2bounce_notice_recipient = admin@domain.tld
###############################################################################################
## Règles sur les adresses de destination
## permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifié
## reject_non_fqdn_recipient : Refuser les adresses de destinations invalides (non FQDN)
###############################################################################################
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_recipient,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_rbl_client zen.spamhaus.org
###############################################################################################
## Règles sur l'échange HELO qui survient avant la connexion
## reject_invalid_helo_hostname : Refuser les échanges HELO invalides
## reject_non_fqdn_helo_hostname : Refuser les noms d'hôte invalides (non FQDN)
## reject_unknown_helo_hostname : Refuser les noms d'hôte qui n'ont pas de champ DNS A ou MX dans leurs DNS.
###############################################################################################
smtpd_helo_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname,
# reject_unknown_helo_hostname
###############################################################################################
## Règles de connexion des clients
## permit_sasl_authenticated : Accepter la connexion lorsque le client est authentifié
## reject_plaintext_session : Refuser les connexions non sécurisées
## reject_unauth_pipelining : Refuser les défauts lors de la connexion
###############################################################################################
smtpd_client_restrictions =
permit_mynetworks,
permit_inet_interfaces,
permit_sasl_authenticated,
# reject_plaintext_session,
# reject_unauth_pipelining
###############################################################################################
## Règles sur les expéditeurs
## reject_non_fqdn_sender : Refuser les expéditeurs invalides (non FQDN)
## reject_unknown_sender_domain : Refuser les expéditeurs qui n'ont pas de champ DNS A ou MX dans leurs DNS.
## reject_sender_login_mismatch : Refuser les expéditeurs locaux non authentifiés
###############################################################################################
smtpd_sender_restrictions =
reject_non_fqdn_sender,
reject_unknown_sender_domain,
# reject_sender_login_mismatch
#----------------------------------------------------------------------------------------------
# Le paramètre "virtual_transport" est très très important, il permet à Postfix de savoir où envoyer les emails reçus.
# Dans notre cas, on utilise le protocole **LMTP** pour les acheminer jusqu'à Dovecot
virtual_transport = lmtp:unix:private/dovecot-lmtp
C’est terminé pour le fichier de configuration principale, je vous l’accorde il y a pas mal de paramètres à prendre en compte mais dans le cas d’un serveur SMTP c’est pas étonnant.
Vous pouvez aller voir la documentation de Postfix si vous voulez avoir plus d’informations sur sa configuration. http://www.postfix.org/postconf.5.html
Fichier de configuration complet main.cf : https://gist.github.com/hardware/b26918353c6325c09310
Configuration de Postfix pour MySQL/MariaDb
Créer les 4 fichiers de configuration qui vont permettre à Postfix d’interagir avec MySQL :
nano /etc/postfix/mysql-virtual-mailbox-domains.cf
hosts = 127.0.0.1
user = postfix
password = iq9awn3wEuUPxsi6qrdU
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = 0 and active = 1
nano /etc/postfix/mysql-virtual-mailbox-maps.cf
hosts = 127.0.0.1
user = postfix
password = iq9awn3wEuUPxsi6qrdU
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1
nano /etc/postfix/mysql-virtual-alias-maps.cf
hosts = 127.0.0.1
user = postfix
password = iq9awn3wEuUPxsi6qrdU
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = 1
nano /etc/postfix/mysql-sender-login-maps.cf
hosts = 127.0.0.1
user = postfix
password = iq9awn3wEuUPxsi6qrdU
dbname = postfix
query = SELECT username FROM mailbox WHERE username='%s' AND active = 1
Si vous voulez activer le port 587 pour vous connecter de manière sécurisé par SMTPS avec n’importe quel client mail, il faut décommenter/modifier les lignes suivantes dans le fichier /etc/postfix/master.cf :
nano /etc/postfix/master.cf
submission inet n - - - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_dh1024_param_file=/etc/postfix/dh_2048.pem
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
Et n’oubliez pas de décommentez cette ligne aussi si ce n’est pas déjà fait :
#smtp inet n - y - - smtpd
smtp inet n - - - - smtpd
Dovecot
Dovecot est un serveur IMAP et POP3 pour les systèmes d’exploitation Unix et dérivés, conçu avec comme premier but la sécurité. Dovecot est distribué en double licence MIT et GPL version 2.
Installation des paquets :
apt install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql -y
Configuration de dovecot
Ajoutez la liste des protocoles activés protocols = imap lmtp
après l’instruction “!include_try” dans le fichier /etc/dovecot/dovecot.conf. Dans notre cas, nous allons activer IMAP pour la récupération des emails via le port 993 et LMTP pour l’acheminement des emails entre Postfix et Dovecot :
nano /etc/dovecot/dovecot.conf
# Enable installed protocols
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap lmtp
listen = *
# Assurez-vous que cette ligne est bien décommentée :
!include conf.d/*.conf
On indique le chemin du conteneur local qui contiendra tous nos emails. Editez le fichier 10-mail.conf :
nano /etc/dovecot/conf.d/10-mail.conf
##
## Mailbox locations and namespaces
##
# Le contenur local est organisé de cette manière :
mail_location = maildir:/var/mail/vhosts/%d/%n/mail
maildir_stat_dirs=yes
namespace inbox {
inbox = yes
}
mail_uid = 5000
mail_gid = 5000
first_valid_uid = 5000
last_valid_uid = 5000
mail_privileged_group = vmail
Les emails seront stockés dans le répertoire /var/mail. On doit donc créer un répertoire correspondant à notre domaine (celui qui est présent dans la table “domain”).
mkdir -p /var/mail/vhosts/cinay.pw
Maintenant on ajoute un nouvel utilisateur et un nouveau groupe nommé vmail avec un UID/GID de 5000 :
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail
chown -R vmail:vmail /var/mail
Editer le fichier 10-auth.conf et modifier les lignes suivantes :
nano /etc/dovecot/conf.d/10-auth.conf
##
## Authentication processes
##
disable_plaintext_auth = yes
auth_mechanisms = plain login
#!include auth-system.conf.ext # Commenter cette ligne
!include auth-sql.conf.ext # décommenter cette ligne
Maintenant on va définir deux méthodes qui vont permettrent à Dovecot de savoir comment obtenir les utilisateurs et les mots de passe correspondants lors de la connexion. Editez le fichier auth-sql.conf.ext :
nano /etc/dovecot/conf.d/auth-sql.conf.ext
# Authentication for SQL users. Included from 10-auth.conf.
#
# Le mot de passe est obtenu à partir de la base de donnée
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
# Par contre le nom d'utilisateur est obtenu de manière statique à partir du conteneur local
# %d = domaine.tld
# %n = utilisateur
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
Ensuite editez le fichier dovecot-sql.conf.ext avec le contenu suivant :
nano /etc/dovecot/dovecot-sql.conf.ext
# Paramètres de connexion
driver = mysql
connect = host=127.0.0.1 dbname=postfix user=postfix password=iq9awn3wEuUPxsi6qrdU
# Permet de définir l'algorithme de hachage.
# Pour plus d'information: http://wiki2.dovecot.org/Authentication/PasswordSchemes
# /!\ ATTENTION : ne pas oublier de vérifier ou modifier le paramètre "$CONF['encrypt'] = 'md5crypt';" de PostfixAdmin
default_pass_scheme = MD5-CRYPT
# Requête de récupération du mot de passe du compte utilisateur
password_query = SELECT password FROM mailbox WHERE username = '%u'
Modifiez les permissions sur le répertoire /etc/dovecot :
chown -R vmail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot
Editer le fichier 10-master.conf avec le contenu suivant :
nano /etc/dovecot/conf.d/10-master.conf
service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
service_count = 0
}
service imap {
}
service lmtp {
# On autorise Postfix à transférer les emails dans le spooler de Dovecot via LMTP
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
service auth {
# On autorise Postfix à se connecter à Dovecot via LMTP
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
# On indique à Dovecot les permissions du conteneur local
unix_listener auth-userdb {
mode = 0600
user = vmail
group = vmail
}
user = dovecot
}
service auth-worker {
user = vmail
}
Enfin, editez le fichier 10-ssl.conf avec le contenu suivant :
nano /etc/dovecot/conf.d/10-ssl.conf
##
## SSL settings
##
ssl = required
ssl_cert = </etc/ssl/private/cinay.pw-chain.pem
ssl_key = </etc/ssl/private/cinay.pw-key.pem
#ssl_protocols = !SSLv2 !SSLv3
ssl_protocols = !SSLv3
ssl_cipher_list = ALL:!aNULL:!eNULL:!LOW:!MEDIUM:!EXP:!RC2:!RC4:!DES:!3DES:!MD5:!PSK:!SRP:!DSS:!AECDH:!ADH:@STRENGTH
ssl_prefer_server_ciphers = yes # Dovecot > 2.2.x
ssl_dh_parameters_length = 4096 # Dovecot > 2.2.x
#ssl_dh_parameters_length = 2048 # Dovecot > 2.2.x
Redémarrage des services et vérification des ports
On redémarre Postfix et Dovecot :
systemctl restart postfix dovecot
Puis on vérifie que les ports 25 (SMTP), 587 (SMTPS) et 993 (IMAPS) sont bien en écoute sur 0.0.0.0. N’oubliez pas de les ouvrir au niveau de votre Firewall :
netstat -ptna
Proto Recv-Q Send-Q Adresse locale Adresse distante Etat PID/Program name
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 6116/master
tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 6009/dovecot
tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 6116/master
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 6009/dovecot
Vous pouvez tester le serveur Postfix localement à partir du terminal en utilisant une connexion directe avec netcat, telnet ou similaire. Les commandes suivantes doivent être exécutées dans l’ordre correct pour que le serveur ferme la connexion.
nc cinay.pw 25
220 cinay.pw ESMTP Postfix (Debian/GNU)
EHLO $hostname
250-cinay.pw
250-PIPELINING
250-SIZE 502400000
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
Si vous voyez 250-STARTTLS, c’est que le serveur supporte bien l’authentification par STARTTLS.
Reverse DNS
Un enregistrement DNS inversé (aussi appelé “PTR record” correspond à un FQDN à une adresse IP. De nombreux fournisseurs de messagerie populaires vérifient les enregistrements PTR d’autres serveurs de messagerie et refusent de recevoir leurs e-mails s’ils ne peuvent pas trouver un nom de domaine correct pour leurs adresses IP. Vous aurez besoin d’enregistrements PTR pour toutes les adresses IP de votre serveur. Ils doivent tous pointer vers mail. cinay. pw. Dans la plupart des cas, les entrées DNS inversées peuvent être réglées via l’interface web de votre hébergeur serveur ou via l’équipe de support du serveur.
SPF records
SPF records a été inventé pour soutenir la lutte contre les serveurs de spam. Malheureusement, cela s’est avéré être un malentendu et vous ne pouvez plus vous fier à ces enregistrements. SPF décrit quels serveurs de messagerie sont autorisés à envoyer des e-mails pour un domaine et lesquels ne le sont pas. Dans certains cas (par exemple les listes de diffusion), le concept SPF ne fonctionne pas. Certains fournisseurs s’attendent toujours à ce que vous établissiez un record SPF - si ce n’est pas le cas, vous obtiendrez un point sur votre “score de crédibilité anti-spam”. Faisons donc un compromis et fournissons un disque SPF neutre:
cinay.pw. 3600 IN TXT "v=spf1 a mx ip4:93.113.206.145 ip6:2a03:75c0:39:6a3f::1 -all"
Les mauvais fournisseurs de services « mail » seront satisfaits, mais nous ne soutenons pas les mauvaises pratiques de SPF. L’enregistrement SPF est également défini pour vos autres domaines “xoyize. xyz” et “oli. ovh”, mais d’une manière légèrement différente:
xoyize.xyz. 3600 IN TXT v=spf1 include:cinay.pw ?all
DMARC
Les enregistrements DMARC fixent des règles pour les serveurs de messagerie étrangers, qui leur indiquent comment traiter les e-mails non authentifiés ou incorrectement authentifiés. Si un spammeur envoie un faux e-mail et utilise votre domaine cinay.pw, le serveur destinataire consultera le DNS et demandera l’enregistrement DMARC. S’il découvre que SPF ou DKIM échoue (ce qui sera le cas), le serveur procédera selon l’enregistrement DMARC. C’est une bonne idée de rejeter de tels courriels:
_dmarc.cinay.pw. 3600 IN TXT v=DMARC1; p=reject;
Définissez l’enregistrement DMARC pour vos autres domaines en conséquence:
_dmarc.xoyize.xyz. 3600 IN TXT v=DMARC1; p=reject;
Vous pouvez créer vos propres enregistrements de politique DMARC sur https://elasticemail.com/dmarc/.
Rspamd
Install and integrate Rspamd
Les dépôts officiels de Debian contiennent une version obsolète de Rspamd, utilisez donc le Rspamd-Repository pour l’installation:
apt install -y lsb-release wget -y
wget -O- https://rspamd.com/apt-stable/gpg.key | apt-key add -
echo "deb http://rspamd.com/apt-stable/ $(lsb_release -c -s) main" > /etc/apt/sources.list.d/rspamd.list
echo "deb-src http://rspamd.com/apt-stable/ $(lsb_release -c -s) main" >> /etc/apt/sources.list.d/rspamd.list
Mettez à jour les sources de paquets et installez Rspamd:
apt update
apt install rspamd -y
Arrêter le servcie Rspamd
systemctl stop rspamd
Configuration de base
Au lieu de modifier les fichiers de configuration stock, nous allons créer de nouveaux fichiers dans le répertoire /etc/rspamd/local.d/ qui écraseront le réglage par défaut.
Les fichiers suivants sont maintenant créés dans /etc/rspamd/local.d/:
/etc/rspamd/local.d/worker-normal.inc: Paramètres pour le Rspamd worker
bind_socket = "127.0.0.1:11333";
L’agent mandataire écoute sur le port 11332 et prend en charge le protocole Milter. Pour que Postfix puisse communiquer avec Rspamd, nous devons activer le mode Milter: /etc/rspamd/local.d/worker-proxy.inc
bind_socket = "127.0.0.1:11332";
milter = yes;
timeout = 120s;
upstream "local" {
default = yes;
self_scan = yes;
}
Ensuite, nous avons besoin de mettre en place un mot de passe pour le “controller worker” qui donne accès à l’interface web de Rspamd. Pour générer un lancement de mot de passe crypté:
rspamadm pw --encrypt -p P4ssvv0rD
Et coller le code dans le fichier /etc/rspamd/local.d/worker-controller.inc
type = "controller";
count = 1;
password = "$2$aib.........................bqxiy";
secure_ip = "127.0.0.1";
secure_ip = "::1";
static_dir = "${WWWDIR}";
Pour accéder à l’interface web, nous configurerons plus tard Nginx en tant que proxy inverse pour le serveur web du contrôleur.
Nous utiliserons Redis en tant que backend pour les statistiques Rspamd: /etc/rspamd/local.d/classifier-bayes.conf
servers = "127.0.0.1";
backend = "redis";
Les entêtes milter /etc/rspamd/local.d/milter_headers.conf
use = ["x-spamd-bar", "x-spam-level", "authentication-results"];
Redémarrer le service Rspamd:
systemctl restart rspamd
Rspamd DKIM
Rspamd ne s’occupe pas seulement du filtrage des spams, mais est également capable de signer des e-mails via DKIM. Tout d’abord, une clé de signature doit être créée:
mkdir /var/lib/rspamd/dkim/
rspamadm dkim_keygen -b 2048 -s 2018 -k /var/lib/rspamd/dkim/2018.key > /var/lib/rspamd/dkim/2018.txt
chown -R _rspamd:_rspamd /var/lib/rspamd/dkim
chmod 440 /var/lib/rspamd/dkim/*
2018 est le nom de la touche DKIM (également appelée “sélecteur”). J’utilise l’année en cours comme nom. Pour une clé de signature DKIM (/var/lib/rspamd/dkim/2018.key) il y a aussi une clé publique correspondante, qui doit être publiée dans le DNS (/var/lib/rspamd/dkim/2018.txt)
Enregistrement DNS de sortie avec clé publique:
cat /var/lib/rspamd/dkim/2018.txt
2018._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2/al5HqXUpe+HUazCr6t9lv2VOZLR369PPB4t+dgljZQvgUsIKoYzfS/w9NagS32xZYxi1dtlDWuRfTU/ahHO2MYzE0zHE4lMfwb6VkNCG+pM6bAkCwc5cFvyRygwxAPEiHAtmtU5b0i9LY25Z/ZWgyBxEWZ0Wf+hLjYHvnvMqewPsduUqKVjDOdUqeBb1VAu3WFErOAGVUYfKqFX"
"+yfz36Alb7/OMAort8A5Vo5t5k0vxTHzkYYg5KB6tLS8jngrNucGjyNL5+k0ijPs3yT7WpTGL3U3SEa8cX8WvOO1fIpWQz4yyZJJ1Mm62+FskSc7BHjdiMHE64Id/UBDDVjxwIDAQAB"
) ;
La partie importante commence par v=DKIM1 et se termine par AQAB (dans cet exemple). Placez maintenant cette partie de la sortie dans un nouvel enregistrement DNS.
Assurez-vous que le préfixe _domainkey-subdomain-prefix correspond au préfixe de votre sélecteur! (“2018”)
Si votre enregistrement n’est pas accepté par votre hébergeur DNS, une clé de 2048 bits peut être trop longue. Vous pouvez générer une clé plus courte en spécifiant -b 1024 au lieu de -b 2048 et en exécutant à nouveau la commande rspamadm dkim_keygen
Créer /etc/rspamd/local.d/dkim_signing.conf et définissez “2018” comme sélecteur:
path = "/var/lib/rspamd/dkim/$selector.key";
selector = "2018";
### Enable DKIM signing for alias sender addresses
allow_username_mismatch = true;
Cette configuration est également copiée dans /etc/rspamd/local.d/arc.conf, puisque le « ARC module » utilise les mêmes paramètres.
cp -R /etc/rspamd/local.d/dkim_signing.conf /etc/rspamd/local.d/arc.conf
Redis
Rspamd utilise Redis comme cache de données. L’installation est simple:
apt install redis-server
/etc/rspamd/local.d/redis.conf
servers = "127.0.0.1";
Rspamd postfix
Nous devons configurer Postfix pour utiliser le Rspamd Milter.
postconf -e "milter_protocol = 6"
postconf -e "milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}"
postconf -e "milter_default_action = accept"
postconf -e "smtpd_milters = inet:127.0.0.1:11332"
postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"
Ajout au fichier /etc/postfix/main.cf rspamd dkimm
##
## Spam filter and DKIM signatures via Rspamd
##
milter_protocol = 6
milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}
milter_default_action = accept
smtpd_milters = inet:127.0.0.1:11332
non_smtpd_milters = inet:127.0.0.1:11332
Redémarrer postfix
systemctl restart postfix
Dovecot Sieve (Filtrer les mails côté serveur)
Vous connaissez très certainement les filtres côté clients, tout bon client mail possède un système de filtre permettant de trier automatiquement les mails en fonction de différents critères que vous pouvez définir. Sieve c’est exactement la même chose mais côté serveur, il possède un langage de script pour définir soit même l’ensemble des règles.On intègre dovecot à rspamd.
Pour installer sieve, exécuter la commande suivante :
apt install dovecot-sieve dovecot-managesieved
Ensuite dans le fichier /etc/dovecot/conf.d/20-lmtp.conf, ajouter le contenu suivant :
protocol lmtp {
postmaster_address = postmaster@cinay.pw
mail_plugins = $mail_plugins sieve
}
Dans le fichier /etc/dovecot/conf.d/20-managesieve.conf
...
service managesieve-login {
inet_listener sieve {
port = 4190
}
...
}
...
service managesieve {
process_limit = 1024
}
...
Dans le fichier /etc/dovecot/conf.d/20-imap.conf
...
protocol imap {
...
#mail_plugins = $mail_plugins imap_quota imap_sieve
mail_plugins = $mail_plugins imap_sieve
...
}
...
Dans le fichier /etc/dovecot/conf.d/90-sieve.conf, modifier la configuration du plugin :
plugin {
sieve_plugins = sieve_imapsieve sieve_extprograms
sieve_before = /var/mail/sieve/default.sieve
#sieve = file:/var/mail/sieve/%d/%n/scripts;active=/var/mail/sieve/%d/%n/active-script.sieve
###
### Spam learning
###
# From elsewhere to Spam folder
imapsieve_mailbox1_name = Spam
imapsieve_mailbox1_causes = COPY
imapsieve_mailbox1_before = file:/var/mail/sieve/learn-spam.sieve
# From Spam folder to elsewhere
imapsieve_mailbox2_name = *
imapsieve_mailbox2_from = Spam
imapsieve_mailbox2_causes = COPY
imapsieve_mailbox2_before = file:/var/mail/sieve/learn-ham.sieve
sieve_pipe_bin_dir = /usr/bin
sieve_global_extensions = +vnd.dovecot.pipe
#quota = maildir:User quota
#quota_exceeded_message = Benutzer %u hat das Speichervolumen überschritten. / User %u has exhausted allowed storage space.
}
Puis :
mkdir /var/mail/sieve/
touch /var/mail/sieve/default.sieve
Par défaut, vous pouvez mettre toutes les règles dans le fichier default.sieve, elles s’appliqueront à toutes les adresses, les règles spécifiques à une adresse doivent être mises dans le fichier /var/mail/vhosts/xoyize.xyz/adresse/.dovecot.sieve. Attention si ce fichier existe, le fichier par défaut (default.sieve) ne sera pas lu pour l’utilisateur courant.
Pour ce tutoriel, on va ajouter dans /var/mail/sieve/default.sieve une règle basique mais très utile :
require ["fileinto"];
if header :contains "Subject" "***SPAM***" {
fileinto "Spam";
}
if header :contains "X-Spam-Flag" "YES" {
fileinto "Spam";
}
if header :is "X-Spam" "Yes" {
fileinto "Spam";
}
Rspamd apprendra de ses erreurs si vous déplacez un courrier hors de votre dossier “Spam” et vice versa. Sieve reconnaît le processus de déplacement et déclenche un processus d’apprentissage Rspam. Créez les deux fichiers de configuration suivants dans /var/mail/sieve/:
/var/mail/sieve/learn-spam.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_spam"];
/var/mail/sieve/learn-ham.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_ham"];
Et pour finir compiler les règles avec la commande sievec :
sievec /var/mail/sieve/default.sieve
sievec /var/mail/sieve/learn-spam.sieve
sievec /var/mail/sieve/learn-ham.sieve
chown -R vmail:vmail /var/mail/sieve
et on redémarre Dovecot :
systemctl restart dovecot
Lancer Rspamd
systemctl restart postfix dovecot rspamd
Rspamd via tunnel SSH
Accès à l’interface web Rspamd via tunnel SSH (alternative à Nginx)
Si votre machine locale est un ordinateur Linux ou MAC, entrez la commande suivante pour lier l’interface web à votre port TCP 8080 local:
ssh -L 8080:localhost:11334 benutzer@mail.cinay.pw -N # sans clé
ssh -p 55027 -i ~/.ssh/kvm-vps-27199 -L 8080:localhost:11334 adxo@cinay.pw -N # avec clé
L’interface web peut alors être consultée via http://localhost:8080. CTRL+C annule la connexion.
Postfix ,modifier les entêtes de message
Cacher les informations sensibles qui sont contenues dans les headers des mails que vous envoyez, comme votre adresse ip LAN/WAN, le User-Agent…etc.
On va utiliser les regex. Créer le fichier /etc/postfix/header_checks et y ajouter :
/^Received:.*with ESMTPSA/ IGNORE
/^X-Originating-IP:/ IGNORE
/^X-Mailer:/ IGNORE
/^User-Agent:/ IGNORE
Ensuite modifier la configuration de postfix en ajoutant les lignes suivantes dans /etc/postfix/main.cf :
postconf -e "mime_header_checks = regexp:/etc/postfix/header_checks"
postconf -e "header_checks = regexp:/etc/postfix/header_checks"
Et pour finir, il faut reconstruire la hash table et redémarrer postfix :
postmap /etc/postfix/header_checks
systemctl reload postfix
Fail2ban
Fail2ban lit des fichiers de log et bannit les adresses IP qui ont obtenu un trop grand nombre d’échecs lors de l’authentification. Il met à jour les règles du pare-feu pour rejeter cette adresse IP. Ces règles peuvent êtres défines par l’utilisateur.
Les commandes sont exécutées en mode su sudo
Installation
apt install fail2ban
fail2ban.conf
Rien à faire dans le fichier /etc/fail2ban/fail2ban.conf, vous pouvez laisser les options par défaut
jail.conf
Copier la configuration par défaut afin qu’elle ne soit pas supprimée en cas de mise à jour.
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Ce fichier est beaucoup plus intéressant, il contient tous les services à monitorer, et vous allez le découvrir, fail2ban ne se limite pas à SSH…
nano /etc/fail2ban/jail.local
Tous les commentaires ont été supprimés pour allèger le fichier.
Les commentaires sont visibles dans le fichier original jail.conf
[INCLUDES]
before = paths-debian.conf
[DEFAULT]
ignoreip = 127.0.0.1/8
bantime = 600
findtime = 600
maxretry = 3
backend = auto
usedns = warn
logencoding = auto
filter = %(__name__)s
destemail = root@localhost
sender = root@localhost
mta = sendmail
protocol = tcp
chain = INPUT
port = 0:65535
fail2ban_agent = Fail2Ban/%(fail2ban_version)s
banaction = iptables-multiport
banaction_allports = iptables-allports
protocol="%(protocol)s", chain="%(chain)s"]
action_mw = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
%(mta)s-whois[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
action_mwl = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
%(mta)s-whois-lines[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s"]
action_xarf = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath=%(logpath)s, port="%(port)s"]
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
%(mta)s-whois-lines[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s"]
action_blocklist_de = blocklist_de[email="%(sender)s", service=%(filter)s, apikey="%(blocklist_de_apikey)s", agent="%(fail2ban_agent)s"]
action_badips = badips.py[category="%(__name__)s", banaction="%(banaction)s", agent="%(fail2ban_agent)s"]
action_badips_report = badips[category="%(__name__)s", agent="%(fail2ban_agent)s"]
action = %(action_)s
Pour envoyer un mail contenant le whois, placez la variable sur :
action = %(action_mw)s
Pour envoyer un mail avec le whois ET les logs, placez la variable sur :
action = %(action_mwl)s
Pour activer la surveillance d’un service, il suffit de placer la variable “enabled” à “true”
Par défaut la protection du service SSH est activée, pas les autres.
Si votre ssh n’écoute pas sur le port 22, pensez à le changer… (port = N° de port).
Rappelez vous également que le loglevel de SSHD (/etc/ssh/sshd_config) doit absolument être positionné sur DEBUG (LogLevel DEBUG) sans quoi, Fail2ban ne bloquera rien concernant SSH.
#
# JAILS
#
# SSH
[sshd]
enabled = true
port = 55027
logpath = %(sshd_log)s
backend = %(sshd_backend)s
# Mail servers
[postfix]
enabled = true
port = smtp,ssmtp,submission
filter = postfix
logpath = /var/log/mail.log
[sasl]
enabled = true
port = smtp,ssmtp,submission,imap2,imap3,imaps,pop3,pop3s
filter = postfix-sasl
# You might consider monitoring /var/log/mail.warn instead if you are
# running postfix since it would provide the same log lines at the
# "warn" level but overall at the smaller filesize.
logpath = /var/log/mail.log
[dovecot]
enabled = true
port = smtp,ssmtp,submission,imap2,imap3,imaps,pop3,pop3s
filter = dovecot
logpath = /var/log/mail.log
# nginx
[nginx-http-auth]
enabled = true
port = http,https
logpath = %(nginx_error_log)s
Redémarrer fail2ban pour implémenter les règles:
systemctl restart fail2ban
Afficher les règles de pare-feu actuelles
iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N f2b-dovecot
-N f2b-nginx-http-auth
-N f2b-postfix
-N f2b-sasl
-N f2b-sshd
-A INPUT -p tcp -m multiport --dports 25,465,587 -j f2b-postfix
-A INPUT -p tcp -m multiport --dports 80,443 -j f2b-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 55027 -j f2b-sshd
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 55027 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 587 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 55027 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 993 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 587 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A f2b-dovecot -j RETURN
-A f2b-nginx-http-auth -j RETURN
-A f2b-postfix -j RETURN
-A f2b-sasl -j RETURN
-A f2b-sshd -j RETURN
Clients de messagerie (Linux Thunderbird et Android K9mail)
La configuration d’un client mail
IMAP imap.cinay.pw ou cinay.pw 993 SSL/TLS Mot de Passe Normal
SMTP smtp.cinay.pw ou cinay.pw 587 STARTTLS Mot de Passe Normal
Utilisateur yan@cinay.pw
Les adresses imap.cinay.pw et smtp.cinay.pw sont arbitraires, vous pouvez très bien mettre à la place le FQDN de votre serveur (exemple: cinay.pw), ça marchera très bien aussi. Le plus important ce sont les ports et les algorithmes de chiffrement/d’authentification (SSL/TLS - STARTTLS).
Ajout de domaine au serveur de messagerie
Utiliser PostFixAdmin pour ajouter des domaines et les utilisateurs associés
Exemple pour un ajout des domaines oli.ovh et xoyize.xyz il faut ajouter les champs DNS suivants au gestionnaire du domaine
oli.ovh. 3600 IN MX 10 cinay.pw.
oli.ovh. 3600 IN TXT "v=spf1 include:cinay.pw ?all"
_dmarc.oli.ovh. 3600 IN TXT "v=DMARC1; p=reject;"
xoyize.xyz
xoyize.xyz. 3600 IN MX 10 cinay.pw.
xoyize.xyz. 3600 IN TXT "v=spf1 include:cinay.pw ?all"
_dmarc.xoyize.xyz. 3600 IN TXT "v=DMARC1"
Il faut paramétrer les clients de messagerie avec le serveur cinay.pw et les utilisateurs du domaine oli.ovh
Nextcloud
Installation
Prérequis
Toutes les commandes sont effectuées dans un terminal en super utilisateur (root)
Les paquets debian : apt install php7.0 php7.0-fpm php7.0-mysql php7.0-curl php7.0-json php7.0-gd php7.0-mcrypt php7.0-tidy php7.0-intl php7.0-imagick php7.0-xml php7.0-mbstring php7.0-zip
Créer une base mariadb Nextcloud
mysql -uroot -p
sur le prompt MariaDB [(none)]>
CREATE DATABASE nextcloud;
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost' IDENTIFIED BY 'w5C4AGeTzFY4Fz';
FLUSH PRIVILEGES;
QUIT
Installer la dernière version nextcloud
cd /var/www
wget https://download.nextcloud.com/server/releases/nextcloud-13.0.0.zip
unzip nextcloud-13.0.0.zip
mkdir /var/www/nextcloud/data
rm nextcloud-13.0.0.zip
# il est recommandé d’avoir un utilisateur dédié à la gestion du dossier nextcloud. Cet utilisateur aura des droits aussi restreints que possible à ce répertoire.
useradd nextcloud --comment "limited nextcloud user" --no-create-home
# modifier le propriétaire du répertoire /var/www/nextcloud et l’attribuer à un nouvel utilisateur dédié : nextcloud.
chown -R nextcloud:www-data /var/www/nextcloud
# retirer toutes les permissions de ce répertoire aux autre utilisateurs
chmod -R o-rwx /var/www/nextcloud
Pool php7.0-fpm-nextcloud
Création du pool dédié à Nextcloud
nano /etc/php/7.0/fpm/pool.d/nextcloud.conf
[nextcloud]
listen = /run/php/php7.0-fpm-nextcloud.sock
; Set permissions for unix socket, if one is used.
listen.owner = nextcloud
listen.group = www-data
listen.mode = 0660
; Unix user/group of processes.
user = nextcloud
group = www-data
pm = dynamic
pm.max_children = 6
pm.start_servers = 3
pm.min_spare_servers = 3
pm.max_spare_servers = 5
pm.max_requests = 500
pm.status_path = /fpm-status
ping.path = /ping
request_terminate_timeout = 1d
request_slowlog_timeout = 5s
slowlog = /var/log/nginx/nextcloud.slow.log
rlimit_files = 4096
rlimit_core = 0
chdir = /var/www/nextcloud/
catch_workers_output = yes
clear_env = no
php_value[upload_max_filesize] = 10G
php_value[post_max_size] = 10G
php_value[default_charset] = UTF-8
Redémarrez le service php-fpm afin d’activer le nouveau pool nextcloud :
systemctl restart php7.0-fpm.service
Vérifier si aucune erreur systemctl status php7.0-fpm.service
Nextcloud nginx vhost
Deux alternatives
- Alternative A : Nginx vhost cinay.pw/nextcloud ,accès https://cinay.pw/nextcloud
- Alternative B : Nginx vhost nc.cinay.pw (sous-domaine),accès https://nc.cinay.pw
Alternative A : Nginx vhost cinay.pw/nextcloud
La configuration vhost
nano /etc/nginx/conf.d/cinay.pw.d/nextcloud.conf
location ^~ /nextcloud {
alias /var/www/nextcloud/;
if ($scheme = http) {
rewrite ^ https://$server_name$request_uri? permanent;
}
# Add headers to serve security related headers
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
# Set max upload size
client_max_body_size 10G;
fastcgi_buffers 64 4K;
# Disable gzip to avoid the removal of the ETag header
gzip off;
# Errors pages
error_page 403 /nextcloud/core/templates/403.php;
error_page 404 /nextcloud/core/templates/404.php;
# The following 2 rules are only needed for the user_webfinger app.
# Uncomment it if you're planning to use this app.
#rewrite ^/.well-known/host-meta /nextcloud/public.php?service=host-meta last;
#rewrite ^/.well-known/host-meta.json /nextcloud/public.php?service=host-meta-json last;
location /nextcloud {
rewrite ^ /nextcloud/index.php$uri;
}
location = /nextcloud/robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~ ^/nextcloud/(?:build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}
location ~ ^/nextcloud/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}
location ~ ^/nextcloud/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true;
fastcgi_param REMOTE_USER $remote_user;
fastcgi_pass unix:/run/php/php7.0-fpm-nextcloud.sock;
fastcgi_intercept_errors on;
}
location ~ ^/nextcloud/(?:updater|ocs-provider)(?:$|/) {
try_files $uri/ =404;
index index.php;
}
# Adding the cache control header for js and css files
location ~* \.(?:css|js)$ {
add_header Cache-Control "public, max-age=7200";
# Add headers to serve security related headers
add_header Strict-Transport-Security "max-age=15768000;";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
# Optional: Don't log access to assets
access_log off;
}
location ~* \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ {
# Optional: Don't log access to other assets
access_log off;
}
}
Vérification
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Relancer php-fpm et nginx
systemctl restart php7.0-fpm nginx
Accès https://cinay.pw/nextcloud
Alternative B : Nginx vhost nc.cinay.pw
Pour afficher la page de connexion Nextcloud sur https://nc.cinay.pw
Créer le fichier /etc/nginx/conf.d/nc.cinay.pw.conf avec le contenu suivant
server {
listen 80;
listen [::]:80;
server_name nc.cinay.pw;
# enforce https
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name nc.cinay.pw;
include ssl_params;
include header_params;
include dh_param;
add_header Strict-Transport-Security "max-age=31536000;";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
# Path to the root of your installation
root /var/www/nextcloud/;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# The following 2 rules are only needed for the user_webfinger app.
# Uncomment it if you're planning to use this app.
#rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
#rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json
# last;
location = /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}
# set max upload size
client_max_body_size 512M;
fastcgi_buffers 64 4K;
# Enable gzip but do not remove ETag headers
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
# Uncomment if your server is build with the ngx_pagespeed module
# This module is currently not supported.
#pagespeed off;
location / {
rewrite ^ /index.php$uri;
}
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}
location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) {
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS on;
#Avoid sending the security headers twice
fastcgi_param modHeadersAvailable true;
fastcgi_param REMOTE_USER $remote_user;
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}
location ~ ^/(?:updater|ocs-provider)(?:$|/) {
try_files $uri/ =404;
index index.php;
}
# Adding the cache control header for js and css files
# Make sure it is BELOW the PHP block
location ~ \.(?:css|js|woff|svg|gif)$ {
try_files $uri /index.php$uri$is_args$args;
add_header Cache-Control "public, max-age=15778463";
# Add headers to serve security related headers (It is intended to
# have those duplicated to the ones above)
# Before enabling Strict-Transport-Security headers please read into
# this topic first.
# add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
#
# WARNING: Only add the preload option once you read about
# the consequences in https://hstspreload.org/. This option
# will add the domain to a hardcoded list that is shipped
# in all major browsers and getting removed from this list
# could take several months.
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
# Optional: Don't log access to assets
access_log off;
}
location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
try_files $uri /index.php$uri$is_args$args;
# Optional: Don't log access to other assets
access_log off;
}
}
Vérification
nginx -t
Relancer php-fpm et nginx
systemctl restart php7.0-fpm nginx
Nextcloud première connexion
Suivant alternative choisie : https://cinay.pw/nextcloud ou https://nc.cinay.pw
Créer un compte administrateur admin + mot de passe
Répertoire des données /var/www/nextcloud/data
Base MariaDb (MySql) nextcloud , utilisateur nextcloud + mot de passe accès
NOTE : Si vous voulez passer de l’alternative A vers B ,lL faut modifier le fichier de configuration de nextcloud
'trusted_domains' =>
array (
0 => 'nc.cinay.pw',
),
'datadirectory' => '/var/www/nextcloud/data',
'overwrite.cli.url' => 'https://nc.cinay.pw',
Nextcloud les caches
Nextcloud Debian Stretch: les caches
Après installation du cache ,se connecter en admin , Paramètres -> Paramètres de base
Avertissements de sécurité & configuration
Il est important pour la sécurité et la performance de votre instance que tout soit configuré correctement. Pour vous aider dans cette tâche, nous faisons des vérifications automatiques. Veuillez consulter la section Trucs et Astuces et la documentation pour plus d'informations.
x Tous les tests ont réussi.
Nextcloud double authentification (admin)
Se connecter en admin sur nextcloud
Cliquer sur l’icône A en haut à droite puis Administration -> +Applications -> Sécurité
“Two Factor TOTP Provider” ,cliquer sur Activer
Cliquer sur l’icône A en haut à droite puis Administration -> Paramètres -> Sécurité
Cliquer Générer des codes de récupération
Deuxième facteur d’authentification du mot de passe temporaire à usage unique
Cocher la case Activer les mots de passe à usage unique (TOTP)
Votre nouveau secret TOTP est : kfkfiiehhdyyhdkz
Scannez ce QR code avec votre application android TOTP (andOTP, Signature PGP)
Ue fois le code QR scanné, il faut saisir le code pour confirmer l’activation
Nextcloud Utilisateur, Calendar, Contacts et Mail
Connexion admin
Cliquer sur l’icône A en haut à droite puis Utilisateurs
“Groupes” “+Ajouter un groupe” users
Ajouter un utilisateur yan , mot de passe ,groupe users , cliquer sur Créer
Cliquer sur l’icône A en haut à droite puis +Applications -> Pack d’applications
Activer Calendar
Activer Contacts
Cliquer sur l’icône A en haut à droite puis +Applications -> Bureautique &Texte
Activer Markdown Editor ,Notes
Activer Mail (client email imap smtp)
Stockage externe
Cliquer sur l’icône A en haut à droite puis +Applications -> Vos applications
Activer External storage support
Pour une utilisation d’un support externe à nextcloud, il faut créer ,en mode cli, un dossier local avec les droits nextcloud
sudo -
mkdir /mnt/local
# modifier le propriétaire du répertoire /var/www/nextcloud et l’attribuer à un nouvel utilisateur dédié : nextcloud.
chown -R nextcloud:www-data /var/www/nextcloud
# retirer toutes les permissions de ce répertoire aux autre utilisateurs
chmod -R o-rwx /var/www/nextcloud
Il faut en connexion admin ,cliquer sur l’icône A en haut à droite puis Paramètres et dans la zone Administration sur Stockages externes
Configurer le support externe
Connexion utilisateur
Cliquer sur l’icône Y en haut à droite puis Paramètres
Remplir le champ “Adresse e-mail”
Messagerie : Cliquer sur l’icône (en haut à gauche de l’écran) et compléter
Calendrier : Cliquer sur l’icône
Cliquer sur les ...
de Personnel ,”Editer”
et renommer l’agenda yan, choisir éventuellement une couleur autre et valider par clic sur l’icône
Contacts : Cliquer sur l’icône et renommer le carnet d’adresses yan
Activer l’authentification en deux étapes (voir opération précédente avec admin)
Synchronisation client
Pour utiliser la synchronisation client , il faut aller dans Paramètres -> Sécurité et cliquer sur Créer un nouveau mot de passe d’application (donner un nom d’application)
Ce sera le mot de passe à utiliser pour la synchronisation de fichiers/dossiers (Impératif quand on active la double authentification)
Nextcloud Thèmes
Changement de thème
Se positionner dasn le dossier
cd /var/www/nextcloud/themes
Cloner le thème choisi
git clone https://github.com/mwalbeck/nextcloud-breeze-dark.git
Valider le thème dans le fichier de configuration
nano /var/www/nextcloud/config/config.php
'theme' => 'nextcloud-breeze-dark',
GitLab serveur
Certificat SSL gitlab.cinay.pw
Il faut regénérer les certificats SSL en ajoutant le sous-domaine gitlab
Ajouter les variables pour l’accès api OVH
export OVH_AK="MyBRE3Oq2FZrLC2N"
export OVH_AS="U8rSfBLK0OYNRoeaCZvatqxUcf5aE8bj"
Génération des certificats
/root/.acme.sh/acme.sh --dns dns_ovh --issue --keylength 4096 -d cinay.pw -d smtp.cinay.pw -d imap.cinay.pw -d webmail.cinay.pw -d mail.cinay.pw -d nc.cinay.pw -d gitlab.cinay.pw
Installer gitlab
Gitlab Gitlab-ce APT/YUM repository for GitLab Community Edition packages
Passer en mode super utilisateur (root)
curl -LJO https://packages.gitlab.com/gitlab/gitlab-ce/packages/debian/stretch/gitlab-ce_10.5.4-ce.0_amd64.deb/download
dpkg -i gitlab-ce_10.5.4-ce.0_amd64.deb
Configuration gitlab
on n’utilise pas le serveur nginx embarqué dans gitlab-ce
nano /etc/gitlab/gitlab.rb
external_url 'https://gitlab.cinay.pw'
nginx['enable'] = false
web_server['external_users'] = ['www-data']
Générer la configuration
sudo gitlab-ctl reconfigure # Patienter quelques minutes !!!
Running handlers complete
Chef Client finished, 368/525 resources updated in 02 minutes 07 seconds
gitlab Reconfigured!
Nginx gitlab proxy
Ajout www-data au groupe gitlab-www
usermod -aG gitlab-www www-data
Créer le fichier de configuration nginx /etc/nginx/conf.d/gitlab.cinay.pw.conf
upstream gitlab-workhorse {
server unix:/var/opt/gitlab/gitlab-workhorse/socket fail_timeout=0;
}
server {
listen 80;
listen [::]:80;
server_name gitlab.cinay.pw;
# enforce https
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name gitlab.cinay.pw;
include ssl_params;
include header_params;
include dh_param;
location / {
client_max_body_size 0;
gzip off;
## https://github.com/gitlabhq/gitlabhq/issues/694
## Some requests take more than 30 seconds.
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://gitlab-workhorse;
}
}
Vérifier
sudo nginx -t
Relancer nginx
systemctl reload nginx
Connexion site gitlab.cinay.pw
A la première connexion au site https://gitlab.cinay.pw , il faut renseigné le mot de passe “admin”
Cliquer sur Register et créer un utilisateur
Full name : Cin Yan
Username : yan
Email : yan@cinay.pw
Password : xxxxxxxxx
Créer un groupe spm avec accès Public (https://gitlab.cinay.pw/spm)
Git client
git est un logiciel de gestion de versions.
Installation
sudo apt install git #debian
sudo pacman -S git #archlinux/manjaro
On dispose d’un serveur décentralisé de type gitlab , https://gitlab.cinay.pw
Configuration globale de Git
git config --global user.name "Cin Yan"
git config --global user.email "yan@cinay.pw"
Il faut également ajouter en fin de fichier ~/.gitconfig les 4 lignes suivantes (si inexistantes)
[credential]
helper = store
[core]
editor = nano
Modifier ou créer ~/.git-credentials pour un accès auto
https://yan:Mot-de-passe@gitlab.cinay.pw