MySQLプロダクションサーバーでログインの試行が失敗する場合があります(MySQLダッシュボードで警告されます)。 general_log
を有効にせずに、MySQLサーバーへのすべての成功と失敗したログインをログに記録する方法はありますか?
general_log
は、高負荷の本番サーバーであるため、オプションではないと考えています。
好奇心が強い人に知らせるためだけに:エラーログを調べて、プレストしてください!
(1)。 my.cnfを編集します(設定ドキュメントが見つかりました ここ )
[mysqld]
:#エラーログファイルの名前を入力します。それ以外の場合は、デフォルトの名前が使用されます。
log_error =/var/log/mysql/error
:#デフォルトは1です。値が1より大きい場合、接続が中止され、新しい接続試行のアクセス拒否エラーがエラーログに書き込まれます。
log_warnings = 2
...
(2)。コマンド実行時
$ Sudo cat /var/log/mysql/error.err | egrep '[aA] ccess denied'
(3)。そしてあなたはそれを持っています!
(4)。ユーザーを制限する必要がある場合(マルチユーザーデータベースで攻撃またはmysqlユーザーパスワードを回復する試み)、( http://dev.mysql.com/doc/refman/5.5/en/user-resources .html )
mysql> GRANT USAGE ON *。 * MAX_CONNECTIONS_PER_HOUR 100で 'attacker' @ 'localhost'にするには、
1時間あたり100回のパスワード回復試行のみに制限する。
一般的なログは、他の多くのものの間ですべてのログイン試行(成功と失敗)をログに記録する可能性があると思います。主な問題は、一般的なログがデータベースのパフォーマンスに影響することです。あなたはクエリで一般的なログをオンにすることができます
SET GLOBAL general_log = 'on'
mySQLの新しいバージョン。
こんにちは、それは可能ではないと思います。
Mysql 5.1.29以降-ストレージオプション(テーブルまたはファイル)と場所、および必要なログ(エラー、一般、バイナリ、またはスロークエリ)を指定できます。私の知る限り、ログの形式や何をログに記録するかを指定することはできません。私は間違っているかもしれませんが、すべてのログイン試行は、エラーではなく、一般的なログに記録されると思います。
ただし、mysqlサーバーがアプリケーションサーバーとは別のマシンで実行されていて、ポート3306(またはその他)を開く必要があり、sshトンネルを使用できない場合、mysqlサーバーには誰でもアクセスできません。ナリー。これをWebトラフィックに公開しないことを強くお勧めします。また、(ファイアウォールの背後にない場所に存在する場合など)必要がある場合は、アプリケーションサーバーのIPアドレスまたはIPブロックと管理アクセスIPにバインドします(からのアクセス)
お役に立てば幸いです。
Mysql-audit-pluginを使用して、connect
およびquit
コマンドをログに記録できます。
audit-plugin-percona-5.7-1.1.7-805-linux-x86_64.Zip
を使用しました。so
ファイルをmysqladmin variables | grep plugin_dir
で指定された場所に再配置します。mysql>install plugin audit soname 'libaudit_plugin.so'
mysql>set global audit_json_file=ON
をオンにすると、デフォルトで、成功したすべての操作がログに記録されます。 mysql-audit-plugin configuration によると、set global audit_record_cmds='quit,connect'
を設定することで、接続のみをログに記録し、おそらく終了します。これは、ログインとログアウトのためにファイルでどのように見えるかです:
{"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自体が若干のパフォーマンスの低下を招く可能性があります。このソリューションでは、一般クエリログよりも少ないデータが記録されます。
私自身はこれを使用していませんが、とても便利に聞こえます。