Linux

有沒有辦法在成功的 SSH 登錄(不一定使用 shell 或 PTY)時執行特權命令?

  • October 18, 2014

我想在伺服器端成功登錄 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

引用自:https://unix.stackexchange.com/questions/131236