Как защитить phpMyAdmin

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

/phpmyadmin/
/pma/

etc.

теперь я установил 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

9 ответов


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

вот отличный способ заблокировать 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 вы будете уведомлены.

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

в более новых версиях phpMyAdmin разрешения доступа для имен пользователей + ip-адреса могут быть настроены внутри конфигурации phpMyAdmin.Инк.PHP-файл. Это гораздо лучший и более надежный метод ограничения доступа (по URL-адресам жесткого кодирования и IP-адресам в httpd Apache.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 или an .файл htaccess может предоставить на уровне имени пользователя MySQL.

убедитесь, что пользователь, с которым вы входите в систему, имеет свой MySQL


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

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

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

просто измените директиву alias, и вам будет хорошо идти.


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

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

$cfg в['сервера'][$я]['хозяина'] = '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! Он же "easy 2 remember"

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


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

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

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

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

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

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


самым простым подходом было бы отредактировать веб-сервер, скорее всего, установку Apache2, конфигурацию и дать phpmyadmin другое имя.

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


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

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

$ 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.журнал, в котором есть phpmyadmin,

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

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

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

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

ограничения

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