萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP chroot() 改變根目錄:原理、限制、安全應用與容器化替代方案

函式原型

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 "失敗: 權限不足或路徑無效";
}

關鍵限制

實務部署步驟 (建立最小 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();'

安全應用場景

  1. FTP/SFTP 伺服器隔離:vsftpd、ProFTPD 使用 chroot 限制用戶目錄
  2. 舊版共享主機隔離:早期虛擬主機技術
  3. 建構/測試環境隔離:編譯不可信代碼

現代替代方案 (更強隔離、更易管理)

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
限制說明
僅限 Unix-likeWindows 無此系統呼叫
需 root 權限普通用戶無法呼叫
SAPI 限制僅 CLI、CGI、Embed SAPI 可用 (Apache mod_php、PHP-FPM 不支援)
不改變目前目錄chroot 後 getcwd() 仍為舊路徑,需自行 chdir('/')
動態連結器問題chroot 後需在新根目錄內備妥 libc、ld-linux 等共享庫