Comment installer et sécuriser phpMyAdmin avec Nginx sur un serveur CentOS 7

introduction

Les systèmes de gestion de base de données relationnelle tels que MySQL et MariaDB sont nécessaires pour une grande partie des sites Web et des applications. Cependant, tous les utilisateurs ne se sentent pas à l'aise pour administrer leurs données à partir de la ligne de commande.

Pour résoudre ce problème, un projet appelé phpMyAdmin a été créé afin de proposer une alternative sous la forme d'une interface de gestion basée sur le Web. Dans ce guide, nous montrerons comment installer et sécuriser une configuration phpMyAdmin sur un serveur CentOS 7. Nous allons construire cette configuration sur le serveur Web Nginx, qui présente un bon profil de performances et peut gérer de lourdes charges mieux que certains autres serveurs Web.

Conditions préalables

Avant de commencer, il y a quelques exigences à régler.

Pour vous assurer que vous disposez d'une base solide sur laquelle construire ce système, vous devez parcourir nosinitial server setup guide for CentOS 7. Entre autres choses, cela vous guidera à travers la configuration d'un utilisateur non root avec un accèssudopour les commandes d'administration.

La deuxième condition préalable à remplir pour commencer à utiliser ce guide consiste à installer une pile LEMP (Linux, Nginx, MariaDB et PHP) sur votre serveur CentOS 7. C’est la plate-forme que nous utiliserons pour servir notre interface phpMyAdmin (MariaDB est également le logiciel de gestion de base de données que nous souhaitons gérer). Si vous n'avez pas encore d'installation LEMP sur votre serveur, suivez notre tutoriel surinstalling LEMP on CentOS 7.

Lorsque votre serveur fonctionne correctement après avoir suivi ces instructions, vous pouvez continuer avec le reste de cette page.

[[step-one -—- install-phpmyadmin]] == Première étape - Installer phpMyAdmin

Avec notre plateforme LEMP déjà en place, nous pouvons commencer immédiatement par installer le logiciel phpMyAdmin. Malheureusement, phpMyAdmin n’est pas disponible dans le référentiel par défaut de CentOS 7.

Pour obtenir les packages dont nous avons besoin, nous devrons ajouter un référentiel supplémentaire à notre système. Le repo EPEL (ExtraPackages forEnterpriseLinux) contient de nombreux packages supplémentaires, y compris le package phpMyAdmin que nous recherchons.

Heureusement, la procédure d’ajout du référentiel EPEL est devenue beaucoup plus simple. Il existe en fait un package appeléepel-release qui reconfigure notre gestionnaire de packages pour utiliser les dépôts EPEL.

Nous pouvons l'installer maintenant en tapant:

sudo yum install epel-release

Maintenant que vous avez accès au référentiel EPEL, vous pouvez installer phpMyAdmin via yum:

sudo yum install phpmyadmin

L'installation va maintenant se terminer. Pour que le serveur Web Nginx trouve et serve correctement les fichiers phpMyAdmin, il suffit de créer un lien symbolique depuis les fichiers d’installation vers le répertoire racine de notre document Nginx en tapant ceci:

sudo ln -s /usr/share/phpMyAdmin /usr/share/nginx/html

Nous devrions également redémarrer notre processeur PHP pour nous assurer qu'il peut charger les modules PHP supplémentaires que nous avons installés:

sudo systemctl restart php-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 une paire nom d'utilisateur / mot de passe d'un utilisateur MariaDB valide. L'utilisateurroot et le mot de passe administrateur MariaDB sont un bon choix pour commencer. Vous pourrez alors accéder à l'interface administrative:

phpMyAdmin admin interface

Cliquez autour pour vous familiariser avec l'interface. Dans la section suivante, nous allons prendre des mesures pour sécuriser notre nouvelle interface.

[[step-two -—- secure-your-phpmyadmin-instance]] == Deuxième étape - Sécurisez votre instance phpMyAdmin

L'instance phpMyAdmin installée sur notre serveur devrait être complètement utilisable à ce stade. Cependant, en installant une interface Web, nous avons exposé notre système MySQL au monde extérieur.

Même avec l'écran d'authentification inclus, c'est tout un problème. En raison de la popularité de phpMyAdmin et de la grande quantité de données auxquelles il donne accès, de telles installations sont des cibles courantes pour les attaquants.

Nous allons mettre en œuvre deux stratégies simples pour réduire les chances que notre installation soit ciblée et compromise. Nous allons changer l'emplacement de l'interface de/phpMyAdmin à quelque chose d'autre pour éviter certaines des tentatives automatisées de force brute de bot. Nous allons également créer une passerelle d'authentification supplémentaire au niveau du serveur Web qui doit être transmise avant même d'accéder à l'écran de connexion de phpMyAdmin.

