Oracle HTTP Server (OHS) 基於 Apache,預設以 Oracle 使用者運行,Linux 安全機制限制非 root 進程無法綁定 **< 1024 埠** (如 80、443)。解決方案:將 .apachectl 控制腳本擁有者改為 root 並設定 **setuid/setgid 位元**,使啟動過程暫時提權綁定低埠號。
/u00/app/oracle/product/fmw-11.1.1 (依實際安裝路徑調整)instance1ohs1export MW_HOME=/u00/app/oracle/product/fmw-11.1.1
cd $MW_HOME/Oracle_WT1/instances/instance1/bin
./opmnctl stopall
cd $MW_HOME/Oracle_WT1/instances/instance1/config/OHS/ohs1
cp httpd.conf httpd.conf.bak
# 編輯 httpd.conf,找到 Listen 指令
Listen 80
# 存檔
# 切換至 root 用戶
cd $MW_HOME/Oracle_WT1/ohs/bin
ls -la .apachectl
# 輸出範例:-rwxr-x--- 1 oracle oinstall 13278 Dec 17 03:54 .apachectl
chown root .apachectl
chmod 6750 .apachectl
# 6750 = setuid(4) + setgid(2) + owner(rwx=7) + group(r-x=5) + other(---=0)
ls -la .apachectl
# 預期輸出:-rwsr-s--- 1 root oinstall 13278 Dec 17 03:54 .apachectl
# s 位元表示 setuid/setgid 生效
注意:.apachectl 為隱藏檔 (以點開頭),ls -la 才能看見。
cd $MW_HOME/Oracle_WT1/instances/instance1/bin
./opmnctl startall
./opmnctl status -l
# 輸出應顯示 OHS 進程運行於埠 80
chmod 4750 (或 6750) 使 .apachectl 執行時 **有效 UID/GID 變為檔案擁有者 (root/oracle)**,暫時擁有 root 權限綁定埠 80。setuid(oracle) 降權回 Oracle 用戶運行 Worker 進程,僅 Master 進程短暫以 root 身分綁定埠口,符合最小權限原則。| 方案 | 操作 | 優/缺點 |
|---|---|---|
| Authbind | apt/yum install authbind → touch /etc/authbind/byport/80 → chmod 755 /etc/authbind/byport/80 → 啟動腳本加 authbind --deep | 無需 setuid root,較安全;需額外安裝套件 |
| setcap | setcap 'cap_net_bind_service=+ep' /path/to/httpd | 僅賦予綁定低埠能力,不給完整 root;需 filesystem 支援 xattr |
| iptables 轉發 | iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 7777 | OHS 仍聽 7777,核心層轉發;增加 NAT 開銷、複雜度 |
| Systemd AmbientCapabilities | 服務單元加 AmbientCapabilities=CAP_NET_BIND_SERVICE | 現代 systemd 原生做法,乾淨無 setuid;需 systemd 管理 OHS |