Mémo pour la configuration de mon serveur dédié chez Ikoula.
Problème de mot de passe root
[Edit] Il semblerait que le problème ne se produise plus.A voir dans le temps.
[/Edit]
Un problème assez sympathique que j’ai rencontré est que si vous changez le mot de passe root et que vous supprimez les kernels non utilisés par la commande « $ apt autoremove », alors le mot de passe root est réinitialisé.
Très bizarre. Et à priori, Ikoula n’a pas de solution.
Donc voici un contournement que j’ai mis en place.
Ajouter un groupe sshusers
1 |
command groupadd sshusers |
Ajouter la ligne suivante dans le fichier : /etc/ssh/sshd_config
1 |
AllowGroups sshusers |
Relancer le service SSH
1 |
command systemctl restart ssh.service |
Ajouter un utilisateur simple pour se connecter en SSH
Ne doit pas être dans la liste des sudoers.
1 2 |
command adduser jbnet command usermod -a -G sshusers jbnet |
Ajouter un utilisateur qui sera dans la liste des sudoers, mais pas dans le groupe sshusers.
1 2 |
command adduser jbnet2secours command usermod -a -G sudo jbnet2secours |
Dans le répertoire de cet utilisateur, ajouter un fichier caché qui contiendra le mot de passe d’origine de root.
Ce fichier devra avoir les droits 600 et appartenir à root:root.
Maintenant, 2 choses :
- Soit j’ai pensé à modifier le mot de passe root avec le mot de passe généré à la création de l’instance et tout va bien.
- Soit je n’y ai pas pensé (ce qui est plus que probable 😉 ) et j’ai plus qu’à modifier le mot de passe root avec mon utilisateur sudo et la commande « $ sudo passwd root » pour remettre mon mot de passe.
Activer la swap
Par défaut, la swap n’est pas activée.
Vérification :
1 |
command cat /proc/sys/vm/swappiness |
Passer la configuration à 10.
- Editer le fichier /etc/sysctl.conf
- Rechercher la ligne vm.swappiness = 0.
- Modifier à 10.
Sinon, exécuter ces commandes pour la prise en compte immédiate :
1 2 |
command sysctl vm.swappiness=10 command swapoff -a && swapon -a |
SSMTP
Présent par défaut.
Permet au serveur d’envoyer des e-mails à l’aide d’un compte qui permet la connexion SMTP.
Utile pour la suite pour recevoir les e-mails de sécurité ou de mise à jour du système.
Fichier : /etc/ssmtp/revaliases
1 2 3 4 5 6 7 |
# sSMTP aliases # # Format: local_account:outgoing_address:mailhub # # Example: root:your_login@your.domain:mailhub.your.domain[:port] # where [:port] is an optional port number that defaults to 25. root:webmaster@domain.ltd:smtp.domain.ltd:587 |
Fichier : /etc/ssmtp/ssmtp.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# # Config file for sSMTP sendmail # # The person who gets all mail for userids < 1000 # Make this empty to disable rewriting. root=webmaster@domain.ltd # The place where the mail goes. The actual machine name is required no # MX records are consulted. Commonly mailhosts are named mail.domain.com mailhub=smtp.domain.ltd:587 # Where will the mail seem to come from? rewriteDomain=domain.ltd # The full hostname hostname=debian9x64 # Are users allowed to set their own From: address? # YES - Allow the user to specify their own From: address # NO - Use the system generated From: address FromLineOverride=YES # Use SSL/TLS before starting negotiation UseTLS=Yes UseSTARTTLS=Yes # Username/Password AuthUser=webmaster@domain.ltd AuthPass=mot2passe |
Sécurité
SSH
Dans le fichier /etc/ssh/sshd_config
- Port 11022 : Changer le port
- PermitRootLogin no : Ne pas permettre la connexion root
Firewall iptables
Chargement des règles au boot
Créez le script qui utilise ce fichier de configuration au démarrage : /etc/network/if-pre-up.d/iptables
1 2 |
#!/bin/bash /sbin/iptables-restore < /etc/iptables.up.rules |
Appliquez les droits d’exécution sur ce fichier :
1 |
command chmod +x /etc/network/if-pre-up.d/iptables |
Enregistrer les log iptables dans une log à part
Par défaut, les règles iptables enregistrent la sortie vers la log /var/log/messages.
On va les rediriger vers /var/log/iptables.log
Créez le fichier /etc/rsyslog.d/10-iptables.conf :
1 2 |
:msg, contains, "iptables: " -/var/log/iptables.log & ~ |
Redémarrez rsyslog :
1 |
command systemctl restart rsyslog.service |
Configuration logrotate pour iptables
Le fichier iptables.log va grossir et doit être purgé pour éviter que le disque doit plein.
Créer le fichier /etc/logrotate.d/iptables
1 2 3 4 5 6 7 8 9 10 11 12 |
/var/log/iptables.log { rotate 7 daily missingok notifempty delaycompress compress postrotate invoke-rc.d rsyslog force-reload > /dev/null endscript } |
On garde 7 jours de logs compressées.
A partir de là, toutes les règles du style de celle présentée ci-dessous ajouteront une ligne dans le fichier de log /var/log/iptables.log
1 |
-A INPUT -p icmp -j LOG --log-prefix "iptables: ping: " |
Règles de base
Fichier : /etc/iptables.up.rules
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
*filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -i eth0 -p icmp -j LOG --log-prefix "iptables: ping: " -A INPUT -i eth0 -p icmp -j ACCEPT -A INPUT -p tcp -m tcp --dport 11022 -m state --state NEW,ESTABLISHED -j ACCEPT -A INPUT -p udp -m udp --sport 67:68 --dport 67:68 -j ACCEPT -A INPUT -p udp -m udp --sport 123 -j ACCEPT -A INPUT -p udp -m udp --sport 53 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --sport 80 -j ACCEPT -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT -A INPUT -p tcp -m tcp --sport 8443 -j ACCEPT -A INPUT -p tcp -m tcp --sport 587 -j ACCEPT -A INPUT -j LOG --log-prefix "iptables: " -A INPUT -j DROP -A FORWARD -j LOG --log-prefix "iptables: " -A FORWARD -j DROP -A OUTPUT -o lo -j ACCEPT -A OUTPUT -o eth0 -p icmp -j ACCEPT -A OUTPUT -p tcp -m tcp --sport 11022 -m state --state NEW,ESTABLISHED -j ACCEPT -A OUTPUT -p udp -m udp --dport 123 -j ACCEPT -A OUTPUT -p udp -m udp --dport 53 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -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 8443 -j ACCEPT -A OUTPUT -p tcp -m tcp --dport 587 -j ACCEPT -A OUTPUT -j LOG --log-prefix "iptables: " -A OUTPUT -j DROP COMMIT |
Charger les règles :
1 |
command iptables-restore < /etc/iptables.up.rules |
PSAD
Installation
1 |
command apt install psad |
Configuration
Editer le fichier /etc/psad/psad.conf
Modifier ce fichier en cherchant et modifiant les paramètres suivants :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
EMAIL_ADDRESSES webmaster@domain.ltd; HOSTNAME domain; HOME_NET NOT_USED; ENABLE_IPV6_DETECTION N; FW_MSG_SEARCH iptables; ENABLE_SYSLOG_FILE Y; IPT_SYSLOG_FILE /var/log/iptables.log; ENABLE_AUTO_IDS Y; AUTO_IDS_DANGER_LEVEL 3; AUTO_BLOCK_TIMEOUT 86400; mailCmd /usr/bin/mail; MAIL_ALERT_PREFIX [psad-alert - $HOSTNAME]; MAIL_STATUS_PREFIX [psad-status - $HOSTNAME]; MAIL_ERROR_PREFIX [psad-error - $HOSTNAME]; MAIL_FATAL_PREFIX [psad-fatal - $HOSTNAME]; |
Modifier les 2 premières lignes EMAIL_ADDRESSES et HOSTNAME.
IPT_SYSLOG_FILE est configuré pour analyser le fichier /var/log/iptables.log défini plus haut dans ce mémo.
Dans le fichier /etc/psad/auto_dl, ajoutez cette ligne pour désactiver la détection sur 127.0.0.1 :
1 |
127.0.0.1 0; # Ignore this IP. |
Coupler PSAD et IPTABLES
Si fail2ban est déjà installé, il faut l’arrêter.
Sinon, les règles qu’il ajoute seront enregistrée dans le fichier /etc/iptables.up.rules.
Exécuter ces commande :
1 2 3 |
command iptables -N PSAD_BLOCK_INPUT command iptables -N PSAD_BLOCK_OUTPUT command iptables -N PSAD_BLOCK_FORWARD |
Enregistrez les modifications dans le fichier /etc/iptables.up.rules :
1 |
command iptables-save > /etc/iptables.up.rules |
Editez le fichier /etc/iptables.up.rules et ajoutez les lignes « PSAD_BLOCK_* » après « LOG » et avant « DROP » :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
… … … -A INPUT -j LOG --log-prefix "iptables: " -A INPUT -j PSAD_BLOCK_INPUT -A INPUT -j DROP … -A FORWARD -j LOG --log-prefix "iptables: " -A FORWARD -j PSAD_BLOCK_FORWARD -A FORWARD -j DROP … … … -A OUTPUT -j LOG --log-prefix "iptables: " -A OUTPUT -j PSAD_BLOCK_OUTPUT -A OUTPUT -j DROP |
Enregistrer les règles iptables et relancer Fail2ban et Psad :
1 2 3 |
command iptables-restore < /etc/iptables.up.rules command systemctl start fail2ban.service command systemctl start psad.service |
Vérifier l’état de Psad :
1 |
command psad -S |
Résultat :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
[-] psad: pid file /var/run/psad/psadwatchd.pid does not exist for psadwatchd on domain.tld [+] psad_fw_read (pid: 7328) %CPU: 0.0 %MEM: 1.4 Running since: Wed Aug 15 14:48:17 2018 [+] psad (pid: 7313) %CPU: 0.2 %MEM: 1.5 Running since: Wed Aug 15 14:48:17 2018 Command line arguments: [none specified] Alert email address(es): webmaster@domain.tld [+] Version: psad v2.4.3 [+] Top 50 signature matches: [NONE] [+] Top 25 attackers: [NONE] [+] Top 20 scanned ports: [NONE] [+] iptables log prefix counters: [NONE] Total protocol packet counters: [+] IP Status Detail: [NONE] Total scan sources: 0 Total scan destinations: 0 [+] These results are available in: /var/log/psad/status.out |
Toutes les lignes doivent avoir « [+] ».
Si il y a un « [-] », faut corriger.
Dans le cas du résultat ci-dessus : « [-] psad: pid file /var/run/psad/psadwatchd.pid does not exist for psadwatchd on domain.tld »
Solution trouvée ici : https://carteryagemann.com/psad-on-pi.html
Créer le fichier /etc/systemd/system/psadwatchd.service :
1 2 3 4 5 6 7 8 9 |
[Unit] Description=Port scan attack detector daemon After=psad.service [Service] ExecStart=/usr/sbin/psadwatchd Type=oneshot RemainAfterExit=yes [Install] WantedBy=multi-user.target |
Démarrer psadwatchd :
1 |
command systemctl start psadwatchd |
Vérifier que tout est en ordre :
1 |
psad -S |
Activer le service au démarrage du serveur :
1 |
command systemctl enable psadwatchd |
Mise à jour automatique
Pour une mise à jour hebdomadaire, il faut créer un fichier /etc/cron.d/psad
1 2 |
# psad update signatures @weekly root /usr/sbin/psad --sig-update && /usr/sbin/psad -H | mail -s "psad signatures updated on Domain" webmaster@domain.ltd |
Relancez le service cron pour la prise en compte :
1 |
command systemctl restart cron.service |
Quelques commandes utiles
Liste des IP bloquée :
1 |
command psad --fw-list |
Supprimer une ip bloquée :
1 |
command psad --fw-rm-block-ip <ip> |
Supprimer toutes les ips bloquées :
1 |
command psad -F |
Mise à jour manuelle des signatures :
1 |
command psad --sig-update && psad -H |
Fail2ban
Installation :
1 |
command apt install fail2ban |
NE MODIFIER AUCUN FICHIER avec l’extension *.conf. Ils peuvent être remplacés lors des mises à jour.
Pour surcharger, il suffit de créer le même fichier avec l’extension *.local.
Créer le fichier : /etc/fail2ban/jail.d/jail.local
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[DEFAULT] destemail = webmaster@domain.ltd sender = webmaster@domain.ltd action = %(action_mwl)s [pam-generic] enabled = true [sshd] enabled = true port = 11022 [sshd-ddos] enabled = true port = 11022 |
Pour l’option « action », consulter les autres actions disponibles dans le fichier /etc/fail2ban/jail.conf
« action_mwl » envoi un e-mail à chaque arrêt/relance de Fail2Ban et à chaque bannissement détecté.
Relancer Fail2Ban pour la prise en compte :
1 |
command systemctl restart fail2ban.service |
Vérifier les jails activées :
1 |
command fail2ban-client status |
Résultat :
1 2 3 |
Status |- Number of jail: 3 `- Jail list: pam-generic, sshd, sshd-ddos |
Vérifier également la boîte e-mail configurée dans jail.local.
Au moins 6 e-mails sont arrivés !
Pour ajouter une log à analyser, des filtres sont déjà disponibles dans le répertoire : /etc/fail2ban/filter.d
Pour les activer, il faut juste copier le nom du fichier sans l’extension, et l’ajouter dans le fichier jail.local.
Ex pour Nginx :
Le fichier présent : /etc/fail2ban/filter.d/nginx-limit-req.conf
Donc il faut ajouter ces lignes dans le fichier /etc/fail2ban/jail.d/jail.local
1 2 |
[nginx-limit-req] enabled = true |
Au besoin ajouter les paramètres à surcharger puis relancer le service Fail2ban pour la prise en compte.
Pas compliqué.
Logwatch – Surveillance des journaux
Permet d’analyser les logs et de recevoir un e-mail sur l’état du serveur.
Plus d’information sur le site de SourceForge.net.
Installation
1 |
command apt install logwatch |
Créer le répertoire cache :
1 |
command mkdir /var/cache/logwatch |
Configuration
Il ne faut pas modifier le fichier de configuration d’origine.
Il faut le copier dans le répertoire /etc/logwatch/conf/ et modifier ce dernier :
1 |
command cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/ |
Idem pour les fichiers qui décrivent les services ou logsfiles.
Origine : /usr/share/logwatch/default.conf/services
Destination : /etc/logwatch/conf/services
Modification de l’e-mail de destination des rapports
Éditer le fichier /etc/logwatch/conf/logwatch.conf
Modifier les lignes :
1 2 3 |
MailTo = webmaster@domain.ltd MailFrom = webmaster@domain.ltd Detail = Med |
Modifier le sujet de l’e-mail.
Ajouter cette ligne à la fin du fichier /etc/logwatch/conf/logwatch.conf :
1 |
subject = "Logwatch : Domain" |
Afficher le rapport dans la console :
1 |
command logwatch restart |
Pour envoyer le rapport à une adresse spécifique :
1 |
command logwatch --mailto webmaster@domain.ltd |
Un rapport sera envoyé tous les jours.
Vérifier la présence du fichier /etc/cron.daily/00logwatch
Recevoir les mises à jour par email
Vous pouvez configurer vos serveurs pour qu’ils exécutent un « apt update », télécharge les nouveaux fichiers et vous avertis que des mises à jour sont disponibles par email.
A vous de les installer manuellement.
L’installation est décrite sur ce mémo : « Debian – Recevoir la liste des mises à jour »
NGINX / PHP / MariaDB
Installation de PHP FPM 7.2
Source : https://packages.sury.org/php/README.txt
1 2 3 4 5 6 |
command apt install apt-transport-https lsb-release ca-certificates command wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg command sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' command apt update command apt install php7.2-fpm php7.2-mbstring php7.2-xml php7.2-mysql php7.2-common php7.2-gd php7.2-json php7.2-cli php7.2-curl command systemctl status php7.2-fpm.service |
Installation de Nginx
Ajouter le dépôt backports :
Fichier : /etc/apt/sources.list.d/backports.list
1 2 3 |
# Backports repository deb http://deb.debian.org/debian stretch-backports main contrib non-free #deb http://deb.debian.org/debian stretch-backports-sloppy main contrib non-free |
Installer Nginx :
1 2 3 |
command apt update command apt-cache policy nginx-extras command apt install nginx-extras |
Let’s Encrypt
Inspiré de : https://www.grafikart.fr/formations/serveur-linux/nginx-ssl-letsencrypt
1 2 3 4 5 |
command apt install python-certbot-nginx command certbot --authenticator webroot --installer nginx --webroot-path /var/www/domain.tld -d domain.tld command mkdir /etc/nginx/ssl command openssl rand -out /etc/nginx/ssl/ticket.key 48 command openssl dhparam -out /etc/nginx/ssl/dhparam4.pem 4096 |
La dernière commande prend du temps, plus de 20min…
Tester le renouvellement du certificat :
1 |
command certbot renew --dry-run |
Fichier /etc/nginx/site-availlable/domain.tld :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# Redirection http vers https server { listen 80; # listen [::]:80; server_name domain.tld; location ~ /\.well-known/acme-challenge { allow all; } location / { return 301 https://domain.tld$request_uri; } } # Notre bloc serveur server { # http2 pour Nginx >= 1.9.5 listen 443 ssl http2; listen [::]:443 ssl http2; server_name domain.tld; root /var/www/html; index index.html index.htm; error_log /var/log/nginx/domain.tld.log notice; access_log off; #### 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; } location ~ \.php$ { fastcgi_pass unix:/run/php/php7.0-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; include snippets/fastcgi-php.conf; } #### SSL ssl on; ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem; # Google DNS, Open DNS, Dyn DNS resolver 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 216.146.35.35 216.146.36.36 valid=300s; resolver_timeout 3s; #### Session Tickets # Session Cache doit avoir la même valeur sur tous les blocs "server". ssl_session_cache shared:SSL:100m; ssl_session_timeout 24h; ssl_session_tickets on; # [ATTENTION] il faudra générer le ticket de session. ssl_session_ticket_key /etc/nginx/ssl/ticket.key; # [ATTENTION] Les paramètres Diffie-Helman doivent être générés ssl_dhparam /etc/nginx/ssl/dhparam4.pem; #### ECDH Curve ssl_ecdh_curve secp384r1; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK'; } |
Autre configuration pour un SSL A+
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
## # You should look at the following URL's in order to grasp a solid understanding # of Nginx configuration files in order to fully unleash the power of Nginx. # https://www.nginx.com/resources/wiki/start/ # https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ # https://wiki.debian.org/Nginx/DirectoryStructure # # In most cases, administrators will remove this file from sites-enabled/ and # leave it as reference inside of sites-available where it will continue to be # updated by the nginx packaging team. # # This file will automatically load configuration files provided by other # applications, such as Drupal or Wordpress. These applications will be made # available underneath a path with that package name, such as /drupal8. # # Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. ## # Default server configuration # server { listen 80 default_server; # listen [::]:80 default_server; # SSL configuration # # listen 443 ssl default_server; # listen [::]:443 ssl default_server; # # Note: You should disable gzip for SSL traffic. # See: https://bugs.debian.org/773332 # # Read up on ssl_ciphers to ensure a secure configuration. # See: https://bugs.debian.org/765782 # # Self signed certs generated by the ssl-cert package # Don't use them in a production server! # # include snippets/snakeoil.conf; root /var/www/html; # Add index.php to the list if you are using PHP index index.php index.html index.htm index.nginx-debian.html; server_name domain.tld; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } # pass PHP scripts to FastCGI server # #location ~ \.php$ { # include snippets/fastcgi-php.conf; # # # With php-fpm (or other unix sockets): # fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; # # With php-cgi (or other tcp sockets): # fastcgi_pass 127.0.0.1:9000; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/domain.tld;/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/domain.tld;/privkey.pem; # managed by Certbot ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/domain.tld;/fullchain.pem; resolver 1.1.1.1 9.9.9.9 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 216.146.35.35 216.146.36.36 valid=300s; resolver_timeout 5s; #### Session Tickets # Session Cache doit avoir la même valeur sur tous les blocs "server". ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_session_tickets off; # [ATTENTION] il faudra générer le ticket de session. ssl_session_ticket_key /etc/nginx/ssl/ticket.key; # [ATTENTION] Les paramètres Diffie-Helman doivent être générés ssl_dhparam /etc/nginx/ssl/dhparam4.pem; #### ECDH Curve ssl_ecdh_curve secp384r1; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384; # Add headers to serve security related headers # 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; add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; add_header X-Frame-Options DENY; if ($scheme != "https") { return 301 https://$host$request_uri; } # managed by Certbot location ~ \.php$ { fastcgi_pass unix:/run/php/php7.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; include snippets/fastcgi-php.conf; } } |
Activer la configuration :
1 2 3 4 |
command cd /etc/nginx/sites-enabled command ln -s /etc/nginx/sites-available/domain.ltd command nginx -t command systemctl nginx restart |
PHP-FPM multi user
Créer l’utilisateur sans répertoire home :
1 |
command useradd -r -s /bin/false new_php_user |
Fichier /etc/nginx/nginx.conf :
1 2 3 4 5 6 7 |
user new_php_user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { ... |
Fichier /etc/php/7.2/fpm/pool.d/new_site.conf :
1 |
command cp /etc/php/7.2/fpm/pool.d/www.conf /etc/php/7.2/fpm/pool.d/new_site.conf |
Modifier :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
; Start a new pool named 'www'. ; the variable $pool can be used in any directive and will be replaced by the ; pool name ('www' here) [new_site] ... user = new_php_user group = new_php_user ... listen = /run/php/php7.2-fpm-new-site.sock ... listen.owner = new_php_user listen.group = new_php_user listen.mode = 066 |
Fichier : /etc/nginx/sites-available/new-site
1 2 3 4 5 6 7 8 9 |
server { ... location ~ \.php$ { fastcgi_pass unix:/run/php/php7.2-fpm-new-site.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; include snippets/fastcgi-php.conf; } ... |
Relancer PHP et Nginx
1 2 |
command systemctl restart php7.2-fpm.service command nginx -s reload |
MariaDB
1 2 |
command apt install mariadb-server mariadb-client command mysql_secure_installation |