Nginx

nginx 的安全性

  • July 12, 2017

介紹

好的,我即將成為新的生產網路的問題非常複雜(至少對我而言)。我正在向更有經驗的 linux 使用者尋求建議,尤其是關於設置我所描述的網路的安全方法的建議。我仍然是所有這一切的新手,但我現在負責建立這個新網路。

目前,我在一個負載均衡器、三個網路伺服器和一個 apache 中的數據伺服器的設置上執行了大約 150 多個網站。現在一切都很好,但是由於性能的巨大提升,我正在嘗試在新的 debian 中使用 nginx 設置一個新網路。

我已經閱讀了很多關於 nginx 和 apache 的資訊,執行了幾十個測試來比較兩種情況下的性能,得出的結論是 nginx 在高壓下(我們幾乎只執行 WordPress 站點)處理請求比主要是 apache 快得多因為靜態文件(有時在一頁中超過 100 個,瀏覽器顯然可以兌現但仍然如此)。

目前設置

  • Debian 9
  • nginx 1.10.3
  • php-fpm (7.0)
  • LDAP 3

我將網站的所有數據都安裝在每個網路伺服器的 /websites 目錄中。nginx 和 fpm 的配置文件也位於那裡的配置目錄中。每個網站(我將使用 example.com)都有自己的使用者(通過 ldap 進行身份驗證)並且在網站組中(也在 ldap 中)。因此,每個使用者在 /websites 文件夾中都有他的主目錄,其權限為 700 所有者 example.com 和組網站。這樣做是為了讓每個網站都在自己孤立的“孤島”中執行。

這意味著對於每個網站配置,我都有一個 php fpm 配置,它為每個使用者使用不同的套接字。意思是,它只能在自己的網站目錄中執行php文件,對吧?對於 PHP,這可以正常工作,我寧願不更改此配置。

問題

問題來了,nginx 更快,因為它直接提供靜態文件,而 apache(我們之前如何配置它)使用 mpm-itk 模組為每個使用者創建單獨的程序,然後提供靜態文件或 PHP。

Nginx 以不同的方式做到這一點,通過為每個使用者使用具有不同套接字的 php fpm,我實現(至少使用 php)與 mpm-itk 模組為 apache 所做的相同。但是 nginx 不能這樣做,並嘗試在使用者 nginx 執行時提供所有靜態文件(預設為 www-data)。所以輸出是由 PHP 生成的(工作正常),但 nginx 沒有顯示靜態文件的權限。

一天多來,我一直在嘗試尋找解決方案,並得出了一些不同的結論。

以root身份執行

我的同事說以 root 身份執行 nginx 可以解決這個問題,當然可以,但這對我來說似乎並不安全。如果我這樣做,不妨刪除整個“每個網站都有自己的使用者”政策。

將 www-data 添加到網站組

如果我可以將 unix 使用者(在這種情況下為 www-data)添加到 ldap 組(顯然我不能),我可以給組(網站)讀取權限(而不是目前的 700),以便它可以讀取靜態文件到處。唯一的問題是,網站也可以相互讀取文件,這是我試圖避免的。所以這似乎也不是一個合適的解決方案。

SELinux

我閱讀了一些關於 SELinux 的文件和介紹,對我來說,這似乎是解決此問題的一種複雜方法。我從來沒有使用過它,並且在這樣的生產網路上執行它似乎不是一個好主意,因為我不知道我在用它做什麼。

結論

那麼,從我現在所處的位置開始,更有經驗的使用者會走哪條路呢?在 SELinux 上做更多研究?應用裝甲?或者是否有另一種更簡單的方法來獲得與 apaches mpm_itk 提供的相同的安全性。

這是我遇到的最後一個問題,我不是在尋找所有配置文件來設置它以及我需要執行的確切命令,這一切都完成了。

我希望有更多經驗的人能給我一些建議或指出正確的方向。無論如何,非常感謝!

SELinux 值得花時間投資恕我直言,它實際上並不像您只想確定文件夾的權限時那樣複雜。

但是讓我拋出一個曲線球……如果它主要是 Wordpress,我會使用帶有 Wordpress 記憶體外掛的 Litespeed Webserver。您可以通過網路伺服器級別的記憶體獲得極快的 Wordpress:

https://www.litespeedtech.com/products/cache-plugins/wordpress-acceleration

Litespeed 內置了一個易於實現的 chroot 功能,可以解決您的安全問題:

https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:config:chroot

“chroot”是類 Unix 系統上的一項功能,可以更改程序的根目錄。更改的根程序及其子程序無法訪問新根目錄之外的任何文件。這就像將一個程序放入具有物理文件訪問邊界的監獄中,這種機制通常被稱為“chroot 監獄”。

當然,也可以使用 Nginx 進行 chrooting:

https://gir.me.uk/posts/nginx-php-fpm-with-chroot.html

Litespeed 的管理 GUI 讓它變得非常簡單,可能比從 CLI 執行所有操作更符合您的經驗水平。

除了 Chroot,你還有 SuEXEC 選項:

https://www.litespeedtech.com/support/wiki/doku.php/litespeed_wiki:config:suexec-mode

SuEXEC 是一項功能,它允許 LiteSpeed Web 伺服器在 Web 伺服器程序的 UID 之外的 UID(使用者 ID)下執行 CGI/FastCGI/LSAPI/PHP/Ruby 或任何外部 Web 應用程序。

這進一步解決了您以 root 身份執行 Nginx 的主要擔憂。

我目前將 Nginx 和 Litespeed 用於生產 Wordpress 站點。對於您所描述的高流量情況,我會隨時推薦使用專用外掛的 Litespeed。此外,您還可以獲得將 Nginx 和 Litespeed 與 Apache 分開的快速文件服務的所有其他好處。

引用自:https://serverfault.com/questions/859656