我有很多服务器共享一个共同的TrustedUserCAKeys
.我想签署一个用户证书,以便它授予对特定服务器的某些访问权限,而不是所有服务器的访问权限。
例如,以下命令生成一个可用于在所有服务器上以 root 身份登录的证书:
ssh-keygen -s ca -I example -n root id_rsa.pub
我尝试了以下命令,但它生成了一个......无用的证书。
ssh-keygen -s ca -I example -n root@server1 id_rsa.pub
我打算生成一个只能以 root 身份登录 server1 的证书,而不能以 root 身份登录任何其他服务器。我已确保这server1
是该服务器上的 FQDN(或 的完整内容/etc/hostname
)。有没有办法在不接触任何主机的情况下实现这一目标sshd_config
?
答案1
在不更改sshd_config
文件的情况下,答案通常是否定的。实现这一点的机制是设置一个AuthorizedPrincipalsFile
(或AuthorizedPrincipalsCommand
)。如果没有此指令sshd_config
,默认行为是身份验证尝试的用户名必须按字面形式列为嵌入在证书中的主体之一。这就是为什么“root”可以工作,但“root@server1”却不能。
为了使使用 'root@server1' 的证书起作用(无需添加条目/root/.ssh/authorized_keys
),您需要AuthorizedPrincipalsFile
为 root 用户配置一个(后来的 OpenSSH 版本允许在Match
块内使用此指令),并列出 'root@server1',并在其他服务器上执行类似的操作。您还可以扩展它以允许适用于服务器组的证书,例如“root@dev”甚至“root@*”,只要每个适当的风格在AuthorizedPrincipalsFile
.
.ssh/authorized_keys
实现此目的的另一种方法是使用cert-authority
和选项显式列出文件中的 CA 密钥和允许的主体principals=
。这些内容包含在sshd
Authorized_Keys 文件格式的手册页描述中。
答案2
问题是,当您颁发 ssh 证书时,如果您直接输入,root
您Principals
将授予对所有信任您的 CA 的服务器的访问权限。
为了避免这种情况,切勿颁发带有username
.相反,要制定访问策略。一个典型的场景是有些人需要访问测试服务器,有些人需要访问数据库服务器,有些人需要访问所有服务器。所以我创造了多个原则
project-dev
- 访问开发/测试服务器project-databases
- 访问数据库服务器project-super
- 访问所有服务器
为了实现这个添加AuthorizedPrincipalsFile /etc/ssh/auth_principals/%u
文件sshd_config
。
因此,当有人尝试使用用户名登录服务器时root
,它将检查文件/etc/ssh/auth_principals/root
(通知%u
代表用户)。
因此,如果用户证书具有此文件中列出的原则,则用户将被授予访问权限。
此场景的授权原则文件将是
- 开发服务器 -
project-dev\nproject-super
- 数据库服务器 -
project-dev\nproject-super
- 生产服务器 -
project-super
因此,根据您的需求制定策略。
root
注意:如果您仍然使用in颁发证书,Principles
它仍然可以工作。所以要避免这种情况。
我写了一篇博客来设置完整的 ssh 证书基础设施: