Sshd

ChrootDirectory 和使用者的主目錄如何協同工作?

  • September 19, 2019

我需要在 CentOS 7 上創建一個僅限 SFTP 的使用者。我已經從各種來源閱讀瞭如何做到這一點。該設置只需要支持單個使用者,並且只能通過 SFTP 訪問單個文件夾。

如果使用者的主目錄是/home/user並且sshd_config我有ChrootDirectoryas %h,假設 sshd 會將目錄更改/home/user為 chroot 之後:

ChrootDirectory 指定 chroot(2) 認證後的目錄路徑名。路徑名的所有組件必須是任何其他使用者或組不可寫的根目錄。在 chroot 之後,sshd(8) 將工作目錄更改為使用者的主目錄。

這是如何運作的?它肯定會失敗,因為 sshd 會嘗試 CD 到/home/user/home/user?

/home補充問題:對於是否在創建使用者時定義的主目錄中對此類使用者進行 chroot 或讓他們在eg之外進行 chroot 是否有最佳實踐/var/sftp/user?在外部創建 chroot 時/home,使用者主目錄的目的是什麼?還用來讀書~/.ssh/authorized_keys嗎?

您需要注意對用作 的目錄的其他限制ChrootDirectory:**路徑名的所有組件必須是任何其他使用者或組不可寫的根目錄。**如果使用者需要能夠在 chroot 中寫入自己的主目錄,則主目錄不能與ChrootDirectory.

歷史註釋:

OpenSSH 的 chroot 支持起源於一個單獨的更新檔,即使在它被集成到主要的 OpenSSH 發行版之後,對用作 ChrootDirectory 的目錄的確切要求也隨著不同的 OpenSSH 版本而改變。新版本通常傾向於執行比舊版本更嚴格的要求,以響應先前設置中發現的安全漏洞。

此外,在 chroot 內部和外部都適用相同的主目錄路徑的要求顯然不是最理想的,並且一些發行版已經應用更新檔來修改行為。不幸的是,過去並非所有此類更新檔都包含對手冊頁和其他相關文件的更新。

但是為了滿足書面要求,您可以這樣做,例如:

mkdir -p /jail/username/home

# First, the chroot directory:
chown root:root /jail/username
chmod 755 /jail/username

# Then, the user's home directory:
chown username: /jail/username/home
chmod 750 /jail/username/home
usermod -d /jail/username/home username

# And here's the magic:
cd /jail/username
ln -s . jail       # this would normally be a silly thing to do
ln -s . username   # but with chroot it can be useful

現在,我們可以設置ChrootDirectory /jail/%u.

在 chroot 之外查看時,使用者的主目錄將是/jail/username/home. 有點偏離正常的命名約定,但沒有什麼特別的。

在 chroot 內部,確實會引用相同的主目錄路徑 /jail/username/jail/username/home……但是您看到上面那兩個愚蠢的符號連結了嗎?取消引用它們,你會得到/jail/username/././home,它最終與/jail/username/home. 因此,相同的路徑最終指向 chroot 內部和外部的相同位置。

chroot 中的使用者將看到他們的主目錄/jail/username/home= /././home= /home,他們可以正常使用它。他們將能夠看到高於他們的主目錄的一層/,但只有 root 可以在那裡寫入。

這也將允許類似 syslog 樣式的日誌記錄:您可以創建一個 root 擁有的目錄/jail/username/dev並告訴在 …rsyslog創建一個額外的/dev/log樣式套接字,/jail/username/dev/log現在 chrooted 使用者可以生成日誌消息並讓它們由正常 syslog 子系統處理.

這絕不是安排 chroot 環境的唯一方法,儘管上述風格的設置使使用者的主目錄對於 chroot 之外的程序盡可能正常(= 沒有符號連結或其他怪異),如果這很重要的話。

如果您想要一個對被監禁的使用者最大程度地無菌的 chroot,您可以這樣做:

mkdir -p /jail/username/username

# Prepare the chroot directory
chown root:root /jail /jail/username
chmod 755 /jail /jail/username

# Prepare the user's actual home directory
chown username: /jail/username/username
chmod 750 /jail/username/username

# Make it usable outside the chroot too
ln -s /jail/username/username /username

# And now it can be assigned to the user.
usermod -d /username username

再次,我們設置ChrootDirectory /jail/%u.

在 chroot 之外,/username將是一個指向 的符號連結/jail/username/username,因此使用者的主目錄將是有效的。

對於 chrooted 程序/username將只是一個正常目錄,完全可以用作使用者的主目錄。

是的,實際的路徑名有點重複,符號連結會弄亂系統的根目錄,但在 chroot 環境中不會有任何多餘的東西。

如果chroot 使用者唯一需要的是 SFTP,那麼這個問題的公認答案描述了一種更簡單的方法。

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