Mac miniのファイアウォール設定ミスでSSH接続できなくなった時の復旧メモ
Mac miniを自宅サーバとして使うために、スリープ無効化、SSH鍵認証、UPS復旧設定を行いました。
その後、macOSのファイアウォールを有効化したところ、翌日になってSSH接続できない状態になりました。
今回は、Mac miniのファイアウォール設定とSSH認証まわりでハマった内容、原因、復旧手順をメモとして残します。
今回起きた問題
Mac mini側でファイアウォールを有効化しました。
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on
その後、現状の許可リストを確認しました。
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --listapps
実行結果は以下です。
Total number of apps = 8
1 : /usr/local/libexec/remotepairingdeviced
(Allow incoming connections)
2 : /usr/libexec/remoted
(Allow incoming connections)
3 : /usr/bin/python3
(Allow incoming connections)
4 : /usr/bin/ruby
(Allow incoming connections)
5 : /usr/sbin/cupsd
(Allow incoming connections)
6 : /usr/libexec/sharingd
(Allow incoming connections)
7 : /usr/libexec/sshd-keygen-wrapper
(Allow incoming connections)
8 : /usr/sbin/smbd
(Allow incoming connections)
一見するとSSH関連の sshd-keygen-wrapper が許可されているため、SSH接続は問題なさそうに見えます。
しかし、実際には翌日になるとSSH接続できない状態になりました。
ファイアウォール許可リストの確認
許可リストの内容を整理すると、以下のようになります。
| 項目 | 内容 | 判断 |
|---|---|---|
/usr/local/libexec/remotepairingdeviced |
Apple内部系 | 放置でOK |
/usr/libexec/remoted |
Apple内部系 | 放置でOK |
/usr/bin/python3 |
Python | 注意 |
/usr/bin/ruby |
Ruby | 注意 |
/usr/sbin/cupsd |
プリンタ共有など | 使っていなければOFF候補 |
/usr/libexec/sharingd |
AirDropや共有系 | 使っていなければOFF候補 |
/usr/libexec/sshd-keygen-wrapper |
SSH関連 | 必要 |
/usr/sbin/smbd |
SMBファイル共有 | ファイル共有しないならOFF候補 |
この時点では、いきなり削除せず、まずは現状のままにしました。
ただし、後から分かった重要なポイントがあります。
sshd-keygen-wrapperが許可されていても、SSH本体が許可されているとは限らない。
リモートでディスプレイをオン・オフする
作業中、リモートからMac miniの画面をオフにするため、以下を実行しました。
pmset displaysleepnow
画面をオンにする場合は、以下を実行します。
caffeinate -u -t 1
これ自体は問題なく使えました。
しかし、翌日になるとSSH接続できない状態になりました。
原因1:sshd-keygen-wrapperはSSH本体ではない
ファイアウォール許可リストには、以下がありました。
7 : /usr/libexec/sshd-keygen-wrapper
(Allow incoming connections)
これを見て、SSHは許可されていると思っていました。
しかし、これはSSH接続を受ける本体ではありません。
本来確認したかったのは、以下のようなSSHデーモン本体です。
/usr/libexec/sshd
つまり、今回の状態は以下のような罠でした。
sshd-keygen-wrapperは許可されている- しかし、実際にSSH接続を受ける
sshd本体が許可されていない
これは、macOSのファイアウォール設定でハマりやすいポイントです。
原因2:ターミナルにフルディスクアクセス権限がなかった
もう一つの原因として、ターミナルにフルディスクアクセス権限がありませんでした。
そのため、ターミナルからリモートログインを有効化しようとしても、設定変更がうまく通りませんでした。
macOS側で以下を開きます。
システム設定 > プライバシーとセキュリティ > フルディスクアクセス
そこで、+ を押して以下を追加します。
アプリケーション > ユーティリティ > ターミナル
ターミナルをフルディスクアクセスに登録した後、リモートログインを有効化します。
ここでコマンドの on は英字の on です。数字の 0n ではありません。
sudo systemsetup -setremotelogin on
設定後、以下で確認します。
sudo systemsetup -getremotelogin
以下のように表示されればOKです。
Remote Login: On
IPアドレス指定ではSSH接続できる状態
この時点で、通常のホスト名指定では接続できませんでした。
ssh mac-mini
しかし、IPアドレスを直接指定すると接続できました。
ssh snowpool@192.168.1.200
つまり、Mac mini自体のSSHは生きているものの、ホスト名解決やSSH config側の設定に問題が残っている可能性がありました。
なぜかPassword:が出る問題
さらに、IPアドレス指定でSSH接続すると、なぜかパスワード認証のように Password: が表示されました。
パスワード認証は無効化したはずだったため、SSH設定を確認します。
sudo sshd -T | egrep 'passwordauthentication|kbdinteractiveauthentication|challengeresponseauthentication|pubkeyauthentication|authorizedkeysfile'
実行結果は以下です。
pubkeyauthentication yes passwordauthentication no kbdinteractiveauthentication yes authorizedkeysfile .ssh/authorized_keys
ここで重要なのは、以下です。
pubkeyauthentication yes:公開鍵認証は有効passwordauthentication no:通常のパスワード認証は無効kbdinteractiveauthentication yes:キーボード対話型認証が有効authorizedkeysfile .ssh/authorized_keys:公開鍵の参照先は通常通り
つまり、PasswordAuthentication no にしただけでは不十分でした。
macOSでは、KbdInteractiveAuthentication が有効なままだと、見た目上 Password: が表示される場合があります。
パスワード認証を無効にしたつもりでも、keyboard-interactive認証が残っていると、まだパスワード入力のような動きになる。
KbdInteractiveAuthenticationを無効化する
Mac mini側でSSH設定ファイルを編集します。
sudo vim /etc/ssh/sshd_config
以下の行を探します。
#KbdInteractiveAuthentication yes
これを以下のように変更します。
KbdInteractiveAuthentication no
これで、キーボード対話型認証を無効化できます。
設定後は、リモートログインを一度OFFにしてからONにします。
sudo systemsetup -setremotelogin off sudo systemsetup -setremotelogin on
念のため、再度設定を確認します。
sudo sshd -T | egrep 'passwordauthentication|kbdinteractiveauthentication|challengeresponseauthentication|pubkeyauthentication|authorizedkeysfile'
以下のように、kbdinteractiveauthentication no になっていればOKです。
pubkeyauthentication yes passwordauthentication no kbdinteractiveauthentication no authorizedkeysfile .ssh/authorized_keys
公開鍵と秘密鍵の権限を確認する
手元のMac側で、SSH鍵の権限を確認・修正します。
chmod 644 ~/.ssh/id_ed25519_macmini_home.pub chmod 600 ~/.ssh/id_ed25519_macmini_home
秘密鍵は 600、公開鍵は 644 にします。
公開鍵をMac miniへ再登録する
念のため、公開鍵をMac miniへ再登録します。
cat ~/.ssh/id_ed25519_macmini_home.pub | ssh snowpool@192.168.1.200 \ "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
これで、Mac mini側の ~/.ssh/authorized_keys に公開鍵が登録されます。
なお、同じ公開鍵を何度も追記すると authorized_keys 内で重複するため、気になる場合は後で整理します。
鍵を明示してSSH接続を確認する
次に、鍵ファイルを明示して接続できるか確認します。
ssh -i ~/.ssh/id_ed25519_macmini_home snowpool@192.168.1.200
これで接続できれば、公開鍵認証は正常に動いています。
SSH configを修正する
最後に、手元のMac側で ~/.ssh/config を修正します。
vim ~/.ssh/config
以下のように、ホスト名指定用とIPアドレス指定用を用意しました。
Host mac-mini
HostName mac-mini
User snowpool
IdentityFile ~/.ssh/id_ed25519_macmini_home
IdentitiesOnly yes
Host macmini
HostName 192.168.1.200
User snowpool
IdentityFile ~/.ssh/id_ed25519_macmini_home
IdentitiesOnly yes
mac-mini はホスト名指定、macmini はIPアドレス直指定用です。
今回の環境では、ホスト名指定の ssh mac-mini は不安定だったため、IPアドレス直指定の ssh macmini を使うことにしました。
最終的な接続確認
以下で接続します。
ssh macmini
パスワードなしで接続できれば復旧完了です。
今回の原因まとめ
今回ハマった原因は、主に以下です。
- ファイアウォール許可リストに
sshd-keygen-wrapperはあったが、SSH本体の許可と勘違いした - ターミナルにフルディスクアクセス権限がなく、リモートログイン設定がうまく通らなかった
PasswordAuthentication noだけでは不十分で、KbdInteractiveAuthenticationが有効なままだった- ホスト名
mac-miniでの接続が不安定だったため、IPアドレス直指定に切り替えた
今回の復旧後の状態
最終的には、以下の状態にしました。
- Mac miniのリモートログインは有効
- SSH公開鍵認証は有効
- 通常のパスワード認証は無効
- キーボード対話型認証も無効
- 手元のMacから
ssh macminiで接続可能 - SSH鍵はMac mini専用の
id_ed25519_macmini_homeを使用
注意点
リモート環境でSSH設定を変更する場合は、必ず現在のSSH接続を切らずに、別ターミナルから新しい接続確認を行う方が安全です。
特に以下の作業は、接続不能になるリスクがあります。
- ファイアウォールの有効化
- パスワード認証の無効化
KbdInteractiveAuthenticationの無効化- リモートログインのOFF/ON
~/.ssh/configの変更
Mac miniが手元にあるなら復旧できますが、完全な遠隔地にある場合はかなり危険です。
まとめ
macOSのファイアウォール設定では、sshd-keygen-wrapper が許可されていても、それだけでSSH本体が問題なく使えるとは限りません。
また、SSHのパスワード認証を無効化する場合、PasswordAuthentication no だけでなく、KbdInteractiveAuthentication no も確認する必要があります。
今回の復旧で、最終的には以下の接続に統一しました。
ssh macmini
自宅サーバ用途のMac miniでは、SSH鍵認証、ファイアウォール、リモートログイン設定が絡むため、設定変更後は必ず別ターミナルから接続確認するのが安全です。

コメント