現象:CentOS/RHEL/Fedora 等啟用 SELinux 的系統安裝 vsftpd 後,FTP 用戶登入即報錯:
500 OOPS: cannot change directory:/home/username
500 OOPS: child died
根因:**SELinux 預設策略禁止 ftpd 進程存取用戶家目錄 (`/home/*`)**。vsftpd 需讀寫用戶家目錄作為 FTP 根目錄,被 SELinux 阻擋導致 `chdir()` 失敗,進程異常退出 (child died)。
# 開啟 ftpd_disable_trans 布爾值,允許 ftpd 以非受限域存取用戶目錄
setsebool -P ftpd_disable_trans 1
# 重啟 vsftpd 生效
systemctl restart vsftpd
# 或舊版
service vsftpd restart
# 檢查布爾值狀態
getsebool ftpd_disable_trans
# 輸出應為: ftpd_disable_trans --> on
# FTP 客戶端測試
ftp localhost
# 應正常登入、列表、上傳、下載
semanage fcontext -a -t public_content_t "/var/ftp(/.*)?"
restorecon -Rv /var/ftp
setsebool -P allow_ftpd_anon_write 1 # 若需匿名寫入
semanage fcontext -a -t user_home_dir_t "/home/username(/.*)?"
restorecon -Rv /home/username
setsebool -P ftp_home_dir 1 # 允許 ftpd 存取用戶家目錄 (需 policycoreutils-python)
setenforce 0
# 永久修改 /etc/selinux/config: SELINUX=permissive
| 布爾值 | 預設 | 作用 |
|---|---|---|
| ftpd_disable_trans | Off | 允許 ftpd 以非受限域運行,存取用戶家目錄 (最常用) |
| ftp_home_dir | Off | 允許 ftpd 存取帶有 `user_home_dir_t` 標籤的家目錄 |
| allow_ftpd_anon_write | Off | 允許匿名 FTP 寫入 `public_content_rw_t` 目錄 |
| allow_ftpd_full_access | Off | 允許 ftpd 完全存取所有檔案 (極寬鬆,慎用) |
| httpd_enable_ftp_server | Off | 允許 httpd 執行 FTP 伺服器功能 (極少用) |