COVID-19の影響により、テレワーク/リモートワーク化が加速し、Web会議サービスを使用することが増えてきました。 Web会議サービスの場合、往々にしてカメラやマイクを使用することとなります。

エンドユーザーが意図せずにこれらのアクセスを拒否してしまい、目当てのアプリケーションを使用するのに混乱したり、手間どったりすることがあります。

組織において管理下にあるデバイスであれば、プロファイルやスクリプトなどで強制的にアクセス権を付与したいと考えますが、カメラなど一部の項目に関しては、エンドユーザーのみが操作可能です。

今回は、Jamf Proを使用してこの制約の中で対応する方法を紹介します。

また、この記事はFOLIO Advent calendar 2020の3日目の記事でもあります。

User Consentについて

macOSでは、High Sierra(10.13)からUser Consentと呼ばれるプライバシー保護機能が搭載されました。 アプリケーションがカメラやマイクなどにアクセスする場合は、エンドユーザーの許可が必要です。

アプリケーションが初めてUser Consentの対象となる項目にアクセスする際には、ダイアログでエンドユーザーに対してアクセス権の確認がされます。

カメラへのアクセス確認ダイアログ Zoomアプリケーションでの例 マイクへのアクセス確認ダイアログ Zoomアプリケーションでの例

以降は、 [システム環境設定] > [セキュリティとプライバシー] > [プライバシー] からであれば個別にアクセス権を変更できます。

PPPC (Privacy Preferences Policy Control)について

PPPCは、デバイスのUser ConsentをMDMのポリシーで制御するためのしくみです。 これにより、指定したアプリケーションの対するUser Consentを制御できますが、以下の表に示すとおり、一部許可ができない項目が存在します。

項目 制御 役割
Accessibility 許可 / 拒否 アクセシビリティ(たとえば、マウス操作)に関するシステムの制御
AddressBook 許可 / 拒否 連絡先アプリケーションで管理されている連絡先情報へのアクセス
Admin Files 許可 / 拒否 管理者用の一部のファイルへのアクセス
All Files 許可 / 拒否 すべてのユーザーのメール、メッセージ、Safari、ホーム、Time Machineバックアップ、および特定の管理設定などのデータへのアクセス
Calendar 許可 / 拒否 カレンダーアプリケーションで管理されているイベント情報へのアクセス
Camera 拒否 カメラへのアクセス
Desktop Folder 許可 / 拒否 「デスクトップ」フォルダ(/Users/username/Desktop)へのアクセス
Document Folder 許可 / 拒否 「書類」フォルダ(/Users/username/Documents)へのアクセス
Download Folder 許可 / 拒否 「ダウンロード」フォルダ(/Users/username/Downloads)へのアクセス
File Provider Presence 許可 / 拒否 ファイルプロバイダで管理されているファイルをユーザーが使用している状況の取得
Listen Event システム環境設定で許可1 / 拒否 アプリケーションがCoreGraphicsおよびHIDAPIを使用して、すべてのプロセスからのCGEventおよびHIDイベントのリッスン(受信)
Media Library 許可 / 拒否 Apple Music、ミュージックとビデオのアクティビティ、およびメディアライブラリへのアクセス
Microphone 拒否 マイクへのアクセス
Network Volumes 許可 / 拒否 SMBなど、ネットワークボリューム上のファイルへのアクセス
Photos 許可 / 拒否 写真アプリケーションで管理されている画像(/Users/username/Pictures/Photos Library.photoslibrary)へのアクセス
Post Events 許可 / 拒否 CoreGraphics APIを使用してCGEventsをシステムイベントストリームに送信
Reminders 許可 / 拒否 リマインダーアプリケーションで管理されているリマインダー情報へのアクセス
Removable Volumes 許可 / 拒否 リムーバブルボリュームへのアクセス
Screen Capture システム環境設定で許可1 / 拒否 画面キャプチャの許可
Speech Recognition 許可 / 拒否 音声認識機能を介した音声データのAppleへの送信

