[MySQ] McAfeeのおかげでMySQLで監査ログが取れるようになった

10月 28th, 2012

McAfee MySQL Audit Plugin

McAfee が MySQLの監査ログ取得プラグインをオープンソースでリリースしています。
これがシンプルで便利だったので紹介したいと思います。

米McAfee、MySQL向けの監査ツールを無償公開
http://sourceforge.jp/magazine/12/03/27/1333243

特徴

  • 監査対象としたいテーブルやスキーマを指定できる
  • ログがJSON形式で取り扱い安い
  • ログファイル出力に加えて、UNIXドメインソケットに対して出力可能
  • MySQL5.1, 5.5対応。Audit Plugin Interface 機能のないMySQL5.1 でも利用できる

MySQLではMySQL5.5で追加されたAudit Plugin Interfaceを利用すれば自由に監査プラグインを実装できるのですが、MySQLの内部構造(どの変数にどのような情報が入ってるか?など)の理解やスレッドセーフな実装を要求するもので、比較的ハードルの高いものでした。

監査ログを取得する目的

監査ログは「いつ、だれが、どのように」データにアクセスしたかを記録するものです。
不正アクセス時の被害状況を確認や、DB管理者が適切な運用を行っているかチェックするのに利用されます。

重要なデータをデータベースで扱う上では欠かせない機能です。Oracle DatabaseやMS SQL Serverといった商用製品には監査ログ機能があり、MySQLに欠けている機能のうちの1つでした。

McAfee Audit Plugin では以下のような形式のログを取得することが出来ます。
1クエリで1行出力されます。

{"msg-type":"activity",
"date":"1351346322387",
"thread-id":"5",
"query-id":"19",
"user":"root",
"priv_user":"root",
"host":"localhost",
"cmd":"select",
"objects":[{"db":"test","name":"mytable","obj_type":"TABLE"}],
"query":"select * from test.mytable"}

msg_type 「activity」固定
date コマンドが実行された日時のUNIXTIME。単位はミリ秒。
thread-id スレッドID。コネクション毎のユニークなID。
query-id クエリID。クエリ毎のユニークなID。
user ユーザ名。
priv_user ユーザ名。LDAP認証を使っている場合はuserと異なるユーザ名になるケースがある。
基本はpriv_userを見れば良い。
host アクセス元ホスト名。
ip アクセス元IP。
cmd 実行したコマンド。
objects 対処のオブジェクト。
query クエリー全体。

セットアップ方法

まずはバイナリをダウンロードしてきて、MySQLのプラグインディレクトリに放り込みます。

mysql> show variables like '%plugin_dir%';
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| plugin_dir    | /usr/lib/mysql/plugin |
+---------------+-----------------------+
1 row in set (0.00 sec)

$ wget https://github.com/downloads/mcafee/mysql-audit/audit-plugin-mysql-5.5-1.0.2-345-linux-x86_64.zip
$ unzip audit-plugin-mysql-5.5-1.0.2-345-linux-x86_64.zip 
$ sudo cp audit-plugin-mysql-5.5/lib/libaudit_plugin.so /usr/lib/mysql/plugin

my.cnf に設定を追加してMySQLを再起動します。
audit_record_cmds にログを取りたいコマンドを、audit_record_objs にはログを取りたいオブジェクト(テーブル、ビューetc)を指定します。

この例ではtestスキーマ以下のオブジェクト(テーブル、ビューetc)に対する、INSERT,SELECT,UPDATE,DELETE および、SETによる設定変更のログ取得するようにしています。

$ vi /etc/my.cnf
plugin-load=AUDIT=libaudit_plugin.so
audit_json_log_file=/var/log/mysqld-audit.json
audit_json_file=1
audit_record_cmds=insert,select,update,delete,set_option
audit_record_objs=test.*,{}

プラグインが読み込まれない場合

McAfee Audit Plugin は MySQLの特定の関数をフックする仕組みになっています。Oracle が配布しているバイナリ以外の、OS付属のMySQL、自分でビルドしたMySQL、MariaDBやPercona Serverなどの派生製品ではそのままでは動作しません。対応方法が以下に記載されています。

