Netskope Client の「無効化しっぱなし」を検知してユーザーに気付かせる

戻し忘れという問題

Netskope Client を運用している環境で悩ましいのが、Disable All Client Services による一時無効化の扱いである。
ネットワークのトラブルシュートやステアリング対象外の通信の切り分けなど、職務によっては一時的に無効化したい場面は運用上たしかに存在するため、管理側で操作を一律に禁止するとかえって不便になる環境も多い。

問題は、無効化そのものではなく戻し忘れである。
無効化している間はステアリング対象の通信が Netskope を経由しなくなり、Web フィルタリングや DLP による保護が効かなくなる(影響の範囲は構成によって異なるが、保護に穴があく点は変わらない)。
それにもかかわらず、無効化中であることを示す手掛かりはメニューバーの小さなアイコンだけで、作業が終わればそのまま忘れてしまいやすい。

そこで本記事では、macOS を対象に、「戻し忘れたら本人に気付かせる」仕組みを Netskope Client に同梱される診断コマンドと OS の標準機能を組み合わせて、追加のソフトウェアなしに作る方法を紹介する。
仕組みは単純で、クライアントの状態を定期的に確認し、無効ならデスクトップ通知を出すだけである。
まずは手元の 1 台で動かす手順として説明するが、構成要素はシェルスクリプトと plist が一つずつという単純さなので、MDM を使って組織内のユーザーに一斉配布する形にも展開できる。
組織配布での調整点は記事の後半で述べる。

クライアントの状態を取得する

Netskope Client には nsdiag という診断コマンドが同梱されており(Netskope Client Command Reference)、macOS では次のパスにある。

/Library/Application Support/Netskope/STAgent/nsdiag
  • f オプションで実行すると、トンネルの状態やクライアントのステータスが一覧で出力される。
    このうち Client status:: の行を見れば、クライアントが有効か無効かを判定できる。
bash
$ "/Library/Application Support/Netskope/STAgent/nsdiag" -f | grep "Client status::"
Client status:: disable.

Disable All Client Services を実行した状態では、このように disable が返る。
なお、Client statusdisable になる原因はユーザー操作とは限らず、この値だけでは無効化の理由までは識別できない。
それでも「無効のまま放置されていることに気付く」という目的には、原因を問わず disable 状態を検知できれば十分である。

シェルスクリプトで扱いやすいよう、値だけを取り出しておく。

bash
STATUS=$("$NSDIAG" -f 2>/dev/null | grep "Client status::" | tail -1 | awk -F':: ' '{print $2}' | tr -d '.')

監視スクリプト

状態の取得ができれば、あとは判定して通知するだけである。
通知には osascript を使う。
macOS に標準で入っており、追加のツールなしでサウンド付きのデスクトップ通知を出せる。

bash
#!/bin/bash
# Netskope Client 監視スクリプト
# Disable All Client Services の状態を検知して通知する

NSDIAG="/Library/Application Support/Netskope/STAgent/nsdiag"
LOG_TAG="[$(date '+%Y-%m-%d %H:%M:%S')]"

# nsdiagが存在するか確認
if [ ! -x "$NSDIAG" ]; then
    echo "$LOG_TAG ERROR: nsdiagが見つかりません"
    osascript -e 'display notification "nsdiagが見つかりません" with title "Netskope Monitor" subtitle "スクリプトの設定を確認してください"'
    exit 1
fi

# クライアントステータスを取得
STATUS=$("$NSDIAG" -f 2>/dev/null | grep "Client status::" | tail -1 | awk -F':: ' '{print $2}' | tr -d '.')

if [ "$STATUS" = "disable" ]; then
    echo "$LOG_TAG WARNING: Netskopeが無効状態です"
    osascript -e 'display notification "Disable状態が続いています。有効に戻してください。" with title "Netskopeが無効です" sound name "Basso"'
elif [ -z "$STATUS" ]; then
    echo "$LOG_TAG ERROR: ステータスを取得できませんでした"
    osascript -e 'display notification "nsdiagからステータスを取得できませんでした。" with title "Netskope Monitor" subtitle "ログを確認してください"'
