我想創建一個只能做一件事的用戶:透過 ssh 指定一個駐留在一個特定資料夾中的腳本(以及該腳本的命令列參數)(出於這個問題的目的,讓我們稱之為它/local/remote_only_scripts/foo
)並執行該腳本並傳回它的輸出。
為了清楚起見,我不希望使用者能夠做一些事情的例子:
- 本機登入帳戶。登入應用程式是
/bin/login
.它不是/local/remote_only_scripts/foo
資料夾中的腳本,因此不應由使用者呼叫。 - 遠端登入帳戶。再次登入(是 ssh 呼叫的嗎?)不是相關資料夾中的腳本。
- 列出目錄的內容。 ls 位於
/bin/ls
.它不是適當目錄中的腳本。 - 編輯該目錄中的檔案。 emacs、vi、gedit 大多數其他編輯器不是該目錄中的腳本。
- 查看該目錄中文件的內容。
- 執行該目錄下他無權執行的文件。
請注意,這些是例子還有許多其他操作我不希望用戶能夠執行。在考慮某個操作時,請詢問“這是由 中的腳本完成的嗎/local/remote_only_scripts/foo
?”如果答案是否定的,則使用者不應該能夠這樣做。如果答案是肯定的,那麼用戶應該能夠做到這一點。
PS:讓我澄清一下「添加用戶」的意思。我的意思並不是將使用者新增到某些 ssh 子系統。相反,我的意思是向電腦系統添加用戶。例如,我有一個運行 debian stable 的系統,透過它的位址呼叫它,www.hg.bar.com。我想添加一個用戶(透過 kuser、users-admin 或 useradd 或某種類似的方式)稱他為 hg_guest。 hg_guest 無法本機登入或執行上述清單中的任何操作。 hg_guest 所能做的就是「遠端」執行腳本。我說他應該可以透過ssh來做到這一點,但現在想想,也許允許他使用ssh可能會讓他在本地登錄,所以可能需要一些其他機制。
答案1
有一個命令authorized_keys 檔案中的選項。這個選項似乎完全符合你的要求。
請注意,它不是 chroot 或受限 shell。它只允許透過 ssh 執行這些命令。以你的例子來說,它將是:
ssh somehost /local/remote_only_scripts/foo
對於這個authorized_keys檔:
command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key...
如果您不希望用戶能夠本地登錄,有很多方法。您可以:
- 只需將其外殼設置為/bin/假(也許你需要/bin/真因為 ssh 需要有效登入)
- 鎖定其密碼,請參閱
passwd -l
編輯:新增了更多限制選項並闡明如何刪除本機存取權限。
答案2
嘗試將此作為使用者的登入 shell:
#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
if [ ! -x "$basedir/$prog" ]; then
echo "Invalid program: $prog"
else
case "$prog $args" in
*\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
echo "Invalid character in command";;
*)
eval "$prog $args"
echo;; # force a trailing newline after the program
esac
fi
done
您可能還希望將其authorized_keys
明確地包含在文件中,如 Coren 的回答所示;但替換 '.../foo;與這裡的程式。這將阻止來自 SSH 的命令,例如sftp
、scp
和ssh hostname command
。
答案3
萬一他們只需要存取一個腳本,這對我來說非常有效。新增使用者並將其預設 shell 變更為腳本的路徑。當他們透過 ssh 連線時,它將執行腳本並關閉會話。
server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest
server1:/ # grep hg_guest /etc/passwd
hg_guest:x:2002:100::/home/hg_guest:/local/remote_only_scripts/foo/script.sh