我几乎一整天都在努力解决这个问题,并且取得了一些进展,但我仍然有点卡住了。我希望能够使用私钥文件对 SSH 会话进行身份验证,然后使用相同的身份验证对 sudo 请求进行身份验证。我连接的系统是使用 Putty 和 Pageant 的 Windows 机器。我连接的系统是运行 13.10 Saucy(32 位)的 Ubuntu 机器,特别是 OpenSSH 服务器。我已成功生成 4096 位 RSA 密钥,并且能够使用它毫无问题地连接到 SSH 会话。
为了方便 sudo 身份验证,我尝试安装并使用 libpam-ssh-agent-auth。它位于 SourceForge 上,并在此处有记录:http://pamsshagentauth.sourceforge.net/ 网上有大量关于这个库的信息和操作指南,但是这些信息和指南大多已过时和/或针对特定发行版。
我的一些进展:我发现您必须启用用户代理转发并在 Putty 中启动并运行 Pageant,才能成功让用户代理实际显示在 Ubuntu 服务器上。我还必须将“AllowAgentForwarding yes”添加到 /etc/ssh/sshd_config,并将“Defaults env_keep += SSH_AUTH_SOCK”行添加到 /etc/sudoers(在其他 3 个 Defaults 行之后)。这些更改似乎允许 SSH 身份验证套接字传播到 sudo 命令,如终端中测试的那样:
echo "$SSH_AUTH_SOCK"
/tmp/ssh-4LcT4GZtZ8/agent.6725
sudo echo "$SSH_AUTH_SOCK"
/tmp/ssh-4LcT4GZtZ8/agent.6725
在进行这些更改之前,我根本没有获得 SSH_AUTH_SOCK,而且只能在普通命令提示符下获得它,在 sudo 中则无法获得。进行上述更改可使身份验证套接字顺利通过 sudo。
最后一步似乎是安装 libpam-ssh-agent-auth,然后对 /etc/pam.d/sudo 进行适当的配置更改。我曾尝试自己编译它,也从两个不同的 PPA 安装预编译的 .debs,作为我实现它工作的一部分(就像我说的,我尝试了一整天)这最后一步让我陷入困境。基本上,尽管配置正确,但我没有成功。
据我所知,我的测试用例应该是运行“sudo -K”,然后 sudo 任何命令。-K 会重置 sudo 计时器,在下一次尝试 sudo 时强制重新进行身份验证。
我没有成功。
我当前的 /etc/pam.d/sudo 文件:
#%PAM-1.0
auth required pam_env.so readenv=1 user_readenv=0
auth required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
auth sufficient pam_ssh_agent_auth.so file=~/.ssh/authorized_keys
auth requisite pam_unix.so nullok_secure
@include common-auth
@include common-account
@include common-session-noninteractive
我想这可能是发布此类内容的好地方。
答案1
我能自己解决这个问题。
解决此问题的关键是检查 /var/log/auth.log 文件。检查此日志后,我发现了错误
pam_ssh_agent_auth: Authentication refused: bad ownership or modes for file
这让我想到了第一个问题:必须正确设置文件所有权和权限才能继续进行 SSH 身份验证。我专门运行了“chmod 700 -R ~/.ssh”,这解决了该特定错误,但当我尝试 sudo 时,我收到三次“密码不正确”的消息,然后 sudo 失败。
为了解决这个问题,我最终修改了 /etc/pam.d/sudo 文件,特别是注释掉除了以下行之外的所有内容
auth sufficient pam_ssh_agent_auth.so file=~/.ssh/authorized_keys debug allow_user_owned_authorized_keys_file
这远非理想,但给了我一个起点。对 /etc/pam.d/sudo 文件的进一步编辑应该允许其他类型的身份验证也能正常工作。