![记录或限制ssh登录的源用户](https://linux22.com/image/98866/%E8%AE%B0%E5%BD%95%E6%88%96%E9%99%90%E5%88%B6ssh%E7%99%BB%E5%BD%95%E7%9A%84%E6%BA%90%E7%94%A8%E6%88%B7.png)
是否可以记录和/或限制 ssh 登录的源用户?
例如:
user1@server1
登录server2
为user2
.
另外,user3@server1
登录server2
为user2
.
我所说的“源用户”是指user1
或user3
以上。
我希望能够跟踪哪个会话是由 发起的user1@server1
以及哪个会话是由 发起的user3@server1
。
这样做的目的是多个用户可以使用该user2
帐户来管理服务器 2 上的进程等。 (我意识到这存在安全隐患,但这个问题的一部分是评估这些隐患的程度)。
正如 的手册页中提到的sshd_config(5)
,sshd
能够使用AllowUsers
中的配置选项限制对特定用户的访问sshd_config
。
允许用户
该关键字后面可以跟一个用户名模式列表,以空格分隔。如果指定,则仅允许与其中一种模式匹配的用户名登录。仅用户名有效;无法识别数字用户 ID。默认情况下,允许所有用户登录。如果模式采用 USER@HOST 形式,则分别检查 USER 和 HOST,从而限制来自特定主机的特定用户的登录。允许/拒绝指令按以下顺序处理:DenyUsers、AllowUsers、DenyGroup,最后是AllowGroups。
但USER
上面的手册页中指定的似乎是描述目标计算机上的用户名(server2
在示例中)。
我通过将 AllowUsers 选项设置为 来测试这一点user2@server1
,发现我仍然能够从user1@server1
->登录user2@server2
。
此外,日志似乎没有显示任何源用户。
这是 RHEL6 上的日志/var/log/secure
,登录后从user1@server1
->user2@server2
11 月 17 日 16:14:59 server2 sshd[28349]:将 /proc/self/oom_score_adj 设置为 0
11 月 17 日 16:14:59 server2 sshd[28349]:来自 10.1.2.3 端口 36508 的连接
11 月 17 日 16:14:59 server2 sshd[28349]:找到匹配的 RSA 密钥:aa:bb:cc:dd:ee:ff:gg:..
11 月 17 日 16:14:59 server2 sshd[28350]:从 10.1.2.3 端口 36508 ssh2 推迟了 user2 的公钥
11 月 17 日 16:14:59 server2 sshd[28349]:找到匹配的 RSA 密钥:aa:bb:cc:dd:ee:ff:gg:..
11 月 17 日 16:14:59 server2 sshd[28349]:从 10.1.2.3 端口 36508 ssh2 接受 user2 的公钥
11 月 17 日 16:14:59 server2 sshd[28349]: pam_unix(sshd:session): 由 (uid=0) 为用户 user2 打开会话
11 月 17 日 16:14:59 server2 sshd[28349]:用户子进程的 pid 为 28351
那么,有什么办法可以
(a) 更改 的日志记录或行为,sshd
以便跟踪进行 ssh 连接的源用户?
(b) 限制 sshd 根据源用户限制连接?
答案1
简短的回答是否定的,服务器将接受从服务器端角度来看的任何有效登录。
然而,有一些可能的解决方法可以实现您想要的。测试并查看以下内容是否满足您的需求。
笔记这对于“普通”用户来说可能就足够了,并且要求您还控制客户端。有经验的用户会找到一种方法来伪造CLIENTUSER
下面使用的变量。
通过使用AcceptEnv
in 中的指令,/etc/ssh/sshd_config
您可以接受一个名为 CLIENTUSER 的变量:
AcceptEnv CLIENTUSER
下一步是强制用户登录命令到登录 shell,例如:
ForceCommand /bin/bash -l
重新启动 sshd 服务并将以下内容添加到 /etc/profile
if [ -z "$CLIENTUSER" ] || [ "$CLIENTUSER" != "user3" ] && [ ! -z "$SSH_CLIENT" ]
then
echo 'Client logon not allowed'
logout
fi
以上将注销每个不发送变量CLIENTUSER
或发送CLIENTUSER
具有不同于 的值的变量的客户端user3
。
您可以使用以下客户端命令行对此进行测试:
$ ssh user2@host
Client logon not allowed
$ CLIENTUSER=user3 ssh -o "SendEnv CLIENTUSER" user2@host
user2@host $
正如您所看到的,CLIENTUSER
可以通过命令行轻松伪造。为了防止这种情况,您可以将以下内容添加到客户`/etc/配置文件:
declare -r CLIENTUSER="$USER"
当用户尝试更改CLIENTUSER
变量的值时,他/她将收到以下错误:
bash: CLIENTUSER: readonly variable