基於CA簽名的使用者公鑰管理

安全劍客發表於2020-10-22
透過CA簽名使用者公鑰的證照統一管理方法。透過該方法可以實現基於角色透過ssh管理對伺服器的訪問。

為了安全便捷的管理和維護伺服器,禁止SSH密碼登陸,並用證照認證是比較好的選擇。其方法是使用者生成金鑰對,其私鑰嚴格保管不洩露,將公鑰新增到伺服器上使用者對應的authorized_keys檔案,然後就可以用證照方式進行登陸,在證照生成的時候,也可以對證照新增密碼,防止私鑰被盜用。

基於CA簽名的使用者公鑰管理基於CA簽名的使用者公鑰管理

這種方式很方便,但是存在一個問題,就是當伺服器比較多的時候,對伺服器上公鑰的管理就會比較麻煩,容易當人員發生變化時候,容易清理遺漏,從而導致安全隱患。本文我們介紹一種透過中心CA統一簽發證照管理SSH證照的方法。

概述

為了解決統一管理的問題,引入CA來統一管理SSH的認證。使用者仍然需要生成一個公鑰和私鑰對證照。但是,認證不是透過將使用者公鑰新增伺服器來完成,使用證照頒發機構(CA)金鑰對使用者公鑰進行簽名。簽名過程僅生成了第三個證照檔案,使用者透過該簽發證照和自己原有的證照對就能完成登陸。

伺服器上,只需配置SSH對CA的公鑰認證,伺服器透過檢測使用者證照是否透過CA簽發,來完成認證過程。

基於CA簽名的使用者公鑰管理基於CA簽名的使用者公鑰管理

具體做法
建立CA

使用者生成一個證照頒發機構CA私鑰對,並保證私鑰的私鑰安全:

umask 77 # 修改掩碼,保證此後生成目錄和檔案的許可權

mkdir ~/CC-ca && cd ~/CC-ca 
ssh-keygen -C CA -f ca -b 4096

生成時候,給證照新增一個密碼,以防止洩露。

配置CA公鑰認證

然後在伺服器上,指定允許由CA簽名的所有使用者訪問該伺服器:

將CA的公鑰上傳到伺服器上,例如在/etc/ssh/ca.pub

在/etc/ssh/sshd_config新增下面的行,配置CA簽發的證照的信任:

TrustedUserCAKeys /etc/ssh/ca.pub

重啟sshd服務:

service sshd reload
CA簽發使用者證照

使用者使用ssh-keygen生成證照,並且把公鑰發給CA中心,CA中心用私鑰對該證照新增簽名:

ssh-keygen -s ca -I USER_ID -V +12w -z 1 id_ecdsa.pub

行說明:

-s ca 想使用CA進行簽名

-I USER_ID -使用者ID/使用者名稱

-V +12w -證照過期前的時間,該例子中證照有效期為12周

-z 1 設定證照的序列號,可以用證照的序列號來登出證照。

id_ecdsa.pub:需要簽名的使用者公鑰

生成證照id_ecdsa-cert.pub,該證照需要傳送給開發人員,使用者將其放入~/.ssh中。

新增角色

上面就可以完成了證照的CA簽名和統一認證。但是還有一個問題,可能使用者也需要分類,不同的團隊和角色的,需要有不同的訪問許可權。實際上,可以在簽名過程中新增角色,用來指定允許伺服器的訪問許可權。新新增使用者時候,即可使他們可以訪問所有相關伺服器,而無需在這些伺服器上新增任何內容。

基於CA簽名的使用者公鑰管理基於CA簽名的使用者公鑰管理

伺服器上配置角色資訊

建立用於配置訪問許可權的資料夾:

mkdir /etc/ssh/auth_principals

在該資料夾中,可以使用伺服器使用者名稱建立檔案,該使用者可以登入。例如,要授予對某些角色的root使用者訪問許可權,請新增檔案/etc/ssh/auth_principals/root。

在/etc/ssh/auth_principals/root檔案中,配置可以以root使用者身份登入的角色,每行一個角色,比如

admin_dev
root_op
ROLE1

在伺服器上SSHD配置檔案/etc/ssh/sshd_config,新增對角色的認證:

AuthorizedPrincipalsFile /etc/ssh/auth_principals/%u

然後重新載入sshd服務

service sshd reload
CA簽發帶角色的使用者證照

可以使用一下 行,簽發帶角色的證照:

ssh-keygen -s ca -I USER_ID -n ROLE1,ROLE2 -V +12w -z 2 id_ecdsa.pub

與以前命令列一樣,多增加了-n ROLE1,ROLE2標誌。

現在,該使用者可以登入到auth_principals檔案配置了ROLE1或ROLE2角色的伺服器。

登出證照

前面說了,可以對使用者證照進行登出。登出使用者需要用的使用者的序列號。建議同意維護一個使用者序列號的列表,或建立資料庫。

登出證照檔案

透過下面的命令生成一個登出證照檔案

ssh-keygen -k -f revoked-keys -u -s ca list-to-revoke

當已經有一個revoked-keys列表並想要更新證照時候(-u標誌)。

在list-to-revoke檔案內容由使用者名稱(IDS)或序列號(的-z生成期間標誌)是這樣的:

serial: 1
id: test.user

這將撤消對序列號為1的證照和所有ID為test.user的證照的訪問許可權。

伺服器配置登出

為了使伺服器完成對撤銷金鑰配置,需要將生成的/更新的revoked keys檔案新增到/etc/ssh/revoked-keys並在/etc/ssh/sshd_config配置:

RevokedKeys /etc/ssh/revoked-keys

注意:請確保該revoked-keys檔案為可訪問且可讀,否則會導致任何使用者都不能訪問。

總結

本文我們介紹了一個透過CA簽名使用者公鑰的證照統一管理方法。透過該方法可以實現基於角色透過ssh管理對伺服器的訪問。只需要配置伺服器一次(允許哪些角色訪問伺服器)。對於每個使用者,只需要生成一個簽名證照,就可以實現按角色登陸所有相關機器的方法。也可以方便登出使用者的證照,從而限制使用者的訪問。由於每個證照籤名都要有效性限制,即使未能及時登出使用者許可權,也可以在超過有效期後自動登出,從而保證了安全。

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2728722/,如需轉載,請註明出處,否則將追究法律責任。

相關文章