OXY NOTES

サーバのログを監視するSwatchの導入方法と使い方を解説

止めどなくサーバに押し寄せるハッカーによる攻撃

サーバを無防備な状態でインターネットに繋ぐと、30分でハッキングされる」というショッキングなデータが示す通り、健全なサーバ運用にはセキュリティ対策が必須です。

サーバへの攻撃はポートスキャン・脆弱性の把握・総当たり攻撃・Dos攻撃と多岐に渡ります。

攻撃を確実に防ぐにはログを分析して1つ1つ対策を取る必要があります。
そうなると、どうしても人力での対策には限界があります。

そんな悩めるサーバ管理者の強い味方Swatchについて解説します。Swatchを使えばサーバのログを監視し、予め登録しておいた対策を実行することができます。

1つ1つの設定は単純ですが、複数の要素を組み合わせて動作させるため解説が長くなるので、2回に分けて解説します。
今回は基本編ということで、Swatchのインストールから、基本的な使い方までを解説します。


目次

swatchと今回のスクリプトに必要なパッケージのインストール
Swatchの書式
Swatchの基本的な使い方
メールを送信やthresholdを利用した例


swatchと今回のスクリプトに必要なパッケージのインストール

今回実行する環境はCentOS 6.5を想定しています。CentOS 6.5では公式でSwatchは提供されていないのでepelリポジトリを利用してインストールします。
1つずつインストールしてもいいのですが、yumを利用すれば必要なPerlのライブラリも同時にインストールしてくれるので手間なしです。

外部リポジトリの追加方法は過去の投稿を参照してください。

# yum install swatch --enablerepo=epel
(省略)
Dependencies Resolved

====================================================================================
 Package             Arch            Version            Repository             Size
====================================================================================
Installing:
 swatch             noarch           3.2.3-7.el6        epel                   49 k
Installing for dependencies:
 perl-Bit-Vector    x86_64           7.1-2.el6          base                   169 k
 perl-Carp-Clan     noarch           6.03-2.el6         base                   25 k
 perl-Date-Calc     noarch           6.3-2.el6          base                   210 k
 perl-Date-Manip    noarch           6.24-1.el6         base                   1.4 M
 perl-Time-HiRes    x86_64           4:1.9721-136.el6   base                   48 k
 perl-TimeDate      noarch           1:1.16-11.1.el6    base                   34 k
 perl-YAML-Syck     x86_64           1.07-4.el6         base                   75 k

Transaction Summary
=====================================================================================
Install       8 Package(s)
(省略)

Swatchの書式

設定ファイルの書式

Swatchの設定ファイルは以下の書式で記述します。

設定ファイルの書式

watchfor   /パターン/
	アクション1
	アクション2
	……

パターンにマッチした文字に対して、特定のアクションをする」という設定になる。アクションの行頭にはTabを入れるのを忘れないようにしてください。

パターンについて

パターンにはPerlの正規表現で文字列を指定します。
よく使うのは以下の様な指定方法。

パターン 説明
/hoge/ hogeにマッチ
/hoge/i hogeの大文字、小文字どちらでもマッチ(hoge、HOGEなど)
/hoge|huga/ hogeもしくは、hugaにマッチ
/ho[gn]e/ hogeもしくは、honeにマッチ
/hoge/,/huga/ hogeもしくは、hugaにマッチ(2つのパターンに分ける例)
/h..e/ hで始まり、間に任意の1文字が2つ入り、eで終わる場合にマッチ(hogeなど)
/ho.*e/ hoで始まり、間に任意の1文字が0回以上の繰り返し、eで終わる場合にマッチ(hoooogeなど)

アクションについて

上記パターンに一致した場合に実行されるのがアクションです。

