セキュリティとプライバシーの設定値をリセットする（macOS 10.15 Catalina）


# 概要
- macOS10.15ではアクセス権が必要となる場所が追加されています。
    - [macOS 10\.15 Catalinaでは「User Consent」がさらに強化され、アプリがスクリーンキャプチャの撮影や書類、ダウンロードフォルダへのアクセスする際にユーザーの承認が必要に。 \| AAPL Ch\.](https://applech2.com/archives/20190605-macos-10-15-catalina-more-user-consent.html)
- そこで改めてセキュリティとプライバシー設定がどのように動作しているのか、またどのように変わったかを見ていきたいと思います。
- 最後にUI上では削除できないセキュリティとプライバシー設定の値をリセットする方法を紹介します。

# 参考
- [TCCのリセット\(mojave 10\.14\.4\)
](https://innovate-shoma.blogspot.com/2019/05/tccmojave-10144.html)
    > これはTCC(Transparency Consent and Control)というユーザ保護の仕組みで、図のようにセキュリティとプライバシー環境設定で設定されるものです
    
    > このデータは
    >   ~/Library/Application Support/com.apple.TCC/TCC.db
    > に保存されているので、sqlite3で直接編集するか？もしくは、
    >   $ tccutil reset service [bundle id]
    > で初期化できます
    > (面倒なら $ tccutil reset Allとかでも)
    
# 実践
## デスクトップにアクセスしてみる
- 試しにSwiftで`Desktop`上のファイルにアクセスを試みる

```swift
let contents = loadTextFile(path: "/Users/<ユーザ名>/Desktop/sample.txt")
if (contents.utf16.count != 0) {
    print("\(contents)")
} else {
    print("read error")
}

func loadTextFile(path:String) -> String {
    var contents = ""
    do {
        contents = try String(contentsOfFile: path,
                                  encoding: String.Encoding.utf8)
    }
    catch {
        print("Read Error")
    }
    return contents
}
```

- `String(contentsOfFile`でアクセスする際に下記の警告画面が出る

![-w420](https://i.imgur.com/fhQeWHK.jpg)

## セキュリティとプライバシー設定

- `OK`を選択すると`セキュリティとプライバシー`>`プライバシー`>`ファイルとフォルダ`に項目が追加される。
- `許可しない`を選択した場合はチェックマークが外れた状態で追加される
- どちらもしたくない場合（項目を追加したくない場合）は、上記の画面で`esc`キーを押すことで回避できる。
- 今の所このUIから項目を削除することはできないようです（`-`ボタンはdisableのままです）

![-w668](https://i.imgur.com/QRURz37.jpg)

## ターミナルからセキュリティとプライバシー設定をリセットする
### 概要
- 削除するにはターミナルで` tccutil reset <service> <bundle id>`を叩く必要があります。
    - `<bundle id>`を省略した場合はサービス全体の設定がリセットされる
- [Requesting Authorization for Media Capture on macOS](https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/requesting_authorization_for_media_capture_on_macos?language=objc)
    - カメラのアクセス例。
    - `tccutil reset Microphone`が紹介されている

### 具体例

- `SystemPolicyDesktopFolder`の出どころに関しては後述します

```sh
tccutil reset SystemPolicyDesktopFolder jp.co.hikeuchi.LoadFileSample
approval status for jp.co.hikeuchi.LoadFileSample
```

- `identifier`はapp内のplistから確認できます

![image](https://i.imgur.com/sE5B7Ux.png)

# tccutilの詳細
## ターミナルで確認

- `help`で確認してみると以下の通り。

```sh
tccutil --help
tccutil: Usage: tccutil reset SERVICE
```

- `man tccutil`でマニュアルを表示してみた。

```sh
tccutil(1)                BSD General Commands Manual               tccutil(1)

NAME
     tccutil -- manage the privacy database

SYNOPSIS
     tccutil command service

DESCRIPTION
     The tccutil command manages the privacy database, which stores decisions
     the user has made about whether apps may access personal data.

     One command is current supported:

     reset    Reset all decisions for the specified service, causing apps to
              prompt again the next time they access the service.

EXAMPLES
     To reset all decisions about whether apps may access the address book:

           tccutil reset AddressBook

Darwin                           April 3, 2012                          Darwin
```

- リセットするためには`SERVICE`名を知る必要があります。

## SERVICE名の調べ方
### 参考

- [Mojaveで強化された、ユーザープライバシー保護機能 の設定をリセットする](https://qiita.com/shintax/items/98b656fe274a9f05e2b1)
    - macOS10.14だがSERVICE名一覧が載っている
- [Bitsplitting\.org Reauthorizing Automation in Mojave](https://bitsplitting.org/2018/07/11/reauthorizing-automation-in-mojave/)
    
    > You can get a sense for the variety of services tccutil apparently supports resetting by dumping the pertinent strings from the framework:
    > `strings /System/Library/PrivateFrameworks/TCC.framework/TCC | grep kTCCService`

- 会社の先輩曰く…
> この書き手が，どうしてこんな strings コマンドをおもむろに叩けるのかといえば，添付 concat-in-tccutil.png の
> ような実装を tccutil の中に見い出したからに思える。これを非公開のフレームワークである TCC.framework が
> エクスポートしている TCCAccessRequest() の唯一の引数に投げつけてリセットしているような実装になっている。
> ![](https://i.imgur.com/3WQX2aF.jpg)

### 具体例(macOS10.15.2 Betaの場合)

- [【 strings 】コマンド――バイナリファイルの可読部分を表示する](https://www.atmarkit.co.jp/ait/articles/1703/09/news038.html)

```sh
strings /System/Library/PrivateFrameworks/TCC.framework/TCC | grep kTCCService  
kTCCServiceAll
kTCCServiceAddressBook
kTCCServiceContactsLimited
kTCCServiceContactsFull
kTCCServiceCalendar
kTCCServiceReminders
kTCCServiceTwitter
kTCCServiceFacebook
kTCCServiceSinaWeibo
kTCCServiceLiverpool
kTCCServiceUbiquity
kTCCServiceTencentWeibo
kTCCServiceShareKit
kTCCServicePhotos
kTCCServicePhotosAdd
kTCCServiceMicrophone
kTCCServiceCamera
kTCCServiceWillow
kTCCServiceMediaLibrary
kTCCServiceSiri
kTCCServiceMotion
kTCCServiceSpeechRecognition
kTCCServiceAppleEvents
kTCCServiceLinkedIn
kTCCServiceAccessibility
kTCCServicePostEvent
kTCCServiceListenEvent
kTCCServiceLocation
kTCCServiceSystemPolicyAllFiles
kTCCServiceSystemPolicySysAdminFiles
kTCCServiceSystemPolicyDeveloperFiles
kTCCServiceSystemPolicyRemovableVolumes
kTCCServiceSystemPolicyNetworkVolumes
kTCCServiceSystemPolicyDesktopFolder
kTCCServiceSystemPolicyDownloadsFolder
kTCCServiceSystemPolicyDocumentsFolder
kTCCServiceScreenCapture
kTCCServiceDeveloperTool
kTCCServiceFileProviderPresence
kTCCServiceFileProviderDomain
%s{public}: service kTCCServiceAppleEvents is not supported by this function
kTCCServiceAppleEvents indirect object identifier %s
kTCCServiceAppleEvents indirect object identifier type %d
```

- 不必要な行を削除、また実際のSERVICE名ではPrefixの`kTCCService`が不要。
整形した結果は以下。

```sh
All
AddressBook
ContactsLimited
ContactsFull
Calendar
Reminders
Twitter
Facebook
SinaWeibo
Liverpool
Ubiquity
TencentWeibo
ShareKit
Photos
PhotosAdd
Microphone
Camera
Willow
MediaLibrary
Siri
Motion
SpeechRecognition
AppleEvents
LinkedIn
Accessibility
PostEvent
ListenEvent
Location
SystemPolicyAllFiles
SystemPolicySysAdminFiles
SystemPolicyDeveloperFiles
SystemPolicyRemovableVolumes
SystemPolicyNetworkVolumes
SystemPolicyDesktopFolder
SystemPolicyDownloadsFolder
SystemPolicyDocumentsFolder
ScreenCapture
DeveloperTool
FileProviderPresence
FileProviderDomain
```

- ここから必要そうなものをピックアップすればOKですね
    - （ドキュメント化されていないので使ってもいいのか気になりますが…）
- 先に紹介した[Bitsplitting\.org Reauthorizing Automation in Mojave](https://bitsplitting.org/2018/07/11/reauthorizing-automation-in-mojave/)が詳しいので、詳細はそちらを一読ください。