Comment installer et sécuriser phpMyAdmin avec Nginx sur Ubuntu 16.04

introduction

De nombreux utilisateurs ont besoin des fonctionnalités d'un système de gestion de base de données tel que MySQL, mais son interface de ligne de commande peut être moins intuitive et plus conviviale pour certains, constituant un obstacle à l'entrée.

phpMyAdmin a été créé pour que les utilisateurs puissent interagir avec MySQL via une interface Web. Dans ce guide, nous expliquerons comment installer et sécuriser phpMyAdmin afin que vous puissiez l’utiliser en toute sécurité pour gérer vos bases de données à partir d’un système Ubuntu 16.04. Nous allons construire cette configuration sur le serveur Web Nginx, qui présente un bon profil de performances et peut gérer des charges lourdes mieux que d’autres serveurs Web.

Conditions préalables

Avant de commencer avec ce guide, assurez-vous d’avoir suivi les étapes préalables suivantes:

  • Tout d'abord, nous supposerons que vous utilisez un utilisateur non root avec des privilèges sudo, comme décrit dans les étapes 1 à 4 desinitial server setup of Ubuntu 16.04.

  • Nous allons également supposer que vous avez terminé l’installation de LEMP (Linux, Nginx, MySQL et PHP) sur votre serveur Ubuntu 16.04. Si vous ne l’avez pas encore fait, vous pouvez suivre le guide surinstalling a LEMP stack on Ubuntu 16.04. Assurez-vous de noter votre mot de passe d’administrateur de base de données MySQL.

Enfin, vous devez prendre en compte des considérations de sécurité importantes lorsque vous utilisez un logiciel tel que phpMyAdmin: il communique directement avec votre installation MySQL, gère l'authentification à l'aide des informations d'identification MySQL, et exécute et renvoie les résultats des requêtes SQL arbitraires.

Pour ces raisons, et parce qu'il s'agit d'une application PHP largement déployée et fréquemment attaquée, vous ne devez jamais exécuter phpMyAdmin sur des systèmes distants via une simple connexion HTTP. Si vous n'avez pas de domaine existant configuré avec un certificat SSL / TLS, vous pouvez suivre ce guide sursecuring Nginx with Let’s Encrypt on Ubuntu 16.04.

Une fois ces étapes préalables terminées, vous êtes prêt à utiliser ce guide.

[[step-1 -—- install-phpmyadmin]] == Étape 1 - Installer phpMyAdmin

Notre plate-forme LEMP étant déjà en place, nous pouvons commencer par installer phpMyAdmin, disponible dans les dépôts par défaut d’Ubuntu.

Tout d’abord, nous mettrons à jour l’index de package local du serveur pour nous assurer qu’il dispose d’un nouvel ensemble de références aux packages disponibles. Ensuite, nous utiliserons les outils de packaging deapt pour extraire le logiciel des référentiels et l'installer sur notre système:

sudo apt-get update
sudo apt-get install phpmyadmin

Au cours de l'installation, vous serez invité à fournir certaines informations. Il vous demandera quel serveur Web vous souhaitez que le logiciel configure automatiquement. Comme Nginx, le serveur Web que nous utilisons, ne fait pas partie des options disponibles, vous pouvez simplement appuyer surTAB, puis surENTER pour contourner cette invite.

L'invite suivante vous demandera si vous souhaitez quedbconfig-common configure une base de données pour phpMyAdmin à utiliser. Sélectionnez «Oui» pour continuer. Vous devrez entrer le mot de passe de l'administrateur de la base de données que vous avez configuré lors de l'installation de MySQL pour autoriser ces modifications.

Il vous sera maintenant demandé de choisir et de confirmer un mot de passe pour l'application phpMyAdmin et sa base de données (qui sera créée à cette étape). Choisissez et confirmez un mot de passe sécurisé et notez-le.

L'installation va maintenant se terminer. Pour que le serveur Web Nginx trouve et serve correctement les fichiers phpMyAdmin, nous devons créer un lien symbolique à partir des fichiers d’installation dans le répertoire racine de notre document Nginx:

sudo ln -s /usr/share/phpmyadmin /var/www/html

Enfin, nous devons activer le module PHPmcrypt, sur lequel phpMyAdmin s'appuie. Cela a été installé avec phpMyAdmin, donc nous allons l’activer et redémarrer notre processeur PHP:

