Vendredi 16 mars 2018

KVM Debian Stretch Yunohost cinay.pw

Debian 9

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

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 )

Rsync

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

lemp

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

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)

SSL Letsencrypt

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)

parefeu Iptables

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

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

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

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

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

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

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.

rspamd

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

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

thunderbird

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

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

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

2fa

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

2fa

Deuxième facteur d’authentification du mot de passe temporaire à usage unique

2fa

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)

2fa

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)

icones

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

Stockages externes

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 icone mail (en haut à gauche de l’écran) et compléter

Mail

Calendrier : Cliquer sur l’icône icone mail
Cliquer sur les ... de Personnel ,”Editer”
et renommer l’agenda yan, choisir éventuellement une couleur autre et valider par clic sur l’icône icone valider

Contacts : Cliquer sur l’icône icone mail 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)

mp appli

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

GitLab

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

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