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 のスマートグループの条件に設定する値と同じ値を設定します。

スマートグループ識別子(Smart Group’s Identifier)を設定
登録後、上記の設定をしたAnalyticをPlanから、適用端末に割当られているPlanのAnalytic Setに割り当ててください。
検証前の確認ポイント
・端末に適用されているプランのHash値が最新版PlanのHash値と一致しているかどうかを確認
手順
①Jamf Protect のComputersで対象端末をクリックします。
②Computer Detailsタブをクリックし、下にスクロールします。

端末に適用されているプランは最新版

端末に適用されているプランが最新版ではない場合
※端末に適用されているプランが最新版にならない場合、端末はインターネットに接続しているかどうかを確認して、インターネットを接続している状態でもPlan Hashがアップデートされていなかったら、以下のいずれかを実行します。
- 同じ管理画面に一番上にスクロールして、オンラインになっている状態で「Request Check-in」ボタンがあります。 Jamf Protect にチェックインして、最新版のプラン情報をもらうために「Request Check-in」をクリックします。

「Request Check-in」ボタン
- 対象端末のTerminal.app から「sudo protectctl checkin」コマンドを実行します。
Jamf Pro 側
Jamf Protect ワークフローのための必要な基本のコンポーネントを作成
- Jamf Protect – Smart Groups 拡張属性:
※この設定は、 Jamf Pro インスタンスで1つあれば結構です。既存の設定がある場合は次へ進んでください。
左側の「設定」> コンピュータ管理タブの「拡張属性」> 右上の「テンプレートから新規作成」>「Jamf Protect – Smart Groups」をクリックします。そのまま右下「保存」をクリックして良いです。

「Jamf Protect – Smart Groups」拡張属性
- Analytics の検知用のスマートグループ:左側の「コンピュータ」>「スマートコンピュータグループ」>右上の「新規」をクリックしたら、以下のとおり設定して保存します。
- グループの表示名:ネットワーク隔離ワークフローのグループなので、ネットワーク隔離ワークフロー関連の名前を設定(例えば、protect-networkIsolation)
- クライテリア:「Jamf Protect – Smart Groups」is「設定されたJamf Protect Analyticのスマートグループ識別子(Smart Group’s Identifier)」

Analytics の検知用のスマートグループのクライテリア
この設定により検知対象の 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
- トリガー:「カスタム」に設定し、「カスタムイベント」に「protect」を設定
- スクリプトペイロード:ネットワーク隔離を強制するスクリプトを選択
- ファイルとプロセスペイロード:「コマンドを実行」に以下コマンド設定します。
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の設定
ネットワーク隔離を解除する設定も完成しました!
ネットワーク隔離設定を適用している端末には、Self Service アプリを起動して、ネットワーク隔離を解除するポリシーを実行すると、通常のネットワーク状態に戻ります。
挙動を確認しましょう!
この動画では、スクリーンショットを取得すると自動的にネットワーク隔離が強制されることが確認できます。その後、Self Service からネットワーク設定を元に戻す動作も確認できます。
おまけ : 追加のネットワークルールを除外したい
問題です。 ネットワーク隔離を強制するスクリプトの中でネットワークルールの設定箇所どこでしょうか?
回答:以下の部分です(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
こちらは、パケットフィルター(ファイアウォールの一つ)のルールです。
パケットフィルタリングとは、通信機器やコンピュータの持つネットワーク制御機能の一つで、外部から受信したデータ(パケット)を管理者などが設 定した一定の基準に従って通したり破棄したりすること。
技術文書:パケットフィルタリング 【packet filtering】 PF
ネットワーク隔離を強制する際、サードパーティ製品(インシデントレスポンスツール・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 ワークフローの基本をご理解いただけたと思いますので、今後はいろいろな対策ワークフローが作成できるようになると思います。
以上、 今回はエンジニアのナトニチャが担当いたしました。
最後まで読んでいただき、ありがとうございました。