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


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

/phpmyadmin/
/pma/

etc.

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

9 ответов:

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

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

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

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

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

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

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

эта система вполне безопасный / удобный для домашних серверов-обычно со всеми портами, заблокированными по умолчанию-. Вам нужно только переслать порт 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 Setup 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 drop!!

это будет сначала найти все строки в $path_to_access.журнал, в котором есть phpmyadmin,

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

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

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

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

ограничения

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