函式原型
chroot(string $directory): bool
// 僅限 CLI/CGI/Embed SAPI,需 root 權限,Windows 不支援
核心概念
chroot 將目前進程的「根目錄 /」重新定義為指定目錄。進程及其子進程**無法存取**新根目錄外的任何檔案,形成隔離環境 (chroot jail)。
基本用法 (需 root)
<?php
// 必須以 root 執行:sudo php chroot.php
if (chroot('/var/www/jail')) {
echo "新根目錄: " . getcwd(); // 顯示 "/"
// 此處無法存取 /etc/passwd、/bin/bash 等系統檔案
} else {
echo "失敗: 權限不足或路徑無效";
}
關鍵限制
| 限制 | 說明 |
| 僅限 Unix-like | Windows 無此系統呼叫 |
| 需 root 權限 | 普通用戶無法呼叫 |
| SAPI 限制 | 僅 CLI、CGI、Embed SAPI 可用 (Apache mod_php、PHP-FPM 不支援) |
| 不改變目前目錄 | chroot 後 getcwd() 仍為舊路徑,需自行 chdir('/') |
| 動態連結器問題 | chroot 後需在新根目錄內備妥 libc、ld-linux 等共享庫 |
實務部署步驟 (建立最小 chroot 環境)
# 1. 建立目錄結構
mkdir -p /var/www/jail/{bin,lib,lib64,etc,usr/bin,usr/lib}
# 2. 複製 PHP 執行檔與依賴庫
cp $(which php) /var/www/jail/bin/
ldd $(which php) | grep -o '/[^ ]*' | xargs -I{} cp -v {} /var/www/jail/{}
# 3. 基礎系統檔案
cp /etc/passwd /etc/group /etc/nsswitch.conf /etc/resolv.conf /var/www/jail/etc/
# 4. PHP 擴展 .so 檔案
cp /usr/lib/php/20210902/*.so /var/www/jail/usr/lib/
# 5. 執行測試
chroot /var/www/jail /bin/php -r 'echo getcwd();'
安全應用場景
- FTP/SFTP 伺服器隔離:vsftpd、ProFTPD 使用 chroot 限制用戶目錄
- 舊版共享主機隔離:早期虛擬主機技術
- 建構/測試環境隔離:編譯不可信代碼
現代替代方案 (更強隔離、更易管理)
1. Linux Containers (LXC/LXD)
lxc launch ubuntu:22.04 my-container
lxc exec my-container -- php script.php
2. Docker (行業標準)
docker run --rm -v $(pwd):/app -w /app php:8.2-cli php script.php
3. Systemd-nspawn
systemd-nspawn -D /var/www/jail /bin/php script.php
4. gVisor / Kata Containers (硬體級隔離)
用於多租戶、不可信代碼執行環境。
PHP 內建替代:open_basedir
; php.ini 或 .user.ini
open_basedir = /var/www/html:/tmp:/usr/share/php
// 限制 PHP 腳本只能存取指定路徑樹,無需 root、跨平台
總結
chroot 是底層隔離機制,現代雲原生環境**極少直接使用**。開發者應優先考慮 open_basedir (輕量)、Docker (標準)、或沙箱服務 (如 AWS Lambda、Google Cloud Run)。理解 chroot 有助於掌握容器隔離本質,但生產部署請用成熟工具鏈。
copyright ©
萬盛學電腦網 all rights reserved