Вход Регистрация
Защита phpMyAdmin от брутфорса при помощи Fail2Ban (оценка: 0)
Очень часто взлом сайтов, происходит по вине вебмастера, поленившегося поставить длинный и сложный пароль к БД MySQL. Подобрав имя пользователя и пароль, злоумышленник проникает в phpMyAdmin и как правило просто удаляет все БД к которым сумел добраться. Как правило, большинство phpMyAdmin защищены cookies аутентификаций, но при этом лог попыток авторизаций не ведется.

У многих возникает резонный вопрос, каким-же образом Fail2Ban сможет блокировать перебор паролей, если нет лога? Да вобщем совсем не сложно, даже для начинающего программиста или системного администратора. Все что нам понадобится, это базовые навыки PHP и немного внимательности. Итак начнем!

Логирование неудачных попыток входа в phpMyAdmin

Поскольку мы используем cookies аутентификацию, нам понадобится файл, в котором находятся функции cookies аутентификации, в Debian и CentOS он находится тут - /usr/share/phpMyAdmin/libraries/auth/cookie.auth.lib.php Копируем файл (на случай кривизны рук, а руки у половины кривые .лох. ), далее открываем файл в текстовом редакторе и находим данную функцию:
  1. function PMA_auth_fails()
  2. {
  3. global $conn_error;
  4.  
  5. // Deletes password cookie and displays the login form
  6. $GLOBALS['PMA_Config']->removeCookie('pmaPass-' . $GLOBALS['server']);
  7.  
  8. if (! empty($GLOBALS['login_without_password_is_forbidden'])) {
  9. $conn_error = __('Login without a password is forbidden by configuration (see AllowNoPassword)');
  10. } elseif (! empty($GLOBALS['allowDeny_forbidden'])) {
  11. $conn_error = __('Access denied');
  12. } elseif (! empty($GLOBALS['no_activity'])) {
  13. $conn_error = sprintf(__('No activity within %s seconds; please log in again'), $GLOBALS['cfg']['LoginCookieValidity']);
  14. // Remember where we got timeout to return on same place
  15. if (PMA_getenv('SCRIPT_NAME')) {
  16. $GLOBALS['target'] = basename(PMA_getenv('SCRIPT_NAME'));
  17. // avoid "missing parameter: field" on re-entry
  18. if ('tbl_alter.php' == $GLOBALS['target']) {
  19. $GLOBALS['target'] = 'tbl_structure.php';
  20. }
  21. }
  22. } elseif (PMA_DBI_getError()) {
  23. $conn_error = '#' . $GLOBALS['errno'] . ' ' . __('Cannot log in to the MySQL server');
  24. } else {
  25. $conn_error = __('Cannot log in to the MySQL server');
  26. }
  27.  
  28. // needed for PHP-CGI (not need for FastCGI or mod-php)
  29. header('Cache-Control: no-store, no-cache, must-revalidate');
  30. header('Pragma: no-cache');
  31.  
  32. PMA_auth();
  33. }

Это и есть наша функция авторизации в phpMyAdmin

