Windows上にOpenSSHサーバを建て,使っています.セキュリティのため,認証方式として公開鍵認証を使用しているのですが,様々な原因で認証エラー"Permission Denied (publickey)"が出て面倒くさかったです.
原因は主にWindowsのパーミッションです.パーミッションの設定が少しでも間違っていると認証エラーが発生します.ここでは適切なパーミッション設定方法についてまとめます.
アカウント構成
はじめに,アカウントの構成を示します.サーバを建てているWindows PCは他の人と共用なので,以下のようなアカウントが入っています.
アカウント名 | 説明 | Administratorsグループ |
---|---|---|
Administrator | 休止している(ACTIVE=NO ) |
◯ |
Public | 皆が使う用.このアカウントでOpenSSHサーバを起動(Start-Service sshd )する. |
◯ |
Private | 各個人が使う用.アカウント名は各々の名前になっている.これらのアカウントへSSHでアクセスしたい. | × |
適切なパーミッション設定はアカウント構成によって変わってきます.
結論:適切なパーミッション設定
各個人が使う用のアカウントのホームディレクトリにて,以下のディレクトリとファイルを作ることになります.
.ssh
.ssh/authorized_keys
これら2件に対し,適切にパーミッション設定を行うことが必要です.
- [プロパティ]→[セキュリティ]→[詳細設定]より [継承の無効化] を選択します.
- アクセス許可を与えるプリンシパルを以下のいずれかに限定します.いずれもアクセスはフルコントロールです:
✅
- [ユーザ] 自分のアカウント
- [ユーザ] SYSTEM
自分のアカウントに加えSYSTEMを追加したらうまくいきました.
✅
- [ユーザ] 自分のアカウント
- [グループ] Administrators
グループであるAdministrators(←複数形だよ!)を与えてもうまくいきました.
動かなかった例
❌
- [ユーザ] 自分のアカウント
OpenSSHサーバを起動している主体が読み込んでこれないので,動かないのだと思います.
例えば,次の記事などでは現行のアカウントを追加するだけで良いとされていますが,それはあくまでもOpenSSHサーバを起動するアカウントとSSHでアクセスするアカウントが同じ時に限ります.適切なパーミッション設定はユーザ構成によって変わってくることに注意が必要です.
❌
- [ユーザ] 自分のアカウント
- [ユーザ] Administrator
私の場合,Administratorは休止中であり,これにアクセスを与えても動きませんでした.
❌
- [ユーザ] 自分のアカウント
- [ユーザ] Public
PublicでOpenSSHを起動するのだから,Publicを追加すればいいのでは?と思ったのですが,動きませんでした.SYSTEMと自分自身以外のユーザを追加してはいけないのかも(?).
他にパーミッション設定を注意せねばならない場所
各個人の.ssh/
だけではなく,OpenSSHに必要な各種フォルダのパーミッションも適切に設定する必要があります.
例えば,C:¥ProgramData¥ssh¥logs
のパーミッションに個人アカウントを追加してしまうと,OpenSSHが起動しませんでした(例外を吐いて終了した).
参考:sshd_config
Protocol 2
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
AllowUsers Private
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys