1.1K Views
February 15, 16
スライド概要
MySQL 監査システムについて
2023年10月からSpeaker Deckに移行しました。最新情報はこちらをご覧ください。 https://speakerdeck.com/lycorptech_jp
MySQL 監査システムを作った話 ヤフー株式会社 井上和博 2016/2/15
自己紹介 • いのうえ かずひろ • @i_swing_by • 好きな言語 • C++ • 趣味 • 競技プログラミング、AI作成など • 最近はISUCONやCTFなどにも参加
アジェンダ • 監査とは • 監査システムの機能 • 監査システムの構成 • Audit Plugin • 監査システムのシステム性能 • 改善と問題点
監査とは
監査とは • DBへのアクセス情報を出力 • クエリ、ip、ユーザ、etcを出力 • アクセス情報の解析 • アクセスルートやコマンドの登録 ログの出力 • 登録以外はインシデントとして登録 query:select * from test; Ip:hoge user:hoge コマンドの実行 select * from test;
なぜ監査が必要なのか • 不正アクセスの検知 • 不正アクセスがあった時にすぐに対応出来る • どうのような操作を行われたか調べられる • DB管理者を守る • 監査システムは別のチームが管理 • 問題発生時にDB管理者が疑われるのを防ぐ
問題無いアクセスの決め方 • ホワイトリストを事前に登録 • ホワイトリストの仕組み • 登録者は事前に登録した利用者のみ • 登録者の上長の確認後に登録される
監査システムの機能
監査システムの機能 • ログインやクエリを監視 • ポリシーの設定 • ポリシーとログのつきあわせ • インシデントの登録 • インシデントの回答
ポリシー設定 • ホワイトリスト方式で設定を行う • 下記の項目の範囲で設定可能 設定項目 入力例 インスタンス instance スキーマ database アクセス元IP 127.0.0.1 データベースアカウント kainoue コマンド SELECT 有効期間 2015-08-21 16:50 ~ 2015-08-28 16:50
ポリシーとログのつきあわせ • バッチの種類 • 定期的にホワイトリストの作成 • JSON形式に直してファイルに出力 • ポリシーとログのつきあわせ • Memcacheの使用 • ポリシーを保存し処理速度向上 • ログイン連続失敗回数のカウント
インシデントの回答 • インシデント内容から原因を回答
ポリシーの登録漏れ防止 • ポリシーの登録を忘れてしまった • インシデントがたくさん上がってしまう テストモード機能
システム構成
システム構成 セキュリティ担当者が管理 DB利用者が管理 DB管理者が管理 監査サーバ https WEBサーバ APサーバ https DB利用者 https インシデント情報参照、 登録などを行う fluentd Fluentdを使用し、監 査ログの読込・解析 mysql インシデント情報をDBか ら取得 接続情報やインシデント 情報を登録する mysql 監視対象DB McAfee Audit Pluginを 使用し監査ログの出力 DBへのアクセスサーバ 管理DB
Audit Pluginの出力について
Audit Plugin McAfee Audit Plugin 特徴 • ログはJSON形式で出力される • MySQL 5.1 以降に対応している • 関数をフックして監査ログを取得する
Audit Logの出力例 { msg-type: "activity", date: "1421981385199", thread-id: "7", query-id: "57", user: "root", priv_user: "root", host: "localhost", ip: "", cmd: "select", objects: [ { db: "hogehoge", name: "a", obj_type: "TABLE" } ], query: "select * from a" }
監視コマンド • コマンドの種類多い • show status like ‘Com_%’の%の部分 • 全部で100種類以上 • 利用者に登録してもらうのが大変
監視コマンド 解決策 コマンドを まとめる コマンドの分類 頻繁に使われるコマンド 一時的に使われるコマンド
頻繁に使われるコマンド • 個別に登録 • 複数まとめると監査が甘くなる コマンド select insert update replace insert_select truncate delete lock_tables load replace_select
一時的に使われるコマンド コマンドグループ コマンド ALTER alter_db,alter_db_upgrade,alter_event,alter_function,alter_procedure,alter_server, alter_table,alter_tablespace,alter_user,rename_table,repair,rename_user グループピングの例 11種類のグループを作成 拡大 コマンドの選択画面 全部で21種類
Audit Pluginのパラメータについて
パラメータの注意点 • ログの取得方法 • MySQLの特定の関数をフックする • audit_offsetの値を元にフックする関数を探す • audit_offset • MySQLのバージョン毎に固定の値 • MySQLのバイナリから値を取得
audit_offsetの取得手順
1.スクリプトの取得
https://raw.githubusercontent.com/mcafee/mysql-audit/v1.0.3/offset-extract/offset-extract.sh
2.strip されてないMySQLのバイナリを用意
3.スクリプトの実行
実行例
$ ~/mcafee/mcafee/offset-extract.sh mysqld
//offsets for: mysqld (5.6.24-72.2)
{
"5.6.2472.2","99159a927a3e3ba0265713c0baf8d484", 7680, 772
8, 4384, 5024, 88, 2720, 96, 0, 32, 104
},
MySQLのパフォーマンス • MySQL5.5 • sysbench を利用 • ReadOnlyで計測 • スレッド数:10, 20, 30, 40
改善点と課題
リリース後の改善点 • ポリシーの申請漏れ • インシデントがたくさん上がってしまう インシデントをセッション単位に変更 改善前 改善後 コマンド コマンド stop/start slave show slave status インシデント stop/start slave show slave status インシデント stop slave start slave show slave status stop slave start slave show slave status
課題 •McAfee Audit Pluginが起因で落ちてしまう 監視のプラグインをPerconaのに差し替える •アクセスが激しいと監査が追いつかない 検討中 •ポリシー更新時にfluentdを再起動させない ポリシー情報をDBに見に行くようにする
ご清聴ありがとうございました。