И добавляем в функцию внесколько строк, которые собственно и добавят, в системный лог, сообщения о неудачных попытках авторизации в phpMyAdmin. B результате этих нехитрых манипуляций, мы получим следующий код.недовол. можете заменить код выше на этот)

  1. function PMA_auth_fails(){
  2. global $conn_error;
  3.  
  4. // Deletes password cookie and displays the login form
  5. $GLOBALS['PMA_Config']->removeCookie('pmaPass-' . $GLOBALS['server']);
  6.  
  7. if (! empty($GLOBALS['login_without_password_is_forbidden'])) {
  8. $conn_error = __('Login without a password is forbidden by configuration (see AllowNoPassword)');
  9. $info_auth_error = 'ERROR AUTH phpMyAdmin (password empty)';
  10. } elseif (! empty($GLOBALS['allowDeny_forbidden'])) {
  11. $conn_error = __('Access denied');
  12. $info_auth_error = 'ERROR AUTH phpMyAdmin (access denied)';
  13. } elseif (! empty($GLOBALS['no_activity'])) {
  14. $conn_error = sprintf(__('No activity within %s seconds; please log in again'), $GLOBALS['cfg']['LoginCookieValidity']);
  15. $info_auth_error = NULL;
  16. // Remember where we got timeout to return on same place
  17. if (PMA_getenv('SCRIPT_NAME')) {
  18. $GLOBALS['target'] = basename(PMA_getenv('SCRIPT_NAME'));
  19. // avoid "missing parameter: field" on re-entry
  20. if ('tbl_alter.php' == $GLOBALS['target']) {
  21. $GLOBALS['target'] = 'tbl_structure.php';
  22. }
  23. }
  24. } elseif (PMA_DBI_getError()) {
  25. $conn_error = '#' . $GLOBALS['errno'] . ' ' . __('Cannot log in to the MySQL server');
  26. $info_auth_error = 'ERROR AUTH phpMyAdmin (cannot log in to the MySQL server)';
  27. } else {
  28. $conn_error = __('Cannot log in to the MySQL server');
  29. $info_auth_error = 'ERROR AUTH phpMyAdmin (cannot log in to the MySQL server)';
  30. }
  31.  
  32. // needed for PHP-CGI (not need for FastCGI or mod-php)
  33. header('Cache-Control: no-store, no-cache, must-revalidate');
  34. header('Pragma: no-cache');
  35.  
  36. if(!empty($info_auth_error)){
  37.  
  38. openlog("phpMyAdmin", LOG_PID | LOG_PERROR, LOG_LOCAL0);
  39. syslog(LOG_WARNING, $_SERVER['REMOTE_ADDR']." - ".$info_auth_error);
  40.  
  41. }
  42.  
  43. PMA_auth();
  44. }

Теперь сохраняем изменённый файл на сервер и пробуем авторизоваться в phpMyAdmin, указав некорректное имя пользователя или пароль. Далее если вы все сделали правильно, в системном логе, которые находится (для Debian и CentOS) по адресу - /var/log/messages мы получим запись, примерно такого вида (где xxx.xxx.xxx.xxx ваш IP адрес):
  1. Apr 26 19:37:21 root phpMyAdmin[21516]: xxx.xxx.xxx.xxx - ERROR AUTH phpMyAdmin

Теперь в данном логе, у нас будут фиксироваться, все неудачные попытки авторизации в phpMyAdmin. Можно приступать к настройке Fail2Ban, создав фильтр и правило блокировки. Заходим в директорию - /etc/fail2ban/filter.d/ и создаем там файл - phpmyadmin.conf
Открываем созданный нами файл для редактирования и вносим в него следующее правило:
  1. [Definition]
  2. failregex = <HOST> - ERROR AUTH phpMyAdmin
  3. ignoreregex =


Настраиваем файл конфигурации

Открываем файл конфигурации Fail2Ban - /etc/fail2ban/jail.conf и вносим в него правило блокировки, для защиты phpMyAdmin. Указываем число неудачных попыток авторизации maxretry - 10, время блокировки злоумышленника - 3 часа (10800 секунд),findtime- количество неудачный попыток за 600 секунд (уменьшаем до 100). Время блокировки и количество неудачных авторизаций, стоит подбирать самостоятельно, это строго индивидуально
  1. [phpmyadmin]
  2. enabled = true
  3. filter = phpmyadmin
  4. action = iptables-multiport[name=phpMyAdmin, port="80,443", protocol=tcp]
  5. logpath = /var/log/messages
  6. findtime = 600
  7. maxretry = 10
  8. bantime = 10800

Проверяем корректность настройки
  1. fail2ban-regex /var/log/messages /etc/fail2ban/filter.d/phpmyadmin.conf

Перезапускаем Fail2Ban
  1. service fail2ban restart

В результате этих нехитрых манипуляций, все попытки подбора паролей к phpMyAdmin будут заканчиваться баном злоумышленника, а администратор сервера, сможет спокойно спать по ночам. А ещё лучше - ставьте сложный пароль и спите ещё крепче.
Автор: * -=(C)DRU987=- (Dev) / 29.02.2016 в 19:02
Просмотров: 1089
ТОП блогов | поиск | все блоги
Онлайн: 0
Реклама