本記事では AWS Network Firewall にて実装が可能な Suricata互換のIPSルールの解説と簡易的なルールを記載する
#Suricataとは
Suricataとは、簡単にいうとオープンソースのセキュリティ監査エンジン。
Network Firewall では互換性のあるステートフルルールとしてSuricataが使用可能である。
以下、公式ドキュメント
#特徴
他のステートフルルールである 5tuple あるいは domain list との大きな違いは、定義したシグネチャー通りに動作を行うところ。要は以下に記載したルールによって、検査を行う動作内容を表現する事が出来る。
また、5tuple あるいは domain list で実装が出来ないシグネチャー単位で優先順位を付ける事が可能。
#ルール形式
基本的には公式ドキュメントに記載がある形式を使用する。
ルール形式は以下の3構成で定義される。
項目 | 動作内容 |
---|---|
アクション | 検査後にどのような対応を行うか |
ヘッダ | プロトコル、IPアドレス、ポート、ルールの方向を指定 |
オプション | ルールの詳細を定義 |
以下を例として色付けによる解説を行う。
drop http any any -> any any (msg:"HTTP traffic detected"; sid:200000; rev:1;)
- アクション
アクションでは以下 3つが定義可能
Pass : パケットの検査を終了し、目的の宛先への送信を許可。
drop : ファイアウォールにアラートログが設定されている場合は、メッセージを送信する。パケットのすべての検査を終了し、目的の宛先に送信されないようにブロックする。
alert : ファイアウォールにアラートログが設定されている場合は、メッセージを送信する。パケットが目的の宛先に送信されることを許可。
Network Firewall では reject アクションはサポートされない。
- ヘッダ
ヘッダは以下大きく分けて 4つの構成から定義されている
protocol : 検査するプロトコルを定義。指定可能なプロトコル一覧は以下となる。
tcp / udp / icmp / ip (allまたは any) / http / ftp / tls (sslを含む) /smb / dns / dcerpc / ssh /smtp /imap / ikev2 / krb5 / ntp /dhcp
src and dest: 通信の送信元と、送信先のIP を指定。以下のように特定の演算子や変数の指定も可能。任意の送信先とする場合は any ->
, -> any
にて表現する。
演算子 | 内容 |
---|---|
../.. | CIDR |
! | 否定/例外 |
[.., ..] | グループ化 |
$HOME_NET / $EXTERNAL_NET
|
自分のネットワークの範囲 / 自分以外のネットワークの範囲 |
port :送信元と送信先のポートを指定する。
以下のように演算子を用いた指定も可能。任意ポートは any ->
, -> any
にて表現する。
演算子 | 内容 |
---|---|
: | ポート範囲 |
! | 否定/例外 |
[.., ..] | グループ化 |
direction :通信の方向を指定する。
direction の記述については、以下の通り2パターン
演算子 | 内容 |
---|---|
-> | source から destionation への通信 |
<> | 双方向の通信 |
このようにヘッダは記述を行う。先述したルールを上記に倣って解釈すると、全ての送信元から http プロトコルにて全ての送信先へ通信をする場合、 drop する。となる。
drop http any any -> any any (msg:"HTTP traffic detected"; sid:200000; rev:1;)
- オプション
ルールの残りの部分はオプションで構成される。
これらは括弧 ( )
で囲まれ、;
セミコロンで区切られる。
オプションはキーワードによって構成され、sid キーワード以外は任意のメタキーワードとなる。
一部の msg オプションには設定があり、キーワード、コロン、設定の順に指定される。その他には設定がなく、キーワードとなる。
sid : オプションで唯一必須の項目となる。任意のID を定義し、他のシグネチャーと重複しないようにする。
rev : シグネチャーのバージョンを表記する。変更があった際に更新をかけるキーワード
msg : アラートに関するテキスト情報を提供する。
オプションはキーワードの数が多く、適切なキーワードを使用してシグネチャーを作成する。先述したルールを上記に倣って解釈すると、全ての送信元から http プロトコルにて全ての送信先へ通信をする場合、通信は drop され、"HTTP traffic detected" といったテキスト情報をアラートログへ記述するようになる。
drop http any any -> any any (msg:"HTTP traffic detected"; sid:200000; rev:1;)