it-roy-ru.com

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

Я заметил, что на мой сайт попадаются странные запросы на поиск 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
59
Andrei

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

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

  • НЕ ДОПУСКАЙТЕ УДАЛЕННЫХ ЛОГИНОВ! Вместо этого 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, вы будете уведомлены.
81
rook

Одной из моих проблем с phpMyAdmin было то, что по умолчанию все пользователи MySQL могут получить доступ к БД. Если пароль администратора базы данных скомпрометирован, кто-то может разрушить базу данных. Я хотел найти способ избежать этого, ограничив, какой пользователь 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'
12
Jae Cho

В более новых версиях 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 находятся в одной системе.

6
rightstuff

Другое решение - использовать файл конфигурации без каких-либо настроек. В первый раз вам, возможно, придется включить свой логин/пароль для входа в 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, вы просто увидите экран входа в систему .enter image description here

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

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

4
ppumkin

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

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

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

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

4
Mathew

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

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

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

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

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

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

2
JJFS

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

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

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

1
lexu

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

$ 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, так что, возможно, их тоже нужно установить. В любом случае, это очень полезно, если вы делаете много ударов.

0
Technical Blood