クイックスタート:5分で始めるSuricata
ネットワークセキュリティは、もはや大企業だけの問題ではありません。サーバーを管理している人、あるいは高度なホームネットワークを運用している人にとっても、基本的な要件となっています。深夜にブルートフォース攻撃を受けた経験から、私は初期設定の段階からセキュリティを最優先するようになりました。Suricataのような侵入検知システム(IDS)および侵入防御システム(IPS)は、その防御に重要な層を追加します。
Suricataは、オープンソースの高性能ネットワークIDS/IPSおよびネットワークセキュリティ監視(NSM)エンジンです。シグネチャ、異常、プロトコル検出を用いて高度な脅威を検知するように設計されています。早速、動かしてみましょう。
Ubuntu/Debianへのインストール
ほとんどのDebianベースシステムでは、Suricataはすぐに利用可能です:
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt update
sudo apt install suricata
インストールの確認
正しくインストールされたことを確認するために、バージョンをチェックします:
suricata -V
基本設定(IDSモード)
Suricataには通常、デフォルトの設定ファイル(/etc/suricata/suricata.yaml)といくつかの基本ルールが付属しています。簡単なテストのために、特定のインターフェースでIDSモードで実行し、受動的にトラフィックを監視することができます。
まず、ネットワークインターフェースを特定します:
ip a
プライマリインターフェースがeth0またはenp0s3であると仮定しましょう。以下のコマンドでSuricataを起動できます:
sudo suricata -c /etc/suricata/suricata.yaml -i eth0
eth0を実際のインターフェース名に置き換えてください。このコマンドはSuricataをフォアグラウンドで実行します。アラートは/var/log/suricata/fast.logに、詳細なイベントは/var/log/suricata/eve.jsonに記録されます。
簡単なルールでテストする
Suricataの動作を確認するために、既知のルールをトリガーしてみましょう。デフォルト設定には、一般的なネットワークスキャンを検出するルールセットが含まれていることが多いです。別のマシンから(またはlocalhostを使用している場合は同じマシンから)、簡単なNmapスキャンを試してみてください:
nmap -sT <your_target_IP>
次に、Suricataのログをチェックします:
tail -f /var/log/suricata/fast.log
Nmapスキャンに関連するアラートが表示されるはずです。これは、Suricataが疑わしいアクティビティを積極的に検出していることを示しています。
Suricataの機能への深掘り
Suricataを起動して実行するだけでは不十分です。その基盤となるアーキテクチャと、いかにして強力な検出を実現しているかを理解することは、効果的なネットワーク防御にとって不可欠です。
Suricataとは何か?
より単純なパケットスニッファとは異なり、Suricataは大規模なパフォーマンスのために設計されたマルチスレッドエンジンです。大量のネットワークトラフィックを処理できるため、小規模サーバーから高速なエンタープライズネットワークまで適しています。その強みは、複数の検出方法を組み合わせている点にあります:
- シグネチャベースの検出: 既知の脅威のデータベースとトラフィックパターンを照合します。
- プロトコル分析: 一般的なネットワークプロトコル(HTTP、DNS、TLS)を理解し、予期しない動作からの逸脱を検出します。
- 異常検出: ゼロデイ攻撃を示す可能性のある異常なトラフィックパターンを特定します。
IDS vs. IPS:主要な違い
-
侵入検知システム(IDS): IDSモードでは、Suricataはネットワークトラフィックを受動的に監視します。疑わしいアクティビティを検出すると、アラートをログに記録します。トラフィックフローには干渉せず、サイレントアラームのように機能します。これは、ネットワークの中断を危険にさらすことなく、初期展開と監視に最適です。
-
侵入防御システム(IPS): IPSモードでは、Suricataはインラインで動作します。つまり、すべてのネットワークトラフィックは直接Suricataを通過します。脅威が検出された場合、Suricataは悪意のあるトラフィックをリアルタイムで積極的にブロックし、ターゲットに到達するのを防ぐことができます。これはよりプロアクティブな防御を提供しますが、正当なトラフィックに影響を与える誤検知を避けるために注意深い設定が必要です。
Suricataルールの仕組み
Suricataの検出機能は、Snortルールに似た構文を使用するルールエンジンによって大きく左右されます。ルールは通常、ヘッダーとルールオプションの2つの主要部分で構成されます。
ルールヘッダー
ヘッダーは、アクション、プロトコル、送信元/宛先IP、およびポートを定義します。例:
alert tcp any any -> any 80 (msg:"ET POLICY HTTP Hostヘッダー内の非RFC1918インバウンドホスト"; flow:to_server; content:"Host|"; http_header; pcre:"/^Host\x3a\x20(?:(?:10\.\d{1,3}\.\d{1,3}\.\d{1,3})|(?:172\.(?:1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3})|(?:192\.168\.\d{1,3}\.\d{1,3}))/H"; classtype:bad-unknown; sid:2018865; rev:2;)
alert: 実行するアクション(アラートをログに記録)。その他のアクションにはdrop、reject、passがあります。tcp: プロトコル(ip、tcp、udp、icmpも可)。any any -> any 80: 送信元IP/ポート(any/any)から宛先IP/ポート(any/80)。
ルールオプション
これらは括弧で囲まれ、詳細なマッチング条件とメタデータを提供します:
msg: ルールが発動したときにログに記録されるメッセージ。flow: ルールが適用されるトラフィックの方向を指定します(例:to_server、to_client)。content: パケットペイロード内の特定のバイトシーケンスを検索します。pcre: より複雑なパターンマッチングのためにPerl互換正規表現を許可します。sid: ルールの一意のSuricata ID。rev: ルールリビジョン番号。
Suricataデプロイメントのためのネットワークアーキテクチャ
Suricataの物理的な配置は、その機能に大きく影響します:
-
SPAN/TAP(IDSモード): この設定では、Suricataはネットワークトラフィックのコピーを受け取ります。スイッチのSPANポート(ポートミラーリングとも呼ばれる)は、トラフィックをSuricataに複製します。あるいは、ネットワークTAP(テストアクセスポイント)は、ネットワークリンクに挿入され、トラフィックのコピーを作成するハードウェアデバイスです。どちらの方法も、ネットワークパフォーマンスに影響を与えることなく受動的な監視を可能にし、IDSデプロイメントに最適です。
-
インライン(IPSモード): IPSの場合、Suricataはネットワークトラフィックの経路に直接配置されます。これは、すべてのパケットがSuricataを通過し、検査してブロックできることを意味します。これを実現するには、バイパスカードの使用やブリッジモードの設定など、特定のネットワークインターフェースカード(NIC)構成が必要であり、Suricataで問題が発生した場合でもトラフィックが継続するようにします。
高度な使用法と微調整
基本に慣れたら、Suricataの機能を拡張するには、高度な設定、カスタムルール、パフォーマンス最適化が含まれます。
IPSモードの有効化
IPS機能を有効にするには、通常、Suricataをインラインモードで実行するように設定する必要があります。これにはしばしば次のことが含まれます:
-
ネットワークカード構成: IPS用に、ブリッジとして構成できる2つのポートを持つ専用のネットワークカードを使用するか、特殊なバイパスカードを使用します。
-
Suricata構成:
suricata.yamlのoutputsセクションにあるnfqueueまたはaf-packet設定を変更します。また、ルールでdropまたはrejectアクションが有効になっていることを確認してください。
以下に、IPS用の典型的なaf-packet設定を示します:
af-packet:
- interface: eth0
threads: 1
defrag: yes
cluster_type: cluster_flow
cluster_id: 99
copy_mode: ips
copy_iface: eth1
# Suricataはeth0からパケットをキャプチャし、eth1に再注入します。
# eth0とeth1がブリッジまたはIPSモードで構成されていることを確認してください。
このスニペットは概念的なセットアップを示しています。実際の設定は、お使いのカーネルとNICドライバーに大きく依存します。IPSを本番環境にデプロイする前に、必ずステージング環境で十分にテストしてください。
ルール管理:脅威の一歩先を行く
Suricataは、そのルール次第で効果が変わります。ルールの手動更新は面倒でエラーが発生しやすいですが、PulledPorkやSuricata-Updateのようなツールがこのプロセスを自動化します。
Suricata-Update
Suricata-Updateは、Suricataルールを管理するための最新の公式ツールです。様々なソース(例:Emerging Threats Open、サブスクライブしていればProofpoint ET Pro)からルールセットをダウンロード、マージ、更新します。
sudo suricata-update
sudo systemctl restart suricata
希望するルールソースを指定するために/etc/suricata/update.yamlを設定します。suricata-updateを定期的に(例:cronジョブで毎日または毎週)実行することが不可欠です。
カスタムルールの作成
時として、一般的なルールだけでは不十分な場合があります。内部の脅威や特定のアプリケーションの脆弱性を検出する必要があるかもしれません。カスタムルールはプレーンテキストファイル(例:/etc/suricata/rules/local.rules)に記述され、suricata.yamlに含められます。デプロイする前に、必ずsuricata -T -c /etc/suricata/suricata.yamlでカスタムルールを検証してください。
alert tcp any any -> $HOME_NET any (msg:"カスタムルール:疑わしい内部TCPスキャン"; flow:to_client,established; flags:S,A; dsize:0; threshold:type limit,track by_src,count 5,seconds 60; classtype:attempted-recon; sid:9000001; rev:1;)
この例では、内部ホストが外部ソースから60秒以内に5つの空のTCP SYN-ACKパケットを受信した場合にアラートを発します。これはスキャン試行を示している可能性があります。
パフォーマンスチューニング
-
マルチスレッド化: パケット処理に複数のCPUコアを使用するようにSuricataを設定します。これは通常、
suricata.yamlのrunmodeおよびthreadingセクションで行われます。autofp(Auto Flow Processing)実行モードは、良い出発点となることが多いです。 -
ハードウェアオフロード: 最新のNICは、Receive Side Scaling(RSS)やGeneric Receive Offload(GRO)などの機能を備えており、CPUオーバーヘッドを削減できます。これらが適切に設定されていることを確認してください。
-
ルール最適化: 大規模で非効率なルールセットは、パフォーマンスに大きな影響を与える可能性があります。環境に関連しない、または誤検知が多すぎるルールは定期的に見直し、無効にしてください。
継続的なSuricata管理のための実践的なヒント
Suricataをデプロイすることは最初のステップに過ぎません。効果的なネットワーク防御には、継続的な監視と適応が必要です。
ログの理解
Suricataのアラートとイベントの主要な出力はeve.json(Extensible Event Format)です。このJSON出力には、検出された脅威、フロー情報などに関する豊富で構造化されたデータが含まれています。jqのようなツールを使用して簡単に解析できます:
tail -f /var/log/suricata/eve.json | jq '.'
大量のログ記録を行う場合は、eve.jsonをSIEM(Security Information and Event Management)システムに転送することを検討してください。例としては、ELKスタック(Elasticsearch、Logstash、Kibana)やSplunkがあり、これらはより優れた視覚化、相関分析、長期保存を提供します。
誤検知の処理
特にアグレッシブなルールセットでは、誤検知は避けられません。正当なトラフィックがアラートをトリガーした場合、いくつかの選択肢があります:
- ルールを無効にする: そのルールが環境に対して常に不正確な場合。
- ルールを修正する: カスタムルールである場合は、その条件を微調整します。
- ルールを抑制する: 特定のIP、ポート、またはメッセージIDからのアラートを無視するために、Suricataの抑制メカニズムを使用します。これは、一般的に有用なルールを完全に無効にするよりも望ましい方法です。
抑制ルールの例(/etc/suricata/suppress.rulesに追加し、suricata.yamlに含めます):
suppress gen_id 1, sig_id 2018865, track by_src, ip 192.168.1.100
これにより、192.168.1.100から発信された特定のルール(gen_id 1, sig_id 2018865)からのアラートが抑制されます。
定期的な更新とメンテナンス
- ルール更新:
suricata-updateをcron経由で毎日または毎週実行するように自動化します。 - ソフトウェア更新: バグ修正、パフォーマンス改善、新しい検出機能の恩恵を受けるために、Suricata自体を常に最新の状態に保ちます。
- 設定のバックアップ:
suricata.yamlとカスタムルールファイルを定期的にバックアップします。
デプロイモデルの選択
まず、監視のためにIDSモード(SPAN/TAP)でSuricataを使用することから始めます。これにより、ライブトラフィックに影響を与えることなく、アラートを理解し、ルールを調整できます。その精度に自信を持ち、誤検知を十分に把握したら、アクティブなブロックが必要なネットワークの重要なセグメントでIPSを有効にすることを検討してください。
Suricataをデプロイすることは、ネットワークのセキュリティ態勢を大幅に強化します。それは脅威に対する貴重な可視性と、それらから積極的に防御する能力を提供します。他のセキュリティツールと同様に、継続的な注意が必要ですが、それが提供する洞察と保護は非常に貴重です。

