有没有办法在成功 SSH 登录后运行特权命令(不一定使用 shell 或 PTY)?

有没有办法在成功 SSH 登录后运行特权命令(不一定使用 shell 或 PTY)?

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

我知道/etc/ssh/sshrc,但这似乎是“客户端”,即它由登录计算机的用户运行。

OpenSSH 中是否存在这样的工具?我使用的是6.6版本。


另外,手册页 ( ssh(1)) 也不太清楚sshrc

/etc/ssh/sshrcssh此文件中的命令在用户登录时、用户的 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

相关内容