kickstartでVNCを管理するTips

こんにちは、iOSエンジニアの paper_and_paper です。

先日、いよいよAWS EC2でも Macインスタンス を立てれるようになると発表されました。

## Amazon EC2 Mac Instances👏👏

EC2上でMacを使えるようになると、ビルド、テスト、署名などのXcodeが必要な作業をAWS上でもできるようになるため、CI/CDやビルド・署名作業などはもちろん、開発環境ごとにインスタンスを立ち上げることも容易になりそうですね。

SSHまたはリモートデスクトップ(VNC)を用いて操作を行うことが可能なようで、間もなくmacOS Big Sur11.0のサポートも間もなく開始されるようです。

https://aws.amazon.com/jp/blogs/aws/new-use-mac-instances-to-build-test-macos-ios-ipados-tvos-and-watchos-apps/

物理マシンを購入するという選択に加えて、クラウド上でビルドやテストを走らせるという選択が増えるのは嬉しい限りです。

## 1. Apple Remote Desktop

さて、テストやビルドのために専用マシンを導入するとなると、マシンのメンテナンスや開発環境のアップデートするにはSSHやVNCが非常に活躍します。Macには Screen Sharing (画面共有) が標準で装備されています。GUI上では追加インストールしなくとも大抵の操作ができるため、もちろん VNC でリモートアクセスしてXcodeやコマンドツールをインストールすることができます。

このようなMacのリモート操作を担っているのが Apple Remote Desktop （ARD） というアプリケーションです。

### 1-1. Apple Remote Desktop で kickstart コマンドラインを使う

Apple Remote Desktop のコンポーネントをインストールしたり、アンインストール、起動、設定、再起動するために `kickstart` というコマンドが提供されています。

kickstartコマンドは以下のパスに配置されています。

```
/System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart
```

ARDとは **Apple Remote Desktop** の略称で、Macに標準インストールされているCoreService アプリケーションの１つです。Apple Remote Desktop Client の一部となっています。

### 1-2. ARDのコンポーネント

 1.  ARD Helper
 2.  ARD Agent & associated daemons
 3.  ARD Menu Extra    (controlled by the SystemUIServer)
 4.  ARD Admin Console (if you have an Administrator license)

### 1-3. リモートマネージメントは画面共有より優先される

基本的にGUI上で画面共有を利用しているときは、リモートマネージメントは無効になっています。

![Screen Shot 2020-12-05 at 13.45.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133774/3814a196-3d12-7eca-290d-2f3710fd1dfb.png)

早速、SHHでログインしてARDを起動してみましょう。

#### i. 有効化する

```zsh
$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate  
Starting...
Warning: macos 10.14 and later only allows control if Screen Sharing is enabled through System Preferences.
Activated Remote Management.
Done.
```

GUI上で「システム設定」を確認してみると **Remote Management** にチェックが付いたのを確認できます。

![Screen Shot 2020-12-05 at 13.46.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133774/164fd549-1a16-e600-3ea2-dd115a52b0c2.png)

Remote Managementを有効になると、画面共有は「切」に変更されて変更不可能な項目になりました。

#### ii. 無効化する

```zsh
$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -deactivate
Starting...
Removed preference to start ARD after reboot.
Done.
```

次は **Remote Management** のチェックが外れました。

![Screen Shot 2020-12-05 at 13.52.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133774/a83b4de0-1cf3-614c-34f7-19e8de2edd2a.png)

リモートマネージメント起動後に停止してしまった「画面共有」は、リモートマネージメントを停止させても画面共有はONにもどらないので注意です。


## 2. kickstartコマンドで何ができるのか

### 2-1. 権限を付与する

```
$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -configure -allowAccessFor -allUsers -privs -all

Starting...
Setting allow all users to YES.
Setting all users privileges to 1073742079.
Done.
```

### 2-2. VNCユーザを許可する

