止めどなくサーバに押し寄せるハッカーによる攻撃
「サーバを無防備な状態でインターネットに繋ぐと、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の基本的な使い方
今回テストするのは以下の条件。
- 1.ログファイル「/var/log/secure」を監視。
- 2.特定のユーザーがログインに成功したらコンソールにログを出力する。
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を利用した例
今回も同じログを監視します。条件は以下のとおりです。
- 1.パターンに一致したらコンソールに書き出す。
- 2.タイトルを付けてメールを送信する。
- 3.以上のアクションをパターンに3回カウントした場合に実行する。
また30秒経つとカウントはリセットされ、再び30秒位内に3回カウントした時だけ実行される。(つまり30秒間に2回までならルールは実行されない。もしくは30秒間に5回なら1度だけ、6回なら2度ルールが実行される。)
# 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でサーバのログを監視して攻撃の対策を自動で実行する方法」