Yunfi

Yunfi

tg_channel
github
email

ssh 的 UNPROTECTED PRIVATE KEY FILE 問題解決

太長不看#

問題#

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         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 客戶端可以並且應該為存儲和使用私鑰定義嚴格的規則,因為它們可以被視為密碼的等效物。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。