第八章:SSH代理身份验证

大多数系统管理员使用安全Shell(SSH)管理主机。大多数SSH身份验证都是使用公钥而不是密码进行的。如果您使用的是SSH代理,您可以告诉PAM使用pam_ssh_agent_auth将该代理用作身份验证源。

Pam_ssh_agent_auth(https://sourceforge.net/projects/pamsshagentauth/)其工作原理与基于SSH密钥的身份验证非常相似。该模块获取用户的authorized_keys文件,并询问用户的SSH代理是否有匹配的私钥。如果SSH代理拥有私钥,则模块返回PAM_SUCCESS。pam_ssh_agent_auth旨在对 sudo(1) 进行身份验证,因此我们将使用它。

使用用户的SSH密钥进行身份验证是对多因素身份验证的拙劣模仿。它证明用户拥有密钥文件和密码来解密它。当然,密钥文件不是物理的东西。它可以在机器之间复制和移动。但它比单纯的密码好一点。对于真正的双因素身份验证,您需要像Google Authenticator(第9章)这样的东西,或者投资安全令牌。另一方面,SSH代理身份验证使您无需在服务器上键入密码。

许多组织有合理的理由不使用SSH代理,或者不想以这种方式对程序进行身份验证。泄露用户的SSH客户端可能会导致服务器泄露。在许多环境中,这是一个合理的反对意见。但是pam_ssh_agent_auth是一个更简单的附加pam模块,所以这是一个开始探索的好地方。

此模块仅在您的环境连接到SSH代理时工作。如果您通过串行线登录,pam_ssh_agent_auth将无法通过串行线到达您的桌面并查询您的ssh代理。即使你想在任何地方部署pam_ssh_agent_auth,也要确保你有用于灾难恢复的替代身份验证方法。

安装 pam_ssh_agent_auth

基于CentOS和FreeBSD的系统提供了pam_ssh_agent_auth包。Debian有一个pam-ssh-agent-auth包(在我写这篇文章的时候,在实验存储库中)。

如果您的操作系统没有提供软件包,请从项目页面下载并编译。

配置 pam_ssh_agent_auth

所有pam_ssh_agent_auth配置都发生在pam配置文件中。最大的问题是找到用户的authorized_keys文件,但您也有调试和权限选项。

查找授权密钥

file 参数告诉pam_ssh_agent_auth在哪里可以找到用户的authorized_keys文件。最简单的配置将模块指向用户主目录中的 authorized_keys 文件:

波浪号字符(~)扩展到用户的主目录。您还可以使用%h表示用户的主目录。

对于更复杂的设置,特别是跨多个主机共享PAM配置的设置,可以使用%H表示短主机名,%u表示用户名,%f表示完整主机名。当集中管理关键文件时,这些功能会更多,这在许多大规模部署中很常见。这样的配置非常常见。

每个用户的公钥文件都以他们的用户名命名,位于 /etc/ssh/keys 目录中。因此,我的密钥文件将是 /etc/ssh/keys/mwl 。在这里,系统管理员团队有一个中央配置服务器,类似于Ansible或Puppet,并通过一个命令将密钥分发到数百台服务器。用户无法更新其 authorized_keys 文件。

有些主机甚至不将密钥文件保存在机器上,而是保存在LDAP等中央存储库中。这些主机运行一个命令来检索用户的密钥文件。使用 authorized_keys_command 参数和命令路径,而不是使用 file 参数:

获取用户密钥文件的命令使用单个参数运行,即需要检索其密钥的用户。Pam_ssh_agent_auth通常使用试图进行身份验证的用户。不过,如果你想始终检索特定用户的密钥,你可以添加 authorized_keys_command_user 选项和所需的用户。

这些选项应该可以让您将密钥文件放在适合您环境的任何地方。

密钥文件所有权

Pam_ssh_agent_auth假设用户主目录中的密钥文件应由用户拥有。不在用户主目录中的密钥文件应由root拥有。您可能允许用户在 /etc/ssh/keys 等中央存储库中编辑自己的密钥文件,但这种情况非常罕见,您需要使用 allow_user_owned_authorized_keys_file 选项告诉pam_ssh_agent_auth。

其他选项

如果您在使用pam_ssh_agent_auth时遇到问题,一定要尝试常用的调试选项。该模块将把其进度记录到系统的安全身份验证日志中。

pam_ssh_agent_auth预期与 sudo(1) 配合使用。如果您编译sudo以使用非标准PAM服务名称,请使用 sudo_service_name 选项、等号和您选择的服务名称告诉模块。

配置 sudo

sudo(1) 程序在获取任何权限之前会清除用户的环境。pam_ssh_agent_auth使用SSH_AUTH_SOCK环境变量来查找用户的ssh代理。根据您的sudo版本和操作系统,您可能需要配置 sudo(1) 以保留SSH_AUTH_SOCK环境变量。以下sudoers条目实现了这一点:

在我写这篇文章的时候,CentOS不需要这个设置,而Debian和FreeBSD需要。

Pam_ssh_agent_auth 和 PAM

那么,你怎么用这个东西?查找您系统的sudo(1) PAM配置。在大多数Linux系统中,它将放在 /etc/pam.d/sudo 中,而FreeBSD将把它放在 /usr/local/etc/pam.d/seudo 中。

现在最难的部分是:决定如何使用该模块。

您希望SSH代理身份验证足以获得sudo访问权限吗?将模块放在身份验证策略的顶部,并使用足够的控制。

您想同时需要SSH代理和密码吗?将pam_ssh_agent_auth放在最后一个pam_deny.so之前的某个位置,并使用所需的控件。

现在让我们来看看一种稍微多因素的身份验证方法。