macOS の「画面を共有」でログインできないが SSH 接続できる時の対処法

# Mac の画面共有でログインできない<sub><sup>（リモートマネージメント）</sup></sub>

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78776/525b4905-831f-d471-3c61-29ec012da547.png "〜に接続できませんでした。〜と通信できません。リモートコンピュータが利用可能になっていて、ファイアウォールによって画面共有がブロックされていないことを確認してください。")

> macOS の標準 [VNC](https://ja.wikipedia.org/wiki/Virtual_Network_Computing) こと「[画面共有](https://support.apple.com/ja-jp/guide/mac-help/mh14066/mac)」。つまり、別の Mac のデスクトップを遠隔操作できる標準機能ですが、**たまに接続できないことがあるので困ります**。

特に、ヘッドレス（モニタなし）でサーバー的に使っている場合、いちいちモニタをつなげるのがとても面倒です。セキュリティなどの自動アップデートが行われた場合などに多く発生する気がします。

ちなみに<strong>「画面共有」アプリは「アクセシビリティ」には追加済み</strong>（システム環境設定の「セキュリティとプライバシー」→「プライバシー」にある「アクセシビリティ」）です。どうしたものでしょう。

## 原因

> アプリや OS のアップデートで**キーチェーンアクセスの許可が必要なレベルのアップデート**があった場合、<strong>承認されるまでロックされる</strong>から。

「重要なセキュリティアップデート」待ちや「規約の確認」待ちなど、適用・承認せずにいた場合、OS が「古いバージョンだとリモート接続が危険」とみなすと OS レベルでブロックすることが多々あります。

これは接続先の Mac だけでなく、接続元の Mac でも発生している可能性があります。

接続先の問題だと勘違いしてしまうケースで<ruby>あるある<rt>・・・・</rt></ruby>なのが、実は手元の Mac で自動アップデートがあったものの、再起動やアップデート内容の確認が完了しておらず、外部へのアクセスが制限されている場合です。SSH 接続や Web ページは見えているので、しょっちゅう勘違いします。

まずは手元の macOS で、お知らせやアップデートがない状態で再起動してから、接続して確認してみます。

それでも接続できない場合は、おそらく対象（接続先）のデスクトップで承認待ちのポップアップなどが表示されていると思います。その場合、一番簡単なのは対象の macOS のデスクトップで許可をするだけです。

**問題は、遠隔地に置いてあるヘッドレス（モニタなし）の Mac だった**場合です。

クリックするためだけにモニタとマウスを接続するのは面倒なのです。あと別室に置いてあって腰を上げるのすらリモートでしたい時とか、移動するのが面倒な時とか。

## 対策

この「承認待ち」状態を VNC 接続で解除できないとなると、SSH 接続で何とかするしかありません。

SSH 接続で試せる方法には、大きく 2 通りあります。「キーチェーンアクセスの解除」と「画面共有の再設定」です。

:::note warn
🐒 &nbsp;しかし、OS の大幅なセキュリティ・アップデートなどのうち <strong>Apple 社の公開鍵が変更（更新）されるレベルだった場合</strong>は、やはり GUI の画面上からパスワードを入れたり、改めて画面共有を設定しないといけません。
ローカル・ネットワーク環境なら「画面共有」の方が軽いのですが、バックアップの接続用としてオープンソースの [RustDesk](https://rustdesk.com/)、使い勝手優先なら有償ですが <a href="https://ja.wikipedia.org/wiki/TeamViewer" target="_blank">TeamViewer</a> などの遠隔アプリも入れておいた方が無難だと思います。
:::

### キーチェーンアクセスの許可をコマンドで操作する

対象の Mac に SSH 接続して、キーチェーンアクセスの許可を行います。

```bash:キーチェーンアクセスのロック解除コマンド
security unlock-keychain
```
```shell-session:解除例
$ ssh user1@keinos-no-macmini.local
Warning: Permanently added the ECDSA host key for IP address 'xxxx::xxxx:xxxx:xxx:xxxx%en0' to the list of known hosts.
Last login: Wed Nov 11 11:59:36 2020

KEINOS-no-MacMini:~ user1$ security unlock-keychain
password to unlock default: <macの管理者パスワードを入れる>
```

必要なら再起動もしておきます。

```shell-session
$ ssh user1@keinos-no-macmini.local
Warning: Permanently added the ECDSA host key for IP address 'xxxx::xxxx:xxxx:xxx:xxxx%en0' to the list of known hosts.
Last login: Wed Nov 11 12:30:16 2020

KEINOS-no-MacMini:~ user1$ sudo reboot now
Password: <macの管理者パスワードを入れる>
Connection to keinos-no-macmini.local closed by remote host.
Connection to keinos-no-macmini.local closed.
```

### 「画面の共有」サービスを再起動（オフ・オン）する

上記でダメだった場合、画面共有に必要な共通鍵が変わってしまったり、不用意なシャットダウンなどで不正な接続元として認識（ブロック）されている可能性があります。

その場合、「画面の共有」サービスを一旦オフにして、入れ直すと鍵の再作成とブロック情報のクリアされるため、直ることがあります。

モニタとキーボードがあればいいのですが、この記事では「ない」ことになっているので、コマンドで `ssh` 接続経由で「画面の共有」サービスを再起動します。

```bash:「画面の共有」サービス停止
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -deactivate
```
```bash:「画面の共有」サービス開始
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate
```

- SSH 接続した先での具体的な方法

```shell-session:ssh接続先での操作（サービス停止編）
$ # 念のためにキーチェーンアクセスをアンロックしておく
$ security unlock-keychain
password to unlock default: <macの管理者パスワードを入れる>

$ # 「画面の共有」サービスの無効化
$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -deactivate
Password: <macの管理者パスワードを入れる>
Starting...
Removed preference to start ARD after reboot.
Done.

$ # OS の再起動
$ sudo reboot now
Connection to keinos-macmini.local closed by remote host.
Connection to keinos-macmini.local closed.
```
```shell-session:ssh接続先での操作（サービス開始編）
$ # 「画面の共有」サービスの有効化
$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate
Password:
Starting...
Activated Remote Management.
Done.
```

## 注意

当然と言えば当然なのですが、あらかじめ **SSH 接続ができるように設定しておかないといけません**。パスワードによる SSH 接続は~~打つのが面倒~~セキュリティ上よくないので、公開鍵認証でログインできるようにしましょう。

- 「[macのssh 接続 公開鍵](https://www.google.com/search?q=site:qiita.com+mac%E3%81%AEssh+%E6%8E%A5%E7%B6%9A+%E5%85%AC%E9%96%8B%E9%8D%B5)」の Qiita 記事

鍵の作成（署名鍵もしくは公開鍵と秘密鍵のペアの作成）をする際の強度ですが、[RSA](https://ja.wikipedia.org/wiki/RSA%E6%9A%97%E5%8F%B7#RSA%E7%BD%B2%E5%90%8D) か [Ed25519](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%89%E3%83%AF%E3%83%BC%E3%82%BA%E6%9B%B2%E7%B7%9A%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0) で迷ったら `Ed25519` を選びましょう。署名専用の鍵で、速く強いためです。

ローカルとリモートの双方の **OpenSSH のバージョンが `ssh -V` で 6.5 以上なら使えます**。

```bash
ssh-keygen -t ed25519 -a 100 -C "your_email@example.com or usage or memo"
```

汎用性を優先する場合は RSA 署名鍵を選択しますが 4096 ビットにしましょう。

```bash
ssh-keygen -t rsa -b 4096 -o -a 100 -C "your_email@example.com or usage or memo"
```

- `-a` オプション
    - この値はセキュリティの強度設定です。鍵の作成途中で聞かれるパスフレーズを空にした場合は必要ありませんが、鍵の流出に備えてパスフレーズ付きにした場合に考慮する設定です。<br>高くすると強度が増しますがログインの認証が遅くなります。`-a 100` でログインに 1〜2 秒の遅延を発生させます（接続先のマシンスペックによる）。<br>この値はパスフレーズを「[KDF](https://ja.wikipedia.org/wiki/%E9%8D%B5%E5%B0%8E%E5%87%BA%E9%96%A2%E6%95%B0)」と言う関数に通す回数（反復回数）です。値が大きいほど反復させる回数が増えるため、1 回のパスフレーズの確認処理が遅くなります。これにより、ローカルでの[総当たり攻撃](https://ja.wikipedia.org/wiki/%E7%B7%8F%E5%BD%93%E3%81%9F%E3%82%8A%E6%94%BB%E6%92%83)に対して劇的に強くなる対策で、「[キーストレッチング](https://en.wikipedia.org/wiki/Key_stretching)」と呼ばれる手法の 1 つです。
- `-C` オプション
    - この値は備忘録用のコメントです。公開鍵に埋め込まれ、公開鍵を開くか `ssh-keygen -l -f <公開鍵のファイル名>` で確認できます。「何のために作った鍵だったか」と言ったメモ的な用途に使われます。汎用的に使う場合は「誰の鍵か」を知るためにメールアドレスを入力する習慣がありますが、公開されるものであることを念頭においてください。パスフレーズのヒントなどは NG です。