Outils Web d’Administration – Intro
Cette série d’article propose d’expliquer l’installation d’un ensemble d’outils d’administrations web bien pratiques qui aident à la gestion de son serveur tout en en sécurisant l’accès. Ce dernier point est critique, en effet combien de fois peut-on voir des phpMyAdmin installés directement dans le sous répertoire d’un site web ? Bien évidemment, ces installations simplistes sont la cible de scanners sur internet qui les recherchent pour leurs vulnérabilités connues.
Cette introduction pose donc les bases d’une installation sécurisée et sera suivi par d’autres articles expliquant comment implémenter différents outils pratiques que j’ai pu trouver comme phpMyAdmin, Cacti, munin, etc.
Environnement
OS : Debian 7.5 stable (Wheezy) (64bits)
Nginx : nginx/1.2.1
PHP : 5.4.4
MySQL : Ver 14.14 Distrib 5.5.35
Afin de réaliser le meilleur tutoriel possible, toutes les configurations ont été passées sur un VPS Classic d’OVH à 2.40€ par mois avec son propre nom de domaine admin-tools.writesthisblog.com
. Pour installer le minimum vital pour disposer d’un serveur LEMP (Linux Engine-x MySQL PHP) avec SSL, il suffit de passer apt-get install mysql-server php5-mysql php5-cli php5-fpm nginx openssl apache2-utils
.
J’utilise Debian, ceci dit, ces configurations sont plutôt indépendantes de l’OS, à part des variations sur les noms des packages ou des répertoires utilisés, tout devrait être assez facilement portable d’un linux à l’autre.
Un Script pour Gérer ses Bases de Données MySQL
Pour disposer d’une installation solide, chaque outil va utiliser sa propre base de données (BDD). Cela évite d’avoir des tables qui se percutent, ou des fausses manipulations qui tournent au désastre. Autant se servir d’un script pour créer rapidement les BDDs. En bonus, il permet de faire appel à des scripts externes, qui peuvent être soit des scripts d’initialisation de la BDD, soit des dumps pour restaurer la BDD.
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 | root@server:~# cat ./create_db #!/bin/bash # script creant une base de donnee sur un MySQL en local # doit disposer d'un acces root à mysql # si ce parametre est commente, il faudra saisir a la main # son mot de passe mysql MYSQL_PWD="mot_de_passe_mysql_root" create_db () { # arguments de la fonction db=$1 user=$2 pass=$3 script=$4 # construit un mini script sql sql="CREATE DATABASE IF NOT EXISTS ${db};" sql+="GRANT USAGE ON $db.* TO '$user'@localhost IDENTIFIED BY '$pass';" sql+="GRANT ALL PRIVILEGES ON $db.* TO '$user'@localhost;" sql+="FLUSH PRIVILEGES;" # insere eventuellement un script ou un dump mysql externe if [ "x$script" != "x" ] ; then sql+="USE $db;" sql+="source $script;" fi if ( ! mysql -h localhost -u root -p$MYSQL_PWD -e "$sql" >> /dev/null 2>&1 ) ; then echo -e "Fail to create $db database" >> $Log_File return 1 ; fi return 0 } # verifie le bon nombre de parametres if [ $# -lt 3 -o $# -gt 4 ]; then echo "Usage: $0 database_name username password [script]" exit 1 fi # exectue la fonction principale if ( ! create_db $1 $2 $3 $4 >> /dev/null 2>&1 ) ; then echo -e "Echec creation de la base de donnees $1" exit 1 fi echo -e "Base de donnees \"$1\" creee avec succes" exit 0 |
Dernièrement, On sécurise un minimum son installation avec mysql_secure_installation :
1 2 3 4 5 6 7 8 9 10 | root@server:~# mysql_secure_installation NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MySQL to secure it, we'll need the current password for the root user. If you've just installed MySQL, and you haven't set the root password yet, the password will be blank, so you should just press enter here. [...] |
Sous-Domaine d’Administration Sécurisé
Il est très important de séparer ses outils d’administration dans un sous-domaine que l’on sécurisera avec du SSL et ce pour trois raisons :
- un scan sur l’IP du serveur aboutira sur le domaine principal sans les outils
- le SSL chiffre les échanges et rend plus difficile les attaques par » brute force «
- la séparation rend possible une configuration brutale des ACL ou du fail2ban
Je renvoie vers un des mes précédents articles pour configurer son serveur web en SSL.
Selon son degré de paranoïa, on peut aussi créer avec htpassword
un fichier de mots de passe qui sera utilisé pour permettre l’accès à toute la zone d’administration.
1 2 3 4 5 6 7 8 9 | root@server:~# mkdir /etc/nginx/secu root@server:~# htpasswd -c /etc/nginx/secu/admin-password user1 New password: Re-type new password: Adding password for user user2 root@server:~# htpasswd /etc/nginx/secu/admin-password user2 New password: Re-type new password: Adding password for user user1 |
Fichier de mots de passe et certificats sont supposés être placés dans le répertoire /etc/nginx/secu dans ce tutoriel. Surtout ne pas oublier de limiter l’accès à ces fichiers à coup de chmod
Configuration Nginx
Au final, les outils d’administration seront placés dans le répertoire /var/www/admin
. Ici une configuration nginx
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 | root@vps62429:~# cat /etc/nginx/sites-available/admin server { listen 80; server_name admin-tools.writesthisblog.com default; return 301 https://admin-tools.writesthisblog.com$request_uri; } server { listen 443 ssl; server_name admin-tools.writesthisblog.com; access_log /var/log/nginx/admin_access.log; error_log /var/log/nginx/admin_error.log; # gere le controle d acces a la zone d'admin auth_basic "Veuillez-vous authentifier"; auth_basic_user_file /etc/nginx/secu/admin-password; # Parametres SSL ssl_certificate /etc/nginx/secu/admin.crt; ssl_certificate_key /etc/nginx/secu/admin.key; include /etc/nginx/ssl_params; root /var/www/admin; index index.php /phpinfo/info.php; fastcgi_intercept_errors on; # fichier a ne pas servir location ~ /\. { deny all; } location / { try_files $uri $uri/ /index.php ; } location ~ \.php { try_files $uri $uri/ index.php /phpinfo/info.php ; include /etc/nginx/fastcgi_params; fastcgi_param HTTP_SCHEME https; fastcgi_index /phpinfo/info.php; } } root@server:~# ln -s /etc/nginx/sites-available/admin /etc/nginx/sites-enabled/admin root@server:~# service nginx reload |
Les fichiers utilisés dans les « includes » sont /etc/nginx/fastcgi_params
et /etc/nginx/ssl_params
. C’est un peu plus difficile à mettre en place, mais éclater les éléments de sa configuration permet de la rendre plus lisible et aussi fournit un point centralisé pour transmettre une modification à tous ses sites web.
Premier Exemple : PHP Info
On crée rapidement le fichier phpinfo.php
1 2 3 4 5 6 7 8 | root@server:~# mkdir /var/www/admin/phpinfo root@server:~# nano /var/www/admin/phpinfo/info.php root@server:~# cat /var/www/admin/phpinfo/info.php <?php phpinfo(); ?> |
Afin de sécuriser/simplifier l’accès, on peut rajouter le bloc location suivant à sa configuration nginx :
1 2 3 4 5 6 | root@server:~# cat /etc/nginx/sites-available/admin | grep -A 3 location\ /phpinfo location /phpinfo { index info.php; rewrite ^/phpinfo/.+ /phpinfo/ permanent; } root@server:~# service nginx reload |
Il ne reste plus qu’à visiter la page https://admin-tools.writesthisblog.com/test/info.php
.
La suite au prochain article pour installer phpMyAdmin.