Modification de l’emplacement d’accès de l’application

Afin que notre serveur Web Nginx puisse trouver et servir nos fichiers phpMyAdmin, nous avons précédemment créé un lien symbolique du répertoire phpMyAdmin à la racine de notre document.

Pour changer l'URL où notre interface phpMyAdmin est accessible, il suffit de renommer le lien symbolique. Déplacez-vous dans le répertoire racine du document Nginx pour avoir une meilleure idée de ce que nous faisons:

cd /usr/share/nginx/html
ls -l
-rw-r--r-- 1 root root 537 Aug  5 08:15 50x.html
-rw-r--r-- 1 root root 612 Aug  5 08:15 index.html
lrwxrwxrwx 1 root root  21 Aug  6 17:29 phpMyAdmin -> /usr/share/phpMyAdmin

Comme vous pouvez le voir, 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 l'emplacement où phpMyAdmin peut être accessible à partir d'un navigateur, ce qui peut aider à masquer le point d'accès à partir de robots codés en dur.

Choisissez un nom qui n'indique pas le but de l'emplacement. Dans ce guide, nous nommerons notre emplacement d'accès/nothingtosee. Pour ce faire, il suffit de renommer le lien:

sudo mv phpMyAdmin nothingtosee
ls -l
total 8
-rw-r--r-- 1 root root 537 Aug  5 08:15 50x.html
-rw-r--r-- 1 root root 612 Aug  5 08:15 index.html
lrwxrwxrwx 1 root root  21 Aug  6 17:29 nothingtosee -> /usr/share/phpMyAdmin

Maintenant, si vous allez à l'emplacement précédent de votre installation phpMyAdmin, vous obtiendrez une erreur 404:

http://server_domain_or_IP/phpMyAdmin

phpMyAdmin 404 error

Cependant, votre interface phpMyAdmin sera disponible au nouvel emplacement que nous avons sélectionné:

http://server_domain_or_IP/nothingtosee

phpMyAdmin login screen

Configuration d'une passerelle d'authentification de serveur Web

La prochaine fonctionnalité que nous souhaitions pour notre installation était une invite d'authentification qu'un utilisateur serait tenu de transmettre avant de voir l'écran de connexion phpMyAdmin.

Heureusement, la plupart des serveurs Web, y compris Nginx, fournissent cette fonctionnalité de manière native. Nous aurons juste besoin 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 nos informations d'identification 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:

O5az.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, il vous suffit de spécifier le nom d'utilisateur que vous souhaitez utiliser, suivi de deux points (:), suivi de la version cryptée de votre mot de passe que vous avez reçu de l'utilitaireopenssl passwd.

Nous allons nommer notre utilisateurdemo, mais vous devriez choisir un autre nom d'utilisateur. Le fichier de ce guide ressemble à ceci:

demo:O5az.RSPzd.HE

Enregistrez et fermez le fichier lorsque vous avez terminé.

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

sudo nano /etc/nginx/conf.d/default.conf

Dans ce fichier, nous devons ajouter une nouvelle section d’emplacement. Cela ciblera l'emplacement que nous avons choisi 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 placerons notre nouveau bloc d'emplacement sous le bloclocation / dans notre exemple:

server {
    . . .

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

    location /nothingtosee {
    }

    . . .
}

Dans ce bloc, nous devons définir la valeur d'une directive 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, donc ne donnez pas de détails spécifiques. Nous allons simplement utiliser "Admin Login" dans notre exemple.

Nous devons ensuite utiliser une directive appeléeauth_basic_user_file pour pointer notre serveur Web vers le fichier d'authentification que nous avons créé. 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:

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 mettre en œuvre notre nouvelle porte d’authentification, nous devons redémarrer le serveur Web:

sudo systemctl restart nginx

Maintenant, si nous visitons notre emplacement phpMyAdmin dans notre navigateur Web (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 le mot de passe que vous avez ajoutés aupma_pass fichier:

http://server_domain_or_IP/nothingtosee

Nginx authentication page

Une fois que vous avez entré vos identifiants, vous serez redirigé vers la page de connexion normale de phpMyAdmin. Cette couche de protection supplémentaire aidera à garder vos journaux MySQL à l’abri des tentatives d’authentification, en plus des avantages de sécurité supplémentaires.

Conclusion

Vous pouvez maintenant gérer vos bases de données MySQL à partir d'une interface Web raisonnablement sécurisée. Cette interface utilisateur présente la plupart des fonctionnalités disponibles à partir de l'invite de commande MySQL. Vous pouvez afficher 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.