Nginx

多站點文件權限

  • November 2, 2019

我花了一個多小時在網上搜尋答案,但令人驚訝的是,沒有一個適合我的問題。

我有一個小型專用伺服器,我在上面託管一些東西。主要是:一個 Owncloud 伺服器和一些網站供我和我的朋友使用(主要是 Wordpress、MediaWiki 之類的東西……)。

我將 Nginx 用於不同的站點(每個站點一個 conf.d 文件)。

對於每個需要 php 的站點,我創建了一個 php-fpm 池。

對於每個站點:

  • 我創建了一個使用者:$$ website_user $$.
  • 我在其主目錄中創建了一個 public_html 目錄。
  • 如有必要,我會通過 sftp 讓使用者訪問此目錄。
  • 我將 php-fpm 池配置為在下執行$$ website_user $$.
  • 我將每個站點的文件設置為由$$ website_user $$:$$ nginx $$使用者
  • 我將每個站點的文件權限設置為 750

這是好習慣嗎?這種模式有缺陷嗎?

我的 Owncloud 託管了一些非常敏感的資訊(即使它們是加密的並且它“只是”一個私人伺服器:我不是 CIA 或大公司)。

我應該在 chroot 中為 Owncloud 執行另一個 Nginx 伺服器還是我的設置足夠安全?

你有正確的事情(在不同的使用者下執行 PHP-FPM 池),但有一些例外。

假設您的 NGINX 工作程序執行為nginx,PHP-FPM 池執行為foo.

從列表頂部向下,問題是:

我將每個站點的文件設置為由

$$ website_user $$:$$ nginx $$使用者

錯誤的。如果 PHP 腳本創建了一些文件(例如處理上傳),那麼該文件可能歸foo:foo. 隨後,無法保證 NGINX 以後能夠讀取它。

foo:foo所以最好的方法是從一開始就擁有所有文件。

現在要做的神奇事情是讓執行 NGINX 工作程序的使用者成為foo使用者組的成員。複雜?不是這樣:

usermod -a -G foo nginx

這將使nginx使用者成為foo網站使用者組(補充)。換句話說,nginx使用者現在是這些組的一部分:nginx並且foo. 該站點使用者foo是 only 的成員foo

對於將在另一個 PHP-FPM 池中的使用者下執行的另一個網站bar,您將執行相同操作:將nginx使用者添加到bar.

通過這種方式,您現在可以通過調整chmod設置的組部分,非常靈活地定義 NGINX 可以看到什麼和不可以看到什麼。

如果您現在想要,您可以使用限制最少的 chmod,它將0750用於目錄和0640文件。然後 NGINX 可以看到一切,PHP-FPM 也可以。一種在站點文件中進行設置的簡單方法:

chmod -R u=rwX,g=rX,o= /path/to/site/dir

我正在使用X,以便僅在目錄上設置執行檔(意味著在 dirs 的上下文中遍歷)位。因此,0750僅當文件為0640.

但是你可以很容易地限制更多。說,NGINX 不應該讀取/config.php,因為它僅由 PHP 使用者讀取,不需要被 NGINX “讀取”,因此您可以輕鬆地做到:

chmod 0600 config.php

它仍然可以按需要工作。

如果您沒有在 NGINX 配置中進行任何文件存在檢查(例如 no if (-f $request_filename) {),那麼您甚至可以0600在每個 PHP 文件上設置相同的內容,甚至0400可以為鎖定配置進行設置:) 例如,請參閱我在Magento 鎖定配置上的文章。

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