ChrootDirectory 和使用者的主目錄如何協同工作?
我需要在 CentOS 7 上創建一個僅限 SFTP 的使用者。我已經從各種來源閱讀瞭如何做到這一點。該設置只需要支持單個使用者,並且只能通過 SFTP 訪問單個文件夾。
如果使用者的主目錄是
/home/user
並且sshd_config
我有ChrootDirectory
as%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,那麼這個問題的公認答案描述了一種更簡單的方法。