
2026/02/28 14:18
**誤って `scp` で SSH アクセスを無効にする** *自分の `~/.ssh/authorized_keys` ファイルを書き換えてしまったり、削除してしまうと、リモートへの SSH 接続ができなくなることがあります。*
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
を実行した結果、サーバー上のユーザーのホームディレクトリがクライアント側のパーミッション(scp -r . host:)で上書きされました。OpenSSH は、そのディレクトリが過度に許容的な場合に SSH キーを使用しないため、「/home/user ディレクトリの所有権またはモードが不正です」というエラーでログインに失敗しました。ディレクトリを777に戻すと、キー認証が再び有効になりました。この問題は OpenSSH に報告され、パッチはリリース 10.3 で公開される予定です(著者はリンクを提供しています)。この件は、バルク scp 操作後にキー認証に依存するユーザーに主に影響し、ホームディレクトリの正しいパーミッション設定の重要性を示しています。700
本文
この一手で SSH アクセスを無効化しないようにする方法
最近、奇妙なバグに遭遇しました。
scp でサーバーへファイルを転送した後、SSH 経由でログインできなくなり、鍵が sshd に拒否されました。
user@host: Permission denied (publickey).
対象はシングルボードコンピュータです。以前に WebDAV サーバーを構築していたので、その経路ならファイルシステムへアクセスできました。
なぜ鍵が拒否されたのか?
最初は
authorized_keys が上書きされたのではないかと疑いました。Forgejo は更新時にこれを行っていましたが、最近はそうなりませんでしたし、私の鍵はまだ残っていました。新しい鍵を作成したり別マシンから試しても効果はありませんでした。一時的にパスワードログインは機能しましたが、回避策に過ぎませんでした。再起動でも解決しませんでした。
SD カードを取り外し
fsck を実行した際には何も異常は見つかりませんでした。しかしファイルシステムを調べている最中に奇妙なことに気づきました:自分のホームディレクトリが 777 (rwxrwxrwx) になっていたのです。SSH にとってこれは過度に許容的すぎます。
OpenSSH は、鍵を使用する際にアクセスしたファイルやディレクトリが他者に読み取り可能であれば拒否します:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0644 for 'id_ed25519' are too open. ... user@host: Permission denied (publickey).
同様にサーバ側でも:
sshd-session: Authentication refused: bad ownership or modes for directory /home/user
ホームディレクトリを 700 (
rwx------) に戻すと、SSH は再び機能しました。
何が許可設定の変更を引き起こしたか?
原因は
scp の転送でした。以下のように実行していました:
$ scp -r . host:
ローカルディレクトリ(権限が 777)からサーバー上のホームディレクトリへすべてコピーしました。
問題を再現する手順
-
777 権限といくつかファイルを持つローカルディレクトリを作成:
$ mkdir local_directory $ chmod 777 local_directory $ cd local_directory $ touch test_file_1 test_file_2 test_file_3 -
リモート側に別のディレクトリ(ホームではなく安全のため)を作成:
$ ssh host mkdir remote_directory $ ssh host chmod 700 remote_directory -
転送前の権限確認:
$ ssh host ls -ld remote_directory | cut -d " " -f 1 drwx------ -
ファイルを転送:
$ scp -r . host:remote_directory test_file_1 100% 0 0.0KB/s 00:00 test_file_2 100% 0 0.0KB/s 00:00 test_file_3 100% 0 0.0KB/s 00:00 -
転送後の権限確認:
$ ssh host ls -ld remote_directory | cut -d " " -f 1 drwxrwxrwx
scp はソースディレクトリの権限をターゲットへコピーし、既に存在する場合でも上書きします。
結論
ローカルで 777 権限を持つディレクトリから
scp で転送した結果、リモート(ホーム)ディレクトリが 777 に設定されました。SSH はそれを過度に開放されたと判断し鍵を拒否しました。権限を正しく戻すことで問題は解決しました。
この挙動を OpenSSH のバグトラッカーに報告したところ、数時間以内に修正がプッシュされ、次のリリース(10.3)で確認できるようになります。開発者の迅速な対応に感謝します!
興味深いリンク