見出し画像

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

    • スクリプトペイロード:ネットワーク隔離を強制するスクリプトを選択

    • ファイルとプロセスペイロード:「コマンドを実行」に以下コマンド設定します。
      rm /Library/Application\ Support/JamfProtect/groups/*; sleep 5; jamf recon;

    • スコープ:Analyticsの検知用のスマートグループ( protect-networkIsolation )

一般ペイロードの設定
ファイルとプロセスペイロードの設定
スコープの設定

ネットワーク隔離を強制するワークフローが完成しました!
Analyticsが端末でスクリーンショットの取得を検知すると検知用のスマートグループ(protect-networkIsolationグループ)に入り、ネットワーク隔離設定(network isolation protectポリシー)が適用されます。

ネットワーク隔離設定を適用された状態で、セキュリティーチームはインシデントレスポンスを対応します。
対応が終わったら、ネットワーク設定を通常の状態に戻します。

続いて、ネットワーク隔離を解除する設定のご紹介です。

2.2 ネットワーク隔離を解除する設定

ネットワーク隔離のステータス拡張属性
  • ネットワーク隔離を適用しているスマートグループ:左側の「コンピュータ」>「スマートコンピュータグループ」>右上の「新規」をクリックしたら、以下を設定して保存します。

    • クライテリア:「設定されたネットワーク隔離のステータス拡張属性」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アプリを起動して、ネットワーク隔離を解除するポリシーを実行すると、通常のネットワーク状態に戻ります。

挙動を確認しましょう!

この動画では、スクリーンショットを取得すると自動的にネットワーク隔離が強制されることが確認できます。その後、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

こちらは、パケットフィルター(ファイアウォールの一つ)のルールです。

パケットフィルタリングとは、通信機器やコンピュータの持つネットワーク制御機能の一つで、外部から受信したデータ(パケット)を管理者などが設 定した一定の基準に従って通したり破棄したりすること。

技術文書:パケットフィルタリング 【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ワークフローの基本をご理解いただけたと思いますので、今後はいろいろな対策ワークフローが作成できるようになると思います。

以上、 今回はエンジニアのナトニチャが担当いたしました。
最後まで読んでいただき、ありがとうございました。

みんなにも読んでほしいですか?

オススメした記事はフォロワーのタイムラインに表示されます!

新しい記事の情報をツイッターで報告しておりますので是非@magichat2011もフォローして下さい!