我有许多服务器共享一个共同的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
我打算生成一个证书,该证书只能在 server1 上以 root 身份登录,而不能在任何其他服务器上以 root 身份登录。我已确定这server1
是该服务器上的 FQDN(或 的完整内容/etc/hostname
)。sshd_config
有没有办法在不触及任何主机的情况下实现这一目标?
在不更改
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
文件中显式列出 CA 密钥和允许的主体。这些在Authorized_Keys 文件格式的手册页描述中有所介绍。cert-authority
principals=
sshd
问题是当您颁发 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
(notice%u
代表用户)。因此,如果用户证书具有此文件中列出的原则,用户将被授予访问权限。
此方案的授权原则文件将是
project-dev\nproject-super
project-dev\nproject-super
project-super
因此,根据您的需求制定策略。
root
注意:如果您仍然使用in颁发证书,Principles
它仍然可以工作。所以避免这种情况。我写了一篇博客来设置完整的 ssh 证书基础设施:
https://medium.com/better-programming/how-to-use-ssh-certificates-for-scalable-secure-and-more-transparent-server-access-720a87af6617