ポリシーが矛盾する場合は、より厳しいほうが優先されるようになっています。 また、この機能は、Mojave(10.14)から追加された機能であるため、それ以前のバーションでは使用できません。

PPPCで許可できないUser Consentの項目を許可してみる

今回はZoomアプリケーションを例に、PPPCつまり、MDMの機能では許可できないUser Consentの項目を、Jamf Proを使用して許可する方法を紹介します。

ZoomアプリケーションはPPPCでは許可できない、カメラ、マイクおよび画面キャプチャへのアクセス権を要求するため、これらを強制的に許可するようにしてみます。

スクリプトの取得

今回はTCC-Permitterを使用します。 このスクリプトは、許可したいBundle IDまたはバイナリパスとTCCサービス名を指定すると、拒否されているUser Consentの項目を許可できます。

デフォルトがdevブランチ、つまり開発中のブランチであるため、安定版が必要な場合はリリース一覧より、任意のリリースバーションのソースコードからTCC-Permitter.shを取得してください。

Jamf ProにTCC-Permitterを設定

ここからはJamf Proにログインをして作業します。

スクリプトの登録

  1. [設定] > [コンピュータの管理] > [スクリプト]から新規作成に進みます。

    • カテゴリの設定は必須ではありませんが、このスクリプトを分類するのに使用できます。以下の画像では例としてSecurityを指定しています。

    TCC-Permitterの新規スクリプト作成の一般セクションの設定

  2. 次に、ScriptセクションにGitHubからコピーしてきたTCC-Permitter.shを貼り付けます。

    TCC-Permitterの新規スクリプト作成のスクリプトセクションの設定

  3. Optionsセクションのパラメータ4にバンドルIDまたはバイナリパス、パラメータ5にTTCのサービス名を指定することがわかるような名前を入力してください。

    • これは設定しなくても動作しますが、ポリシー側で使用する際にわかりやすくなるので設定しています。
    • 以下の画像では例としてBundle ID or Binary PathTTC Service Nameという名前を設定しています。

    TCC-Permitterの新規スクリプト作成のオプションセクションの設定

  4. [保存]してスクリプトの登録は完了です。

拡張属性の登録

  1. [設定] > [コンピュータの管理 - 管理用フレームワーク] > [拡張属性]から新規作成に進みます。
  2. 各値を設定します。
    • 表示名: Zoom disabled TCC service values
    • データタイプ: String
    • インベントリの表示: Extension Attributes
      • コンピュータのインベントリ情報のどのセクションで表示するかの設定であるため、任意のものを指定してかまいません。
    • 入力タイプ: Script
      • スクリプト入力欄に以下のスクリプトのBUNDLE_ID_OR_BINARY_PATHus.zoom.xosに変更して貼り付けます。

        #!/bin/zsh
        
        export PATH=/usr/bin:/bin:/usr/sbin:/sbin
        
        CURRENT_USER=$(stat -f%Su /dev/console)
        BUNDLE_ID_OR_BINARY_PATH="!!SET BUNDLE ID OR BINARY PATH YOU WANT!!"
        
        if [[ ! "${CURRENT_USER}" ]] || [[ "${CURRENT_USER}" = "root" ]];then
          exit 0
        fi
        
        CURRENT_USER_HOME_DIRECTORY=$(dscl /Local/Default read "/Users/${CURRENT_USER}" NFSHomeDirectory | awk '{print $2}')
        
        DIABLED_VALUES=$(sqlite3 "${CURRENT_USER_HOME_DIRECTORY}/Library/Application Support/com.apple.TCC/TCC.db" "SELECT service FROM access WHERE client = '${BUNDLE_ID_OR_BINARY_PATH}' AND allowed = '0'")
        
        echo "<result>${DIABLED_VALUES}</result>"
        

    Zoomの拒否となっているTCC Service名を取得する拡張属性の作成

  3. [保存]して拡張属性の登録は完了です。

スマートコンピュータグループの設定

  1. [コンピュータ] > [Smart Computer Groups]から新規作成に進みます。
  2. コンピュータグループセクションの表示名に認識しやすい名前を設定します。
    • 以下の画像では例としてZoom Camera or Microphone or ScreenCaptureを指定しています。

    Zoomのカメラ、マイクおよび画面キャプチャが拒否されているスマートコンピュータグループの作成

  3. Criteriaセクションに先程作成した拡張属性「Zoom disabled TCC service values」の値の条件を指定します。
    • カメラ、マイクおよび画面キャプチャのいずれかが拒否されているスマートコンピュータグループを作成するので、以下の画像のようにそれぞれをor条件でつなぎます。

    Zoomのカメラ、マイクおよび画面キャプチャが拒否されているスマートコンピュータグループのCriteriaの設定

  4. [保存]してスマートコンピュータグループの設定は完了です。

ポリシーの設定

  1. [コンピュータ] > [ポリシー]から新規作成に進みます。
  2. Generalセクションで各値を設定します。
    • 表示名: Allow Camera or Microphone or ScreenCapture to Zoom
    • カテゴリ: Security
      • カテゴリの設定は任意です。
    • トリガー: Recurring Check-in
    • 実行頻度: Ongoing
      • ScopeにSmart Computer Groupを使用するため、Ongoingで問題ないです。

    Installomatorを使用したZoomポリシーのオプションセクションのGeneral設定

  3. 次に、スクリプトの項目を選択し、登録したTCC-Permitterのスクリプトを追加します。
  4. パラメータ4とパラメータ5に値を設定します。
    • パラメータ4: us.zoom.xos
    • パラメータ5: Camera,Microphone,ScreenCapture

    Installomatorを使用したZoomポリシーのオプションセクションのスクリプト設定

  5. 次に、Scopeセクションからターゲットコンピュータを先程作成したスマートコンピュータグループ「Zoom Camera or Microphone or ScreenCapture」を設定します。

    Installomatorを使用したZoomポリシーのオプションセクションのスクリプトのパラメータ設定

  6. [保存]してポリシーの登録は完了です。

TCC-Permitterで使用するパラメータの取得方法

TCC-Permitterスクリプトの「パラメータ4」で使用するパラメータは、Bundle IDまたはバイナリパスを指定する必要があります。 バイナリパスはすぐわかると思いますが、アプリケーションの場合は以下のようなコマンドを実行すると簡単に取得できます。

mdls -name kMDItemCFBundleIdentifier -r <アプリケーション名>
# 例えばZoomだったら
# mdls -name kMDItemCFBundleIdentifier -r /Applications/zoom.us.app

また、もし現在のデバイスの許可の状態を見て判断したい場合は、

sqlite3 -header -csv "$HOME/Library/Application Support/com.apple.TCC/TCC.db" "SELECT service, client, allowed FROM access"

で確認できます。

注意点

一度、エンドユーザーがUser Consentのアクセス権に関するダイアログでアクションを行ってからでないと、このスクリプトは期待どおりには動作しません。 エンドユーザーがアプリケーションを起動しておらず、アクションを何もしていない場合には許可させることはできません。

ただ、間違ってエンドユーザーがアクセスを拒否してしまい、対象のアプリケーションが使えないという状況は改善できるため、ほとんど問題にはならないと思います。

まとめ

今回はTCC-Permitterを使用して、Jamf ProでmacOSのプライバシー保護機能のアクセス権を付与する方法を紹介しました。

さらに、スマートコンピュータグループを使用してより柔軟にポリシーを適用できるようにしてみました。

宣伝

現在、FOLIO ではコーポレートITの人材を募集しています。 もし興味がありましたら、@kenchan0130のTwitterまでお声がけください。

  1. [システム環境設定] > [セキュリティとプライバシー] > [プライバシー] から管理者権限がなくても許可および拒否が切り替えられる。Big Sur(11.0)より古いバージョンのデバイスに配布するとエラーになるので注意が必要。  2