有 chroot 的 SSH 只能工作「sftp」、「rsync」(兩者)?

有 chroot 的 SSH 只能工作「sftp」、「rsync」(兩者)?

我的 Ubuntu 伺服器中有兩個使用者和一個共用資料夾:

  1. 用戶writer,具有寫入權限/var/shared。它是一個使用 SSH 金鑰定期從遠端更改此資料夾中的檔案的應用程式。

  2. 使用者reader由多個具有 SSH 金鑰的用戶端使用,他們可以在未經我許可的情況下取得該金鑰,這就是為什麼我需要限制此 shell 中可用的命令。

問題:

我需要限制使用者可以存取的命令,reader以便它只能使用 sftp 和 rsync 協定(沒有像mkdirlstop、 ... 這樣的標準命令)。只有目錄/var/shared必須是可讀的,並且必須是根路徑,例如,不需要cd進入它,它已經/在 sftp 或 rsync 中。

我如何編寫一個 shell 腳本,以便我可以將它應用於將給出這種行為的usermod -s使用者?reader我找不到任何樣本。我如何使writer也保持「監禁」/var/share,以便路徑相同?

筆記:

  1. 我已經嘗試過sshd_configMatch指示ForceCommand internal-sftpChrootDirectory。這要求ChrootDirectory為 root 所有且不可寫(755 或更少),並且不支援rsync.

  2. 我已經嘗試過rssh,但它對於登入使用者的主目錄之外的目錄不起作用。所以我無法將使用者chroot到具有不同權限的相同目錄。

  3. command=".." ssh-rsa....我嘗試在文件中使用authorized_keys,但不知道如何啟用我需要的行為,我只檢查rrsyncrsync 文件中的腳本。這個方法沒有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 綁定安裝或某種符號連結解決方法在該目錄中進行存取。

如果您需要限製sftprsync,則需要藉助透過 ssh 公鑰或透過ssh 公鑰SSH_ORIGINAL_COMMAND強制執行的「包裝器」來檢查伺服器上的環境變量,該變數在使用者經過驗證後填充,並包含客戶端正在進行哪種連接的資訊建立。因為它會有內部,因為它會有,對於只是會話,它會有,IIRC,變數為空,因為它會是。在伺服器上經過身份驗證的用戶下運行!ForceCommandcommandsftpsftp-serverrsyncrsyncsshssh datedateSSH_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/

相關內容