Windows のOpenSSH サーバーが鍵認証できない。
ログをみると、公開鍵で認証できない。理由はパーミッション。パーミッションはLinux/BSDと同じく他者から書き込み不可が必須である。
WindowsでもLinuxなどのOpenSSH-サーバーと同じ
Admin権限で sshd.exe が起動している。設定はLinuxと同じ。authorized_keys の権限は、他人から読み込みはオッケ。書き込みは自分だけ。
デフォルトの設置場所
C:\ProgramData\ssh\administrators_authorized_keys
Windowsのデフォルトのsshd は C:\ProgramData\ssh
に公開鍵を保存します。
ここはシステム領域なので注意が必要です。SSHログインするユーザがUACを使えないと書き込みできません。
設定
Windowsビルトインのssh サーバーに設定する設定は次のとおりです。
## 既存 Match Group administrators AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys ## 追加 Match User takuya AuthorizedKeysFile .ssh/authorized_keys
私は、ユーザフォルダに設置するほうが確実だと思います。
公開鍵のフォルダのパーミッションに注意します。
公開鍵をいれた( authorized_keys ) のパーミッションは次のようにします。
編集は自分だけ。
閲覧はAdministrators だけ
エラーメッセージを見るには。
冒頭にある、パーミッションエラーの詳細なログ情報は、ssh サーバーの設定を変更し再起動するとファイルに書かれます。
sshd.exeの設定とログは、次のフォルダに設定ファイルがあり、ログも同じ場所に書かれます。
設定フォルダ
C:\ProgramData\ssh
logs にログを書き出したいとき。
logs フォルダに、ログを書き出し時は、つぎのように、設定を LOCAL0
に変えると、通常のLinuxと同じくファイルにAppendされてる。
# Logging SyslogFacility LOCAL0 #SyslogFacility AUTH #LogLevel INFO LogLevel DEBUG3
もし設定をせず、デフォルト設定のままであれば、ログは、Syslog( event viewer )に書かれる。しかしsyslog では、ログの詳細情報が書かれず、全く役に立たない。そのためファイルに記入させる必要がある。
ファイルに記入させる設定が SyslogFacility local0
である。 設定し再起動 net stop ssh ; net start ssh
するとログが見れるようになる。
ログを流すようにすると、公開鍵認証に関するエラー確認できる。公開鍵の認証設定が動くようになるまで、デバッグモードでログをファイルに書くようにする。
windows ビルトインの sshd(openssh-server)の再起動。
設定ファイルを編集したら、再起動して設定を反映します。
管理者権限の コマンドコンソールで
net stop sshd net start sshd
PS (powershell) からは Service コマンドで、この手の記述でも動くはず(ためしてない)
PS C:\ProgramData\ssh> Stop-Service sshd PS C:\ProgramData\ssh> Start-Service sshd PS C:\ProgramData\ssh> ReStart-Service sshd PS C:\ProgramData\ssh> Stop-Service 'OpenSSH SSH Server' PS C:\ProgramData\ssh> Start-Service 'OpenSSH SSH Server' PS C:\ProgramData\ssh> ReStart-Service 'OpenSSH SSH Server'
注意点: 接続中は再起動されない。
これは、LinuxのOpenSSHサーバーと違う点なので注意。
接続中のセッションがあれば、サービス再起動されない。接続が残っていると再起動がうまく行かず、設定が反映されないことがあるので注意
わたしも、設定反映されなくてパニクった。
ユーザーフォルダのAuthorized_keys を使いたい。
デフォルトでは、authorize_keys の設置場所は、Adminと一般ユーザーで違う場所が指定されている。WEBサイトを閲覧していると、Match Group
をコメントアウトするように指示する記事を散見するが、個人的には Match User
を追記する方法おすすめしたい。
sshd_config に自分のユーザーだけの設定を書く。
Match User takuya AuthorizedKeysFile .ssh/authorized_keys Match Group administrators AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
Match Group administrators
の末尾をコメントアウトするか、Match User
を作るかは趣味の問題だが、個人的にはデフォルト設定を生かした設定をしたほうがベターだと思う。
公開鍵認証について
WindowsのOpenSSHサーバーでも通常通り公開鍵認証ができます。
「公開鍵認証」とは、<秘密鍵と公開鍵のペア>を使います。
公開鍵をサーバーに登録しておけば、秘密鍵を持った人だけが、アクセスできます。一般的に使われるRSA公開鍵では、秘密鍵から公開鍵が導出されます。
公開鍵は「公開」するためのものです。誤解を恐れず、極めて短言で表現すれば、公開鍵の束(authorized_keys)は「印鑑証明」です。公開するものです。臆さず公開して構いません。
ハンコと捺印で例れば、印章が「秘密鍵」、印影が「公開鍵」です、ログインが「捺印・印鑑」です。( RSA鍵の署名と暗号化については、詳しくは、RSA公開鍵暗号方式でググること)
また、公開鍵暗号方式がRSA公開鍵であるとは限らないのも注意。
Windows のSSHサーバの公開鍵設定でググったら、公開鍵と秘密鍵の違いすら分かってないようなブログ記事が散見され、ヤバさしかなかった。
公開鍵は「秘匿する」ものじゃないですからね。また id_rsa が公開鍵じゃないですからね。
Windowsな人たちは、なんで、id_rsa を公開キーとか書いちゃうんだろう。また公開鍵を秘密にしたがるんだろう。 なんで鍵ペアを知らないんだろう。