為什麼 Web 伺服器傳統上以超級使用者身份啟動?
考慮到未來的 Web 伺服器設置,令我震驚的是,出於某種原因,Web 伺服器通常以 root 身份啟動,然後放棄
setuid
工作程序的某些權限 ()。此外,還經常chroot
涉及,這並不完全是一種安全措施。我想知道的是,為什麼 Web 伺服器(我已經管理了從 Apache、lighttpd 到 nginx 的所有東西)不能在 Linux 上使用功能係統(
capabilities(7)
),例如CAP_NET_BIND_SERVICE
,而只是以非 root 使用者身份啟動?…這種方式仍然在偵聽低於 1024 的特權埠。或者更好,我認為他們中的大多數人都可以,但為什麼這不是常見的做法呢?為什麼不 …
- 在正在執行的二進製文件上使用
setcap(8)
with ?CAP_NET_BIND_SERVICE
- 設置日誌文件夾以允許(非root)使用者在那裡寫入
- …,如果您覺得有
chroot
幫助,請使用chroot
或lxc
“監禁”網路伺服器?除了(工人)子程序可能會殺死我可以想出的父程序之外,沒有什麼比直接從
root
.那麼,為什麼他們傳統上以 root 身份啟動,而之後一切都已完成以消除隨之而來的隱含安全問題?
儘管 POSIX 有一個我認為包括 CAP_NET_BIND_SERVICE 的功能標準,但這些不是一致性所必需的,並且在某些方面可能與例如 linux 上的實現不兼容。
由於像 apache 這樣的網路伺服器不是只為一個平台編寫的,因此使用 root 權限是最便攜的方法。我想它可以專門在 linux 和 BSD(或檢測到支持的任何地方)上執行此操作,但這意味著行為會因平台而異,等等。
在我看來,您可以配置您的系統,以便可以以這種方式使用任何 Web 伺服器;這裡有一些關於這個 WRT apache 的(可能是笨拙的)建議:NonRootPortBinding。
那麼,為什麼他們傳統上以 root 身份啟動,而之後一切都已完成以消除隨之而來的隱含安全問題?
它們以 root 身份啟動,因為它們通常需要訪問特權埠,而傳統上這是唯一的方法。他們後來降級的原因是因為他們隨後不需要特權,並且限制了伺服器常用的無數第三方附加軟體帶來的潛在損害。
這並不是不合理的,因為特權活動非常有限,並且按照慣例,許多其他系統守護程序會連續執行 root,包括其他 inet 守護程序(例如,
sshd
)。請記住,如果伺服器被打包以便它可以作為具有 CAP_NET_BIND_SERVICE 的非特權使用者執行,這將允許任何非特權使用者啟動 HTTP(S) 服務,這可能是一個更大的風險。