sudo phpenmod mcrypt
sudo systemctl restart php7.0-fpm

Avec cela, notre installation de phpMyAdmin est maintenant opérationnelle. Pour accéder à l'interface, accédez au nom de domaine ou à l'adresse IP publique de votre serveur, suivi de/phpmyadmin dans votre navigateur Web:

http://server_domain_or_IP/phpmyadmin

phpMyAdmin login screen

Pour vous connecter, utilisez un ensemble d'informations d'identification pour un utilisateur MySQL valide. Par exemple, l'utilisateurroot et le mot de passe administrateur MySQL sont un bon choix pour commencer. Vous devriez alors pouvoir accéder à l'interface administrative:

phpMyAdmin admin interface

Cliquez autour pour vous familiariser avec l'interface.

Dans les deux prochaines sections, nous allons prendre des mesures pour sécuriser notre nouvelle console Web phpMyAdmin.

[[step-2 -—- change-the-default-phpmyadmin-url]] == Étape 2 - Modifier l'URL phpMyAdmin par défaut

L'installation de phpMyAdmin devrait être complètement fonctionnelle à ce stade. Cependant, en installant une interface Web, nous avons exposé notre serveur de base de données MySQL au monde extérieur. En raison de la popularité de phpMyAdmin et de la grande quantité de données auxquelles il peut donner accès, de telles installations sont des cibles courantes des attaques.

Dans cette section, nous allons «renforcer» ou verrouiller notre installation en modifiant l'URL de l'interface de/phpmyadmin en quelque chose de non standard pour éviter certaines des tentatives de force brute automatisée des robots.

Dans une étape précédente, nous avons créé un lien symbolique du répertoire phpMyAdmin à la racine de notre document afin que notre serveur Web Nginx puisse rechercher et servir nos fichiers phpMyAdmin. Pour changer l’URL de notre interface phpMyAdmin, nous renommerons ce lien symbolique.

Commençons par naviguer dans le répertoire racine du document Nginx pour avoir une meilleure idée du changement que nous allons effectuer:

cd /var/www/html/
ls -l

Vous recevrez le résultat suivant:

Outputtotal 4
-rw-r--r-- 1 root root 612 Apr 10 16:40 index.nginx-debian.html
lrwxrwxrwx 1 root root  21 Apr 10 17:06 phpmyadmin -> /usr/share/phpmyadmin

La sortie montre que nous avons un lien symbolique appeléphpmyadmin dans ce répertoire. Nous pouvons changer ce nom de lien en ce que nous voudrions. Cela changera à son tour l'URL d'accès de phpMyAdmin, ce qui peut aider à masquer le point final des bots codés en dur pour rechercher des noms de points finaux communs (tels que «phpmyadmin»).

Choisissez un nom qui masque l'objectif du noeud final. Dans ce guide, nous nommerons notre point de terminaison/nothingtosee, mais vous devez choisir un autre nom. Pour ce faire, il suffit de renommer le lien:

sudo mv phpmyadmin nothingtosee
ls -l

Après avoir exécuté les commandes ci-dessus, vous recevrez cette sortie:

Outputtotal 4
-rw-r--r-- 1 root root 612 Apr 10 16:40 index.nginx-debian.html
lrwxrwxrwx 1 root root  21 Apr 10 17:06 nothingtosee -> /usr/share/phpmyadmin

Maintenant, si vous allez à l’ancienne URL, vous obtiendrez une erreur 404:

http://server_domain_or_IP/phpmyadmin

phpMyAdmin 404 error

Maintenant, votre interface phpMyAdmin sera disponible à la nouvelle URL que nous venons de configurer:

http://server_domain_or_IP/nothingtosee

phpMyAdmin login screen

Nous pouvons maintenant renforcer notre installation de phpMyAdmin en configurant une passerelle d’authentification.

[[step-3 -—- set-up-an-nginx-authentication-gateway]] == Étape 3 - Configurer une passerelle d'authentification Nginx

La prochaine fonctionnalité que nous allons configurer est une invite d'authentification qu'un utilisateur devrait passer avant de voir l'écran de connexion phpMyAdmin. La plupart des serveurs Web, y compris Nginx, fournissent cette fonctionnalité de manière native. Il nous suffira de modifier notre fichier de configuration Nginx avec les détails.

Avant cela, nous allons créer un fichier de mot de passe qui stockera les informations d’authentification. Nginx exige que les mots de passe soient chiffrés à l'aide de la fonctioncrypt(). La suite OpenSSL, qui devrait déjà être installée sur votre serveur, inclut cette fonctionnalité.

Pour créer un mot de passe crypté, tapez:

openssl passwd

Vous serez invité à entrer et à confirmer le mot de passe que vous souhaitez utiliser. L'utilitaire affichera ensuite une version chiffrée du mot de passe qui ressemblera à ceci:

OutputO5az.RSPzd.HE

Copiez cette valeur, car vous devrez la coller dans le fichier d’authentification que nous allons créer.

Maintenant, créez un fichier d'authentification. Nous appellerons ce fichierpma_pass et le placerons dans le répertoire de configuration de Nginx:

sudo nano /etc/nginx/pma_pass

Dans ce fichier, vous spécifiez le nom d’utilisateur que vous souhaitez utiliser, suivi de deux points (:), suivi de la version chiffrée du mot de passe que vous avez reçu de l’utilitaireopenssl passwd.

Nous allons nommer notre utilisateursammy, mais vous devriez choisir un autre nom d'utilisateur. Le fichier devrait ressembler à ceci:

/etc/nginx/pma_pass

sammy:O5az.RSPzd.HE

Enregistrez et fermez le fichier lorsque vous avez terminé.

Nous sommes maintenant prêts à modifier notre fichier de configuration Nginx. Ouvrez-le dans votre éditeur de texte pour commencer:

sudo nano /etc/nginx/sites-available/default

Dans ce fichier, nous devons ajouter une nouvelle sectionlocation. Cela ciblera leslocation que nous avons choisis pour notre interface phpMyAdmin (nous avons sélectionné/nothingtosee dans ce guide).

Créez cette section dans le blocserver, mais en dehors de tout autre bloc. Nous allons placer notre nouveau bloclocation sous le bloc/ dans notre exemple:

/etc/nginx/sites-available/default

server {
    . . .

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

        location /nothingtosee {
        }


    . . .
}

Dans ce bloc, nous devons définir la valeur d'une variable appeléeauth_basic sur un message d'authentification que notre invite affichera aux utilisateurs. Nous ne voulons pas indiquer aux utilisateurs non authentifiés ce que nous protégeons, alors ne donnez pas de détails spécifiques. Nous allons simplement utiliser "Admin Login" dans notre exemple.

Nous devons ensuite ajouter une variable appeléeauth_basic_user_file pour pointer notre serveur Web vers le fichier d'authentification que nous venons de créer. Nginx demandera à l'utilisateur des informations d'authentification et vérifiera que les valeurs entrées correspondent à ce qu'il trouve dans le fichier spécifié.

Une fois que nous avons terminé, le fichier devrait ressembler à ceci:

/etc/nginx/sites-available/default

server {
    . . .

    location / {
        try_files $uri $uri/ =404;
    }

    location /nothingtosee {
        auth_basic "Admin Login";
        auth_basic_user_file /etc/nginx/pma_pass;
    }

    . . .
}

Enregistrez et fermez le fichier lorsque vous avez terminé.

Pour activer notre nouvelle porte d’authentification, nous devons redémarrer le serveur Web:

sudo service nginx restart

Maintenant, si vous visitez l'URL phpMyAdmin dans votre navigateur Web (si l'actualisation de la page ne fonctionne pas, vous devrez peut-être vider votre cache ou utiliser une session de navigateur différente si vous avez déjà utilisé phpMyAdmin), vous devriez être invité à entrer le nom d'utilisateur et mot de passe que vous avez ajoutés au fichierpma_pass:

http://server_domain_or_IP/nothingtosee

Nginx authentication page

Une fois que vous avez entré vos identifiants, vous serez dirigé vers la page de connexion standard de phpMyAdmin.

En plus de fournir une couche de sécurité supplémentaire, cette passerelle aidera à garder vos journaux MySQL à l’abri des tentatives d’authentification spammeuses.

Conclusion

Une fois ce didacticiel terminé, vous pouvez désormais gérer vos bases de données MySQL à partir d’une interface Web raisonnablement sécurisée. Cette interface utilisateur expose la plupart des fonctionnalités disponibles via la ligne de commande MySQL. Vous pouvez parcourir les bases de données et les schémas, exécuter des requêtes et créer de nouveaux ensembles de données et structures.

Related