独自バイナリのaudit_offsetsを求める手順
https://github.com/mcafee/mysql-audit/issues/2

オフィシャルのmysqldを使っているにもかかわらず、以下のようなエラーが出てプラグインが読み込まれない場合があります。

121027 23:07:59 [Note] Audit Plugin: Couldn't find proper THD offsets for: 5.1.51
121027 23:07:59 [ERROR] Plugin 'AUDIT' init function returned error.
121027 23:07:59 [Note] Audit Plugin: deinit

その場合は、ソースコード から、利用しているバージョンに対応するoffsetを見つけて、設定してみてください。特に、バージョン番号に「5.1.42-community-log」のように「-log」が含まれている場合、自動判定がうまくされず、手動設定の必要があるようです。

//offsets for: mysqlrpm/5.1.37/usr/sbin/mysqld (5.1.37-community)
{"5.1.37-community","508ffea25280c9454dcef065e5fd4af2", 6200, 6264, 3672, 3944, 88, 2048},

↓ 6つの数字をそのままmy.cnfに転記

$ vi /etc/my.cnf
audit_offsets=6200, 6264, 3672, 3944, 88, 2048

設定項目

項目名 説明
audit_json_file ログファイルに出力するかどうか。 1 or 0
audit_json_file_flush 1に設定したタイミングでログファイルを再作成する。ログをローテートするときに使う 1
audit_json_file_sync ログファイルを何秒ごとにディスクに同期(sync)するか?0を指定した場合は同期タイミングはOSに従う。 数字
audit_json_socket UNIXドメインソケットに対する出力を行うかどうか。 1 or 0
audit_json_socket_name ソケットファイルのパス。ソケットファイルは別途受け取り側のプログラムで生成しておく必要がある。 /path/to/mysql-audit.sock
audit_offsets 上記参照 audit_offsets=6200, 6264, 3672, 3944, 88, 2048
audit_record_cmds 記録対象のコマンド。カンマ区切り。未指定の場合は全部が対象。SHOW GLOBAL VARIABLESで出力される、Com_XXX と同じものを指定すれば良い。 insert,select
audit_record_objs 記録対象のオブジェクト(テーブル、スキーマetc)。カンマ区切り。未指定の場合は全部が対象。
ワイルドカード利用可。
SETやFLUSHなどオブジェクトを対象としないコマンドを記録する場合は「{}」を含める必要がある。
mysql.*,{}
audit_uninstall_plugin 監査ログプラグインをUNINSTALL PLUGINコマンドで無効にできなくするかどうか? 1 or 0
audit_validate_checksum mysqldのチェックサムを検査するかどうか。
オフィシャルのMySQLバイナリかどうかをチェックしている。
1 or 0
audit_checksum mysqldのチェックサム
audit_delay_cmds 意図的に処理を遅らせる(スリープさせる)対象にするコマンド。何のために利用するのかよくわからない。。 select,insert
audit_delay_ms 遅延させる時間 数字

あわせて読みたい

実践ハイパフォーマンスMySQL 第2版 MySQL徹底入門 第3版 ~5.5新機能対応~ MySQL Cluster構築・運用バイブル ~仕組みからわかる基礎と実践のノウハウ

Mac OS X 再インストール時の手順 メモ

7月 22nd, 2012

リストア方法を忘れないようにメモっとく。
iPhoto のデータは中身の一部がコピーされないことがあったので注意。
「パッケージの内容を表示」でコピーされてないファイルをリネームするとコピーされた。

データのコピー

  1. ~/Music/iTunes
  2. ~/Library/Keychains

設定

  1. Finder → 環境設定でHDDをデスクトップに表示

Macbook Air 2012 11inch ベンチマーク CrystalDiskMark

7月 22nd, 2012

Macbook Air 2012 11inch が届いたのでBootcampでWindows 7 32bit Professional を入れて、ベンチマークをしてみた。

スペック

機種 Apple Macbook Air 2012 11inch
CPU Core i7
メモリ 8GB
ディスク 512 GB SSD

