我的 Ubuntu 伺服器中有兩個使用者和一個共用資料夾:
用戶
writer
,具有寫入權限/var/shared
。它是一個使用 SSH 金鑰定期從遠端更改此資料夾中的檔案的應用程式。使用者
reader
由多個具有 SSH 金鑰的用戶端使用,他們可以在未經我許可的情況下取得該金鑰,這就是為什麼我需要限制此 shell 中可用的命令。
問題:
我需要限制使用者可以存取的命令,reader
以便它只能使用 sftp 和 rsync 協定(沒有像mkdir
、ls
、top
、 ... 這樣的標準命令)。只有目錄/var/shared
必須是可讀的,並且必須是根路徑,例如,不需要cd
進入它,它已經/
在 sftp 或 rsync 中。
我如何編寫一個 shell 腳本,以便我可以將它應用於將給出這種行為的usermod -s
使用者?reader
我找不到任何樣本。我如何使writer
也保持「監禁」/var/share
,以便路徑相同?
筆記:
我已經嘗試過
sshd_config
和Match
指示ForceCommand internal-sftp
了ChrootDirectory
。這要求ChrootDirectory
為 root 所有且不可寫(755 或更少),並且不支援rsync
.我已經嘗試過
rssh
,但它對於登入使用者的主目錄之外的目錄不起作用。所以我無法將使用者chroot到具有不同權限的相同目錄。command=".." ssh-rsa....
我嘗試在文件中使用authorized_keys
,但不知道如何啟用我需要的行為,我只檢查rrsync
rsync 文件中的腳本。這個方法沒有chroot
我需要的功能。
至少能給我一個這樣的貝殼的樣品嗎?這可以透過腳本實現嗎?
歡迎使用 Bash 和 C++(如果需要)。輸出ldd /bin/bash
:
linux-vdso.so.1 => (0x00007fff7e9d1000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f79dfd8b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f79dfb87000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f79df7bd000)
/lib64/ld-linux-x86-64.so.2 (0x000055bd0767c000)
答案1
首先ChrootDirectory
必須由root擁有並且不能被其他使用者寫入。因此/var/shared
在你的情況下不能是ChrootDirectory
價值。
我建議建立一個只能由 root 使用者寫入的目錄,並且可以/var/shared
透過 Linux 綁定安裝或某種符號連結解決方法在該目錄中進行存取。
如果您需要限製sftp
或rsync
,則需要藉助透過 ssh 公鑰或透過ssh 公鑰SSH_ORIGINAL_COMMAND
強制執行的「包裝器」來檢查伺服器上的環境變量,該變數在使用者經過驗證後填充,並包含客戶端正在進行哪種連接的資訊建立。因為它會有內部,因為它會有,對於只是會話,它會有,IIRC,變數為空,因為它會是。在伺服器上經過身份驗證的用戶下運行!ForceCommand
command
sftp
sftp-server
rsync
rsync
ssh
ssh date
date
SSH_ORIGINAL_COMMAND
這可能是包裝器的開始:
#!/usr/bin/env bash
set -eu
set -o pipefail
[[ -z "${SSH_ORIGINAL_COMMAND:-}" ]] && exit 1
case "${SSH_ORIGINAL_COMMAND}" in
"/usr/libexec/openssh/sftp-server")
exec /usr/libexec/openssh/sftp-server
;;
"rsync --server"*)
exec ${SSH_ORIGINAL_COMMAND}
;;
*)
exit 1
;;
esac
正如您所看到的,ssh -v
它為您提供有關伺服器將執行哪些命令的資訊。因此,您/tmp
也可以更改包裝器中的其他內容。
$ rsync -a -e "ssh -v" bin localhost:/tmp/ 2>&1 | grep '^debug.*Sending command:'
debug1: Sending command: rsync --server -logDtpre.iLsfxC . /tmp/