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

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

具體做法
1. 創(chuàng)建CA
用戶生成一個證書頒發(fā)機構(gòu)CA私鑰對,并保證私鑰的私鑰安全:
umask 77 # 修改掩碼,保證此后生成目錄和文件的權(quán)限
- mkdir ~/CC-ca && cd ~/CC-ca
 
ssh-keygen -C CA -f ca -b 4096 # 生成時候,給證書添加一個密碼,以防止泄露。
2. 配置CA公鑰認(rèn)證
然后在服務(wù)器上,指定允許由CA簽名的所有用戶訪問該服務(wù)器:
將CA的公鑰上傳到服務(wù)器上,例如在/etc/ssh/ca.pub
在/etc/ssh/sshd_config添加下面的行,配置CA簽發(fā)的證書的信任:
- TrustedUserCAKeys /etc/ssh/ca.pub
 
重啟sshd服務(wù):
- service sshd reload
 
3. CA簽發(fā)用戶證書
用戶使用ssh-keygen生成證書,并且把公鑰發(fā)給CA中心,CA中心用私鑰對該證書添加簽名:
- ssh-keygen -s ca -I USER_ID -V +12w -z 1 id_ecdsa.pub
 
命令行說明:
- -s ca 想使用CA進(jìn)行簽名
 - -I USER_ID -用戶ID/用戶名
 - -V +12w -證書過期前的時間,該例子中證書有效期為12周
 - -z 1 設(shè)置證書的序列號,可以用證書的序列號來注銷證書。
 - id_ecdsa.pub:需要簽名的用戶公鑰
 
生成證書id_ecdsa-cert.pub,該證書需要發(fā)送給開發(fā)人員,用戶將其放入~/.ssh文件夾。
4. 添加角色
上面就可以完成了證書的CA簽名和統(tǒng)一認(rèn)證。但是還有一個問題,可能用戶也需要分類,不同的團隊和角色的,需要有不同的訪問權(quán)限。實際上,可以在簽名過程中添加角色,用來指定允許服務(wù)器的訪問權(quán)限。新添加用戶時候,即可使他們可以訪問所有相關(guān)服務(wù)器,而無需在這些服務(wù)器上添加任何內(nèi)容。

5. 服務(wù)器上配置角色信息
創(chuàng)建用于配置訪問權(quán)限的文件夾:
- mkdir /etc/ssh/auth_principals
 
在該文件夾中,可以使用服務(wù)器用戶名創(chuàng)建文件,該用戶可以登錄。例如,要授予對某些角色的root用戶訪問權(quán)限,請?zhí)砑游募?etc/ssh/auth_principals/root。
在/etc/ssh/auth_principals/root文件中,配置可以以root用戶身份登錄的角色,每行一個角色,比如
- admin_dev
 - root_op
 - ROLE1
 
在服務(wù)器上SSHD配置文件/etc/ssh/sshd_config,添加對角色的認(rèn)證:
- AuthorizedPrincipalsFile /etc/ssh/auth_principals/%u
 
然后重新加載sshd服務(wù)
- service sshd reload
 
6. CA簽發(fā)帶角色的用戶證書
可以使用一下命令行,簽發(fā)帶角色的證書:
- ssh-keygen -s ca -I USER_ID -n ROLE1,ROLE2 -V +12w -z 2 id_ecdsa.pub
 
與以前命令行一樣,多增加了-n ROLE1,ROLE2標(biāo)志。
現(xiàn)在,該用戶可以登錄到auth_principals文件配置了ROLE1或ROLE2角色的服務(wù)器。
7. 注銷證書
前面說了,可以對用戶證書進(jìn)行注銷。注銷用戶需要用的用戶的序列號。建議同意維護(hù)一個用戶序列號的列表,或建立數(shù)據(jù)庫。
8. 注銷證書文件
通過下面的命令生成一個注銷證書文件
- ssh-keygen -k -f revoked-keys -u -s ca list-to-revoke
 
當(dāng)已經(jīng)有一個revoked-keys列表并想要更新證書時候(-u標(biāo)志)。
在list-to-revoke文件內(nèi)容由用戶名(IDS)或序列號(的-z生成期間標(biāo)志)是這樣的:
- serial: 1
 - id: test.user
 
這將撤消對序列號為1的證書和所有ID為test.user的證書的訪問權(quán)限。
8. 服務(wù)器配置注銷
為了使服務(wù)器完成對撤銷密鑰配置,需要將生成的/更新的revoked keys文件添加到/etc/ssh/revoked-keys并在/etc/ssh/sshd_config配置:
- RevokedKeys /etc/ssh/revoked-keys
 
注意:請確保該revoked-keys文件為可訪問且可讀,否則會導(dǎo)致任何用戶都不能訪問。
總結(jié)
本文我們介紹了一個通過CA簽名用戶公鑰的證書統(tǒng)一管理方法。通過該方法可以實現(xiàn)基于角色通過ssh管理對服務(wù)器的訪問。只需要配置服務(wù)器一次(允許哪些角色訪問服務(wù)器)。對于每個用戶,只需要生成一個簽名證書,就可以實現(xiàn)按角色登陸所有相關(guān)機器的方法。也可以方便注銷用戶的證書,從而限制用戶的訪問。由于每個證書簽名都要有效性限制,即使未能及時注銷用戶權(quán)限,也可以在超過有效期后自動注銷,從而保證了安全。















 
 
 


 
 
 
 