Jamf Protect の「ネットワーク隔離ワークフロー」のつくり方
セキュリティツールが怪しい振る舞いやマルウェアの挙動を検知した際、その時点では原因や詳細がよくわかっていない場合が多く、状況を悪化させないために問題が発生した端末を「ネットワーク隔離」することがよくあると思います。
ネットワーク隔離により端末に接続可能なネットワークをブロックすることで、端末からインターネットに接続不可になります。逆に、インターネット(攻撃者等)から端末にも接続不可になります。端末がネットワーク隔離されている状態でセキュリティーチームがインシデントを調べたり、インシデントレスポンスを実施したりします。セキュリティーチームの対応が終わったら、通常にインターネットを使えるようにネットワーク設定を戻します。
Jamf Protect には、「Analytics」という振る舞い検知機能があります。振る舞い検知で怪しい振る舞いやマルウェアの挙動を検知したら、自動的にJamf Pro に用意されたワークフローをトリガーする仕組みの構成ができます。
今回紹介したい「ネットワーク隔離ワークフロー」は、Jamf Protect のAnalytics で怪しい振る舞いを検知した際、Jamf Pro のポリシーの処理と連携してネットワーク隔離を行います。
ネットワーク隔離ワークフロー とは
今回ご紹介するサンプルについて
Jamf Open Source Community に公開されている soar_playbooks にあるendpoint_network_isolation を使って、スクリーンショットを撮ったタイミングでネットワークを切断するフローを起動します。
また、対応後の復帰を想定して、ネットワーク設定を戻すフローを起動する処理も作成します。
必要な設定項目
Jamf Protect側
・Analytics のスマートグループ識別子(Smart Group's Identifier)
Jamf Pro側
・拡張属性:Jamf Protect - Smart Groups、ネットワーク隔離のステータス
・スマートグループ:Analytics の検知用のグループ、ネットワーク隔離がかかっているグループ
・ポリシー・スクリプト:ネットワーク隔離を強制する設定、ネットワーク隔離を解除する設定
設定方法
① Jamf Protect ワークフローのために必要な基本コンポーネントを作成
Jamf Protect 側
ワークフローを連携したいAnalytics(今回の例ではスクリーンショットを取得するする振る舞い)の「Analytics Action」に「Add to Jamf Pro Smart Group」設定のチェックを入れて「Identifier」を設定し、保存します。
※Identifierという項目には、後ほどJamf Proのスマートグループの条件に設定する値と同じ値を設定します。
登録後、上記の設定をしたAnalyticをPlanから、適用端末に割当られているPlanのAnalytic Setに割り当ててください。
検証前の確認ポイント
・端末に適用されているプランのHash値が最新版PlanのHash値と一致しているかどうかを確認
手順
①Jamf ProtectのComputersで対象端末をクリックします。
②Computer Detailsタブをクリックし、下にスクロールします。
※端末に適用されているプランが最新版にならない場合、端末はインターネットに接続しているかどうかを確認して、インターネットを接続している状態でもPlan Hashがアップデートされていなかったら、以下のいずれかを実行します。
同じ管理画面に一番上にスクロールして、オンラインになっている状態で「Request Check-in」ボタンがあります。Jamf Protectにチェックインして、最新版のプラン情報をもらうために「Request Check-in」をクリックします。
対象端末のTerminal.app から「sudo protectctl checkin」コマンドを実行します。
Jamf Pro側
Jamf Protectワークフローのための必要な基本のコンポーネントを作成
Jamf Protect - Smart Groups 拡張属性:
※この設定は、Jamf Proインスタンスで1つあれば結構です。既存の設定がある場合は次へ進んでください。
左側の「設定」> コンピュータ管理タブの「拡張属性」> 右上の「テンプレートから新規作成」>「Jamf Protect - Smart Groups」をクリックします。そのまま右下「保存」をクリックして良いです。
Analyticsの検知用のスマートグループ:左側の「コンピュータ」>「スマートコンピュータグループ」>右上の「新規」をクリックしたら、以下のとおり設定して保存します。
グループの表示名:ネットワーク隔離ワークフローのグループなので、ネットワーク隔離ワークフロー関連の名前を設定(例えば、protect-networkIsolation)
クライテリア:「Jamf Protect - Smart Groups」is「設定されたJamf Protect Analyticのスマートグループ識別子(Smart Group's Identifier)」
この設定により検知対象のAnalytic(例では screenshotNam )が検知されると、端末はAnalyticsの検知用のスマートグループ(例では protect-networkIsolation )に入ります。
② ネットワーク隔離ワークフローを構成
ネットワーク隔離スクリプト等は、以下Jamf ProtectのGithub URLに参考して、ワークフローを構成します。
https://github.com/jamf/jamfprotect/tree/main/soar_playbooks/endpoint_network_isolation
こちらスクリプトは、すべてネットワークをブロックして、Jamf Pro URLとAPNsとの通信を除外してコミュニケーションができるような設定のスクリプトです。
2.1 ネットワーク隔離を強制する設定
ネットワーク隔離を強制するスクリプト:左側の「設定」> コンピュータ管理タブの「スクリプト」>右上の「新規」して, endpoint_network_isolation_enforce.shの内容を設定します。
※ endpoint_network_isolation_enforce.shの67行目に許可・ブロックするネットワークルールのファイル名を設定します。下記の例のように自社名をfileNameに設定していただくとよいと思います。
fileName="com.{自社名}.isolate"
例)fileName="com.magichat.isolate"
ネットワーク隔離を強制するポリシー:左側の「コンピュータ」>「ポリシー」> 右上の「新規」して以下の設定を行う
一般ペイロード
トリガー:「カスタム」に設定し、「カスタムイベント」に「protect」を設定
※この「protect」は予約語なので、そのとおりに設定してください。実行頻度:Ongoing
スクリプトペイロード:ネットワーク隔離を強制するスクリプトを選択
ファイルとプロセスペイロード:「コマンドを実行」に以下コマンド設定します。
rm /Library/Application\ Support/JamfProtect/groups/*; sleep 5; jamf recon;スコープ:Analyticsの検知用のスマートグループ( protect-networkIsolation )
ネットワーク隔離を強制するワークフローが完成しました!
Analyticsが端末でスクリーンショットの取得を検知すると検知用のスマートグループ(protect-networkIsolationグループ)に入り、ネットワーク隔離設定(network isolation protectポリシー)が適用されます。
ネットワーク隔離設定を適用された状態で、セキュリティーチームはインシデントレスポンスを対応します。
対応が終わったら、ネットワーク設定を通常の状態に戻します。
続いて、ネットワーク隔離を解除する設定のご紹介です。
2.2 ネットワーク隔離を解除する設定
ネットワーク隔離のステータス拡張属性:左側の「設定」> コンピュータ管理タブの「拡張属性」> 「新規」をクリックして以下を設定します。
データタイプ:String
入力タイプ:Scriptに選択し、jamf_pro_extension_attribute_endpoint_network_isolation_status.sh の内容を入力
※ jamf_pro_extension_attribute_endpoint_network_isolation_status.sh の13行目のファイル名(fileName)に「ネットワーク隔離を強制するスクリプトに設定されたネットワークルールのファイル名」と一致するように修正します。
ネットワーク隔離を適用しているスマートグループ:左側の「コンピュータ」>「スマートコンピュータグループ」>右上の「新規」をクリックしたら、以下を設定して保存します。
クライテリア:「設定されたネットワーク隔離のステータス拡張属性」is「Enforced」
この設定を実施すると、ネットワーク隔離が適用されている端末が特定できます!
※ネットワーク隔離を強制するポリシーの最後にインベントリー更新するコマンド(jamf recon)を実行したのは、最新の端末のネットワーク隔離のステータスを反映するためです。
※※ 今回、「ネットワーク隔離を適用しているスマートグループ」に、ネットワーク隔離を解除する設定を配布します。その際、インシデントレスポンスの対応完了も配布の条件とするため、下記のように対応終了判断のスタティックグループも加えて管理してもよいと思います。
ネットワーク隔離を解除するスクリプト:左側の「設定」> コンピュータ管理タブの「スクリプト」>右上の「新規」して, endpoint_network_isolation_revert.sh の内容を設定します。
※ endpoint_network_isolation_revert.sh の48行目のファイル名(fileName)に「ネットワーク隔離を強制するスクリプトに設定されたネットワークルールのファイル名」と一致するように修正します。
ネットワーク隔離を解除するポリシー(Self Serviceに展開):左側の「コンピュータ」>「ポリシー」> 右上の「新規」をクリックして以下を設定
一般ペイロード
トリガー:設定なし
実行頻度:Ongoing
スクリプトペイロード:ネットワーク隔離を解除するスクリプトを選択
メインテナンスペイロード:「インベントリをアップデート」のチェックを入れる
スコープ:ネットワーク隔離を適用しているスマートグループ
Self Service:「Self Service でポリシーを使用可能にする」のチェックを入れて、Self Serviceの設定をカスタマイズします。
ネットワーク隔離を解除する設定も完成しました!
ネットワーク隔離設定を適用している端末には、Self Serviceアプリを起動して、ネットワーク隔離を解除するポリシーを実行すると、通常のネットワーク状態に戻ります。
挙動を確認しましょう!
この動画では、スクリーンショットを取得すると自動的にネットワーク隔離が強制されることが確認できます。その後、SelfServiceからネットワーク設定を元に戻す動作も確認できます。
おまけ : 追加のネットワークルールを除外したい
問題です。 ネットワーク隔離を強制するスクリプトの中でネットワークルールの設定箇所どこでしょうか?
回答:以下の部分です(140-153行目)。
# Block all incoming connections
block in all
# Pass in incoming connections from Apple addresses and Jamf Pro
pass in from { ${apnsIPRange}, ${JamfProInstance} } to any no state
# Pass in DHCP
pass in inet proto udp from port 67 to port 68
pass in inet6 proto udp from port 547 to port 546
# Block all outgoing connections
block out from any to any no state
# Pass out outgoing connections to Apple addresses and Jamf Pro
pass out from any to { ${apnsIPRange}, ${JamfProInstance} } no state
こちらは、パケットフィルター(ファイアウォールの一つ)のルールです。
ネットワーク隔離を強制する際、サードパーティ製品(インシデントレスポンスツール・SIEM製品)へデータを送信したり、コミュニケーション・仕事ができるようにIPアドレスやポートを除外したりしないといけないことがあります。
以下よく使うシンタックスや書き方に参考して、設定されているネットワークルールの意味がよくわかって、必要に応じてネットワークルールを追加したり、編集したりすることができるようになります。
設定のシンタックス
アクション
block :パケットの通信をブロック
pass :パケットの通信を許可
方向
in : インバウンドパケット
out : アウトバウンドパケット
ログに記録
log : 一致するパケットをログに記録します。
IPv4 / IPv6指定
inet : IPv4アドレス(例:174.043.122.222)
inet6 : IPv6アドレス(例:3ffe:1900:fe21:4545:0000:0000:0000:0000)
プロトコール
proto : プロトコール(tcp, udp, icmp など)
ルールの書き方
[アクション] [方向] [log] [IPv4 / IPv6指定] [proto プロトコール] [from 発信元IPアドレス] [to 宛先IPアドレス] [port ポート]
ルールのサンプル
・pass in inet proto udp from port 67 to port 68
→ ポート67(サーバー側)からポート68(クライアントまたは、MacBook側)へのUDPプロトコルを使用したIPv4着信通信を許可します。
・pass log proto udp to port { 123 4172 4195 5938 }
ポート123、4172、4195、5938 へのUDPプロトコルによる通信を許可して、ログに記録します。
・pass proto tcp to 203.0.113.2 port 22
203.0.113.2(ポート22) へのTCPプロトコルによる通信を許可します。
など
参考情報:https://www.openbsd.org/faq/pf/filter.html
最後に
以上の手順で、ネットワーク隔離ワークフローを皆さんの環境に構成したり、ネットワーク隔離のルールをカスタマイズしたりすることができるようになりました。
パケットフィルターの設定は、ネットワーク隔離だけでなく、日常でネットワークセキュリティーを高めるために設定している会社もあります。
今回の内容でJamf Protectワークフローの基本をご理解いただけたと思いますので、今後はいろいろな対策ワークフローが作成できるようになると思います。
以上、 今回はエンジニアのナトニチャが担当いたしました。
最後まで読んでいただき、ありがとうございました。