
在這篇文章中,我們將開發一個在離線模式下使用硬體安全金鑰緊急存取 SSH 主機的程式。這只是一種方法,您可以根據自己的需求進行調整。我們將把主機的 SSH 憑證授權單位儲存在硬體安全金鑰上。此方案適用於幾乎任何 OpenSSH,包括具有單一登入的 SSH。
為什麼會發生這種情況?嗯,這是最後的選擇。這是一個後門,當由於某種原因沒有其他方法可以幫助時,它可以讓你訪問你的伺服器。
為什麼使用憑證而不是公鑰/私鑰進行緊急存取?
- 與公鑰不同,憑證的有效期可能很短。您可以產生有效期為 1 分鐘甚至 5 秒的憑證。在此期間之後,該證書將無法用於新的連線。這對於緊急訪問來說是理想的。
- 您可以為主機上的任何帳戶建立證書,並在需要時將這些「一次性」證書發送給您的同事。
你需要什麼
- 支援駐留金鑰的硬體安全金鑰。
駐留金鑰是完全儲存在安全金鑰內的加密金鑰。有時它們受到字母數字 PIN 碼的保護。如果需要的話,可以從安全性金鑰中匯出駐留金鑰的公共部分以及私鑰描述符。例如,Yubikey 5 系列的 USB 密鑰支援常駐密鑰。最好它們僅用於緊急存取主機。對於這篇文章,我將只使用一個金鑰,但您應該有一個額外的金鑰用於備份。 - 儲存這些金鑰的安全地方。
- 在本機電腦和緊急情況下需要存取的伺服器上安裝 OpenSSH 版本 8.2 或更高版本。 Ubuntu 20.04 版本附 OpenSSH 8.2。
- (可選但建議)用於檢查憑證的 CLI 工具。
訓練
首先,您需要建立一個認證機構,它將位於硬體安全金鑰上。插入密鑰並運行:
$ ssh-keygen -t ecdsa-sk -f sk-user-ca -O resident -C [security key ID]作為註釋(-C),我指定了 yubikey-9-512-742@smallstep.com,這樣我就不會忘記這個 CA 屬於哪個安全金鑰。
除了將金鑰新增至 Yubikey 之外,本機還會產生兩個檔案:
- sk-user-ca,一個金鑰描述符,指向儲存在安全金鑰中的私鑰,
- sk-user-ca.pub,這將是您的 CA 的公鑰。
不過不用擔心,Yubikey上還儲存了另一個無法擷取的私鑰。所以這裡的一切都是可靠的。
在主機上,以 root 身分將以下內容新增(如果尚未新增)到您的 SSHD 設定(/etc/ssh/sshd_config):
TrustedUserCAKeys /etc/ssh/ca.pub然後在主機上,將公鑰(sk-user-ca.pub)加入/etc/ssh/ca.pub
重新啟動守護程式:
# /etc/init.d/ssh restart現在我們可以嘗試存取主機。但首先我們需要一個證書。建立與憑證關聯的金鑰對:
$ ssh-keygen -t ecdsa -f emergency證書和 SSH 對
有時,使用憑證來取代公鑰/私鑰對是很有吸引力的。但僅憑證書不足以驗證使用者身分。每個證書還具有與其關聯的私鑰。這就是為什麼我們需要在頒發憑證之前產生這個「緊急」金鑰對。重要的是,我們向伺服器顯示簽署的證書,表明我們擁有私鑰的金鑰對。因此公鑰交換仍然活躍且良好。即使有證書,這也有效。證書只是減輕了伺服器儲存公鑰的負擔。
接下來,建立憑證本身。我需要用戶授權。 ubuntu 每隔10分鐘進行一次。你可以按照自己的方式進行。
$ ssh-keygen -s sk-user-ca -I test-key -n ubuntu -V -5m:+5m emergency系統將提示您使用指紋對憑證進行簽署。您可以新增以逗號分隔的其他使用者名,例如 -n ubuntu,carl,ec2-user
就是這樣,現在您有證書了!接下來,您需要指定正確的權限:
$ chmod 600 emergency-cert.pub此後,您可以查看證書的內容:
$ step ssh inspect emergency-cert.pub這就是我的樣子:
emergency-cert.pub
Type: ecdsa-sha2-nistp256-cert-v01@openssh.com user certificate
Public key: ECDSA-CERT SHA256:EJSfzfQv1UK44/LOKhBbuh5oRMqxXGBSr+UAzA7cork
Signing CA: SK-ECDSA SHA256:kLJ7xfTTPQN0G/IF2cq5TB3EitaV4k3XczcBZcLPQ0E
Key ID: "test-key"
Serial: 0
Valid: from 2020-06-24T16:53:03 to 2020-06-24T17:03:03
Principals:
ubuntu
Critical Options: (none)
Extensions:
permit-X11-forwarding
permit-agent-forwarding
permit-port-forwarding
permit-pty
permit-user-rc這裡的公鑰是我們創建的緊急金鑰,與之關聯的CA是sk-user-ca。
最後,我們準備好執行 SSH 命令:
$ ssh -i emergency ubuntu@my-hostname
ubuntu@my-hostname:~$- 現在您可以為主機上信任您的 CA 的任何使用者建立憑證。
- 您可以刪除緊急密鑰。您可以保留 sk-user-ca 金鑰,但由於它也包含在安全金鑰中,因此無需保留。您可能還需要從主機中刪除原始的 PEM 公鑰(例如,從使用者的 ~/.ssh/authorized_keys 檔案中刪除)。 ubuntu),如果您將其用於緊急通道。
緊急通道:行動計劃
插入安全金鑰並執行命令:
$ ssh-add -K這會將 CA 的公鑰和金鑰描述符新增至 SSH 代理程式。
現在匯出公鑰來製作憑證:
$ ssh-add -L | tail -1 > sk-user-ca.pub建立一個有效期限不超過一小時的證書:
$ ssh-keygen -t ecdsa -f emergency
$ ssh-keygen -Us sk-user-ca.pub -I test-key -n [username] -V -5m:+60m emergency
$ chmod 600 emergency-cert.pub現在再次使用 SSH:
$ ssh -i emergency username@host如果您的 .ssh/config 檔案在連接時導致任何問題,您可以執行 ssh 並使用 -F none 選項來繞過它。如果您需要向同事發送證書,最簡單、最安全的選擇是 。為此,您只需要兩個文件 - 在我們的例子中是emergency 和emergency-cert.pub。
我喜歡這種方法的硬體支援。您可以將安全鑰匙放在保險箱中,這樣它們就不會丟失。
論廣告的權利
史詩級伺服器 - 配備強大的 AMD 處理器,CPU 核心頻率高達 3.4 GHz。最高配置可讓您解決幾乎任何任務 - 128 個 CPU 核心、512 GB RAM、4000 GB NVMe。加入我們!
來源: www.habr.com