else
    echo "$LOG_TAG OK: Netskopeは有効です (status=$STATUS)"
fi

通知にはサウンド(Basso)を付けている。
戻し忘れの通知は見逃されては意味がないので、音でも気付けるようにしておく。

ステータスが空の場合を有効・無効と区別して扱っている点にも触れておく。
nsdiag の実行失敗や出力形式の変更で値が取れなかったとき、これを else 節に流すと「監視が壊れているのに有効と記録され続ける」ことになる。
監視スクリプトの障害を正常と誤認しないよう、取得失敗はエラーとして通知する。

launchd で定期実行する

定期実行というと cron が思い浮かぶが、macOS では launchd が標準の仕組みである。
ユーザーのログインセッションで動かす場合は、~/Library/LaunchAgents/ に plist を置いて登録する。

xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "<http://www.apple.com/DTDs/PropertyList-1.0.dtd>">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.local.netskope-monitor</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>/usr/local/bin/check_netskope.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/tmp/netskope-monitor.log</string>
    <key>StandardErrorPath</key>
    <string>/tmp/netskope-monitor.log</string>
</dict>
</plist>

ポイントは三つある。

  • StartInterval:300 秒(5 分)間隔で実行する。戻し忘れの検知が目的なので、この程度の間隔で十分である
  • RunAtLoad:登録時とログイン時に即座に一度実行する
  • StandardOutPath / StandardErrorPath:スクリプトの出力をログファイルに落とし、あとから動作を確認できるようにする

スクリプトを /usr/local/bin/ に配置し、plist を登録すれば監視が始まる。

bash
sudo cp check_netskope.sh /usr/local/bin/
sudo chmod +x /usr/local/bin/check_netskope.sh
cp com.local.netskope-monitor.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.local.netskope-monitor.plist

これで 5 分ごとにクライアントの状態が確認され、無効のままだとサウンド付きの通知が繰り返し届く。
「有効に戻すまで 5 分おきに鳴り続ける」というしつこさが、戻し忘れ対策としてはちょうどよく機能する。

通知が出ないとき

ログには WARNING が記録されているのに、画面に通知バナーが出ないことがある。
筆者の環境では osascript からの通知は「スクリプトエディタ」の通知として扱われたため、システム設定の通知にあるスクリプトエディタの項目で、「通知を許可」が ON になっており「デスクトップ」にチェックが入っていることを確認するとよい。
集中モード(おやすみモード)が有効な場合もバナーは抑制されるので、あわせて確認する。

動作確認環境

  • macOS 26.5.2(Apple Silicon / Intel)
  • Netskope Client 139.*

nsdiag の出力形式や通知の挙動はバージョンによって変わる可能性があるため、本記事の内容は上記環境での確認結果である。

組織的に配布する場合

ここまでは個人の Mac に手動で入れる手順として説明したが、冒頭で触れたとおり、この構成は MDM での配布にも乗せやすい。
シェルスクリプトと plist を pkg にまとめるか、MDM のスクリプト実行機能で配置すればよく、バイナリを含まないので署名や公証も不要である。

その場合の調整点は二つある。
plist は ~/Library/LaunchAgents/ ではなく、全ユーザーを対象にできる /Library/LaunchAgents/ に配置する形に変える。
通知の許可は、各ユーザーの操作に任せず、MDM の通知設定プロファイルでスクリプトエディタの通知を事前に許可しておく。
こうすれば、前節で挙げた設定確認も管理側でまとめて済ませられる。

なお、筆者は MDM での配布までは検証していない。
この節は構成上の見通しとして読んでほしい。

まとめ

Netskope Client の一時無効化は運用上必要な場面があるが、戻し忘れれば保護が効かないまま業務が続いてしまう。
nsdiag によるステータス取得、launchd による定期実行、osascript による通知を組み合わせれば、追加のソフトウェアなしに「戻し忘れたら本人に気付かせる」仕組みを作れる。

無効化の禁止のような強制力のある統制と違い、通知はあくまでユーザー本人への注意喚起である。
それでも、うっかりによる保護の空白を短くする補完策としては、この程度の小さな仕組みで十分に役に立つ。

この記事をシェア