基于CA簽名的統一SSH登陸密鑰管理
為了安全便捷的管理和維護服務器,禁止SSH密碼登陸,并用證書認證是比較好的選擇。其方法是用戶生成密鑰對,其私鑰嚴格保管不泄露,將公鑰添加到服務器上用戶對應的authorized_keys文件,然后就可以用證書方式進行登陸,在證書生成的時候,也可以對證書添加密碼,防止私鑰被盜用。

這種方式很方便,但是存在一個問題,就是當服務器比較多的時候,對服務器上公鑰的管理就會比較麻煩,容易當人員發生變化時候,容易清理遺漏,從而導致安全隱患。本文我們介紹一種通過中心CA統一簽發證書管理SSH證書的方法。
概述
為了解決統一管理的問題,引入CA來統一管理SSH的認證。用戶仍然需要生成一個公鑰和私鑰對證書。但是,認證不是通過將用戶公鑰添加服務器來完成,使用證書頒發機構(CA)密鑰對用戶公鑰進行簽名。簽名過程僅生成了第三個證書文件,用戶通過該簽發證書和自己原有的證書對就能完成登陸。
服務器上,只需配置SSH對CA的公鑰認證,服務器通過檢測用戶證書是否通過CA簽發,來完成認證過程。

具體做法
1. 創建CA
用戶生成一個證書頒發機構CA私鑰對,并保證私鑰的私鑰安全:
umask 77 # 修改掩碼,保證此后生成目錄和文件的權限
- mkdir ~/CC-ca && cd ~/CC-ca
ssh-keygen -C CA -f ca -b 4096 # 生成時候,給證書添加一個密碼,以防止泄露。
2. 配置CA公鑰認證
然后在服務器上,指定允許由CA簽名的所有用戶訪問該服務器:
將CA的公鑰上傳到服務器上,例如在/etc/ssh/ca.pub
在/etc/ssh/sshd_config添加下面的行,配置CA簽發的證書的信任:
- TrustedUserCAKeys /etc/ssh/ca.pub
重啟sshd服務:
- service sshd reload
3. 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文件夾。
4. 添加角色
上面就可以完成了證書的CA簽名和統一認證。但是還有一個問題,可能用戶也需要分類,不同的團隊和角色的,需要有不同的訪問權限。實際上,可以在簽名過程中添加角色,用來指定允許服務器的訪問權限。新添加用戶時候,即可使他們可以訪問所有相關服務器,而無需在這些服務器上添加任何內容。

5. 服務器上配置角色信息
創建用于配置訪問權限的文件夾:
- 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
6. 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角色的服務器。
7. 注銷證書
前面說了,可以對用戶證書進行注銷。注銷用戶需要用的用戶的序列號。建議同意維護一個用戶序列號的列表,或建立數據庫。
8. 注銷證書文件
通過下面的命令生成一個注銷證書文件
- 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的證書的訪問權限。
8. 服務器配置注銷
為了使服務器完成對撤銷密鑰配置,需要將生成的/更新的revoked keys文件添加到/etc/ssh/revoked-keys并在/etc/ssh/sshd_config配置:
- RevokedKeys /etc/ssh/revoked-keys
注意:請確保該revoked-keys文件為可訪問且可讀,否則會導致任何用戶都不能訪問。
總結
本文我們介紹了一個通過CA簽名用戶公鑰的證書統一管理方法。通過該方法可以實現基于角色通過ssh管理對服務器的訪問。只需要配置服務器一次(允許哪些角色訪問服務器)。對于每個用戶,只需要生成一個簽名證書,就可以實現按角色登陸所有相關機器的方法。也可以方便注銷用戶的證書,從而限制用戶的訪問。由于每個證書簽名都要有效性限制,即使未能及時注銷用戶權限,也可以在超過有效期后自動注銷,從而保證了安全。