```
$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -configure -clientopts -setvnclegacy -vnclegacy yes 

Starting...
Set the client options.
Done.
```

### 2-3. VNCパスワードを設定する

`-vncpw`オプションに続けてパスワードを追加します。（""で囲む必要はありません）　
Rootパスワードと同じにならないフレーズを使用しましょう。


```
$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -configure -clientopts -setvncpw -vncpw {_PASSWORD_}

Starting...
Set the client options.
Done.
```

### 2-4. ARDを再起動する

```
$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -restart -agent -console

Starting...
Stopped ARD Agent.
Stopped VNC Privilege Proxy
Stopped RFB Register MDNS
Done.
```

### 2-5. ARDを有効にする

```
$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate

Starting...
Activated Remote Management.
Done.
```

## 3. VNCを特定ユーザのみに制限したい

### 3-1. Remote Desktop 共有を有効にし、特定のユーザにアクセス権を許可する

ARDを有効化する際に、特定ユーザにのみアクセス権限を付与する `-allowAccessFor`オプションに `-specifiedUsers` を指定します。

```
$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -allowAccessFor -specifiedUsers
```

次に、どのユーザにアクセスを認めるかを具体的に指定します。 別のコマンド `-configure`、`-access`、`-privs` オプションを使い、特定のユーザと、各自に割り当てるアクセス権を指定します。

例えば、以下のコマンドは、ショートネームが「santa」と「tonakai」のユーザについて指定したものです。
該当するユーザに、監視 (制御ではない) し、テキストメッセージを送信する権限を与えています。

```
$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart \
-configure \
-users santa,tonakai \
-access -on \
-privs -ControlObserve -ObserveOnly -TextMessages
```

注意すべき点として、kickstart のほかのオプションとは異なり、 **allowAccessFor オプションはほかの kickstart オプションと組み合わせるができない** ということです。 直前の2つの例のように使う必要があり、
コンピュータの設定を終わらせるまでは、状況に応じて、 `kickstart`を複数回呼び出す必要があります。

### 3-2. 特定のユーザ (「tonakai」) のアクセス権を無効にしたい

```
$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart \
-configure \
-users tonakai \
-access -off
```

もしも対象のユーザを指定しなかった場合には、全てのユーザ** に対していデフォルトで適用されます。


## 4. VNCをON/OFFする

### 4-1. VNCを有効にする

```
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart \
-activate \
-configure \
-access -on \
-clientopts -setvnclegacy -vnclegacy yes \
-clientopts -setvncpw -vncpw __my_passeord__ \
-restart -agent \
-privs -all
```

- `-activate`　Remote Management service を有効化する
- `-configure` 設定を変更するオプション
    - `-access` ユーザに対するアクセス設定
        - `-on` ユーザのアクセスを可能にする
    - `-clientopts` 設定オプション
        - `setvnclegacy` VNC Legacy password mode を許可する
            - `-vnclegacy` yes/no を切り替える
    - `-clientopts`
        - `-setvncpw` VNC Legacy PW をセットする
            - `-vncpw` パスワードを指定する
- `-restart` 再起動を指定するオプション
    - `-agent` ARD Agent と helper を再起動する
- `-privs` ユーザにアクセス権限を付与するためのオプション
    - `-all` 全ての権限を付与する

### 4-2. VNCを無効にする

```
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart \
-deactivate \
-configure \
-access -off
```

- `-deactivate` Remote Management service を無効化する
- `-configure` 設定を変更するオプション
    - `-access` ユーザに対するアクセス設定
        - `-off` ユーザのアクセスを不可にする


## 5. References
- [Apple Remote Desktop で kickstart コマンドラインユーティリティを使う - Apple](https://support.apple.com/ja-jp/HT201710)
- [macOS Mojave 10.14 以降で kickstart コマンドラインユーティリティを使う - Apple](https://support.apple.com/ja-jp/HT209161)
- [Start Mac VNC server from command line - github](https://gist.github.com/nateware/3915757)