多站點文件權限
我花了一個多小時在網上搜尋答案,但令人驚訝的是,沒有一個適合我的問題。
我有一個小型專用伺服器,我在上面託管一些東西。主要是:一個 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 鎖定配置上的文章。