Ubuntu20.04で侵入防止システム(IPS)としてSuricataを構成する方法
序章
このチュートリアルでは、Ubuntu 20.04でSuricataの組み込みの侵入防止システム(IPS)モードを構成する方法を学習します。 デフォルトでは、Suricataは侵入検知システム(IDS)として実行するように構成されています。このシステムは、アラートを生成し、疑わしいトラフィックのみをログに記録します。 IPSモードを有効にすると、Suricataは、さらに分析するためのアラートを生成するだけでなく、疑わしいネットワークトラフィックを積極的にドロップできます。
IPSモードを有効にする前に、有効にしたシグニチャとそのデフォルトのアクションを確認することが重要です。 誤って構成された署名、または過度に広い署名は、ネットワークへの正当なトラフィックをドロップしたり、SSHやその他の管理プロトコルを介してサーバーにアクセスすることをブロックしたりする可能性があります。
このチュートリアルの最初の部分では、インストールして有効にした署名を確認します。 また、独自の署名を含める方法についても学習します。 IPSモードで使用するシグニチャが決まったら、デフォルトのアクションを変換してトラフィックをドロップまたは拒否します。 署名を設定したら、 netfilter NFQUEUE iptablesターゲットを使用してSuricataを介してネットワークトラフィックを送信し、無効なネットワークトラフィックを生成して、Suricataが期待どおりにドロップするようにする方法を学習します。
前提条件
このチュートリアルシリーズをフォローしている場合は、Ubuntu20.04サーバーでSuricataを実行しているはずです。
-
それでもSuricataをインストールする必要がある場合は、Ubuntu20.04にSuricataをインストールする方法に従ってください。
-
また、 ET OpenRulesetを使用してダウンロードする必要があります。
suricata-update
コマンド、およびSuricata署名に含まれています。 -
The
jq
コマンドラインJSON処理ツール。 前のチュートリアルでインストールしていない場合は、apt
指図:- sudo apt update
- sudo apt install jq
前のSuricata署名についてチュートリアルで使用したいカスタム署名がある場合もあります。
ステップ1—カスタム署名を含める
このシリーズのこれまでのチュートリアルでは、Suricataをインストールして構成する方法と、署名を理解する方法について説明しました。 独自のルールを作成して含める場合は、Suricataのルールを編集する必要があります。 /etc/suricata/suricata.yaml
署名へのカスタムパスを含めるファイル。
まず、サーバーのパブリックIPを見つけて、カスタム署名で使用できるようにします。 IPを見つけるには、 ip
指図:
- ip -brief address show
次のような出力を受け取るはずです。
Outputlo UNKNOWN 127.0.0.1/8 ::1/128
eth0 UP 203.0.113.5/20 10.20.0.5/16 2001:DB8::1/32 fe80::94ad:d4ff:fef9:cee0/64
eth1 UP 10.137.0.2/16 fe80::44a2:ebff:fe91:5187/64
パブリックIPアドレスは強調表示されたものと同様になります 203.0.113.5
と 2001:DB8::1/32
出力のIP。
次に、次のカスタム署名を作成して、非SSHポートへのSSHトラフィックをスキャンし、それをというファイルに含めます。 /var/lib/suricata/rules/local.rules
. でファイルを開く nano
またはお好みの編集者:
- sudo nano /var/lib/suricata/rules/local.rules
次の署名をコピーして貼り付けます。
alert ssh any any -> 203.0.113.5 !22 (msg:"SSH TRAFFIC on non-SSH port"; flow:to_client, not_established; classtype: misc-attack; target: dest_ip; sid:1000000;)
alert ssh any any -> 2001:DB8::1/32 !22 (msg:"SSH TRAFFIC on non-SSH port"; flow:to_client, not_established; classtype: misc-attack; target: dest_ip; sid:1000001;)
サーバーのパブリックIPアドレスを 203.0.113.5
と 2001:DB8::1/32
ルール内のアドレス。 IPv6を使用していない場合は、このルールと次のルールでその署名を追加することをスキップできます。
これにカスタム署名を追加し続けることができます local.rules
ネットワークとアプリケーションに応じてファイル。 たとえば、非標準ポートへのHTTPトラフィックについてアラートを送信する場合は、次のシグニチャを使用できます。
alert http any any -> 203.0.113.5 !80 (msg:"HTTP REQUEST on non-HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000002;)
alert http any any -> 2001:DB8::1/32 !80 (msg:"HTTP REQUEST on non-HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000003;)
デフォルト以外のポートへのTLSトラフィックをチェックするシグニチャを追加するには 443
Webサーバーの場合、以下を追加します。
alert tls any any -> 203.0.113.5 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000004;)
alert tls any any -> 2001:DB8::1/32 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000005;)
署名の追加が完了したら、ファイルを保存して閉じます。 使用している場合 nano
、あなたはそうすることができます CTRL+X
、 それから Y
と ENTER
確認するために。 使用している場合 vi
、 押す ESC
その後 :x
それから ENTER
保存して終了します。
いくつかのカスタム署名を定義したので、Suricataのを編集します /etc/suricata/suricata.yaml
を使用した構成ファイル nano
またはそれらを含めるための好みのエディタ:
- sudo nano /etc/suricata/suricata.yaml
を見つける rule-files:
構成の一部。 使用している場合 nano
使用する CTRL+_
次に、行番号を入力します 1879
. 使用している場合 vi
入力 1879gg
行に行きます。 ファイル内の正確な場所は異なる場合がありますが、ファイルの正しい一般的な領域にいる必要があります。
セクションを編集し、強調表示された次のものを追加します - local.rules
ライン:
. . .
rule-files:
- suricata.rules
- local.rules
. . .
ファイルを保存して終了します。 ルールを追加した後は、必ずSuricataの構成を検証してください。 これを行うには、次のコマンドを実行します。
- sudo suricata -T -c /etc/suricata/suricata.yaml -v
デフォルトでロードしたルールの数によっては、テストに時間がかかる場合があります suricata.rules
ファイル。 テストに時間がかかりすぎる場合は、コメントアウトできます。 - suricata.rules
を追加して構成の行 #
行の先頭に移動してから、構成テストを再実行します。 必ず削除してください #
使用する予定がある場合はコメント suricata.rules
最終的な実行構成の署名。
を使用して作成または含めた署名に満足したら、 suricata-update
ツールを使用すると、次の手順に進むことができます。ここで、署名のデフォルトのアクションをからに切り替えます。 alert
また log
積極的にトラフィックをドロップします。
ステップ2—シグニチャアクションの設定
カスタム署名をテストしてSuricataを操作したので、アクションを次のように変更できます。 drop
また reject
. SuricataがIPSモードで動作している場合、これらのアクションは、一致するシグニチャの無効なトラフィックをアクティブにブロックします。
これらの2つのアクションは、このシリーズの前のチュートリアルSuricataSignaturesの理解で説明されています。 使用するアクションの選択はあなた次第です。 A drop
アクションは、ネットワークフローに属するパケットと後続のパケットをすぐに破棄します。 A reject
アクションは、トラフィックがTCPベースの場合はクライアントとサーバーの両方にリセットパケットを送信し、その他のプロトコルの場合はICMPエラーパケットを送信します。
前のセクションのカスタムルールを使用して、それらを変換して drop
一致するトラフィックはネットワークスキャンまたはその他の無効な接続である可能性が高いため、アクション。
あなたの /var/lib/suricata/rules/local.rules
を使用してファイル nano
またはお好みのエディタを変更して alert
ファイルの各行の先頭でのアクション drop
:
- sudo nano /var/lib/suricata/rules/local.rules
drop ssh any any -> 203.0.113.5 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000000;)
drop ssh any any -> 2001:DB8::1/32 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000001;)
. . .
の署名について上記の手順を繰り返します /var/lib/suricata/rules/suricata.rules
変換したい drop
また reject
モード。
注:実行した場合 suricata-update
前提条件のチュートリアルでは、30,000を超える署名が含まれている可能性があります suricata.rules file
.
すべての署名をに変換する場合 drop
また reject
ネットワークまたはサーバーへの正当なアクセスをブロックするリスクがあります。 代わりに、ルールをそのままにしておきます suricata.rules
とりあえず、カスタム署名をに追加します local.rules
. Suricataは、の署名によって記述される疑わしいトラフィックのアラートを生成し続けます suricata.rules
IPSモードで実行中。
数日または数週間のアラートを収集したら、それらを分析して、変換する関連するシグニチャを選択できます。 drop
また reject
彼らに基づいて sid
.
実行するアクションですべてのシグニチャを構成したら、次のステップは、再構成してから、IPSモードでSuricataを再起動することです。
ステップ3—有効化 nfqueue
モード
SuricataはデフォルトでIDSモードで実行されます。つまり、ネットワークトラフィックをアクティブにブロックしません。 IPSモードに切り替えるには、Suricataを編集する必要があります /etc/default/suricata
構成ファイル。
でファイルを開きます nano
またはお好みの編集者:
- sudo nano /etc/default/suricata
を見つける LISTENMODE=af-packet
行を追加し、コメントアウトします。 #
行頭まで。 次に、新しい行を追加します LISTENMODE=nfqueue
SuricataにIPSモードで実行するように指示する行。
編集が完了すると、ファイルには次の強調表示された行が含まれているはずです。
. . .
# LISTENMODE=af-packet
LISTENMODE=nfqueue
. . .
ファイルを保存して閉じます。 これで、Suricataを使用して再起動できます systemctl
:
- sudo systemctl restart suricata.service
を使用してSuricataのステータスを確認する systemctl
:
- sudo systemctl status suricata.service
次のような出力を受け取るはずです。
Output● suricata.service - LSB: Next Generation IDS/IPS
Loaded: loaded (/etc/init.d/suricata; generated)
Active: active (running) since Wed 2021-12-01 15:54:28 UTC; 2s ago
Docs: man:systemd-sysv-generator(8)
Process: 1452 ExecStart=/etc/init.d/suricata start (code=exited, status=0/SUCCESS)
Tasks: 12 (limit: 9513)
Memory: 63.6M
CGroup: /system.slice/suricata.service
└─1472 /usr/bin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid -q 0 -D -vvv
Dec 01 15:54:28 suricata systemd[1]: Starting LSB: Next Generation IDS/IPS...
Dec 01 15:54:28 suricata suricata[1452]: Starting suricata in IPS (nfqueue) mode... done.
Dec 01 15:54:28 suricata systemd[1]: Started LSB: Next Generation IDS/IPS.
強調表示されていることに注意してください active (running)
Suricataが正常に再起動したことを示す行。 また、 Starting suricata in IPS (nfqueue) mode... done.
これは、Suricataが現在IPSモードで実行されていることを確認する行です。
この変更により、次のステップでUFWファイアウォールを使用してSuricataにトラフィックを送信する準備が整いました。
ステップ4—トラフィックをSuricataに送信するようにUFWを構成する
IPSモードでトラフィックを処理するようにSuricataを構成したので、次のステップは着信パケットをSuricataに転送することです。 このシリーズの前提条件のチュートリアルに従い、Ubuntu 20.04システムを使用している場合は、Uncomplicated Firewall(UFW)をインストールして有効にする必要があります。
Suricataに必要なルールをUFWに追加するには、ファイアウォールファイルを編集する必要があります。 /etc/ufw/before.rules
(IPv4ルール)および /etc/ufw/before6.rules
(IPv6)直接。
を使用してIPv4ルールの最初のファイルを開きます nano
またはお好みの編集者:
- sudo nano /etc/ufw/before.rules
ファイルの先頭近くに、次の強調表示された行を挿入します。
. . .
# Don't delete these required lines, otherwise there will be errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines
## Start Suricata NFQUEUE rules
-I INPUT 1 -p tcp --dport 22 -j NFQUEUE --queue-bypass
-I OUTPUT 1 -p tcp --sport 22 -j NFQUEUE --queue-bypass
-I FORWARD -j NFQUEUE
-I INPUT 2 -j NFQUEUE
-I OUTPUT 2 -j NFQUEUE
## End Suricata NFQUEUE rules
# allow all on loopback
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT
. . .
編集が完了したら、ファイルを保存して終了します。 次に、同じ強調表示された行を、の同じセクションに追加します。 /etc/ufw/before6.rules
ファイル:
- sudo nano /etc/ufw/before.rules
両方のファイルの内容が同じであることを確認してください。 編集が完了したら、ファイルを保存して終了します。
最初の二つ INPUT
と OUTPUT
ルールはSuricataをバイパスするために使用されるため、Suricataが実行されていない場合でも、SSHを使用してサーバーに接続できます。 これらのルールがないと、署名が正しくないか、広すぎると、SSHアクセスがブロックされる可能性があります。 さらに、Suricataが停止している場合、すべてのトラフィックはに送信されます NFQUEUE
Suricataが実行されていないため、ターゲットを削除しました。
次 FORWARD
ルールにより、サーバーが他のシステムのゲートウェイとして機能している場合、そのすべてのトラフィックは処理のためにSuricataにも送られます。
最後の2つ INPUT
と OUTPUT
ルールは、SSHトラフィックではないallの残りのトラフィックを処理のためにSuricataに送信します。
UFWを再起動して、新しいルールをロードします。
- sudo systemctl restart ufw.service
注:別のファイアウォールを使用している場合は、ファイアウォールが期待する形式に一致するようにこれらのルールを変更する必要があります。
iptablesを使用している場合は、を使用してこれらのルールを直接挿入できます。 iptables
と ip6tables
コマンド。 ただし、次のようなツールを使用して、再起動後もルールが永続的であることを確認する必要があります。 iptables-persistent
.
使用している場合 firewalld
、次に、次のルールがトラフィックをSuricataに転送します。
- firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 22 -j NFQUEUE --queue-bypass
- firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -j NFQUEUE
- firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 0 -p tcp --dport 22 -j NFQUEUE --queue-bypass
- firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 1 -j NFQUEUE
-
- firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -j NFQUEUE
- firewall-cmd --permanent --direct --add-rule ipv6 filter FORWARD 0 -j NFQUEUE
-
- firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -p tcp --sport 22 -j NFQUEUE --queue-bypass
- firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -j NFQUEUE
- firewall-cmd --permanent --direct --add-rule ipv6 filter OUTPUT 0 -p tcp --sport 22 -j NFQUEUE --queue-bypass
- firewall-cmd --permanent --direct --add-rule ipv6 filter OUTPUT 1 -j NFQUEUE
チュートリアルのこの時点で、SuricataはIPSモードで実行するように構成されており、ネットワークトラフィックはデフォルトでSuricataに送信されています。 サーバーはいつでも再起動でき、Suricataとファイアウォールのルールは永続的です。
このチュートリアルの最後のステップは、Suricataがトラフィックを正しくドロップしていることを確認することです。
ステップ5—無効なトラフィックをテストする
Suricataとファイアウォールがネットワークトラフィックを処理するように構成されたので、Suricataがカスタムおよびその他の含まれている署名に一致するパケットをドロップするかどうかをテストできます。
署名を思い出してください sid:2100498
この例で変更された前のチュートリアルから drop
一致するパケット:
drop ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
でルールを見つけて編集します /var/lib/suricata/rules/suricata.rules
使用するファイル drop
署名が含まれている場合のアクション。 それ以外の場合は、ルールをに追加します /var/lib/suricata/rules/local.rules
ファイル。
Suricataを送信します SIGUSR2
署名をリロードするように通知します。
- sudo kill -usr2 $(pidof suricata)
次に、を使用してルールをテストします curl
:
- curl --max-time 5 http://testmynids.org/uid/index.html
リクエストがタイムアウトしたことを示すエラーが表示されます。これは、SuricataがHTTP応答をブロックしたことを示しています。
Outputcurl: (28) Operation timed out after 5000 milliseconds with 0 out of 39 bytes received
SuricataがHTTP応答をドロップしたことを確認するには、 jq
調べるために eve.log
ファイル:
- jq 'select(.alert .signature_id==2100498)' /var/log/suricata/eve.json
次のような出力を受け取るはずです。
Output{
. . .
"community_id": "1:tw19kjR2LeWacglA094gRfEEuDU=",
"alert": {
"action": "blocked",
"gid": 1,
"signature_id": 2100498,
"rev": 7,
"signature": "GPL ATTACK_RESPONSE id check returned root",
"category": "Potentially Bad Traffic",
"severity": 2,
"metadata": {
"created_at": [
"2010_09_23"
],
"updated_at": [
"2010_09_23"
]
}
},
"http": {
"hostname": "testmynids.org",
"url": "/uid/index.html",
"http_user_agent": "curl/7.68.0",
"http_content_type": "text/html",
"http_method": "GET",
"protocol": "HTTP/1.1",
"status": 200,
"length": 39
},
. . .
強調表示 "action": "blocked"
行は、署名が一致したことを確認し、SuricataはテストHTTPリクエストをドロップまたは拒否しました。
結論
このチュートリアルでは、組み込みのIPSモードを使用して疑わしいネットワークトラフィックをブロックするようにSuricataを構成しました。 また、非標準ポートでのSSH、HTTP、およびTLSトラフィックを調べてブロックするためのカスタムシグニチャを追加しました。 すべてを結び付けるために、ファイアウォールルールを追加して、トラフィックをSuricataに転送して処理します。
SuricataをインストールしてIPSモードで構成し、疑わしいトラフィックを警告またはドロップする独自の署名を作成できるようになったので、サーバーとネットワークの監視を継続し、署名を調整できます。
Suricataの署名と構成に満足したら、このシリーズの最後のチュートリアルに進むことができます。このチュートリアルでは、Suricataから Elastic Stackを使用して構築されたセキュリティおよび情報イベント管理(SIEM)システムにログを送信する方法について説明します。 。