クライアントコンピュータ(Mac)に対して、VPNが未接続の時だけWebサイトのアクセスを制限する方法についてメモ的意味合いで記録します。案として、理論的にはいけそうじゃないかと考えています。おそらくMacのシステム環境設定で直接VPNの設定を施せばもっと簡単に実現できると思われますが、クライアント用のアプリを使ってVPNに接続する場合は一工夫必要になります。
本記事が対象としている環境
- クライアントコンピュータ:Mac / macOS Big Sur
- VPNクライアントアプリ:FortiClient
- MDM:Jamf Pro
Jamf Proでの作業
拡張属性を追加
VPN接続しているかどうかをifconfigコマンドで確認して、Yes/Noの値を返すスクリプトで拡張属性を追加。
Smart Computer Groupを作成
上記拡張属性でNoになっているコンピュータ(VPN未接続のコンピュータ)のグループを作成
構成プロファイルのペイロードを作成
ペアレンタルコントロールのペイロードを作成。
内容はWebサイトのアクセス制限。
Scopeに上記Smart Computer Groupを指定。
ポリシーを作成
Maintenanceペイロードを利用し、インベントリ情報をアップデートするポリシーを作成。
トリガーをCheck-inに指定。
ScopeはVPN利用端末全部になるよう調整。
クライアントで実行するスクリプトを作成
スクリプトの概要
シェルスクリプトを作成。
このスクリプトのもっとも重要な任務は、VPN接続状態が変わったら、強制的にJamfのCheck-inを実行させること。具体的なコマンドは以下。
jamf policy
ただし、頻繁にそのコマンドを実施するのはサーバの負担が大きいため、一度実行されたら、次にVPN接続状態が変わるまでは1秒ごとに何もせず待機させる。待機させるコマンドは以下。数字は秒数。
sleep 1
Check-inのコマンドが一度実行されたかどうかは、フラグとなるファイルの有無で判定するようにする。VPN接続したタイミングではファイルを作成し、切断したタイミングではファイルを削除する。
ファイルを作成するコマンドは以下。
touch (ファイルパス)
ファイルを削除するコマンドは以下。オプション -f は強制的に実行する。
rm -f (ファイルパス)
スクリプトはコンピュータが稼働している間は永続的に走らせる必要があるため whileループで実行する。ループの中でVPN接続しているかどうかのif条件分岐、さらにファイルの有無のif条件分岐をネストした形にする。内容は以下のようにする。
- VPN接続時にフラグファイルがなければ、Check-inのコマンドを走らせたら、その直後にフラグファイルを作成する。
- VPN接続状態でフラグファイルがある間はただひたすら待機するのみ。
- VPN接続が切れたら、フラグファイルが存在している場合のみCheck-inのコマンドを実行し、その後すぐにファイルを削除する(rm -f ファイルパス)。
- VPN未接続状態で、フラグファイルがない間はただひたすら待機するのみ。
- 次にVPN接続する時はまた 1 の手順に戻る
####その他のスクリプトに必要なコマンド
ifconfigコマンドで出力される情報から、VPN接続時だけ表示される'ppp0'をgrepで抜き出す。これを変数vpncheckに格納。
vpncheck=`ifconfig | grep 'ppp0'`
次に、フラグファイルの有無を確認するにはファイルが格納されるフォルダに対してlsコマンドを実行し、その結果に対してgrepを実行してファイル名で絞る。これらを | でつないただコマンドを変数fileに格納する。ここではひとまずフラグファイルの保存場所を「/private/var/tmp/」としている。
file=`ls /private/var/tmp/ | grep 'vpnflag'`
初めてスクリプトが実行されるタイミングは、コンピュータ起動直後のため、そのタイミングではVPN接続はされていない。よって、スクリプト冒頭で、前回コンピュータ使用時のフラグファイルが残っていればそれを削除しておく。
rm -f /private/var/tmp/vpnflag
###スクリプト全体
whileループ内の処理はフローチャートにすると以下のようになる。
そして、ここまでの内容をスクリプトにまとめると以下のようになる。
#!/bin/sh
vpncheck=`ifconfig | grep 'ppp0'`
file=`ls /private/var/tmp/ | grep 'vpnflag'`
rm -f /private/var/tmp/vpnflag
while :
do
if [ $vpncheck="" ]; then
if [ $file="" ]; then
sleep 1
else
jamf policy
rm -f /private/var/tmp/vpnflag
sleep 1
fi
else
if [ $file="" ]; then
jamf policy
touch /private/var/tmp/vpnflag
sleep 1
else
sleep 1
fi
fi
done
exit 0
これであとは、Launchdを利用し、コンピュータ起動直後にこのスクリプトファイルを実行するよう仕込めばうまくいくのではないかと考えているが、まだ検証できていない。