
我正在 Ubuntu 12 上運行 LAMP 堆疊,其主要功能是為基於 PHP 的 API 提供服務。
我只想向公眾公開一個文件,名為:api.php
它需要引用我的配置文件,/cfg/api-config.php
其中包含資料庫密碼,以便 API 可以寫入資料庫等。
所以我只希望api.php
由 apache '服務'並公開。
我放入 /cfg 中的設定檔必須能夠被 api.php 讀取,但不能被任何可能造訪該網站的人讀取。
我沒有.htaccess
,只是httpd.conf
按照以下配置。
<VirtualHost *:44448>
DocumentRoot "/api"
ServerName localhost:44448
ServerAlias Server.local
DirectoryIndex index.html
CustomLog "/var/log/apache_access.log" combined
ErrorLog "/var/log/apache_error.log"
SetEnv APPLICATION_ENV development
php_flag magic_quotes_gpc off
<Directory "/api">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
/cfg
對我的和資料夾的權限/api
是:drwxr-xr-x
對我的敏感設定檔的權限(資料庫密碼位於/cfg/api-config.php
is)-rw-r--r--
我想知道是否有人可以告訴我這個設定是否正確且安全?
據此:
A) 除 之外的所有文件均不/api/api.php
公開,且無法存取我的伺服器檔案。
B) 造訪該網站的任何人也無法讀取包含 db(用於 api)密碼的設定檔?
我嘗試通過在/cfg
with中創建一個新資料夾來測試這一點chmod 777
,但我似乎無法訪問它,這很好!
答案1
您有兩個檔案(假設它們位於 /var/www)
- /var/www/api/api.php
- /var/www/cfg/api-config.php
首先,使用 apache 限制對 /cfg 的存取(這確保沒有人可以從 http 存取它)並允許存取 /api:
<Directory /var/www/api>
Options None
AllowOverride None
Order allow,deny
Allow from all
<Directory>
<Directory /var/www/cfg>
Options None
AllowOverride None
Order allow,deny
Deny from all
<Directory>
接下來,使用 open_basedir 限制您的 php:
open_basedir = /var/www/api:/var/www/cfg
(如果需要,請在此處新增 /tmp、session 和其他目錄)
接下來,更改 /var/www/cfg 目錄和 /var/www/cfg/api-config.php 檔案的存取模式(假設您的 apache 使用者是 www-data):
chown -Rv root:root /var/www/{cfg,api}
chmod -v 711 /var/www/cfg
chmod -v 755 /var/www/api
chmod -v 644 /var/www/api/api.php /var/www/cfg/api-config.php
透過使用711在 /cfg 上,你確保,這樣沒有人可以讀取(列出)目錄的內容,同時仍然可以讀取 api-config.php (你需要這個來透過 PHP 讀取檔案)
答案2
首先,我將更改您的 cfg 的檔案權限以及其中駐留的檔案。如果您在其中存儲資料庫設置,則這是讀取訪問,並且應該刪除寫入訪問。很高興您的 Apache HTTP 守護程序環境設定安全,但這是另一層安全。您的 PHP 安裝在您的 HTTP 守護程式的使用者上下文中運行,因此我個人甚至會刪除該群組的讀取存取權限。我想知道你進行的測試。 cfg - 資料夾似乎不在您的 DocumentRoot 下,因此乍一看您的 HTTP - 伺服器似乎無法存取它。但試圖闖入您的安裝的人不會依賴這種方法。您在配置中設定了“AllowOverride All Order”允許、拒絕“Allow from all”,這意味著:根本沒有存取控制。您還聲明了 FollowSymLinks,它引入了其他安全影響。所以這個安裝遠遠落後於安全。您可以將 .htaccess 檔案放入安裝的 DocumentRoot 中來保護您的 cfg 資料夾。其中的條目可以強烈保護文件和目錄訪問,例如
<Files RELEASE_NOTES.txt>
orderallow,deny
拒絕所有
</Files>(取自magento安裝)
如果您想知道FollowSymLinks的安全影響:請記住,PHP是在您的Apache HTTP守護程序安裝的上下文中運行的,並且PHP 可以在您的檔案系統上執行寫入操作。如果PHP 程式碼插入到您的應用程式中,並在其上建立符號鏈接,那麼某人只需創建他或她感興趣的系統部分的符號鏈接即可監視您的檔案系統。放入您的cfg 中- 訂單允許、拒絕形式的目錄 Deny from all 將刪除透過 HTTP 守護程序瀏覽此目錄的能力。如果您的 api.php 是 PHP - 安裝/Web 應用程式的前端控制器,您應該考慮使用 Apache 的 mod_rewrite 重寫所有請求的 URL 以指向您的 api.php,例如
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ api.php [L]
在 .htaccess - 檔案中放入 /api - 目錄,目錄將所有請求路由到您的 api.php。例如 localhost:44448/someURL?id=988 會在內部變成請求 localhost:44448/api.php?id=988 。
需要明確的是:
重寫規則不應該用於存取控制,它們的主要目的是改變請求的處理方式。
許多 PHP 框架或 CMS 使用 RewriteRules 來擁有 Web 應用程式的中央入口點,在該入口點載入應用程式元件、呼叫路由元件以及執行從 URL 參數到內部結構的轉換。
例如Symfony2將Query/和Post參數翻譯成更物件導向的結構,將其封裝成物件。
Symfony2 還透過在產生 HTTP 回應之前讀取路由資訊和配置來利用安全性概念,例如確保已執行驗證或使用者必須具有正確的使用者角色才能存取 URL 路徑。
答案3
您似乎已經完成了一件關鍵的事情,那就是放在/cfg/api-config.php
DocumentRoot 之外。如果/cfg
不在 URL 空間內,則網站使用者無法閱讀它。這是您可以採取的最基本的預防措施。
用戶是否仍然可以讀取該檔案?當然,如果您在其他地方破壞了配置(例如,透過在檔案中設定Alias
或RewriteRule
),或者應用程式做了一些愚蠢的事情,例如輸出檔案的內容。應用程式漏洞才是真正值得關注的問題:應用程式必須能夠讀取文件,應用程式越複雜,就越有可能存在隱藏的漏洞。但就 Apache 配置而言,我認為您已經完成了。
答案4
除了上面的建議之外,我建議刪除對 apache 使用者擁有的 DocumentRoot 中任何檔案/資料夾的寫入存取權。 (例如您的 api.php 檔案)這假設 api.php (或其呼叫的任何內容)不需要向本機 Web 伺服器寫入任何內容。這應該有助於防止不需要的文件被寫入您的網頁伺服器