Mac miniのファイアウォール設定ミスでSSH接続できなくなった時の復旧メモ

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鍵認証、ファイアウォール、リモートログイン設定が絡むため、設定変更後は必ず別ターミナルから接続確認するのが安全です。

コメント

タイトルとURLをコピーしました