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


Mac の画面共有でログインできない(リモートマネージメント)

macOS の標準 VNC こと「画面共有」。つまり、別の Mac のデスクトップを遠隔操作できる標準機能ですが、たまに接続できないことがあるので困ります

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

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

原因

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

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

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

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

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

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

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

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

対策

大きく 2 通りあります。「キーチェーンアクセスの解除」と「画面共有の再設定」です。

🐒  しかし、OS の大幅なセキュリティ・アップデートなどのうち Apple 社の公開鍵が変更(更新)されるレベルだった場合は、やはり GUI の画面上からパスワードを入れたり、改めて画面共有を設定しないといけません。 ローカル環境なら画面共有の方が軽いのですが、バックアップの接続用として(個人マシンなら)TeamViewer などの遠隔アプリも入れておいた方が無難だと思います。

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

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

キーチェーンアクセスのロック解除コマンド
security unlock-keychain
解除例
$ ssh [email protected]
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の管理者パスワードを入れる>

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

$ ssh [email protected]
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 接続経由で「画面の共有」サービスを再起動します。

「画面の共有」サービス停止
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -deactivate
「画面の共有」サービス開始
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate
  • SSH 接続した先での具体的な方法
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.
ssh接続先での操作(サービス開始編)
$ # 「画面の共有」サービスの停止
$ sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate
Password:
Starting...
Activated Remote Management.
Done.

注意

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

署名鍵(公開鍵と秘密鍵のペア)の作成をする際の強度ですが、RSAEd25519 で迷ったら Ed25519 を選びましょう。ローカルとリモートの双方の OpenSSH のバージョンが ssh -V で 6.5 以上なら使えます

ssh-keygen -t ed25519 -a 100 -C "[email protected] or usage or memo"

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

ssh-keygen -t rsa -b 4096 -o -a 100 -C "[email protected] or usage or memo"
  • -a オプション
    • この値は強度設定で、鍵の作成途中で聞かれるパスフレーズを空にした場合は必要ありません。
      パスフレーズ付きにした場合に考慮する設定で、高くすると強度が増しますが認証が遅くなります。-a 100 でログインに数秒の遅延を発生させます(接続先のマシンスペックによる)。
      この値はパスフレーズを「KDF」と言う関数に通す回数(反復回数)です。値が大きいほど反復させる回数が増えるため、1 回のパスフレーズの確認処理が遅くなります。これにより、ローカルでの総当たり攻撃に強くなる対策で「キーストレッチング」と呼ばれる手法の 1 つです。
  • -C オプション
    • この値は備忘録用のコメントです。公開鍵に埋め込まれ、公開鍵を開くか ssh-keygen -l -f <公開鍵のファイル名> で確認できます。「何のために作った鍵だったか」と言ったメモ的な用途に使われます。汎用的に使う場合は「誰の鍵か」を知るためにメールアドレスを入力する習慣がありますが、公開されるものであることを念頭においてください。パスフレーズのヒントなどは NG です。