CPU-Z

CPU-Zの結果。Windows 7 が 32bit 版なので、メモリが2Gちょいしか認識されてない。
CPU_Z_macbook_air2012

CrystalDiskMark

CrystalDiskMarkの結果。512K Random の 読み込みと書き込みの差がありすぎる気がするけど、十分早い。さすがSSD。
MacBookAir2012 CrystalDiskMark

Windows 7 エクスペリエンス インデックス

Windows7_experience_index_macbook_air2012

[vim] 複数ファイルの同時編集

9月 25th, 2011
# vi ファイル1 ファイル2 … ファイルn

として、複数のファイルを開くことができる。

コマンド 機能
:n 次のファイル
:N 前のファイル
:rew 最初のファイル

で移動する。

また、「-o」オプションをつけることにより、ウィンドウを分割して表示させることができる。

# vi -o ファイル1 ファイル2 … ファイルn

複数ファイル間でのコピー&ペーストは「名前付きバッファ」を使う。

[MySQL] MySQL5.0 から MySQL5.5へのアップグレード方法

8月 14th, 2011

MySQL5.0からMySQL5.5へアップグレードするには、一旦、MySQL5.1にアップグレードする必要があります。
CentOS 5.4のLinux環境でアップグレードをしてみました。

環境

CentOS 5.4 (i386)

基本的な流れ

  1. MySQL 5.1 をインストール
  2. mysql_upgrade コマンドでアップグレード
  3. MySQL 5.5 をインストール
  4. mysql_upgrade コマンドでアップグレード

RPMのダウンロード

あらかじめ、RPMをMySQLのサイトからダウンロードしておきます。
今回はCentOSなのでRedhat用のものをダウンロードしました。

  • MySQL 5.1
    1. MySQL-client-community-5.1.58-1.rhel5.i386.rpm
    2. MySQL-server-community-5.1.58-1.rhel5.i386.rpm
    3. MySQL-shared-compat-5.1.58-1.rhel5.i386.rpm
  • MySQL 5.5
    1. MySQL-client-5.5.15-1.rhel5.i386.rpm
    2. MySQL-server-5.5.15-1.rhel5.i386.rpm
    3. MySQL-shared-5.5.15-1.rhel5.i386.rpm
    4. MySQL-shared-compat-5.5.15-1.rhel5.i386.rpm

バックアップ

作業前に念のためデータのバックアップを取得しておきます。
今回は、MySQLを止めて、データファイルを丸ごとコピーしておきました。

$ sudo /etc/init.d/mysqld stop
$ sudo cp -R /var/lib/mysql /var/lib/mysql.backup

5.0 から 5.1へのアップグレード

CentOS付属のRPMとMySQLから配布されているRPMではコンフリクトしてしまうので、一旦CentOS付属のRPMを削除します。
MySQL依存しているRPMもあわせて、削除する必要があります。

# mysqlに依存するパッケージを一旦削除
$ sudo rpm -e mysql mysql-server php-mysql perl-DBD-MySQL

# MySQL5.1をインストール
$ sudo rpm -ivh MySQL-client-community-5.1.58-1.rhel5.i386.rpm MySQL-server-community-5.1.58-1.rhel5.i386.rpm MySQL-shared-compat-5.1.58-1.rhel5.i386.rpm

# my.cnf がRPMを削除されたときに、リネームされてしまっているので、戻しておく
$ sudo mv /etc/my.cnf.rpmsave /etc/my.cnf

MySQLを起動し、mysql_upgradeでアップグレードします。
エラーが出ますが問題ありません。エラーの出た箇所を自動で修復して、5.1へアップグレードしてくれます。

$ sudo /etc/init.d/mysql start

$ sudo mysql_upgrade
Looking for ‘mysql’ as: mysql
Looking for ‘mysqlcheck’ as: mysqlcheck
Running ‘mysqlcheck with default connection arguments
Running ‘mysqlcheck with default connection arguments
group_coupon.area_coupons OK
group_coupon.coupon_sites OK
group_coupon.coupons
error : Table upgrade required. Please do “REPAIR TABLE `coupons`” or dump/reload to fix it!
majide.wp_comments
<省略>
OK

