Как обезопасить phpMyAdmin - PullRequest
       38

Как обезопасить phpMyAdmin

59 голосов
/ 13 апреля 2010

Я заметил, что на мой сайт попадаются странные запросы на поиск phpmyadmin, например

/phpmyadmin/
/pma/

и т.д.

Теперь я установил PMA в Ubuntu через apt и хотел бы получить к нему доступ через веб-адрес, отличный от / phpmyadmin /. Что я могу сделать, чтобы изменить это?

Спасибо


Обновление

Для Ubuntu 9.10 и Apache2 соответствующая настройка находится в файле /etc/apache2/conf.d/phpmyadmin.conf, который является ссылкой на /etc/phpmyadmin/apache.conf. Файл содержит

Alias /phpmyadmin /usr/share/phpmyadmin

где первый /phpmyadmin должен быть изменен на что-то другое, если кто-то хочет избежать ненужной активности, например ::

Alias /secret /usr/share/phpmyadmin

Ответы [ 9 ]

81 голосов
/ 13 апреля 2010

Самая большая угроза состоит в том, что злоумышленник может использовать такую ​​уязвимость, как; Обратный путь в каталогах или использование SQL-инъекции для вызова load_file() для чтения простого имени пользователя / пароля в файле конфигурации, а затем для входа в систему с использованием phpmyadmin или через порт 3306 tcp. Как пентестер, я использовал этот шаблон атаки для компрометации системы.

Вот отличный способ заблокировать phpmyadmin:

  • НЕ РАЗРЕШАТЬ ДИСТАНЦИОННЫЕ ЛОГИНЫ ROOT! Вместо этого phpmyadmin может быть настроен на использование «Cookie Auth» для ограничения доступа пользователя к системе. Если вам нужны некоторые привилегии root, создайте пользовательскую учетную запись, которая может добавлять / удалять / создавать, но не имеет grant или file_priv.
  • Удалить file_priv разрешений для каждой учетной записи. file_priv является одной из самых опасных привилегий в MySQL, поскольку позволяет злоумышленнику читать файлы или загружать бэкдор.
  • Белый список IP-адресов, имеющих доступ к интерфейсу phpmyadmin. Вот пример .htaccess reulset:
Order deny,allow
Deny from all
allow from 199.166.210.1
  • Нет предсказуемого местоположения файла, например: http://127.0.0.1/phpmyadmin. Сканеры уязвимостей, такие как Nessus / Nikto / Acunetix / w3af, будут сканировать это.

  • Брандмауэр отключен от TCP-порта 3306, поэтому злоумышленник не может получить к нему доступ.

  • Используйте HTTPS, иначе данные и пароли могут быть переданы взломщик. Если вы не хотите раскошелиться на 30 долларов за сертификат, то использовать самоподписанный. Вы примете это один раз, и даже если это было Из-за MITM вы будете уведомлены.
12 голосов
/ 21 июня 2012

Одна из моих проблем с phpMyAdmin состояла в том, что по умолчанию все пользователи MySQL могут получить доступ к БД. Если пароль root БД скомпрометирован, кто-то может нанести ущерб БД. Я хотел найти способ избежать этого, ограничив, какой пользователь MySQL может войти в phpMyAdmin.

Я обнаружил, что использование конфигурации AllowDeny в PhpMyAdmin очень полезно. http://wiki.phpmyadmin.net/pma/Config#AllowDeny_.28rules.29

AllowDeny позволяет вам настроить доступ к phpMyAdmin аналогично Apache. Если вы установите явный порядок, он предоставит доступ только пользователям, определенным в разделе «правила». В разделе правил вы запрещаете пользователям MySql, которые могут получить доступ, использовать phpMyAdmin.

$cfg['Servers'][$i]['AllowDeny']['order'] = 'explicit'
$cfg['Servers'][$i]['AllowDeny']['rules'] = array('pma-user from all')

Теперь у вас ограниченный доступ к пользователю с именем pma-user в MySQL, вы можете предоставить ему ограниченные привилегии.

grant select on db_name.some_table to 'pma-user'@'app-server'
6 голосов
/ 06 июня 2014

В более новых версиях phpMyAdmin права доступа для имен пользователей + ip-адреса могут быть установлены в файле config.inc.php phpMyAdmin. Это гораздо лучший и более надежный метод ограничения доступа (через жестко заданные URL-адреса и IP-адреса в httpd.conf Apache).

Вот полный пример того, как переключиться на белый список всех пользователей (никому за пределами этого списка не будет разрешен доступ), а также как ограничить доступ пользователя root только к локальной системе и сети.

