Comment installer et sécuriser phpMyAdmin avec Nginx sur un serveur Ubuntu 14.04

introduction

Les systèmes de gestion de base de données relationnelle tels que MySQL 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 Ubuntu 14.04. 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 Ubuntu 14.04. 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 pouvoir commencer à utiliser ce guide consiste à installer une pile LEMP (Linux, Nginx, MySQL et PHP) sur votre serveur Ubuntu 14.04. C’est la plate-forme que nous utiliserons pour servir notre interface phpMyAdmin (MySQL 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 Ubuntu 14.04.

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. Ceci est disponible dans les dépôts par défaut d’Ubuntu, le processus d’installation est donc simple.

Tout d’abord, mettez à jour l’index de package local du serveur pour vous assurer qu’il dispose d’un nouvel ensemble de références aux packages disponibles. Ensuite, nous pouvons utiliser les outils d'empaquetage 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, n’est pas l’une des options disponibles, vous pouvez simplement appuyer sur la touche de tabulation pour ignorer cette invite.

L'invite suivante vous demandera si vous souhaitez quedbconfig-common configure une base de données à utiliser par phpmyadmin. Sélectionnez «Oui» pour continuer.

Vous devez entrer le mot de passe administratif de la base de données que vous avez configuré lors de l'installation de MySQL pour autoriser ces modifications. Ensuite, il vous sera demandé de sélectionner et de confirmer un mot de passe pour une nouvelle base de données contenant les propres données de 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

Un dernier élément que nous devons aborder est l'activation du module PHPmcrypt, sur lequel phpMyAdmin s'appuie. Cela a été installé avec phpMyAdmin, nous devons donc l'activer et redémarrer notre processeur PHP:

sudo php5enmod mcrypt
sudo service php5-fpm restart

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 MySQL valide. L'utilisateurroot et le mot de passe administratif MySQL 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
total 8
-rw-r--r-- 1 root root 537 Mar  4 06:46 50x.html
-rw-r--r-- 1 root root 612 Mar  4 06:46 index.html
lrwxrwxrwx 1 root root  21 Aug  6 10:50 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 Mar  4 06:46 50x.html
-rw-r--r-- 1 root root 612 Mar  4 06:46 index.html
lrwxrwxrwx 1 root root  21 Aug  6 10:50 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/sites-available/default

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 service nginx restart

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.