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

56

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

/phpmyadmin/
/pma/

и др.

Теперь я установил PMA на Ubuntu через apt и хотел бы получить к нему доступ через webaddress, отличную от /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
  • 2
    Разве заголовок не должен был быть «как переместить phpMyAdmin»? Изменение URL не очень надежно ...
Теги:
security
phpmyadmin

9 ответов

77
Лучший ответ

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

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

  • НЕ ДОПУСКАЙТЕ УДАЛЕННЫЕ КОРНЕ-ВХОДЫ! Вместо phpmyadmin можно настроить "Cookie Auth" , чтобы ограничить пользователь может получить доступ к системе. Если вам нужны привилегии root, создайте пользовательскую учетную запись, которая может добавлять/отбрасывать/создавать, но не имеет grant или file_priv.
  • Удалите разрешения file_priv от каждой учетной записи. file_priv является одной из самых опасных привилегий в MySQL, поскольку позволяет злоумышленнику читать файлы или загружать бэкдор.
  • IP-адрес whitelist, имеющий доступ к интерфейсу 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, будут проверять это.

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

  • Используйте HTTPS, иначе данные и пароли могут быть взломщик. Если вы не хотите раскошеливать 30 долларов за сертификат, то использовать самоподписанные. Вы примете его один раз, и даже если бы это было изменен из-за MITM, вы будете уведомлены.
  • 6
    Я не хочу быть критичным, но забавно, что вы не обращаетесь к «самой большой угрозе» до последнего шага. Самая большая угроза для большинства людей - это грубое принуждение, к которому относятся другие ваши шаги. Использование хорошего пароля также является хорошей идеей.
  • 1
    @therealsix ваше право, но я предположил, что это было очевидно. Грубая сила для mysql встречается реже, чем mssql, потому что у вас есть xp_cmdshell (), которая вызывает cmd.exe. В mysql выполнимый код выполнения не является прямым.
Показать ещё 7 комментариев
10

Одна из моих проблем с phpMyAdmin заключалась в том, что по умолчанию все пользователи MySQL могут получить доступ к db. Если пароль администратора БД взломан, кто-то может разрушить хаос на db. Я хотел найти способ избежать этого, ограничив, какой пользователь 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'
  • 4
    Хороший совет! Просто небольшая ошибка в вашем коде, правила должны выглядеть следующим образом: $cfg['Servers'][$i]['AllowDeny']['rules'] = array('allow pma-user from all');
5

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

Вот полный пример того, как переключиться на белый список всех пользователей (никому из этого списка не будет разрешен доступ), а также как ограничить 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 на localhost для Windows

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

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

4

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

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

Оставляя это как без алиасов apache/lighhtpd, вы просто представите вам экран входа. Изображение 3947

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

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

  • 1
    Lastpass также еще одна отличная система управления паролями
4

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

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

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

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

2

Если вы используете Linux-сервер:

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

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

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

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

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

1

Лучший способ защитить 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 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

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

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

0

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

$ 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!

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

затем выгрузите ip-адрес с начала строки,

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

затем добавьте правило, чтобы удалить их в iptables

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

Ограничения

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню