太長不看#
問題#
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/chris/.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 "/home/chris/.ssh/id_rsa": bad permissions
無法使用 ssh 的私鑰,出現如上提示。
解決#
chmod 0700 ~/.ssh/id_rsa
把路徑換成自己的私鑰路徑即可。
前情#
我在重裝了 wsl 之後想要把 Windows 正在用到的 ssh key 放到 wsl 裡,就直接在文件資源管理器中粘了過去。但是這樣的方法導致的文件權限是 0644,也就是說任意用戶都可以看、只有所有者用戶可以更改,這樣不安全的權限會讓 sshd 罷工不用這個私鑰,導致無論是 ssh 到 vps 還是 git 操作都無法完整進行。解決方案也很簡單:權限改下就好。
完整方法#
以下內容來自 SSH Error “permissions are too open” for Private Key File,原作者 Hiks Gerganov,由我和 ChatGPT 翻譯為中文。
1. 簡介#
密鑰是 Secure Shell (SSH) 協議的一部分。實際上,如果使用正確,它們可以提供額外的安全層級。
在本教程中,我們將探討 SSH 密鑰的權限問題。首先,我們生成密鑰並配置它們以供給定用戶訪問。接下來,我們討論適當的密鑰權限。最後,我們將解釋如何更正密鑰的權限並測試結果。
為簡潔和安全起見,我們僅考慮由 OpenSSH 實現的 SSH 版本 2(SSHv2)的最新迭代。
我們在 Debian 11 (Bullseye) 上使用 GNU Bash 5.1.4 測試了本教程中的代碼。它應該可以在大多數符合 POSIX 標準的環境中工作。
2. 生成密鑰#
首先,讓我們使用默認設置生成一些密鑰:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/baeldung/.ssh/id_rsa):
Created directory '/home/baeldung/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/baeldung/.ssh/id_rsa
Your public key has been saved in /home/baeldung/.ssh/id_rsa.pub
The key fingerprint is:
[...]
此時,正如輸出所述,我們有一組兩個密鑰:
- 公鑰:/home/baeldung/.ssh/id_rsa.pub
- 私鑰:/home/baeldung/.ssh/id_rsa
重要的是,這些是基於用戶(baeldung)的主目錄(/home)的默認位置:$HOME。
為了簡單起見,我們將本地機器用作 SSH 會話的客戶端和服務器。因此,我們將公鑰添加到我們用戶的 authorized_keys 文件中:
cat /home/baeldung/.ssh/id_rsa.pub >> /home/baeldung/.ssh/authorized_keys
現在,讓我們使用我們的新密鑰。
3. 私鑰權限#
在創建和設置密鑰之後,我們只需連接到 localhost:
$ ssh localhost
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0777 for '/root/.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 "/root/.ssh/id_rsa": bad permissions
[...]
在這種情況下,我們遇到了錯誤,它指出我們的私鑰具有錯誤的 權限。具體而言,SSH 客戶端不允許使用可以被其他人訪問的私鑰。
我們使用 ls 命令來檢查私鑰的當前權限:
$ ls -l /home/baeldung/.ssh/id_rsa
-rwxrwxrwx 1 baeldung baeldung 2590 Oct 10 06:56 /home/baeldung/.ssh/id_rsa
這裡,第三和第四列告訴我們 baeldung 是所有者的用戶名和組名。第一列告訴我們所有者、所有者組的成員以及其他所有人都對我們的私鑰文件 /home/baeldung/.ssh/id_rsa 擁有完全權限,例如 模式 為 0777。
如果我們追求適當的安全性,這是不可接受的。
4. 更正私鑰權限#
正如我們之前看到的錯誤文本解釋的那樣,要求是我們的私鑰文件 “不可被其他人訪問”。換句話說,我們需要為每個私鑰文件設置兩個極端之間的模式:
- 0400,最嚴格的,例如,只允許所有者讀取權限
- 0700,最不嚴格的,例如,只允許所有者完全權限
基本上,我們不能為任何非所有者用戶提供任何權限,但所有者仍然必須能夠至少讀取這些文件。在這種情況下,我們使用 chmod 命令應用最嚴格的訪問權限:
$ chmod 0400 /home/baeldung/.ssh/id_rsa
$ ssh localhost
[...]
baeldung $
最後,讓我們看看當我們通過 chown 命令更改所有者時會發生什麼:
$ chown user1:user1 /home/baeldung/.ssh/id_rsa
$ ls -l /home/baeldung/.ssh/id_rsa
-r-------- 1 user1 user1 2590 Oct 10 06:56 /home/baeldung/.ssh/id_rsa
此時,如果我們是 root,SSH 將允許我們繼續操作,因為有以下幾個事實:
- 作為 root,我們對所有文件都有權限
- 就 SSH 客戶端而言,文件權限實際上是準確的(0400)
事實上,作為 root,我們只需通過 -l 選項或使用 user@ 語法指定正確的用戶,以及使用 -i 標誌指定密鑰,即可完成設置。
5. 公鑰權限#
作為私鑰主要問題的附帶說明,我們可能會問是否公鑰也適用於這些權限要求。實際上,有建議但沒有普遍規定。
在大多數情況下,最好保護密鑰的本地副本免受第三方的修改。基本上,這意味著建議的模式介於兩個極端之間:
- 0400,與之前一樣僅允許所有者讀取密鑰
- 0744,使所有者能夠
實際上,下限允許進行操作而不進行修改,並阻止外部用戶,而上限至少可以防止外部修改。
無論如何,一旦我們的公鑰在遠程機器的 authorized_keys 文件中,我們實際上不需要它來登錄 - 我們只需要私鑰。
6. 總結#
本文介紹了 SSH 密鑰的權限問題,以及它們可能引起的問題以及如何更正它們。
總之,SSH 客戶端可以並且應該為存儲和使用私鑰定義嚴格的規則,因為它們可以被視為密碼的等效物。