0xC*_*22L 4 linux root openssh sshd
我想在服务器端成功 SSH 登录后运行特权命令。但是,这必须在服务器配置中(sshd_config或用户无法操纵或规避的任何其他内容),因为我需要这是强制性的。也就是说,无论使用的系统帐户有多大限制,它都需要能够操作需要超级用户权限的数据(即ipset add有条件地使用- 我可以编写脚本)。哦,我希望能够访问 的内容SSH_CLIENT,尽管有特权执行。该命令也必须不受ChrootDirectory.
我知道/etc/ssh/sshrc,但这似乎是“客户端”,即它由登录机器的用户运行。
OpenSSH 中是否存在这样的功能?我使用的是 6.6 版。
此外,手册页 ( ssh(1)) 并不是很清楚sshrc:
/etc/ssh/sshrc该文件中的命令在ssh用户登录时执行,就在用户的 shell(或命令)启动之前。有关sshd(8)更多信息,请参阅手册页。
那么这是否意味着它也会在外部命令(via ForceCommand)或子系统(如internal-sftp被调用)时运行,尽管限制了 PTY 分配等设置或强制执行chroot? 如果是这样,/etc/sudoers如果没有其他办法,我可以诉诸限制性入境。
注意:我没有使用这里描述的inetd明显原因(请参阅sshd(8))。
您可以使用 PAM 和pam_exec.so模块执行此操作。
您只需/etc/pam.d/sshd在“会话”部分添加一行,如下所示:
session optional pam_exec.so /usr/local/bin/ipset-ssh
Run Code Online (Sandbox Code Playgroud)
ipset-ssh您创建的脚本在哪里。
该脚本将以 root 身份运行。您可以使用该PAM_RHOST变量获取客户端的 IP 地址。您还需要检查PAM_TYPE变量,因为您的脚本将在登录和注销时执行。登录时PAM_TYPE将设置为open_session。在注销时它设置为close_session。
这是我从一个简单的测试中得到的完整变量列表(我放入env > /tmp/pamenv了脚本):
PAM_SERVICE=sshd
PAM_RHOST=127.0.0.1
GNOME_KEYRING_CONTROL=/home/phemmer/.cache/keyring-vJUUda
PAM_USER=phemmer
PWD=/
GNOME_KEYRING_PID=19742
SHLVL=1
PAM_TYPE=open_session
PAM_TTY=ssh
_=/usr/bin/env
Run Code Online (Sandbox Code Playgroud)
您的脚本可能很简单:
#!/bin/bash
[[ "$PAM_TYPE" == "open_session" ]] && ipset add whitelist $PAM_RHOST
Run Code Online (Sandbox Code Playgroud)