$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 -    
    );

Источник: Как установить и защитить phpMyAdmin на локальном хосте для Windows

Это дает вам гораздо более детальные ограничения доступа, чем разрешения Apache для URL или файл .htaccess, на уровне имени пользователя MySQL.

Убедитесь, что у пользователя, с которым вы входите, в поле MySQL Host: установлено значение 127.0.0.1 или ::1, поскольку phpMyAdmin и MySQL находятся в одной системе.

4 голосов
/ 21 января 2013

Другим решением является использование файла конфигурации без каких-либо настроек. В первый раз вам, возможно, придется включить свой логин / пароль для входа в MySQL, чтобы он мог установить все свои вещи, но затем удалить их.

$ cfg ['Серверы'] [$ i] ['auth_type'] = 'cookie';

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

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

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

$ cfg ['Серверы'] [$ i] ['extension'] = 'mysql';

Если оставить это так без псевдонимов apache / lighhtpd, вы просто увидите экран входа в систему. enter image description here

Вы можете войти в систему как root, но рекомендуется создавать других пользователей и разрешать root только для локального доступа. Также не забывайте использовать строковые пароли, даже если они короткие, но с заглавной буквы и номером специального символа. например !34sy2rmbr! он же "легкий 2 запомнить"

-EDIT: Хороший пароль в наши дни - это что-то вроде слов, которые не имеют грамматического смысла, но вы можете их запомнить, потому что они забавные . Или используйте keepass для генерации сильных случайностей и легкого доступа к ним

4 голосов
/ 13 апреля 2010

Скорее всего, где-то на вашем веб-сервере будет директива Alias, подобная этой;

Alias /phpmyadmin "c:/wamp/apps/phpmyadmin3.1.3.1/"

В моей настройке wampserver / localhost это было в c: /wamp/alias/phpmyadmin.conf.

Просто измените директиву псевдонима, и вы должны быть готовы.

2 голосов
/ 05 января 2016

Если вы работаете на сервере Linux:

  • Используя SSH, вы можете запретить регистрацию пользователя / пароля и принимать только открытый ключ в файле авторизованных ключах
  • Используйте putty для подключения к вашему серверу и откройте удаленный терминал
  • Пересылаем X11 и переносим локальный firefox / iceweasel на рабочий стол (в Windows вам нужно установить программное обеспечение Xming)
  • Теперь вы защитили свой phpMyAdmin через ssh

Эта система довольно безопасна / удобна для домашних серверов, обычно со всеми портами, заблокированными по умолчанию. Вам нужно только перенаправить порт SSH (не используйте номер 22).

Если вам нравится Microsoft Terminal Server, вы даже можете установить SSH-туннелирование на свой компьютер и через него безопасно подключаться к веб-серверу.

С помощью ssh туннелирования вы даже можете перенаправить порт 3306 вашего удаленного сервера на локальный порт и подключиться с помощью локального phpMyAdmin или MySQL Workbench.

Я понимаю, что эта опция излишняя, но такая же безопасная, как и доступ к вашему секретному ключу.

1 голос
/ 30 июля 2017

Лучший способ защитить phpMyAdmin - это сочетание всех этих 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)

Вот как это сделать: Ubuntu 16.4 + установка Apache 2 Компьютер Windows + PuTTY для подключения и туннелирования SSH-соединения к локальному порту:

# 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/

Если вам удастся сделать все это успешно,

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 голос
/ 13 апреля 2010

Самый простой подход - это отредактировать веб-сервер, скорее всего, установку, настройку Apache2 и дать phpmyadmin другое имя.

Второй подход - это ограничение IP-адресов, с которых можно получить доступ к phpmyadmin (например, только локальный локальный или локальный хост).

0 голосов
/ 02 декабря 2016

Вы можете использовать следующую команду:

$ 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 

Пояснение:

Убедитесь, что ваш IP не указан, прежде чем отправлять через iptables drop !!

Сначала будут найдены все строки в $ path_to_access.log, в которых есть phpmyadmin,

затем извлеките IP-адрес из начала строки,

затем сортируйте и уникальные их,

затем добавьте правило для удаления их в iptables

Опять же, просто отредактируйте в конце echo % вместо команды iptables, чтобы убедиться, что ваш IP не указан. Не забывайте случайно заблокировать ваш доступ к серверу!

Ограничения

Вам может потребоваться изменить часть команды grep, если вы работаете на Mac или в любой системе, в которой нет grep -P. Я не уверен, что все системы начинаются с xargs, так что это может потребоваться установить тоже. В любом случае, это очень полезно, если вы делаете много ударов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...