linux – 有没有办法在成功的SSH登录时运行特权命令(不一定是shell或PTY)?

我想在服务器端成功进行SSH登录时运行特权命令.但是,这必须在服务器配置中(sshd_config或用户无法操纵或规避的任何其他内容),因为我需要这是强制性的.也就是说,无论使用的系统帐户受到限制,它都需要能够处理需要超级用户权限的数据(即有条件地使用ipset add – 我可以编写脚本).哦,我希望能够访问SSH_CLIENT的内容,尽管有特权执行.该命令也必须不受ChrootDirectory的影响.

我知道/ etc / ssh / sshrc,但它似乎是“客户端”,即它正由登录到机器的用户运行.

OpenSSH中是否存在这样的功能?我使用的是6.6版.

另外,手册页(ssh(1))对于sshrc并不是很清楚:

/etc/ssh/sshrc
Commands in this file are executed by ssh when the user logs in, just before the user’s
shell (or command) is started. See the sshd(8) manual page for more information.

这是否意味着它也会在外部命令(通过ForceCommand)或internal-sftp之类的子系统被调用时运行,尽管限制了像PTY分配或强制chroot这样的设置?如果是这样的话,如果没有别的办法,我可以诉诸限制性的/ etc / sudoers条目.

注意:我没有使用inetd,原因很明显(参见sshd(8)),如here所述.

最佳答案
您可以使用PAM和pam_exec.so模块执行此操作.

您只需在/etc/pam.d/sshd中添加一行到’session’部分,如下所示:

session    optional    pam_exec.so /usr/local/bin/ipset-ssh

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

您的脚本可以像下面这样简单:

#!/bin/bash
[[ "$PAM_TYPE" == "open_session" ]] && ipset add whitelist $PAM_RHOST

转载注明原文:linux – 有没有办法在成功的SSH登录时运行特权命令(不一定是shell或PTY)? - 代码日志