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

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

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

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