覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

PowerShell で sshすると UNPROTECTED PRIVATE KEY FILE

パブリッククラウド(等のインターネット空間)にLinuxのサーバ立てて、そこへSSH接続できるようにする場合は、
一般的に 公開鍵認証 の方式にすると思います。

で、試しに Windows の PowerShell から 以下コマンドで、実際にプライベートキーで接続可能かを試すこともあると思います。

ssh -i {キーファイルのパス} {リモートユーザ}@{接続先のIPアドレス or ホスト}


上記コマンドを試した場合に以下のような UNPROTECTED PRIVATE KEY FILE! という表示が出て、接続できないことがあります。

PS C:\Users> ssh -i C:\SSH_KEY\my-generated-key.pem testuser@40.115.XXX.XX

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\\SSH_KEY\\my-generated-key.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "C:\\SSH_KEY\\my-generated-key.pem": bad permissions
testuser@40.115.XXX.XX: Permission denied (publickey).


エラーが出る原因

対象のプライベートキーファイルは接続操作をしているユーザ以外の読み込みと書き込み操作から保護されている必要があり、
プライベートキーのファイルが対象ユーザー以外からもreadやwriteができてしまう場合に表示されるようです。

解決方法

例えば、macOS や Linux ならば chmod 600 {プライベートキーファイル} で、対象ファイルに自分自身だけの r+w のpermission を付与すれば問題ないようです。

ただし、Windowsだとファイルの権限操作でやる方法は結構単純ではなさそうです。
WSLで chmod 600 とかやっても解決になりません。(これはそもそも WSLとWindowsのファイルシステムの絡みの関係っぽいですが)

じゃあ、Windowsで結局どうすればいいのかというと 対象のキーファイルをユーザフォルダの配下に置けば問題ないです。
こうすれば、一応Windows上の別のログインユーザからはアクセスできない。ってことでOKってことなんでしょう。

例えば以下のようなコマンドだと、問題なくSSH接続できます。

ssh -i C:\Users\yuki\Private_Key\my-generated-key.pem testuser@40.115.XXX.XX


まとめ

Windows では プライベートキーファイル のアクセス権操作でも UNPROTECTED PRIVATE KEY FILE! による接続失敗を防ぐことはできるようですが、 ユーザフォルダ以下のどこかにプライベートキーファイルを移してしまうのが手っ取り早いです。


補足

PowerShell からの ssh コマンド接続だと冒頭に書いたエラーになっても、別のターミナルソフトウェアでのssh接続ならそもそもエラーにならない。
というパターンもあります。