簡體   English   中英

Apache如何訪問root用戶創建的SSL證書?

[英]How does Apache access SSL certs created by root user?

我有一台運行 Apache HTTPD 的 Debian 服務器。

我已將其配置為使用駐留在 /etc/ssl/private/ 中的某些 SSL 證書。 只有 root 用戶對該目錄具有讀寫訪問權限。 HTTPD 進程以 www-data 用戶身份運行,但它是由 root 用戶使用 init.d 腳本(HTTP 安裝附帶的)啟動的。

當 apache2 進程作為 www-data 運行並且 SSL 證書只能由 root 用戶讀取時,Apache 如何能夠毫無問題地讀取證書和功能?

我為用 Python 編寫的自定義服務器編寫的 init.d 腳本也面臨着類似的問題。 只要我不使用 SSL 證書,這個 init.d 腳本就可以正常工作。 一旦我添加了這些證書,該過程就不會開始,因為它無法讀取證書,因為 www-data 用戶無法讀取證書。

我也在類似的情況下使用了 nginx,結果與使用 Apache 時的結果相似。 那么這兩個項目是如何解決這個問題的呢?

當你跑

ps aux | grep apache2

你會注意到有一個root擁有的進程,我認為這可能是原因,因為這個進程可以訪問root擁有的文件/目錄。

在大多數情況下,Root 運行 Apache。
因此 root 是主“父”進程的所有者。

Apache 啟動時,它(通常)應該是使用 root 啟動的(部分原因是您必須將sudo與系統服務管理器一起使用才能正確啟動它)。 此外,父進程(以 root 用戶身份運行)然后讀取配置,綁定到給定的系統端口(通常是 80 和 443)和其他任務。 這些端口也被視為特權端口(低於 1024 的任何端口)。 完成后,它會生成子進程(也可以通過核心模塊使用“ worker ”)。

由於父進程是 root 並且子進程/worker 運行在“www-data”(或其他非特權用戶)下,Apache 仍然可以綁定到系統端口並在此處理 root 特權文件,例如私有 SSL 密鑰/等方式。

“雖然父進程通常在 Unix 下以 root 身份啟動以綁定到端口 80,但子進程和線程由服務器作為較低權限的用戶啟動。用戶和組指令用於設置權限Apache HTTP Server 子進程。子進程必須能夠讀取將提供的所有內容,但應盡可能少地擁有超出此范圍的權限。此外,除非使用 suexec,否則這些指令還設置了將要提供的權限由 CGI 腳本繼承。*”

來自:https ://httpd.apache.org/docs/2.4/mod/prefork.html#how-it-works

只有私鑰受到保護,因為證書在 /etc/ssl/certs 目錄中是公開可用的。 /etc/ssl/private 僅 root 可讀,但授予 ssl-cert 用戶組執行(ssl-cert 組 X 權限)。 該系統組可能是 SSL 身份驗證方法中涉及的系統組。

你能試試嗎:

sudo chown root:ssl-cert /etc/ssl/private/your-private.key

重新加載apache並再次檢查?

我已經清除了我服務器上的所有 Apache2 安裝,所以我不能再測試了。

希望有幫助,問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM