CHROOT(Change Root)是類 Unix 系統改變進程「根目錄」視圖的系統調用,將進程及其子進程限制在指定目錄樹中,實現文件系統級隔離。本文深入解析 CHROOT 原理、環境構建步驟、用戶登錄集成、安全優勢與固有局限。
chroot(path) 系統調用(需 Root 權限)將調用進程的根目錄「/」重定向為 path。調用後:
path 之外的任何文件path 為起點(/etc/passwd 實為 $CHROOT/etc/passwd)CHROOT=/home/chroot
mkdir -p $CHROOT/{bin,sbin,lib,lib64,usr/bin,usr/sbin,usr/lib,usr/lib64,etc,home,dev,proc,var}
# 基礎 Shell 與工具
cp /bin/{bash,ls,cat,chmod,chown,cp,mv,rm,mkdir,rmdir,ps} $CHROOT/bin/
# 動態鏈接庫 (使用 ldd 檢查依賴)
for f in /bin/bash /bin/ls; do
ldd $f | grep -o '/[^ ]*' | sort -u | xargs -I{} cp -v {} $CHROOT{}
done
# 最小 /etc/passwd
echo 'root:x:0:0:root:/root:/bin/bash' > $CHROOT/etc/passwd
echo 'nobody:x:65534:65534:nobody:/nonexistent:/bin/false' >> $CHROOT/etc/passwd
# /etc/group
echo 'root:x:0:' > $CHROOT/etc/group
echo 'nogroup:x:65534:' >> $CHROOT/etc/group
# DNS 解析
cp /etc/resolv.conf $CHROOT/etc/
cp /etc/nsswitch.conf $CHROOT/etc/
# /dev 基礎設備
mknod -m 666 $CHROOT/dev/null c 1 3
mknod -m 666 $CHROOT/dev/zero c 1 5
mknod -m 666 $CHROOT/dev/tty c 5 0
mknod -m 666 $CHROOT/dev/urandom c 1 9
# 掛載 proc/sys (需宿主機支援)
mount --bind /proc $CHROOT/proc
mount --bind /sys $CHROOT/sys
mount --bind /dev $CHROOT/dev
在驗證密碼後、執行 Shell 前插入 chroot()。需重編譯 login,維護成本高。
# /etc/pam.d/ssh
auth required pam_chroot.so
/etc/security/chroot.conf:
# 用戶組 chroot路徑
@chrootusers /home/chroot
# /etc/ssh/sshd_config
Match Group sftpusers
ChrootDirectory /home/chroot/%u
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
| 風險類別 | 說明 | 緩解措施 |
|---|---|---|
| Setuid 程序殘留 | CHROOT 內若有 setuid root 程序,可提權逃逸 | 嚴格清理 CHROOT 內所有 setuid 文件 |
| 內核漏洞利用 | 本地提權漏洞不受 CHROOT 限制 | 及時內核補丁、Grsecurity/PaX、seccomp |
| 網絡訪問 | CHROOT 不隔離網絡棧,可發起連接、綁定端口 | 網絡命名空間、防火牆、seccomp 過濾 |
| 已加載守護進程 | 宿主機運行的 sshd、httpd 等若有漏洞,CHROOT 無法防護 | 最小化宿主機服務、容器化隔離 |
| /proc /sys 洩漏 | 掛載宿主機 proc 可讀取進程信息、內核參數 | 不掛載或使用 hidepid=2 選項 |
CHROOT 是容器技術的鼻祖,但現代生產環境建議使用:
CHROOT 提供基礎文件系統隔離,適合:
不適合:多租戶強隔離、非信任代碼運行、高安全需求場景。理解其邊界,選擇合適工具。