アクション 説明
echo [modes] ターミナルにメッセージを表示。modesにより表示形式を変更可能
bell [N] beep音をN回鳴らす。数字を指定しなければ1回
exec command 指定したコマンドを実行する。スペース区切りでコマンドに引数を渡すことができる。コマンド内で「$0」を指定すると、表示されるログそのものを意味する。「$N」は、N番目のフィールドの文字列を意味する
mail [=address:address:…][,subject=your_text_here] 指定されたアドレスにメールを送信する。メールは複数指定できるほか、サブジェクトの指定が可能。アドレスを指定しなければswatchを起動したユーザーに送信される
pipe command[,keep_open] パイプでコマンドに結果を渡す。keep_openを指定すると異なるパイプが実行されるか、swatchが終了するまでパイプが実行されたままになる
write [user:user:…] swatchを実行しているサーバにログインしているユーザーに、writeコマンドを使用して結果を送信する
throttle hours:minutes:seconds,[use=message|regex] (後述するthreshold推奨)一度検出されたパターンが再度検出された場合、検出を抑えることができる。標準では「use=messges」が指定されており、同じmessagesは検出されない。「use=regex」を指定すると、同じ正規表現の場合は検出されない
continue 通常は、マッチするパターンが検出されると指定されたアクションが実行されて終了するが、continueが指定されている場合はさらにマッチするパターンの検出が行われる
quit マッチするパターンを検出するとswatchが終了する
threshold track_by=”/hoge/”,type=limit,count=1,seconds=15といった具合に指定する。track_byはマッチしする正規表現。typeはlimit,threshold,both。limitはcountの回数だけログを処理する。これは最初のマッチからsecondsの間だけだけ有効。secondsだけ時間が過ぎたら再びリセットされる。

thresholdはcountの回数だけマッチしたら1回ログを処理する。再びcountの数だけログがマッチすれば、もう一度ログを処理する。(例えばcount=3と指定すると、3回マッチして初めて一度だけ処理される。)

bothはcountの回数だけマッチしたらログを1回だけ処理する。thretholdと違い、有効時間内はcountの数だけマッチしてもログは処理されない。

thresholdについてはswatch threshold設定のtypeパラメータに詳しい。

echoのmodesについて

以下のような指定をすることができます。

modes 説明
normal 通常の表示
bold 太字で表示
underscore 下線で表示
blink 点滅で表示
inverse 反転して表示
[color] black、red、green、yellow、blue、magenta、cyan、whiteの色で表示
[color_h] black_、red_h、green_h、yellow_h、blue_h、magenta_h、cyan_h、white_hの色で反転
random 上記のものをランダムに使用

Swatchの基本的な使い方

今回テストするのは以下の条件。

Swatch専用のユーザーを作成する方法もありますが、ログファイルの管理が面倒になるのでroot権限で実行することにします。

まずはrootユーザーのホームディレクトリに「swatchrc.secure」という名前の設定ファイルを作成します。

# vi ~/.swatchrc.secure

ログイン成功時にログの一部に「pam_unix(sshd:session): session opened」と出力されるのでこれをパターンに登録します。

watchfor /pam_unix¥(sshd:session¥): session opened/
        echo
Perlでの正規表現は「\ * + . ? { } ( ) [ ] ^ $ - | /」がメタ文字となるため、¥を付けてエスケープ処理する必要があります。

それでは起動します。

# swatch -c ~/.swatchrc.secure -t /var/log/secure &

オプションはそれぞれ「-c」で設定ファイルを指定。「-t」で監視するログを指定。「&」を付けることでバックグラウンドで実行となります。
起動ができたら別の端末でログインしてみてください。
すると以下のようなログがコンソールに表示されるはずです。

Aug 10 15:15:15 example.com sshd[17599]: pam_unix(sshd:session): session opened for user hoge by (uid=0)

起動しているswatchを調べてプロセスを停止する方法

Swatchはそれぞれ独立してログを監視しているので、複数のログを監視するには複数起動する必要があります。
そのためstartやrestartといった起動スクリプトは用意されておらずプロセスを指定して停止する必要があります。

以下のコマンドでプロセス番号を調べて、killコマンドでプロセスを終了してください。

# ps ax | grep swatch
# kill -TERM プロセス番号

メールを送信や、thresholdを利用した例

今回も同じログを監視します。条件は以下のとおりです。

# vi ~/.swatchrc.secure

watchfor /pam_unix¥(sshd:session¥): session opened/
	echo
	mail=hoge@example.com,subject="SSH rogin"
	threshold track_by="/session opened/",type=threshold,count=3,seconds=30

そして前回と同じように実行。

# swatch -c ~/.swatchrc.secure -t /var/log/secure &

再び別の端末で1回だけログインしてみてください。thresholdで3を指定しているので何も起きないと思います。

続けて30秒位内に3回ログインしてみてください。
すると指定したメールアドレスにログが記載されたメールが届くはずです。

もし「line 3: mail: command not found」のように表示される場合はmailコマンドをインストールしてください。

# yum install mailx

以上でswatchの基本的な使い方は終了です。

次の投稿では応用編として攻撃の危険性を分類したり、外部プログラムを利用してファイアーウォールでブロックする方法を解説します。
Swatchでサーバのログを監視して攻撃の対策を自動で実行する方法