我有一台启用了基于密码的 SSH 的 FreeBSD 服务器。我想启用sudo
,但我不希望潜在的攻击者只用一个密码就无法获得 root 访问权限。我当前的解决方案是使用公钥以 root 身份登录(对 root 禁用远程密码验证),并且我的普通用户不在 wheel 中,也sudo
没有安装。
过去,我使用一次性密码进行 sudo 访问(我可以使用公钥进入系统,但 sudo 需要 OTP,并且有 30 分钟的超时时间,让我可以真正完成工作而不必一直重新进行身份验证)。然而,这相当麻烦,至少使用 OPIE/S/Key 时是这样。使用硬件令牌可能没问题,但我现在没有。
我一直在寻找可以让我通过代理转发使用 SSH 公钥对 sudo 进行身份验证的方法。FreeBSD pam_ssh
附带的似乎没有这样做——它只通过查看用户是否可以解密服务器上的私钥来进行身份验证。我发现pam_ssh_agent_auth
,但我在其他地方很少找到关于它的引用。它现在是 0.9,但我有点犹豫是否要相信 root 网关,因为我找不到太多证据表明人们实际使用过这个程序。
所以,我的问题基本上有两个:
pam_ssh_agent_auth
在野外使用可靠吗?- 有没有其他好的解决方案来启用 sudo,同时仍然有登录密码的障碍?我曾考虑过使用第二个具有 sudo 访问权限且无需密码验证的帐户,但这似乎也有些麻烦。
答案1
您已经通过 OTP 解决了这个问题(更高的安全性 = 更多的麻烦),我无法对 pam_ssh_agent_auth 发表评论。但似乎您真正关心的不是 sudo,而是网络级访问。换句话说,您似乎关心的是授予特定主机或主机用户的权限,而不是特定系统帐户的权限。如果是这样,请考虑在 SSH 守护进程前实施端口敲击方案,这样 SSH 只能从特定 IP 和知道密钥敲击的人访问。之后,来自已知主机的常规旧公钥身份验证应该足够了。如果攻击者此时仍然可以获得 shell 访问权限,那么您可能无论如何都无法匹敌。
我能想到的唯一其他方案是在受信任的主机上使用 ssh 代理,当您处于不受信任的网络上时,您可以从该代理反弹连接(由于您身处 bsdworld,因此您甚至可以在主机上使用 jail 来实现这一点)。就我而言,攻击者拥有 shell 访问权限的任何盒子都完全被攻陷了,就是这样。他们是否获得 root 凭据完全无关紧要。您的努力最好花在防止第一次成功入侵上。
欢呼,-G
答案2
迈克尔,
您想要实现的目标可以通过两种方式实现:
你发现的一个是使用pam_ssh_agent_auth或者你可能想使用它的“可怜的表弟”:
ssh 到 localhost 与 SSH 密钥转发联合。 这里的分步说明指向 Ubuntu 服务器,但所有命令都应该适用于您的 FreeBSD,因为它们是 OpenSSH 本身的功能。
1.将密钥添加到ssh-agent:
user@workstation:~$ ssh-add
Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)
2.将密钥复制到目标服务器上的用户账户
user@workstation:~$ ssh-copy-id destination-server
user@destination-server's password:
Now try logging into the machine, with "ssh 'destination-server'", and check in:
~/.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
3.测试基于密钥的登录:
user@workstation:~$ ssh -A destination-server
Welcome to Ubuntu 11.04 (GNU/Linux 2.6.38-10-server x86_64)
* Documentation: http://www.ubuntu.com/server/doc
Last login: Mon Aug 8 20:38:48 2011 from 192.168.123.123
user@destination-server:~$
4.现在我们将 SSH 密钥复制到:/root/.ssh/
user@destination-server:~$ sudo cp ~/.ssh/authorized_keys /root/.ssh/
[sudo] password for user:
user@destination-server:~$ sudo ls -l /root/.ssh/au*
total 4
-rw------- 1 root root 392 2011-08-08 20:44 authorized_keys
5. 回到正常用户生活,我们检查 SSH Auth Socket 是否存在:
$ echo $SSH_AUTH_SOCK
/tmp/ssh-bUhwiw3004/agent.3004
6. 欢乐时光! 笔记:请记住,您的 SSHd 可能配置为拒绝 root 访问。记得启用它
user@destination-server:~$ ssh root@localhost
Welcome to Ubuntu 11.04 (GNU/Linux 2.6.38-10-server x86_64)
* Documentation: http://www.ubuntu.com/server/doc
Last login: Mon Aug 8 21:07:29 2011 from eedev.local
root@destination-server:~# id
uid=0(root) gid=0(root) groups=0(root)
7. 派对还没有结束...您可以放松一下,并使用别名稍微玩一下设置:
笔记:请记住 SSH 和 tty 关系往往很麻烦
user@destination-server:~$ alias sshudo='ssh -4 -t root@localhost'
user@destination-server:~$ sshudo id
uid=0(root) gid=0(root) groups=0(root)
Connection to localhost closed.
user@destination-server:~$ sshudo vi /etc/sudoers
瞧!
Welcome to Ubuntu 11.04 (GNU/Linux 2.6.38-10-server x86_64)
* Documentation: http://www.ubuntu.com/server/doc
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
"/etc/motd" 4 lines, 114 characters
8. 离开之前...进行微调:
user@destination-server:~$ sshudo vi /root/.ssh/authorized_keys
将其添加from="localhost"
到您正在使用的 SSH 密钥的前面。这将限制使用该密钥的远程用户访问并测试:
user@destination-server:~$ sshudo id
user@destination-server:~$ uid=0(root) gid=0(root) groups=0(root)
user@destination-server:~$ Connection to localhost closed.
注销并测试限制
user@destination-server:~$ exit
Connection to destination-server closed.
user@workstation:~$ ssh root@destination-server
root@destination-server's password:
希望这可以帮助。