Snortとは
Snortはオープンソースのネットワーク侵入検知および防御システム (IDS/IPS) で、ネットワークトラフィックを監視して、インターネットプロトコル (IP) ネットワーク上の潜在的に悪意のあるアクティビティを特定します。組織は、プロトコルベース、シグネチャベース、および異常ベースの検査方法を組み合わせたルールベースの言語を使用してSnortを実装して、ネットワークトラフィック内の悪意のあるパケットを検知し、潜在的な攻撃ベクトルをブロックできます。
この組み合わせが重要です。一般的に使用されるシグネチャベースの方法は、既知の脅威を特定するのには効果的ですが、未知の脅威に対してはあまり効果的ではありません。Snortは、振る舞いベースのアプローチも活用して、ネットワークアクティビティを事前定義された一連のSnortルールと比較することで、実際の脆弱性を検出します。これにより、シグネチャベースの手法だけではこれまで特定できなかった可能性のある高度な新たな脅威を検知できます。
Snortのユースケース
Snortは主に、新たな脅威からネットワークを保護するために、プラットフォームに依存しないIDS/IPSを探している組織によって使用されます。企業がSnortを利用する目的は次のとおりです。
- リアルタイムのネットワークトラフィック監視
- プロトコル分析
- コンテンツマッチング(プロトコル、ポートごとにルールを照合し、その後、コンテンツを含むものと含まないもの別にルールを照合する)
- オペレーティングシステム (OS) のフィンガープリント
- あらゆるOSとの互換性
しかし、Snortにはそれ以上の機能があります。
パケットスニッフィングとロギング
Snortは、ローカルネットワークインターフェース上のネットワークトラフィックをキャプチャするパケットスニファーとして機能します。また、キャプチャしたパケットをディスクに書き込み、ネットワークトラフィックをデバッグするパケットロガーとしてSnortを活用することもできます。あるいは、SnortのネットワークIDS/IPS機能を使用して、ネットワークトラフィックをリアルタイムで監視し、各パケットに疑わしいアクティビティや悪意のあると思われるペイロードがないか調べます。
アラートとルール
Snortは、設定されたルールに基づいて、ネットワークトラフィックで検出された異常なパケットに対してアラートを生成できます。これにより、ネットワークの脅威や、脆弱性が悪用される可能性のあるその他のリスクを特定できます。
Snortルール言語は非常に柔軟性が高いため、独自のSnortルールを作成して、通常のネットワークアクティビティと異常なアクティビティを区別できます。これにより、特定の振る舞いについてネットワークを監視し、組織のネットワークに対する潜在的な攻撃を防ぐようSnortに指示する新しい手順を追加できます。
攻撃の検知
Snortルール言語の柔軟性とすべてのOSとの互換性により、Snortは、攻撃の振る舞いに関連付けられたルールがある限り、ネットワークベースの攻撃を検知できます。以下に、Snortが組織の侵害の検出に役立つ侵害の種類をいくつか紹介します。
サービス拒否 (DoS)/分散型サービス拒否 (DDoS)
DoS/DDoS攻撃は、ネットワークに不正なサービス要求を大量に送って業務を妨害するものです。DoS攻撃は1つのシステムから行われますが、DDoS攻撃は複数の場所にある複数のシステムから行われる組織的な攻撃です。
バッファオーバーフロー
バッファオーバーフローは、攻撃者がより多くの着信トラフィックをネットワークアドレスに送り、ネットワークデータの量がシステム内の利用可能なすべての帯域幅を超える場合に発生します。
スプーフィング
ハッカーは、認可済みのユーザーまたはシステムになりすましてターゲットネットワークにアクセスし、情報を盗んだり、悪意あるアクティビティを行ったりすることがあります。これをスプーフィング攻撃といいます。
コモンゲートウェイインターフェース (CGI)
CGIは、Webとエンドユーザーの間に動的なWebページをレンダリングするためのインターフェースを提供しますが、ハッカーに悪用される可能性のあるセキュリティの脆弱性が含まれていることも知られています。WebベースのCGIスクリプトは、悪意のある入力をフィルタリングしないため、入力検証攻撃の犠牲になることがよくあります。
ステルスポートスキャン
ハッカーはステルスポートスキャン(ハーフオープンスキャンとも呼ばれる)を使用して、完全な接続を確立せずにネットワーク上のオープンポートを介して攻撃することがよくあります。この場合、トランスミッションコントロールプロトコル (TCP) の3ウェイハンドシェイクを介して単一のパケットを送信し、ターゲットネットワークでポートが検知されたらプロセスを終了します。これにより、ファイアウォールがバイパスされ、スキャンが通常のネットワークトラフィックであるかのように見えるようになります。
Snortの仕組み
Snortは、ネットワークアナライザーで広く使用されている、トラフィックをキャプチャするためのシステムに依存しないインターフェースであるパケットキャプチャライブラリ (libpcap) に基づいています。Snortはネットワークトラフィックを監視して、設定ファイルのユーザーによって定義されたSnortルールセットと比較します。ルールをネットワークトラフィック内のパケットに適用し、異常なアクティビティを検知した場合はアラートを発行します。
Snortの動作とそのルールについて、さらに詳しく説明します。
Snortのモード
Snortには、動作モードを決定する3つのフラグのいずれかを設定できます。
- スニファーモード(-vフラグ):SnortはTCP/IPパケットを読み取り、コンソールにパケット情報を出力します。
- パケットロガーモード(-lフラグ):Snortは、受信TCP/IPパケットをディスク上のロギングディレクトリに記録し、さらに分析します。
- ネットワーク侵入検知および防御システム (NIDS) モード(-cフラグ):Snortは、設定ファイルで指定されたルールタイプに基づいて、ネットワークトラフィックに対してアクションを実行するかどうかを決定します。
Snortのルールタイプ
Snortは、設定ファイルに表示される順序でルールを評価しません。代わりに、Snortがルール基準に一致するパケットを検出したときに実行するアクションを指定するルールタイプに基づいてルールをレビューします。
Snortの5つの基本的なルールタイプは次のとおりです。
- アラートルール:Snortは、疑わしいパケットが検知されたときにアラートを生成します。
- ブロックルール:Snortは、疑わしいパケットとネットワークフロー内の後続のすべてのパケットをブロックします。
- ドロップルール:Snortは、アラートが生成されるとすぐにパケットをドロップします。
- ロギングルール:Snortは、アラートが生成されるとすぐにパケットをログに記録します。
- 合格ルール:Snortは、疑わしいパケットを無視し、合格としてマークします。
Snortルールの概要
Snortルールを適切に作成して、意図したとおりに機能させることが重要です。つまり、ネットワーク内の新たな脅威が適切に特定されるようにします。これを行うには、Snortの構文とルールの形成方法をきちんと把握する必要があります。
Snortルールは通常1行で記述されますが、最近のバージョンのSnortでは複数行のルールが許可されています。これは、特に1行だけに制限するのが難しい、より高度なルールに役立ちます。
Snortルールは、ルールヘッダーとルールオプションの2つのロジックで構成されます。以下で詳しく説明します。
ルールヘッダー
ルールに一致するトラフィックが特定された場合に実行するアクションを定義します。ルールヘッダーは、次の5つの主要コンポーネントで構成されます。
- 実行するアクション:Snortルールで宣言される最初のコンポーネント
- IPアドレス:ソースと宛先
- ポート番号:ソースと宛先
- トラフィックの方向:ソースから宛先までの一方向の場合は->。双方向の場合は<>
- 検査プロトコル:「レイヤー3」(IPおよびICMP)プロトコルと「レイヤー4」(TCPおよびUDP)プロトコル
注:現在、Snortではレイヤー3および4がサポートされていますが、Snort 3では、特定のアプリケーションレイヤーサービス(SSL/TLSやHTTPなど)のトラフィックのみがルールと一致するよう指示することもできます。
ルールオプション
ルールと一致するために満たす必要があるネットワークトラフィックの基準と一致がある場合の出力を定義します。次に、使用可能なルールオプションの一部を示します。
- ルールに一致したときに表示するメッセージ:ルールの目的を説明します。
- フロー状態:特定のパケットについて確認するセッションプロパティを指定します。
- コンテンツまたはパターン:パケットのペイロードデータまたはペイロード以外のデータで検出するコンテンツまたはパターンを指定します。
- サービスまたはアプリケーションのプロトコル:指定されたアプリケーションレイヤーサービスのトラフィック、またはルールヘッダーで指定されたソースポートと宛先ポートのいずれかでコンテンツまたはパターンを識別するようSnortに指示します。
- Snort ID (sid) と改訂番号 (rev):Snortルールを一意に識別 (sid) するか、Snortルールの改訂番号を一意に識別 (rev) します。
Snortルールの例
Dockerハニーポットを使用するDoS攻撃向けのSnortルールを作成する方法を見てみましょう。
この攻撃モードを明らかにするには、TCP/IP接続を介して侵害されたDockerイメージによって送信されたHTTPリクエストを検知するルールを作成する必要があります。
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS
DoS攻撃では、確立された接続を介してサーバーに大量のHTTP GETリクエストが送り込まれます。したがって、ルールオプションセクションでこのパターンを確認するようSnortに指示する必要があります。
# only detect established TCP connections from client requestsflow:to_server, established;
# match on HTTP GET requests
http_header; content:"Mozilla/5.0 (Windows NT 10.0|3B| Win64|3B| x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36";
http_method; content:"GET";
攻撃モードはハニーポットを介して実施されるため、ルールはネットワークトロイの木馬のアクティビティとして分類されます。
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg: "Detects DoS HTTP request sent by compromised Docker image";
flow:to_server, established;
http_header; content:"Mozilla/5.0 (Windows NT 10.0|3B| Win64|3B| x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36";
http_method; content:"GET";
classtype:trojan-activity;
sid:8001951;
rev:20220420;
)
専門家が作成したSnortルールの活用
サイバーセキュリティスタックにSnortを実装すると、既知および新たなネットワークセキュリティの脅威からネットワークを保護するための柔軟でプラットフォームに依存しないアプローチが提供されます。ただし、正しく機能するようにルールを設定する必要があります。
比較的単純なユースケースに対して独自のSnortルールを作成することはできますが、新たな脅威に対してルールを最新の状態に保つことは困難な作業です。代わりに、無料で入手できるコミュニティルールセットやCrowdStrike Falcon Intelligenceなど、専門家が作成したSnortルールおよびYARAルールの使用を検討してください。