Назад | Перейти на главную страницу

Регистрировать попытки входа в MySQL

Время от времени на нашем производственном сервере MySQL происходят неудачные попытки входа в систему (панель управления MySQL предупреждает нас). Есть ли способ регистрировать каждый успешный и неудачный вход на сервер MySQL без включения general_log?

Мы думаем general_log не вариант, потому что это производственный сервер с высокой нагрузкой.

просто для информирования любопытных: покопайтесь в журнале ошибок и готово!

(1). отредактируйте my.cnf (найдена документация по настройкам Вот)

[mysqld]

: # Введите имя для файла журнала ошибок. В противном случае будет использоваться имя по умолчанию.

log_error = / var / log / mysql / ошибка

: # по умолчанию 1. Если значение> 1, прерванные соединения и ошибки отказа в доступе для новых попыток соединения записываются в журнал ошибок.

log_warnings = 2

...

(2). при запуске команды

$ sudo cat /var/log/mysql/error.err | egrep '[aA] доступ запрещен'

(3). и оно у вас есть!

(4). если вам нужно ограничить пользователя (атака dos или попытка восстановления пароля пользователя mysql в многопользовательской базе данных), то (http://dev.mysql.com/doc/refman/5.5/en/user-resources.html)

mysql> РАЗРЕШИТЬ ИСПОЛЬЗОВАНИЕ НА *. * TO 'атакующий' @ 'localhost' С MAX_CONNECTIONS_PER_HOUR 100;

ограничить 100 попыток восстановления пароля в час.

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

SET GLOBAL general_log = 'on'

для более новых версий MySQL.

Привет, я не думаю, что это возможно.

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

Однако, предполагая, что ваш сервер mysql работает на отдельном компьютере, от вашего сервера приложений, и вам нужен открытый порт 3306 (или любой другой), и вы не можете использовать туннель ssh, ваш сервер mysql по-прежнему не должен быть доступен никому. волей-неволей. Я настоятельно рекомендую не открывать его для веб-трафика, и, если вам необходимо (например, в случае проживания где-то не за вашим брандмауэром), привязать его к IP-адресу или блоку IP вашего сервера приложений и вашему IP-адресу доступа администратора (где вы находитесь доступ из)

Надеюсь, это поможет.

Можно войти connect и quit команда с помощью mysql-audit-plugin.

  1. Найдите подходящую версию из Выпуск mysql-audit-plugin, Я использовал mysql 5.7, поэтому я использовал audit-plugin-percona-5.7-1.1.7-805-linux-x86_64.zip.
  2. переместить загруженный so файл в место, указанное mysqladmin variables | grep plugin_dir.
  3. mysql>install plugin audit soname 'libaudit_plugin.so'
  4. включение функции журнала, mysql>set global audit_json_file=ON, по умолчанию регистрируются все успешные операции. установив set global audit_record_cmds='quit,connect' он регистрирует только подключение и завершение, я полагаю, согласно конфигурация mysql-audit-plugin.

Вот как это выглядит в файле для входа и выхода:

{"msg-type":"activity","date":"1543740612328","thread-id":"1015112","query-id":"3045222","user":"root","priv_user":"skip-grants user","ip":"172.28.15.10","host":"172.28.15.10","connect_attrs":{"_os":"Linux","_client_name":"libmysql","_pid":"11575","_client_version":"5.6.40","_platform":"x86_64","program_name":"mysql"},"cmd":"Quit","query":"Quit"} 

{"msg-type":"activity","date":"1543740724627","thread-id":"1015113","query-id":"0","user":"root","priv_user":"skip-grants user","ip":"172.28.15.10","host":"172.28.15.10","connect_attrs":{"_os":"Linux","_client_name":"libmysql","_pid":"11863","_client_version":"5.6.40","_platform":"x86_64","program_name":"mysql"},"cmd":"Connect","query":"Connect"}
{"msg-type":"activity","date":"1543740724629","thread-id":"1015113","query-id":"3045223","user":"root","priv_user":"skip-grants user","ip":"172.28.15.10","host":"172.28.15.10","connect_attrs":{"_os":"Linux","_client_name":"libmysql","_pid":"11863","_client_version":"5.6.40","_platform":"x86_64","program_name":"mysql"},"rows":"1","status":"0","cmd":"select","query":"select @@version_comment limit 1"}

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

если сервер каким-то образом открыт для внешних подключений на 3306, если это не является преднамеренным и необходимым, я бы установил конфигурацию, как сказал Ник, а также посмотрел на использование iptables для ограничения трафика до 3306 только с серверов приложений.

В http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/ , автор показывает метод захвата пакетов с помощью tcpdump и фильтрации вывода на основе строки.

Это поможет вам избежать опасений относительно general_log и производительности, хотя tcpdump сам по себе может немного снизить производительность. Это решение также будет регистрировать меньше данных, чем общий журнал запросов.

Я сам этим не пользовался, но звучит очень полезно.