Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

WindowsのWSLでSSHのpemファイルをchmod 400できない

問題

WindowsからWSLのSSHで公開鍵(.pem)を使ってログインしようとした際、pemファイルのパーミッションがowner以外から読み出し可能になっていると、OpenSSHが以下のようなエラーメッセージを出して接続に失敗する。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Windowsだと、ブラウザからNTFS上のディレクトリにダウンロードしたファイルのパーミッションはWSLから見るとデフォルトで777になるので、AWS EC2接続用のpemファイルをダウンロードしたときなどにこのメッセージを見ることがある。

stackoverflow.com

ここで、WSLでsudo chmod 400を実行すると、pemファイルのパーミッションが400にならず、なぜか555とかになってしまう。chmodコマンド自体も特にエラー等は返さない。

satob@K690XN:/mnt/c/tmp$ ls -la x.pem
-rwxrwxrwx 1 satob satob 387 Mar 18 00:23 x.pem
satob@K690XN:/mnt/c/tmp$ sudo chmod 400 x.pem
satob@K690XN:/mnt/c/tmp$ ls -la x.pem
-r-xr-xr-x 1 satob satob 387 Mar 18 00:23 x.pem
satob@K690XN:/mnt/c/tmp$

原因

WSLで/mnt/以下のファイルに対してchmodを実行した場合に上記の挙動になる模様。

対策

WSLで/home/以下のディレクトリにpemファイルをコピーしたあとにchmodを実行すれば、正しくパーミッションを400に設定できる。

注意事項

Stack Overflowなどで検索すると、PowerShellからicacls.exeを実行する方法が回答として挙げられていたが、自分の環境ではいずれもWSLから見たときのパーミッションは400にならなかった。

superuser.com

上記を実行するとパーミッションは400でなく444になった。

PS C:\tmp> icacls.exe x.pem /inheritance:r
処理ファイル: x.pem
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
PS C:\tmp> icacls.exe x.pem /grant:r "$($env:username):(r)"
処理ファイル: x.pem
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
PS C:\tmp>
satob@K690XN:/mnt/c/tmp$ ls -la x.pem
-r--r--r-- 1 satob satob 387 Mar 18 00:23 x.pem

しかも、そのあとWSLでchmodを実行しようとすると、sudoしているのにPermission deniedが返るようになった(原因不明)。

satob@K690XN:/mnt/c/tmp$ sudo chmod 400 x.pem
chmod: changing permissions of 'x.pem': Permission denied

superuser.com

上記を実行するとパーミッションは400でなく555になった。

PS C:\tmp> icacls.exe x.pem /c /t /Inheritance:d
処理ファイル: x.pem
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
PS C:\tmp> icacls.exe x.pem /c /t /Grant ${env:UserName}:F
処理ファイル: x.pem
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
PS C:\tmp> TakeOwn /F x.pem

成功: ファイル (またはフォルダー): "C:\tmp\x.pem" は現在ユーザー "K690XN\SATOB" によって所有されています。
PS C:\tmp> icacls.exe x.pem /c /t /Grant:r ${env:UserName}:F
処理ファイル: x.pem
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
PS C:\tmp> icacls.exe x.pem /c /t /Remove:g Administrator "Authenticated Users" BUILTIN\Administrators BUILTIN Everyone System Users
処理ファイル: x.pem
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
PS C:\tmp> icacls.exe x.pem
x.pem K690XN\SATOB:(F)

1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした
satob@K690XN:/mnt/c/tmp$ ls -la x.pem
-r-xr-xr-x 1 satob satob 387 Mar 18 00:23 x.pem

上記いずれの場合も特にエラーメッセージが返ることはなく、エクスプローラからファイルのプロパティを確認すると所有者だけに権限がついている状態になっていたので、icacls.exeの実行自体が失敗しているということはなさそうに見える。