一旦削除した、RPMを再度インストールして、5.1へのアップグレードは完了です。

$ yum install php-mysql perl-DBD-MySQL

MySQL5.1からMySQL5.5へのアップグレード

5.0から5.1と同じように、MySQLをインストール後、mysql_upgradeを実行します。

$ /etc/init.d/mysql stop

$ rpm -Uvh MySQL-client-5.5.15-1.rhel5.i386.rpm MySQL-server-5.5.15-1.rhel5.i386.rpm MySQL-shared-5.5.15-1.rhel5.i386.rpm MySQL-shared-compat-5.5.15-1.rhel5.i386.rpm

$ /etc/init.d/mysql start

$ mysql_upgrade

USB給電の小型ルータでREGZAをWiFi対応にした

8月 13th, 2011

PLANEXのMZK-MF300Nを使ってテレビをネットに繋げてみた。
MZK-MF300Nはルータとしてもコンバータとしても使える製品で、WiFiを有線に変換することができる。
REGZAに限らずだいたいのテレビはWiFiに対応してないので、コンバーターをはさんで有線にする必要がある。

この製品のいいところは、USBで給電できるところ。
REGZAの外付けHDD用のUSBポートから給電すれば、見た目にスッキリと配線できる。
HDD用のUSBポートに録画用のHDD意外を繋げて給電されるか不安だったが、結果として問題なかった。

設置

テレビの裏側に両面テープで貼り付けておいた

アクトビラで動画を見てみたが、コマ落ちしたりせず、速度も問題なし。

[Amazon.co.jp限定] PLANEX 手のひらサイズ 300Mbps ハイパワー無線LANルータ/アクセスポイント/コンバータ FFP-PKR01 [フラストレーションフリーパッケージ(FFP)]
PLANEX 手のひらサイズ 300Mbps
ハイパワー無線LANルータ
¥2,480

PLANEX 無線LANルータ/アクセスポイント/コンバータ「MZK-MF300N」「FFP-PKR01」専用 USB給電ケーブル SSOP-USB02

PLANEX 「MZK-MF300N」「FFP-PKR01」専用
USB給電ケーブル
¥861

あわせて買いたい

TOSHIBA LED REGZA 22V型 地上・BS・110度CSデジタルハイビジョン液晶テレビ ブラック 22A2(K)

TOSHIBA LED REGZA 22V型

PHP OCI8 Oracle Instant Clientを使ったインストール

8月 6th, 2011

PHPでOracleに接続するには、OCI8モジュールを有効にする必要があります。
以下、Instant Clientを使った場合のPHPのビルド方法。

Instant Client のインストール

Oracleのページから、
「Instant Client Package – Basic」 および「Instant Client Package – SDK」をダウンロードしてあらかじめインストールしておきます。
/usr/lib/oracle/11.2/client/以下にライブラリとツール類が、/usr/include/oracle/11.2/client/ にヘッダ類がインストールされます。

PHPのコンパイルとインストール

–with-oci8、–with-pdo-oci を以下のように設定します。
–with-pdo-ociのほうは、Oracle Clientのバージョン(11.2)を指定する必要があります。

./configure --with-oci8=instantclient,/usr/lib/oracle/11.2/client/lib  --with-pdo-oci=instantclient,/usr,11.2 \

LD_LIBRARY_PATHにInstant Clientのパスを指定して、makeを実行します。

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/oracle/11.2/client/lib/
$ make
$ make install

Amazon RDS Oracle のライセンス価格とプラン

8月 4th, 2011

2011年5月から、Amazon Web Service の RDS(Relational Database Service)でMySQLに加えてOracleが
選択できるようになりました。

3つのエディションが利用できます。

RDSでは、Standard Editoin Oneのみですが、ライセンス込みのプランが用意されています。
Oracleライセンスは非常に高価ですので、ちょっと個人でOracleとMySQLを比較してみたいといった場合にピッタリですね。

1時間あたりの利用料金(2011/08現在、Asia Pasific Tokyoの価格)

ライセンス込み ライセンスは自分で別途購入
Edition Standard
Edition
One
Standard
Edition
Enterprise
Edition
Standard
Edition
One
Standard
Edition
Enterprise
Edition
Small $0.18 なし なし $0.13
Large $0.72 なし なし $0.52
Extra Large $0.99 なし なし $0.78
Double Extra Large $1.98 なし なし $1.56
Quadruple Extra Large $3.96 なし なし $3.11

2.8年以上動かすなら、ライセンスを自前購入したほうがお得

Standard Oneのライセンス費用は1ユーザーあたり19,600円です。
最小5ユーザからなので、98,000円が最低のライセンス費用になります。

たとえば、Smallインスタンスの場合、ライセンスあり・なしの価格差は $0.05(約4円、1$=80円換算)です。
198,000 / 4 / 24 = 1020日 で、3年弱、動かすなら、ライセンスを自分で購入したほうがお得です(5ユーザなら)。

ただし、Largeインスタンスになると、急に価格差が開き、半年強で元が取れるようになってしまいます。
このあたりに、Oracle社の商売のうまさを感じますね・・・。

インスタンスサイズ ライセンスあり・なしプラン価格差 元を取るまでの年数
Small $0.05 2.79年
Large $0.2 0.69年
Extra Large $0.21 0.66年
Double Extra Large $0.42 0.33年
Quadruple Extra Large $0.85 0.16年

Standard One Editionと Standard Editionの違い

機能的には同じようです(参考)。
One Editionだと、CPU数(ソケット)に制限があるようですが、Amazon RDSではそのへんは関係なさそうです。

無料のOracleもあるよ

RDSにはありませんが、Oracle Database 10g Express Editionは無料で利用できます。
その代わり、データが4GB/割り当てメモリが1GBまでの制限がつきます。
http://www.oracle.com/technetwork/database/express-edition/overview/index.html

オススメ書籍

Bronze Oracle Database 11g SQL基礎I編(試験番号:1Z0-051) (DVD付) (オラクルマスター教科書)

Bronze Oracle Database 11g SQL基礎I編
Amazon Web Services ガイドブック クラウドでWebサービスを作ろう!
Amazon Web Services ガイドブック
よくわかるAmazonEC2/S3入門 ―AmazonWebServicesクラウド活用と実践 (Software Design plusシリーズ)

よくわかるAmazonEC2/S3入門

WordPress高速化 .htaccess

5月 15th, 2011

当ブログでは、HTMLを圧縮して配信することで、高速化している。

mod_gzipで圧縮しているのだが、レンタルサーバを変更したら、mod_gzipがインストールされていなかった。
mod_deflateは入っていたので、mod_gzipの代わりにmod_deflateを使うことにする。

新しい、.htaccessは以下。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

FileETag None

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
</IfModule>

参考文献

ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール
ハイパフォーマンスWebサイト
続・ハイパフォーマンスWebサイト ―ウェブ高速化のベストプラクティス

続・ハイパフォーマンスWebサイト
基本からしっかりわかる WordPress 3カスタマイズブック (Web Designing Books)

WordPress 3カスタマイズブック

Yahoo! BB光 VDSL スピードテスト結果

5月 15th, 2011

光にしたので、速度を改めて計測してみた。

無線ブロードバンドルータ経由で計測しているので、もしかしたらブロードバンドルータが
ボトルネックになっている可能性もある。

ブロードバンドスピードテスト 通信速度測定結果
http://www.bspeedtest.jp/ v3.0.1
測定時刻 2010/11/28 13:36:43
回線種類/線路長/OS:光ファイバ/-/Mac OS 10/神奈川県
サービス/ISP:Bフレッツ マンションVDSL方式/Yahoo!BB
サーバ1[N] 37.9Mbps
サーバ2[S] 51.2Mbps
下り受信速度: 51Mbps(51.2Mbps,6.40MByte/s)
上り送信速度: 63Mbps(63.1Mbps,7.89MByte/s)
診断コメント: Bフレッツ マンションVDSL方式の下り平均速度