我想在服务器端成功 SSH 登录后运行特权命令。但是,这必须在服务器配置中(sshd_config
或用户无法操纵或规避的任何其他内容),因为我需要强制执行此操作。也就是说,无论使用的系统帐户有多么受限,它都需要能够操作需要超级用户权限的数据(即ipset add
有条件地使用 - 我可以编写脚本)。哦,我希望能够访问 的内容SSH_CLIENT
,请 - 尽管有特权执行。该命令还必须不受 的影响ChrootDirectory
。
我知道/etc/ssh/sshrc
,但这似乎是“客户端”,即它由登录计算机的用户运行。
OpenSSH 中是否存在这样的工具?我使用的是6.6版本。
另外,手册页 ( ssh(1)
) 也不太清楚sshrc
:
/etc/ssh/sshrc
ssh
此文件中的命令在用户登录时、用户的 shell(或命令)启动之前 执行。请参阅sshd(8)
手册页以获取更多信息。
那么这是否意味着它也会在外部命令(通过ForceCommand
)或子系统internal-sftp
被调用时运行,尽管限制了 PTY 分配或强制等设置chroot
?如果是这样,/etc/sudoers
如果没有其他办法,我可以诉诸限制性入境。
注意:我是不是inetd
出于明显的原因使用(参见sshd(8)
),如上所述这里。
答案1
您可以使用 PAM 和pam_exec.so
模块。
您只需在“会话”部分添加一行/etc/pam.d/sshd
,如下所示:
session optional pam_exec.so /usr/local/bin/ipset-ssh
ipset-ssh
您创建的脚本在哪里。
该脚本将以 root 身份运行。您可以使用该变量获取客户端的 IP 地址PAM_RHOST
。您还需要检查该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
您的脚本可以简单如下:
#!/bin/bash
[[ "$PAM_TYPE" == "open_session" ]] && ipset add whitelist $PAM_RHOST