有沒有辦法在成功的 SSH 登錄(不一定使用 shell 或 PTY)時執行特權命令?
我想在伺服器端成功登錄 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 分配或強制 a 的設置chroot
?/etc/sudoers
如果是這樣,如果沒有其他辦法,我可以訴諸限制性入境。**注意:**我沒有使用這裡描述
inetd
的明顯原因(參見) 。sshd(8)
您可以使用 PAM 和
pam_exec.so
模組執行此操作。您只需
/etc/pam.d/sshd
在“會話”部分添加一行,如下所示: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