web-dev-qa-db-fra.com

Comment sécuriser phpMyAdmin

J'ai remarqué qu'il y avait d'étranges requêtes sur mon site Web qui tentaient de trouver phpmyadmin, comme

/phpmyadmin/
/pma/

etc.

Maintenant, j'ai installé PMA sur Ubuntu via apt et j'aimerais y accéder via une adresse Web différente de/phpmyadmin /. Que puis-je faire pour le changer?

Merci


Mettre à jour

Pour Ubuntu 9.10 et Apache2, le paramètre correspondant se trouve dans le fichier /etc/Apache2/conf.d/phpmyadmin.conf 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 on veut éviter l'activité inutile, par exemple:

Alias /secret /usr/share/phpmyadmin
59
Andrei

La plus grande menace est qu'un attaquant pourrait exploiter une vulnérabilité telle que; travers de répertoire ou en utilisant SQL Injection pour appeler load_file() pour lire le nom d'utilisateur/mot de passe en texte brut dans le fichier de configuration, puis vous 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 PERMETTEZ PAS DE CONNEXION ROOT À DISTANCE! À la place, phpmyadmin peut être configuré pour utiliser "Autorisation de cookie" pour limiter les utilisateurs pouvant accéder au système. Si vous avez besoin de certains privilèges root, créez un compte personnalisé pouvant ajouter/supprimer/créer, mais sans grant ni file_priv
  • Supprimer les autorisations file_priv de chaque compte. file_priv est l’un des privilèges les plus dangereux dans MySQL car il permet à un attaquant de lire des fichiers ou de télécharger une porte dérobée. 
  • Liste blanche des adresses IP ayant accès à l'interface phpmyadmin. Voici 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é tels que Nessus/Nikto/Acunetix/w3af le rechercheront. 

  • Pare-feu du port tcp 3306 afin qu’un attaquant ne puisse y accéder. 

  • Utilisez HTTPS, sinon les données et les mots de passe pourraient être divulgués à un attaquant Si vous ne voulez pas débourser 30 $ pour un certificat, alors utilisez un fichier auto-signé. Vous l'accepterez une fois, et même si cela a été modifié en raison d'un MITM, vous en serez averti.
81
rook

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 la base de données est compromis, quelqu'un peut faire des dégâts sur la base de données. Je voulais trouver un moyen d'éviter cela en limitant quel utilisateur de MySQL peut se connecter à phpMyAdmin.

J'ai trouvé très utile d'utiliser la configuration AllowDeny dans PhpMyAdmin. http://wiki.phpmyadmin.net/pma/Config#AllowDeny_.28rules.29

AllowDeny vous permet de configurer l'accès à phpMyAdmin de la même manière qu'à Apache. Si vous définissez 'ordre' sur explicite, il n'accordera l'accès qu'aux utilisateurs définis dans la section 'règles'. Dans les règles, vous restreignez l'accès aux utilisateurs de MySql qui utilisent 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'
12
Jae Cho

Dans les versions plus récentes de phpMyAdmin, des autorisations d'accès pour les noms d'utilisateur et les adresses ip peuvent être définies dans le fichier config.inc.php de phpMyAdmin. Il s'agit d'une méthode beaucoup plus efficace et plus robuste pour limiter l'accès (au-delà d'un codage en dur des adresses URL et IP dans le fichier httpd.conf d'Apache).

Voici un exemple complet sur la façon de passer à la liste blanche de tous les utilisateurs (aucun utilisateur en dehors de cette liste ne sera autorisé à y accéder), mais également sur la manière de restreindre l'utilisateur root au système et au réseau locaux uniquement.

$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 beaucoup plus de restrictions d'accès détaillées que les autorisations d'URL d'Apache ou qu'un fichier .htaccess ne 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.

6
rightstuff

Une autre solution consiste à utiliser le fichier de configuration sans aucun paramètre. La première fois, vous devrez peut-être inclure votre nom d'utilisateur/mot de passe mysql root afin qu'il puisse installer tout son contenu, puis le supprimer.

$ cfg ['Servers'] [$ i] ['auth_type'] = 'cookie';

$ cfg ['Servers'] [$ i] ['Host'] = 'localhost';

$ cfg ['Servers'] [$ i] ['connect_type'] = 'tcp';

$ cfg ['Servers'] [$ i] ['compress'] = false;

$ cfg ['Servers'] [$ i] ['extension'] = 'mysql';

Le laisser comme ça sans aucun alias Apache/lighhtpd ne vous présentera qu'un écran de connexion .enter image description here

Vous pouvez vous connecter avec root, mais il est conseillé de créer d'autres utilisateurs et de n'autoriser que root pour un accès local. Pensez également à utiliser des mots de passe de chaîne, même courts mais avec une majuscule et le nombre de caractères spéciaux. par exemple !34sy2rmbr! aka "easy 2 Remember"

-EDIT: Un bon mot de passe maintenant, jours, est en réalité quelque chose qui ressemble à des mots qui ne donne aucun sens grammatical mais vous pouvez vous en souvenir car ils sont drôles . Ou utilisez keepass pour générer de fortes randonnées et y avoir un accès facile

4
ppumkin

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 se trouvait dans c: /wamp/alias/phpmyadmin.conf.

Il suffit de changer la directive alias et vous devriez être prêt à partir.

4
Mathew

Si vous utilisez un serveur linux:

  • À l’aide de SSH, vous pouvez interdire la journalisation utilisateur/mot de passe et n’accepter que la clé publique du fichier authorised_keys.
  • Utilisez PuTTY pour vous connecter à votre serveur et ouvrir un terminal distant.
  • Transférez X11 et amenez localhost firefox/iceweasel sur votre bureau (sous Windows, le logiciel Xming doit être installé)
  • Maintenant vous avez sécurisé votre phpMyAdmin via ssh

Ce système est assez sécurisé/pratique pour les serveurs domestiques (généralement avec tous les ports bloqués par défaut). Il vous suffit de 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 tunneling 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 ou MySQL Workbench. 

Je comprends que cette option est excessive, mais qu’elle est aussi sécurisée que l’accès à votre clé privée. 

2
JJFS

Le meilleur moyen 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: Ubuntu 16.4 + Installation d’Apache 2 Ordinateur Windows + PuTTY pour connecter et tunnelliser 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 faire tout cela 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.
1
Tarik

La méthode la plus simple consiste à modifier le serveur Web, probablement une installation d’Apache2, à configurer et à donner à phpmyadmin un nom différent.

Une deuxième approche consisterait à limiter les adresses IP à partir desquelles phpmyadmin est accessible (par exemple, uniquement les réseaux locaux ou locaux).

1
lexu

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 à travers iptables drop !!

Cela va d'abord trouver toutes les lignes dans $ path_to_access.log qui contiennent phpmyadmin,

puis grep l'adresse ip depuis le début de la ligne,

puis les trier et les uniques,

puis ajoutez une règle pour les déposer dans iptables

Encore une fois, il suffit de modifier echo % à la fin au lieu de la commande iptables pour vous assurer que votre adresse IP n'y figure pas. Ne bannissez pas par inadvertance votre accès au serveur!

Limitations

Vous devrez peut-être modifier la partie grep de la commande si vous utilisez un ordinateur Mac ou un système ne disposant pas de grep -P. Je ne sais pas si tous les systèmes commencent par xargs, il faudra peut-être également l'installer. C'est super utile quand même si vous faites beaucoup de bash.

0
Technical Blood