Comment sécuriser phpMyAdmin
J'ai remarqué qu'il y a des demandes étranges sur mon site web essayant de trouver phpmyadmin, comme
/phpmyadmin/
/pma/
Etc.
Maintenant, j'ai installé PMA sur Ubuntu via apt et je voudrais y accéder via webaddress différent de / phpmyadmin/. Que puis-je faire pour le changer?
Merci
Mise à Jour
Pour Ubuntu 9.10 et Apache2, le paramètre correspondant se trouve dans le fichier {[3] } qui est un lien vers /etc/phpmyadmin/apache.conf
. Le fichier contient
Alias /phpmyadmin /usr/share/phpmyadmin
Où le premier /phpmyadmin
devrait être changé en quelque chose de différent si l'on veut éviter l'activité inutile, par exemple:
Alias /secret /usr/share/phpmyadmin
9 réponses
La plus grande menace est qu'un attaquant pourrait tirer parti d'une vulnérabilité telle que; Directory traversal, ou en utilisant L'Injection SQL pour appeler load_file()
pour lire le nom d'utilisateur/mot de passe en texte brut dans le fichier de configuration, puis se connecter en utilisant phpmyadmin ou sur le port tcp 3306. En tant que pentester, j'ai utilisé ce modèle d'attaque pour compromettre un système.
Voici un excellent moyen de verrouiller phpmyadmin:
-
NE PAS AUTORISER LES CONNEXIONS RACINE DISTANTES! au lieu de cela phpmyadmin peut être configuré utiliser "Cookie Auth" pour limiter l'accès de l'utilisateur au système. Si vous avez besoin de privilèges root, créez un compte personnalisé qui peut ajouter / supprimer / créer mais n'a pas
grant
oufile_priv
. - supprimez les autorisations
file_priv
de chaque compte.file_priv
est l'un des privilèges les plus dangereux de MySQL car il permet à un attaquant de lire des fichiers ou de télécharger une porte dérobée. - adresse IP de la liste blanche qui ont accès à l'interface phpmyadmin. Ici est un exemple .htaccess reulset:
Order deny,allow Deny from all allow from 199.166.210.1
Ne pas avoir un emplacement de fichier prévisible comme:
http://127.0.0.1/phpmyadmin
. Les scanners de vulnérabilité comme Nessus / Nikto / Acunetix / w3af vont scanner pour cela.Pare-feu hors port tcp 3306 de sorte qu'il ne peut pas être accessible par un attaquant.
- utilisez HTTPS, sinon les données et les mots de passe peuvent être attaquant. Si vous ne voulez pas débourser les 30 $ pour un cert, alors l'utilisation d'un auto-signé. Vous l'accepterez une fois, et même si elle être changé en raison d'un MITM vous serez averti.
Une de mes préoccupations avec phpMyAdmin était que par défaut, tous les utilisateurs de MySQL peuvent accéder à la base de données. Si le mot de passe root de DB est compromis, quelqu'un peut faire des ravages sur la base de données. Je voulais trouver un moyen d'éviter cela en limitant quel utilisateur MySQL peut se connecter à phpMyAdmin.
J'ai trouvé que l'utilisation de la configuration AllowDeny dans PhpMyAdmin était très utile. http://wiki.phpmyadmin.net/pma/Config#AllowDeny_.28rules.29
AllowDeny vous permet de configurer l'accès à phpMyAdmin dans un chemin vers Apache. Si vous définissez' order 'sur explicit, il n'accordera l'accès qu'aux utilisateurs définis dans la section' rules'. Dans la section règles, vous limitez les utilisateurs MySql qui peuvent accéder à l'utilisation de phpMyAdmin.
$cfg['Servers'][$i]['AllowDeny']['order'] = 'explicit'
$cfg['Servers'][$i]['AllowDeny']['rules'] = array('pma-user from all')
Maintenant que vous avez un accès limité à l'utilisateur nommé pma-user dans MySQL, vous pouvez accorder des privilèges limités à cet utilisateur.
grant select on db_name.some_table to 'pma-user'@'app-server'
Dans les nouvelles versions de phpMyAdmin, les autorisations d'accès pour les noms d'utilisateur et les adresses ip peuvent être configurées dans la configuration de phpMyAdmin.Inc.fichier php. C'est une méthode bien meilleure et plus robuste pour restreindre l'accès (sur des URL et des adresses IP codées en dur dans httpd D'Apache.conf).
Voici un exemple complet de la façon de passer à la liste blanche de tous les utilisateurs (personne en dehors de cette liste ne sera autorisé à accéder), et aussi comment restreindre la racine de l'utilisateur au système local et au réseau seulement.
$cfg['Servers'][$i]['AllowDeny']['order'] = 'deny,allow';
$cfg['Servers'][$i]['AllowDeny']['rules'] = array(
'deny % from all', // deny everyone by default, then -
'allow % from 127.0.0.1', // allow all local users
'allow % from ::1',
//'allow % from SERVER_ADDRESS', // allow all from server IP
// allow user:root access from these locations (local network)
'allow root from localhost',
'allow root from 127.0.0.1',
'allow root from 10.0.0.0/8',
'allow root from 172.16.0.0/12',
'allow root from 192.168.0.0/16',
'allow root from ::1',
// add more usernames and their IP (or IP ranges) here -
);
Source: Comment Installer et Sécuriser phpMyAdmin sur localhost pour Windows
Cela vous donne des restrictions d'accès beaucoup plus fines que les autorisations D'URL D'Apache ou un .le fichier htaccess peut fournir, au niveau du nom D'utilisateur MySQL.
assurez-vous que L'utilisateur avec lequel vous vous connectez a son champ MySQL Host:
défini sur 127.0.0.1
ou ::1
, car phpMyAdmin et MySQL sont sur le même système.
Très probablement, quelque part sur votre serveur web sera une directive Alias comme ceci;
Alias /phpmyadmin "c:/wamp/apps/phpmyadmin3.1.3.1/"
Dans ma configuration WampServer / localhost, il était dans c:/wamp/alias/phpmyadmin.conf.
Changez simplement la directive alias et vous devriez être prêt à partir.
Une autre solution consiste à utiliser le fichier de configuration sans aucun paramètre. La première fois que vous devrez peut-être inclure votre login/mot de passe racine mysql afin qu'il puisse installer tous ses trucs, mais ensuite le supprimer.
$ cfg ['serveurs'] [$i] ['auth_type'] = 'cookie';
$ cfg ['serveurs'] [$i] ['hôte'] = 'localhost';
$ cfg ['serveurs'] [$i] ['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compresser'] = false;
$cfg['Servers'][$i]['extension'] = "mysql";
Le laisser comme ça sans alias apache / lighhtpd vous présentera simplement un écran de connexion.
Vous pouvez Vous connecter avec root mais il est conseillé de créer d'autres utilisateurs et ne permettent racine pour l'accès local. Rappelez-vous également d'utiliser des mots de passe de chaîne, même s'ils sont courts mais avec une majuscule et un nombre de caractères spéciaux. par exemple !34sy2rmbr!
alias "Easy 2 remember"
- EDIT: un bon mot de passe maintenant un jour est en fait quelque chose comme des mots qui ne font pas sens grammatical mais vous pouvez vous rappeler parce qu'ils drôles . Ou utilisez keepass pour générer des randoms forts et y avoir un accès facile
Si vous utilisez un serveur linux:
- en utilisant SSH, vous pouvez interdire la connexion utilisateur/mot de passe et n'accepter qu'une clé publique dans le fichier authorized_keys
- Utilisez putty pour vous connecter à votre serveur et ouvrir un terminal distant
- Forward X11 et apporte localhost firefox / iceweasel à votre bureau (dans windows, vous avez besoin du logiciel Xming installé)
- Maintenant, vous avez sécurisé votre phpMyAdmin à travers ssh
Ce système est assez sécurisé / pratique pour les homeservers-généralement avec tous les ports bloqués par défaut-. Vous n'avez qu'à transférer le port SSH (n'utilisez pas le numéro 22).
Si vous aimez Microsoft Terminal Server, vous pouvez même définir un tunnel SSH sur votre ordinateur et vous connecter en toute sécurité à votre serveur web.
Avec SSH tunneling Vous pouvez même transférer le port 3306 de votre serveur distant vers un port local et vous connecter en utilisant phpMyAdmin local ou MySQL Workbench.
Je comprends que cette option est exagérée, mais elle est aussi sécurisée que accès à votre clé privée.
L'approche la plus simple serait d'éditer le serveur web, probablement une installation, une configuration D'Apache2 et de donner à phpmyadmin un nom différent.
Une deuxième approche consisterait à limiter les adresses IP à partir desquelles phpmyadmin peut être consulté (par exemple, uniquement local lan ou localhost).
La meilleure façon de sécuriser phpMyAdmin est la combinaison de tous ces 4:
1. Change phpMyAdmin URL
2. Restrict access to localhost only.
3. Connect through SSH and tunnel connection to a local port on your computer
4. Setup SSL to already encrypted SSH connection. (x2 security)
Voici comment faire tout cela avec: Configuration D'Ubuntu 16.4 + Apache 2 Ordinateur Windows + PuTTY pour connecter et tunnel la connexion SSH à un port local:
# Secure Web Serving of phpMyAdmin (change URL of phpMyAdmin):
sudo nano /etc/apache2/conf-available/phpmyadmin.conf
/etc/phpmyadmin/apache.conf
Change: phpmyadmin URL by this line:
Alias /newphpmyadminname /usr/share/phpmyadmin
Add: AllowOverride All
<Directory /usr/share/phpmyadmin>
Options FollowSymLinks
DirectoryIndex index.php
AllowOverride Limit
...
sudo systemctl restart apache2
sudo nano /usr/share/phpmyadmin/.htaccess
deny from all
allow from 127.0.0.1
alias phpmyadmin="sudo nano /usr/share/phpmyadmin/.htaccess"
alias myip="echo ${SSH_CONNECTION%% *}"
# Secure Web Access to phpMyAdmin:
Make sure pma.yourdomain.com is added to Let's Encrypt SSL configuration:
https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04
PuTTY => Source Port (local): <local_free_port> - Destination: 127.0.0.1:443 (OR localhost:443) - Local, Auto - Add
C:\Windows\System32\drivers\etc
Notepad - Run As Administrator - open: hosts
127.0.0.1 pma.yourdomain.com
https://pma.yourdomain.com:<local_free_port>/newphpmyadminname/ (HTTPS OK, SSL VPN OK)
https://localhost:<local_free_port>/newphpmyadminname/ (HTTPS ERROR, SSL VPN OK)
# Check to make sure you are on SSH Tunnel
1. Windows - CMD:
ping pma.yourdomain.com
ping www.yourdomain.com
# See PuTTY ports:
netstat -ano |find /i "listening"
2. Test live:
https://pma.yourdomain.com:<local_free_port>/newphpmyadminname/
Si vous êtes capable de tout faire avec succès,
you now have your own url path for phpmyadmin,
you denied all access to phpmyadmin except localhost,
you connected to your server with SSH,
you tunneled that connection to a port locally,
you connected to phpmyadmin as if you are on your server,
you have additional SSL conenction (HTTPS) to phpmyadmin in case something leaks or breaks.
Vous pouvez utiliser la commande suivante :
$ grep "phpmyadmin" $path_to_access.log | grep -Po "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" | sort | uniq | xargs -I% sudo iptables -A INPUT -s % -j DROP
Explication:
Assurez-vous que votre adresse IP n'est pas répertoriée avant de passer par iptables drop!!
Cela va d'abord trouver toutes les lignes dans $ path_to_access.log qui ont phpmyadmin en eux,
Puis grep l'adresse ip depuis le début de la ligne,
Puis trier et les uniques,
, Puis ajoutez une règle pour les déposer dans iptables
Encore une fois, il suffit d'éditer dans echo %
à la fin au lieu de la commande iptables pour vous assurer que votre adresse IP n'est pas là. Ne pas interdire par inadvertance votre accès au serveur!
Limites
Vous devrez peut-être changer la partie grep de la commande si vous êtes sur mac ou tout système qui n'a pas grep-P. Je ne suis pas sûr si tous les systèmes commencent par xargs, donc cela pourrait devoir être installé aussi. C'est super utile de toute façon si vous faites beaucoup de bash.