如何为每个用户配置基于ssh主机的身份验证(CentOS/RHEL 7/8)
在本文中,我将分享在Linux服务器和客户端的sshd_config和ssh_config中配置基于主机的身份验证的步骤,以及基于主机的身份验证与公钥身份验证之间的比较。
基于主机的身份验证与基于公钥的身份验证
在配置方面,基于主机的身份验证与SSH公共密钥身份验证不同,尽管在后端,两者均使用公共主机密钥身份验证执行安全连接。
下面我汇总了主机密钥身份验证与公共密钥身份验证之间的比较和区别的列表
基于SSH主机的身份验证 | SSH公钥身份验证 |
---|---|
默认情况下在主机级别进行身份验证 | 默认情况下在用户级别进行身份验证 |
一旦启用和配置,服务器上的所有用户都可以进行身份验证(除非使用“sshd_config”中的“Match”指令进行了限制) | 私钥和公钥对是在每个用户级别配置的(除非所有用户通过将私钥和公钥放在各自的位置来使用相同的密钥) |
使用公钥-私钥组合进行安全连接 | 使用公钥-私钥组合进行安全连接 |
一旦安装了openssh rpm,就在/etc/ssh 下创建公钥和私钥对 | 使用ssh keyen 实用程序手动创建公钥和私钥对 |
私钥默认存储在用户~/.ssh/ (在客户端)的主目录下 | 私钥存储在主机(在客户端)的默认位置,即/etc/ssh 下 |
复制公钥并将内容添加到“/etc/ssh/ssh_known_hosts”文件中;将公钥复制到服务器并将内容添加到相应用户主目录的“authorized_keys”文件中。例如:~/.ssh/authorized_keys | |
复制公钥的首选工具是“ssh keyscan”,尽管可以使用rsync、sftp等任何其他tol;复制公钥的首选工具是“ssh copy id”,尽管可以使用scp、rsync或者类似工具手动完成 | |
通过“/etc/ssh/sshd_config”中的“HostbasedAuthentication”启用;通过“/etc/ssh/sshd_config”中的“PubkeyAuthentication”启用 | |
ssh使用“ssh keysign”访问本地主机密钥,并在基于主机的身份验证过程中生成所需的数字签名;ssh公钥身份验证仅执行公钥和私钥对匹配 |
Linux中有关SSH公钥身份验证(带有和不带有密码)的更多详细信息
我的实验室环境
我正在使用RHEL 7和8 Linux主机来配置基于主机的身份验证。其中rhel-7
将是我的客户端,通过它我将启动SSH连接,而rhel-8
将充当服务器。
[root@rhel-7 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.10.10.7 rhel-8.example.com rhel-8 10.10.10.10 rhel-7.example.com rhel-7
我在两个节点上都禁用了本文的selinux。
为主机配置基于主机的身份验证
在客户端(ssh_config)
在客户机或者源主机上,必须配置此文件,此外,在/etc/ssh下必须至少存在一个主机密钥:
/etc/ssh/ssh_config
-允许客户端请求基于主机的身份验证
在尝试对所有计算机进行主机密钥认证的客户端上,在/etc/ssh/ssh_config
中启用以下值:
Host * EnableSSHKeySign yes HostbasedAuthentication yes
说明:
缺省情况下," ssh-keysign"是禁用的,并且只能通过将" EnableSSHKeysign"设置为" yes",在全局客户端配置文件"/etc/ssh/ssh_config"中启用。
服务器上必须至少存在以下文件之一,并且包含适当的私钥。使用的私钥应与存储在服务器或者目标主机的" ssh_known_hosts"文件中的公钥匹配。可以使用四种类型中的任何一种,即RSA,ECDSA或者Ed25519. DSA不应再使用。然后,在安装openssh软件包时,会自动在`/etc/ssh'下创建这些键。
-rw-------. 1 root root 668 Dec 4 12:12 ssh_host_dsa_key -rw-r--r--. 1 root root 613 Dec 4 12:12 ssh_host_dsa_key.pub -rw-r-----. 1 root ssh_keys 227 May 20 16:30 ssh_host_ecdsa_key -rw-r--r--. 1 root root 162 May 20 16:30 ssh_host_ecdsa_key.pub -rw-r-----. 1 root ssh_keys 387 May 20 16:30 ssh_host_ed25519_key -rw-r--r--. 1 root root 82 May 20 16:30 ssh_host_ed25519_key.pub -rw-------. 1 root root 988 Dec 4 12:12 ssh_host_key -rw-r--r--. 1 root root 653 Dec 4 12:12 ssh_host_key.pub -rw-------. 1 root root 1679 Dec 4 12:13 ssh_host_rsa_key -rw-r--r--. 1 root ssh_keys 405 Dec 4 12:13 ssh_host_rsa_key.pub
接下来重新启动sshd
服务以激活更改
[root@rhel-7 ~]# systemctl restart sshd
在服务器端(sshd_config)
必须修改服务器或者目标主机上的三个文件,以使基于主机的身份验证起作用:
/etc/ssh/shosts.equiv
/etc/ssh/ssh_known_hosts
-保存客户端的身份/etc/ssh/sshd_config
-打开主机密钥认证/root/.shosts
-仅需启用使用密钥的root用户登录
通过修改以下值,在/etc/ssh/sshd_config中启用基于主机的身份验证
[root@rhel-8 ~]# egrep ^'HostbasedAuthentication|IgnoreRhosts' /etc/ssh/sshd_config HostbasedAuthentication yes IgnoreRhosts no
接下来,在sshshosts.equiv
文件中提供客户端<hostname>和root用户,如下所示。其中我的主机名不是rhel-7.example.com
。
[root@rhel-8 ~]# cat /etc/ssh/shosts.equiv rhel-7.example.com root
说明:
ssh使用/usr/libexec/openssh/ssh-keysign
来访问本地主机密钥并生成主机密钥认证期间所需的数字签名。它们应该由root拥有,只能由root读取,并且其他人不能访问。
接下来,为客户端提供一个公共密钥,并使用ssh-keyscan
将密钥添加到/etc/ssh/ssh_known_hosts
中。
提示:
如果我们没有指定密钥类型,则ssh将选择ecdsa
。要指定密钥类型,请使用-t,后接<key_type>例如ssh-rsa。
[root@rhel-8 ~]# ssh-keyscan rhel-7.example.com >> /etc/ssh/ssh_known_hosts # rhel-7.example.com:22 SSH-2.0-OpenSSH_7.4 # rhel-7.example.com:22 SSH-2.0-OpenSSH_7.4 # rhel-7.example.com:22 SSH-2.0-OpenSSH_7.4
由于我们选择了默认密钥类型,因此此命令将从客户端节点/etc/ssh/ssh_host_ecdsa_key.pub
获取公共主机密钥,并将其添加到服务器节点上的/etc/ssh/ssh_known_hosts
以启用主机。密钥认证。
验证" ssh_known_hosts"文件的内容,该内容应与客户端节点上的" /etc/ssh/ssh_host_ecdsa_key.pub"相同
[root@rhel-8 ~]# cat /etc/ssh/ssh_known_hosts rhel-7.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINMVXhySksiT4SiRUJ4uDyjWb0MAQ79biNYSFReELxqt rhel-7.example.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAmATinLkAUc6xcbdVOeNVaUS2LeWyKwks/CBZqMfk+Z7odrPwOiVcCpjz2eoQENWzKnQO7UxR2TzQuTls4n4Zk=
以下是客户端节点的内容
[root@rhel-7 ssh]# cat /etc/ssh/ssh_host_ecdsa_key.pub ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAmATinLkAUc6xcbdVOeNVaUS2LeWyKwks/CBZqMfk+Z7odrPwOiVcCpjz2eoQENWzKnQO7UxR2TzQuTls4n4Zk=
要为根用户启用主机密钥认证,请在根主目录.shosts下的新文件中提供客户端 <hostname>
和root
用户名。
[root@rhel-8 ~]# cat ~/.shosts rhel-7.example.com root
接下来重新启动sshd
服务以激活更改
[root@rhel-8 ~]# systemctl restart sshd
现在,我们用于设置主机密钥身份验证的配置已完成。我们可以使用任何用户尝试从rhel-7
连接到rhel-8
[root@rhel-7 ~]# ssh -v rhel-8.example.com .. debug1: Authentications that can continue: gssapi-keyex,gssapi-with-mic,password,hostbased debug1: Next authentication method: hostbased .. debug1: Authentication succeeded (hostbased). Authenticated to rhel-8.example.com ([10.10.10.7]:22). .. debug1: Sending env LANG = en_US.UTF-8 Last login: Thu Nov 21 23:50:06 2019 from rhel-7.example.com [root@rhel-8 ~]#
我们也可以尝试使用非root用户进行连接
[root@rhel-7 ~]# ssh -v rhel-8.example.com -l hynman .. debug1: Authentications that can continue: gssapi-keyex,gssapi-with-mic,password,hostbased debug1: Next authentication method: hostbased .. debug1: Authentication succeeded (hostbased). Authenticated to rhel-8.example.com ([10.10.10.7]:22). .. Last login: Thu Nov 21 23:49:48 2019 from rhel-7.example.com [hynman@rhel-8 ~]$
因此,我们的主机密钥身份验证正在按预期方式工作。
为每个用户配置基于主机的身份验证
现在,使用上述配置,我们可以使服务器上的所有用户都能够进行身份验证,而无需使用用于主机密钥身份验证的口令和密码。
但是,我们还可以使用Match指令为每个用户或者组对基于主机的身份验证应用过滤器或者限制
假设我的服务器上有两个用户(rhel-8
)
hynman
→允许主机密钥认证并禁用公共密钥认证rahul
→允许公共密钥身份验证并禁用基于主机密钥和密码的身份验证All other
→对于系统上的所有其他用户,仅允许基于密码的身份验证
为此,我们可以在/etc/ssh/sshd_config中添加以下条目
Match User hynman PasswordAuthentication no HostbasedAuthentication yes Match User rahul HostbasedAuthentication no PasswordAuthentication no PubkeyAuthentication yes Match all PasswordAuthentication yes
接下来重新启动sshd服务
[root@rhel-8 ~]# systemctl restart sshd
现在,如果我们尝试使用用户节点" rahul"从客户端节点进行连接
[root@rhel-7 ~]# ssh rhel-8.example.com -l rahul Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
如我们所见,它不支持基于主机和密码的身份验证
同样,对于root用户,该工具会提示输入密码
[root@rhel-7 ~]# ssh rhel-8.example.com [email protected]'s password:
我们可以启用调试模式并获取有关支持的身份验证模式的更多详细信息。
最后,我们能够使用针对" hynman"用户的基于主机的身份验证连接到我们的服务器
[root@rhel-7 ~]# ssh rhel-8.example.com -l hynman Last login: Thu Nov 21 23:54:21 2019 from rhel-7.example.com [hynman@rhel-8 ~]$
重要的提示:
为了对主机密钥认证启用这种用户级别的限制,我们必须从sshd_config文件中注释掉这些指令的任何条目,否则默认情况下,将优先使用这些指令。例如,如果我们在sshd_config文件中将" PasswordAuthentication"指定为" yes",然后在同一文件中再次使用" Match"指令,并提供" PasswordAuthentication"作为" no",则可能不起作用。
对主机密钥身份验证进行故障排除
在配置基于主机的身份验证时,我遇到了一些错误:
错误:
userauth_hostbased mismatch: client sends rhel-7.example.com, but we resolve 10.10.10.10 to rhel-7
解决方案:之所以出现这种情况,是因为我们禁用了UseDNS指令,这就是sshd_config无法解析主机名的原因。一旦在sshd_config中启用了该指令,就应该解决此问题。