## Sommaire 1. Pré‑requis 2. Mise à jour du système 3. Installer Nginx, PHP‑FPM et extensions 4. Installer MariaDB/MySQL et sécuriser 5. Créer un utilisateur DB dédié à phpMyAdmin 6. Installer phpMyAdmin (2 méthodes) - 6.A : via apt (simple) - 6.B : via archive officielle (plus à jour) 7. Configurer Nginx : alias ou sous‑domaine dédié 8. Activer HTTPS avec Let’s Encrypt 9. Durcissement de phpMyAdmin 10. Ajuster PHP (upload, temps d’exécution) 11. Optimisations (Opcache/APCu) 12. Limiter l’accès : IP allowlist et HTTP Auth 13. Rate‑limit et Fail2ban 14. Sauvegardes et mises à jour 15. Tests et Dépannage 16. Annexes utiles 17. Check‑list finale --- ## 1. Pré‑requis - Debian 12 (Bookworm) avec accès sudo. - Nginx installé (sinon, voir plus bas). - Ports 80 et 443 ouverts. - Nom de domaine pointant vers le serveur (recommandé pour HTTPS). - Astuce : si plusieurs versions de PHP sont installées, identifiez la version active avec la commande suivante. ```bash php -v # récupère 8.x.y → notez 8.2 ou 8.1, etc. ``` ## 2. Mise à jour du système Apadate : apt update + correctifs ```bash sudo apt update && sudo apt -y full-upgrade sudo reboot ``` ## 3. Installer Nginx, PHP‑FPM et extensions ```bash sudo apt install -y nginx php-fpm php-cli php-mbstring php-xml php-zip php-curl php-mysql php-gd php-intl php-bcmath php-json sudo apt install -y php-imagick php-apcu ``` Vérifier le socket PHP‑FPM (remplacez 8.2 par votre version si besoin) : ```bash ls -l /run/php/ | grep fpm # Exemple: /run/php/php8.2-fpm.sock ``` ## 4. Installer MariaDB/MySQL et sécuriser ```bash sudo apt install -y mariadb-server mariadb-client sudo mysql_secure_installation ``` Recommandations pendant l’assistant : - Définir un mot de passe root SQL (si non défini). - Supprimer utilisateurs anonymes. - Désactiver le login root distant. - Supprimer la base de test. - Recharger les privilèges. ## 5. Créer un utilisateur DB dédié à phpMyAdmin phpMyAdmin n’a pas besoin d’un compte root. Créez un compte admin limité. ```bash sudo mysql ``` Dans le shell SQL : ```sql CREATE USER 'pma_admin'@'localhost' IDENTIFIED BY 'motdepasse-solideIci!'; GRANT ALL PRIVILEGES ON *.* TO 'pma_admin'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES; EXIT; ``` ## 6. Installer phpMyAdmin (2 méthodes) ### 6.A : via apt (simple) ```bash sudo apt install -y phpmyadmin ``` Pendant l’installation : - Choisir nginx: Non (il ne sera pas configuré automatiquement) → la configuration Nginx se fera à la main. - Choisir dbconfig-common: Oui et définir le mot de passe de l’utilisateur phpMyAdmin pma (différent de pma_admin ci‑dessus). Les fichiers sont généralement dans /usr/share/phpmyadmin. ### 6.B : via archive officielle (plus à jour) ```bash cd /var/www sudo mkdir -p pma && cd pma # Téléchargez la dernière version depuis https://www.phpmyadmin.net/downloads/ # Exemple : wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz sudo tar xzf phpMyAdmin-*-all-languages.tar.gz sudo mv phpMyAdmin-*-all-languages phpmyadmin sudo chown -R www-data:www-data /var/www/pma/phpmyadmin ``` Créer le fichier de config si besoin : ```bash sudo -u www-data cp /var/www/pma/phpmyadmin/config.sample.inc.php /var/www/pma/phpmyadmin/config.inc.php sudo -u www-data nano /var/www/pma/phpmyadmin/config.inc.php ``` Dans config.inc.php, générer un blowfish_secret de 32 caractères aléatoires : ```php /dev/null <<'EOF' [Definition] failregex = ^ - .* "(GET|POST) /phpmyadmin.*" .* (401|403) .*$ ignoreregex = EOF sudo tee /etc/fail2ban/jail.d/nginx-phpmyadmin.local >/dev/null <<'EOF' [nginx-phpmyadmin] enabled = true port = http,https filter = nginx-phpmyadmin logpath = /var/log/nginx/access.log maxretry = 8 findtime = 10m bantime = 1h EOF sudo systemctl restart fail2ban sudo fail2ban-client status nginx-phpmyadmin ``` ## 14. Sauvegardes et mises à jour - Sauvegardes de configuration : /etc/nginx/, /etc/php/*/fpm/, /etc/phpmyadmin/ ou /var/www/pma/phpmyadmin/. - Mises à jour classiques : ```bash sudo apt update && sudo apt -y upgrade ``` - Méthode archive officielle (6.B) : retélécharger la nouvelle archive et remplacer le dossier. - Réaliser un snapshot VM ou conteneur avant une grosse modification. ## 15. Tests et Dépannage - Tester Nginx : ```bash sudo nginx -t sudo systemctl reload nginx ``` - Logs : /var/log/nginx/access.log, /var/log/nginx/error.log, journalctl -u php8.2-fpm. - PHP‑FPM down : vérifier le socket /run/php/php8.2-fpm.sock ou passer en fastcgi_pass 127.0.0.1:9000 si vous utilisez TCP. - Erreur 403 sur alias : vérifier alias ou root, try_files et droits www-data. - Timeout import : augmenter client_max_body_size dans le bloc server et fastcgi_read_timeout. - CSRF token invalide : vérifier cookies, blowfish_secret, et l’horloge système (timedatectl). ## 16. Annexes utiles ### Snippet sécurité Nginx (headers) ```nginx add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; # CSP minimale (testez vos assets avant de l’appliquer en prod) add_header Content-Security-Policy "default-src 'self' 'unsafe-inline' data: blob: https:;" always; ``` ### Tuning PHP‑FPM (pool) Fichier /etc/php/8.2/fpm/pool.d/www.conf : ```ini pm = dynamic pm.max_children = 32 pm.start_servers = 4 pm.min_spare_servers = 4 pm.max_spare_servers = 16 pm.max_requests = 500 ``` Adapter selon la RAM et la charge. ### UFW (pare‑feu simple) ```bash sudo apt install -y ufw sudo ufw allow OpenSSH sudo ufw allow 'Nginx Full' sudo ufw enable sudo ufw status ``` ### Nettoyage de l’alias par défaut Debian Si vous avez installé via apt, Debian peut créer une configuration Apache. Pour Nginx, ignorez‑la et maintenez vos vhosts dans /etc/nginx/sites-available/. --- ## 17. Check‑list finale - [ ] apt update et upgrade effectués - [ ] Nginx et PHP‑FPM opérationnels (page phpinfo de test) - [ ] MariaDB sécurisé avec mysql_secure_installation - [ ] phpMyAdmin installé (apt ou archive) et accessible - [ ] HTTPS actif (Let’s Encrypt) - [ ] ACL (IP et/ou HTTP Auth) en place - [ ] Rate‑limit et Fail2ban actifs - [ ] Sauvegardes prévues et logs surveillés Fin du tutoriel. Besoin d’une variante adaptée à ton domaine, à ta version de PHP exacte ou d’un script Bash ou Ansible idempotent ?