Linux

LAMP/Apache2:如何將 webhook API PHP 文件設置為公共但在項目根目錄之外?

  • July 18, 2017

我有一個 AWS EC2 LAMP 伺服器(使用 Apache 2.0 和 mod_php5),其基本目錄結構如下:

   var
   |-- www
   |   `-- api_folder (NOT public)
   |   |   |-- sensitive files (NOT public)
   |   |   |-- folder with sensitive files and 1 public webhook API file
   |   |   |   |-- sensitive files (NOT public)
   |   |   |   |-- **Public_Webhook.php file receiving POST <== (PUBLIC)**
   |   |   |   |-- sensitive files (NOT public)
   |   '-- public_html (PUBLIC)
   |   |   |-- files_and_folders (PUBLIC)
   |   |   |-- ...

問題

  1. PHP 文件是否需要公開訪問才能從某些服務接收 POST webhook?
  2. 如果是,是否可以在Public_Webhook.php file receiving POST其所在文件夾和其餘內容都是私有且公眾無法訪問時將其設為公開?
  3. 如果可能的話,我是否只需chmod 700(我是否需要自己設置文件,600或者如果我將文件夾設置為自動完成700?)整個私有 API 文件夾並將私有 PHP 文件的權限設置為644

編輯/更新

跑步$ ps aux | grep http,讓我:

$ ps aux | grep http
root     32267  0.0  1.9 370488 19968 ?        Ss   14:40   0:00 /usr/sbin/httpd
apache   32275  0.0  2.5 459372 26324 ?        S    14:40   0:00 /usr/sbin/httpd
apache   32276  0.0  2.6 460168 27080 ?        S    14:40   0:00 /usr/sbin/httpd
apache   32277  0.0  2.5 459400 26412 ?        S    14:40   0:00 /usr/sbin/httpd
apache   32278  0.0  2.5 459240 26272 ?        S    14:40   0:00 /usr/sbin/httpd
apache   32279  0.0  2.5 459372 26304 ?        S    14:40   0:00 /usr/sbin/httpd
apache   32280  0.0  2.5 459372 26288 ?        S    14:40   0:00 /usr/sbin/httpd
apache   32314  0.0  2.5 459372 26288 ?        S    14:50   0:00 /usr/sbin/httpd
apache   32316  0.0  2.5 459372 26288 ?        S    14:50   0:00 /usr/sbin/httpd
apache   32319  0.0  2.5 459236 26240 ?        S    14:50   0:00 /usr/sbin/httpd
apache   32324  0.0  2.4 458332 25132 ?        S    14:50   0:00 /usr/sbin/httpd
ec2-user 32524  0.0  0.2 110456  2208 pts/0    S+   15:50   0:00 grep --color=auto http

所以我的 apache 使用者很簡單apache(而我假設在某些發行版上,這就像www-dataorubuntu等​​)。

目前,我沒有 aa/public_html目錄,但這是我計劃設置的。目前,我的公用文件夾/var/www/html/和所有敏感文件都在該目錄中——哎呀!

$ ls -l /var/www/html顯示了這一點:

drwxrwsr-x 2 ec2-user www 4096 Jul  2 19:56 archive
-rw-r--r-- 1 ec2-user www  364 Jul  7 00:02 config.ini.php
drwxrwsr-x 4 root     www 4096 Jun 30 21:42 private_api_files
drwxrwsr-x 2 root     www 4096 Jun 26 21:29 some_assets
-rw-r--r-- 1 ec2-user www  643 Jul  6 00:02 mail_test.php
-rw-rw-r-- 1 root     www   18 Jul  5 22:53 phpinfo.php
drwxrwsr-x 7 ec2-user www 4096 Jul  2 20:25 PHPMailer-master

幾乎所有這些目錄/文件都是私有的,並且將包含敏感資訊。出於某種原因,這看起來是錯誤的,但我對此太陌生了。


解決方案?

如果我錯了,請糾正我。所以,

  1. 我會移動.../Public_Webhook.php到同時將敏感文件留在原處並在 webhook PHP 文件中正確重新連結它們。/var/www/html/**public_html**/
  2. 然後,我將在新創建的私有上執行以下命令並將其更改為:/var/www/html/**private_api_files**/

$ chown -R apache:apache /var/www/html/private_api_files/

$ chmod -R go-rwx /var/www/html/private_api_files/

$ chmod -R 700 3. 然後我會在新創建的/var/www/html/**public_html**/

$ chown -R apache:apache /var/www/html/public_html/

$ chmod -R rwxr-xr-x /var/www/html/public_html/

$ chmod -R 755

或者

  1. 將所有敏感文件移出/var/www/html/和移入文件夾是否會更乾淨,例如並簡單地將所有內容公開 - 看起來這樣,我不必更改所有權/權限或 Apache DocumentRoot 指令設置,對嗎?)/var/www/**all_sensitive_api_files**/``/var/www/html/

PS:我的伺服器故障點太低了,我什至不能投票給你:/

在您的情況下, php 與 apache forks 本質上是同一個使用者。因此,擁有子 apache 程序的使用者是需要訪問文件的使用者。

使用者 apache 按照 apache conf 文件中的配置執行。您可以通過執行以下命令來驗證此使用者在您正在執行的系統上的身份:

ps aux | grep http

您將看到一個 root 擁有的程序,以及許多您感興趣的子程序。

從目錄的角度來看,這是需要 RX 權限的使用者。

在系統上的每個使用者都需要訪問它的意義上,沒有什麼需要是“公共的”,但是執行 apache 的使用者需要訪問它將讀取的任何文件。

有一個 Apache webroot 的概念。您可以在 conf 文件中配置它,通常在使用DocumentRoot指令的 vhost 部分中。可以通過正在執行的 Apache 伺服器訪問 webroot 下的文件。看來 public_html 是您的 webroot。如果是這種情況,那麼 Public_Webhook.php 應該在 webroot 下。

然而,這並不意味著任何私有文件都需要位於 webroot 下。您可以定義這些文件的路徑並從 Public_Webhook.php 訪問它們,這是一種常見的做法。

大多數帶有前端控制器的框架只將前端控制器本身與靜態資產一起放在 webroot 下。所有其他文件都放置在 webroot 之外並根據需要包含在內。

同樣,任何私有文件都必須由執行 Apache 的使用者訪問,並且您可以根據需要將這些權限設置為開放或受限。

至於預設權限和文件所有權,這個問題有很多。有 umask,然後你可以做一些更精細的事情。您可以為用於擁有相關目錄的使用者配置 unmask,並且設置該使用者的 umask 可能會在將新文件添加到現有目錄時解決您的問題。有關umask 基礎知識,請參閱此站點

有關安裝目錄 acl 可以做的更高級的事情, 請參閱此問題。

更改目錄的權限只需要使用萬用字元和/或遞歸選項的某種組合。這適用於所有權和燙髮:

所有權,遞歸更改:

chown -R apache:apache /some/dir

燙髮:

遞歸刪除組/其他的所有權限

chmod -R go-rwx  /some/dir

設置所有者僅遞歸地燙髮:

chmod -R 700

同樣,請記住,需要訪問文件的 php 腳本不需要對該文件的執行權限。

令人困惑的是,該目錄需要執行權限才能讓 apache(或任何使用者)讀取其中的文件。文件本身(不包括將被執行的 .php 腳本)不必執行,並且可以設置為 apache 僅具有 R 訪問權限。

從安全的角度來看,如果 apache 使用者具有對所有內容的 RWX 訪問權限,則您並不能提供太多安全性。即使在 webroot 下,您也不希望 apache 使用者具有對目錄和腳本的寫入權限。

通常,使用 apache/mod_php 的人會進行設置,以便 Apache 通過文件的組權限訪問文件。

這允許您擁有不同的使用者來擁有/編輯/更新目錄和文件,並且您可以專注於組權限並儘可能限制這些權限。

更新,解決方案答案:

  1. 是的,參考包含文件。在 PHP 中,所有與文件相關的函式都不是指“webspace”,而是指實際的文件系統。因此,您可以在系統上執行 php 腳本的使用者可以訪問的任何位置包含/fopen 等文件。
  2. 讓您的目錄(包括私有目錄和網路空間)由系統上非 apache 的使用者擁有。為簡單起見,該使用者將以使用者|組的身份擁有所有文件,其中使用者名和組名相同。現在讓我們將此帳戶稱為 fsuser。

chown -R fsuser:fsuser /var/www/html/private_api_files/ chown -R fsuser:fsuser /var/www/html/public_html/

現在處理目錄權限,只授予使用者和組訪問權限。

chmod -R 750 /var/www/html/public_html
chmod -R 750  /var/www/html/private_api_files

現在對於目錄中的單個文件,僅對於 php 文件,給它們:

chmod find /var/www/html/public_html -type f -name '*.php' -exec chmod 650 {} \;

對於其他目錄,您不想設置執行位,因此您只希望 group 具有 READ 訪問權限。這會找到所有文件,並設置它們的訪問權限。

find /var/www/html/private_api_files/ -type f -exec chmod 640 {} \;

現在您只需將 apache 使用者作為補充組成員添加到 fsuser 組:

usermod -a -G fsuser apache

確保在進行任何這些類型的更改或調整後始終重新啟動 apache。

sudo service httpd restart

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