【Windows】SSHの鍵認証で「UNPROTECTED PRIVATE KEY FILE」が発生した場合の解決方法の紹介

今回は、Secure Shell(SSH)の鍵認証を使用して接続するときに「UNPROTECTED PRIVATE KEY FILE」の警告が表示されたときの解決方法を紹介します。

スポンサーリンク

検証環境

検証に使用した環境/ライブラリを次に記載します。

  • Windows
    • バージョン:1909
    • OSビルド:18363.1316

問題内容

SSHの鍵認証を使用して接続するときに、次のような警告が表示されることがあります。

$ ssh -i C:\example\.ssh\id_rsa fumidzuki.com
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\\example\\.ssh\\id_rsa' 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:\\example\\.ssh\\id_rsa": bad permissions

原因は、表示されている警告の「UNPROTECTED PRIVATE KEY FILE(保護されていない秘密鍵ファイル)」のとおり、使用する鍵ファイルに適切なアクセス権限が設定されておらず、余分なアクセス権限が設定されていると発生します。

今回の問題は、SSHの鍵認証に使用するファイルの場所により、問題が発生する可能性がかわります。

ホームディレクトリの鍵ファイルを指定すると、基本的にはログインしているユーザのみがアクセスできる場所のため、適切なアクセス権限が設定されています。このため、今回の問題が発生する可能性は低くなります。

ホームディレクトリ以外の鍵ファイルを指定すると、適切なアクセス権限が設定されていないことがあります。このため、今回の問題が発生する可能性が高くなります。

解決方法

SSHの鍵認証で使用する鍵ファイルに適切なアクセス権限を設定することになります。アクセス権限を設定するため、icaclsコマンドを使用する方法を紹介していきます。

icaclsコマンドの詳細については、次の公式サイトを確認してください。

icacls
icacls コマンドのリファレンス記事。このコマンドは、指定されたファイルの随意アクセス制御リスト (DACL) を表示または変更し、保存した DACL を指定したディレクトリ内のファイルに適用します。

アクセス権限を確認する

鍵ファイルのアクセス権限を確認します。次のコマンドを実行して、設定されているアクセス権限を確認することができます。

$ icacls c:\example\.ssh\id_rsa
c:\example\.ssh\id_rsa BUILTIN\Administrators:(I)(F)
                       NT AUTHORITY\SYSTEM:(I)(F)
                       BUILTIN\Users:(I)(RX)
                       NT AUTHORITY\Authenticated Users:(I)(M)

今回の実行例では、アクセス権限が4つ指定されていることを確認できました。不要となる次のアクセス権限を削除します。

  • BUILTIN\Users
    • ローカルコンピュータに標準で登録されている一般ユーザ用のグループです。
  • NT AUTHORITY\Authenticated Users
    • ローカルコンピュータにログインしているユーザ用のグループです。

削除対象のアクセス権限は、ローカルコンピュータにログインできれば、鍵ファイルを参照できるアクセス権限になります。

アクセス権限を削除する

アクセス権限を削除する場合は、icaclsコマンドの/removeパラメータを指定することで削除することができます。ただし、親ディレクトリからアクセス権限の継承が有効なときは削除することができません。

アクセス権限の継承を無効にする

アクセス権限の継承を無効にするため、icaclsコマンドの/inheritance:dパラメータを指定してコマンドを実行します。

$ icacls C:\example\.ssh\id_rsa /inheritance:d
アクセス権を更新するため、継承化を無効にします。継承化を有効にしていると適切にアクセス権を修正することができません。

アクセス権限を削除する

アクセス権限を削除するため、icaclsコマンドの/removeパラメータを指定したコマンドを実行します。

$ icacls C:\example\.ssh\id_rsa /remove Users "Authenticated Users"
処理ファイル: C:\example\.ssh\id_rsa
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

削除対象は、スペースで区切ることで複数指定することができます。

削除対象の名称にスペースがある場合は、""(ダブルクォーテーション)で括ることで指定できます。

削除後のアクセス権限を確認してみます。指定した名称のアクセス権限が削除できていることを確認することができます。

$ icacls c:\example\.ssh\id_rsa
c:\example\.ssh\id_rsa BUILTIN\Administrators:(F)
                       NT AUTHORITY\SYSTEM:(F)

アクセス権限の削除後にSSH接続をする

アクセス権限を削除した状態で、SSHの接続を実施してみます。

$ ssh -i C:\example\.ssh\id_rsa example.com
Load key "C:\\example\\.ssh\\id_rsa": Permission denied

警告表示の「UNPROTECTED PRIVATE KEY FILE」は発生しなくなりました。ただし、SSHの鍵ファイルへのアクセス権限が不足している状態になりました。

アクセス権限を設定する

アクセス権限を設定するためには、icaclsコマンドの/grantパラメータと対象の名称を指定することで、設定することができます。

アクセス権限を設定するため、次のコマンドを実行します。

$ icacls c:\example\.ssh\id_rsa /grant username:r
処理ファイル: c:\example\.ssh\id_rsa
1 個のファイルが正常に処理されました。0 個のファイルを処理できませんでした

設定後のアクセス権限を確認してみます。指定したユーザ名のアクセス権限が設定されていることを確認することができます。

$ icacls c:\example\.ssh\id_rsa
c:\example\.ssh\id_rsa xxxx\username:(R)
                       BUILTIN\Administrators:(F)
                       NT AUTHORITY\SYSTEM:(F)

まとめ

SSHの鍵認証するときに「UNPROTECTED PRIVATE KEY FILE」が表示されたときの解消方法を紹介しました。