1. 程式人生 > >隔壁小孩都要知道的Drupal配置

隔壁小孩都要知道的Drupal配置

i春秋作家:Arizona

原文來自:隔壁小孩都要知道的Drupal配置

隔壁小孩都要知道的Drupal配置


Drupal是一個開源的PHP內容管理系統,具有相當複雜的架構。它還具有強大的安全模型。感謝開發人員在社群的貢獻和維護,所以有很多詳細的文件和有關加強Drupal網站安全配置的方法。

切記,Drupal是執行網站所需的一部分。為了保護整個系統免受黑客攻擊,我們需 要處理整套系統。它包括一些常見的伺服器設定,Web伺服器的配置,PHP和資料庫。此外,伺服器上的任何其他服務都需要正確配置。

本文重點討論上述關鍵點。它提供了一些提示和關鍵點,可以幫助伺服器和網站管理員稽核整個系統的安全性。我們應該明白,打造一個絕對安全的系統是不可能的,但如果你堅持一些原則,它將有助於你的

系統安全

安全原則

讓我們從常見的安全守則開始。它們中的大多數不僅適用於Drupal開發並且支援Drupal網站執行基礎設施的相關安全性,而且還適用於許多其他情況:

  • 使用由一個擁有大量使用者群體的社群開發的解決方案。它可以很好地維護開源庫,流行的Linux發行版等等。始終檢查下載程式碼的完整性。

  • 遵循最小原則,儘量不使用任何其他服務。如果你真的需要它,請安裝新軟體,解除安裝所有不需要的服務。

  • 避免編寫自定義程式碼。在開始之前,請仔細考慮是否可以避免這種情況。與Drupal開發相關的真實情況是在編寫自定義模組之前在drupal.org上搜索現成的解決方案。

  • 預設拒絕訪問。只有在必要時,才應授予相關的訪問許可權。

  • 新增具有所需許可權的角色。每個角色都必須有詳細記錄。這樣,應該很容易支援和擴充套件整個許可權框架。

  • 不要使用root許可權。在基於Linux的作業系統上,僅在需要時使用root訪問許可權,並通過sudo執行此操作。換句話說,你不應該以root使用者身份登入和執行。

  • 定期對系統進行安全檢查和維護。你應仔細分析所有可疑情況並對其作出分析。

  • 備份!你必須始終能夠將系統還原為以前的任何狀態。此外,你需要確保系統進行有效可以用的備份。

  • 在伺服器進行適當的安全維護之前,請勿暴露在公網上。

這些原則可以應用於任何系統和服務,無論它使用何種軟體和硬體。我們進一步討論更具體的關鍵點。

重要的安全維護物件:

除了執行網站的Drupal之外,還需要配置PHP,Web伺服器和資料庫。你可能還需要安裝一些服務外掛來擴充套件搜尋功能,使用快取等。  

如你所見,有很多事情需要正確配置和定期維護。基於上述的情況,我們可以在一定程度上區分以下需要確保安全性的服務:

  • 伺服器(常用的配置)

  • Web伺服器

  • PHP

  • 資料庫

  • Drupal

伺服器(常用設定)

網際網路上可用的任何服務的安全性始於伺服器的基本配置。對於基於Linux的伺服器,它可以使用以下的配置方法:

  • 改變遠端登陸的配置

  • 使用iptables設定防火牆

    改變遠端登陸的配置

通過更改登入到伺服器的配置,。主要目標是使這個過程與一般預設的過程有所區別。

例如,任何Linux的系統都有一個名為root的超級使用者。攻擊者可以通過ssh等爆破root的預設密碼。但是,如果伺服器管理員關閉root登入,則此類嘗試將失敗。我們可以建立一個新使用者,而不是root使用者,然後授予他必要的許可權。

大多數這個的更改都與ssh設定有關。它們通常位於/etc/ssh/ sshd_config檔案中。相關配置:

Port 2345
Protocol 2
PermitRootLogin no
PasswordAuthentication no
UseDNS no
AllowUsers user

它允許使用有效的使用者名稱通過ssh連線到伺服器使用2345埠(非預設,預設22)。它還會禁用root登入和密碼身份驗證。

禁用密碼驗證是提高整個系統安全性的重要步驟。無密碼身份驗證更安全。要登入伺服器,你需要在本地計算機上生成ssh金鑰,然後將公鑰複製到伺服器。安全性更高。

使用iptables設定防火牆

iptables是Linux系統的預設防火牆。它可用於管理與指定埠的連線。如果我們想將網站保留在伺服器上,除了ssh埠之外,還需要開啟http和/或https埠。

預設情況下,作業系統上沒有建立規則。敲sudo iptables -L命令(Ubuntu)將返回以下內容:

  Chain INPUT (policy ACCEPT)
target     prot opt source               destination
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

這意味著伺服器接受來自任何埠上任何人的任何內容(策略預設ACCEPT)。我們可以只打開必要的埠並關閉其他沒必要的埠。

sudo iptables -A INPUT -p tcp --dport 2345 -j ACCEPT 
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT 
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

這些命令是 接受2345,80和443埠的連線。儘管如此,我們仍然沒有其他埠的其他限制。因此,你需要在最後新增一條規則,拒絕所有不需要的資料包。

  sudo iptables -A INPUT -j DROP

就這樣。應該記住,上面的配置可能會你使用不同的系統而有很大差異。這裡的主要目標只是對基本原則的解釋。更改網路配置時要小心!!!有時,你一不小心 它就拒絕任何連線。比如你不小心drop了你的ssh埠,2333。

Web伺服器

設定Web伺服器的一些一般原則。使用這些規則對於你的網站執行非常重要。通過伺服器的漏洞,攻擊者可以任意執行檔案,上傳惡意指令碼並以某種騷操作執行這些指令碼。

能夠訪問執行的網站檔案

主要的原則就是 網站檔案應該由非root使用者執行,並且不應該由Web伺服器寫入(敲黑板,劃重點!)。在一些情況下,Drupal目錄可供Web伺服器使用者寫入,有關保護檔案許可權和所有權的詳細資訊,請看本文末尾的“相關連結”。

限制對Web伺服器的某些功能的訪問

有時,限制在Web伺服器對網站的一些功能的訪問可能是有用的。例如,在你擁有演示網站或沒有註冊功能的網站的情況下。你可以限制/user和/admin/ *。對於Apache Web伺服器,可以使用mod_authz_host和mod_rewrite模組完成。切記,http身份驗證不是一種安全的方法。因此,所描述的方法在特定情況下更適用。

刪除不使用的Web伺服器外掛

伺服器上的所有其他服務都存在潛在的安全風險。因此,你應該遵循最小化原則。如果你不需要什麼,只需將其刪除即可。

這同樣適用於Web伺服器。Apache和Nginx Web伺服器有許多額外的外掛,仔細檢查已啟用的副檔名列表,並刪除所有未使用的副檔名。

使用HTTPS

使用HTTPS協議可以使網站和私人使用者資料的訪問更加安全。如今,當一些線上商店不對他們的支付交易使用加密,這是絕對不對的。而且,Google已經將HTTPS設定為排名指標。這意味著不使用HTTPS協議但還是能執行的網站,一些重要資訊(信用卡,支付交易等)會對搜尋排名產生負面影響。

理想情況是,如果你為與使用者進行互動的所有網站加密。例如說登入和註冊。使用者輸入密碼。即使這些密碼在所有瀏覽器中看起來都不可見(如**),它們也會以未加密的形式通過網路傳遞。因此,攻擊者可以通過中間人方式等輕鬆攔截輸入的資料。使用者通常都是使用常用密碼。這意味著也可能會影響你在對別的網站的賬號。

HTTP認證

應該清楚在什麼情況下可以使用HTTP身份驗證。大多數情況下,你需要它來保護對網站的快取並禁用爬蟲對該網站的索引。但是,HTTP身份驗證本質上是不安全的。它不使用任何加密演算法。因此,瀏覽器和網站之間的流量不會被加密,攻擊者只需複製可以用的HTTP頭並將資料包其傳送到Web伺服器即可訪問網站。

此外,強烈建議將htpasswd檔案保留在文件根目錄之外。設定此檔案的只讀許可權(440)。

PHP

PHP與伺服器的其他服務一樣可能包含漏洞。這在很大程度上取決於PHP本身的設定以及當前使用的PHP版本。當然,你始終需要檢查所有可用的更新並保持PHP更新。但是,在某些情況下,這可能非常困難甚至是不可能的。

一般來說,優化伺服器上PHP安全性的所有工作可以分為三個部分:

  • 定期更新PHP版本
  • 避免使用不安全的程式碼,功能等
  • 優化PHP設定

    定期更新PHP版本

    這是比較容易理解的事情,但正如我所提到的,在某些情況下,更新可能非常困難甚至是不可能的。當你的應用程式中有很多祖傳程式碼(它在新的PHP版本中不起作用)並且當前的業務不允許你花時間更新這段程式碼時就會主要,因為它是很耗費時間的操作。在這種情況下,你可以嘗試使用下面的一些建議。

    避免使用不安全的程式碼

    編寫安全程式碼是伺服器安全的重要一步。你應該花一些時間定期檢視你所有自定義程式碼。此外,沒有人可以保證第三方庫不包含任何漏洞。正如我所提到的,即使PHP本身也存在安全性問題(使用不安全的函式,緩衝區溢位等)。

    為了解決這些問題,有一個很好的玩意叫做Suhosin,它可以幫助你擺脫許多安全問題。Suhosin旨在保護伺服器和使用者免受PHP和PHP核心中已知和未知的缺陷的影響。它由兩部分組成。第一部分是PHP核心的補丁,它提供了一些針對緩衝區溢位或格式化字串漏洞的低階保護。第二部分是PHP擴充套件,它實現了一些額外的保護。

    Suhosin是一個非常強大的工具,可以保護你的伺服器免受許多漏洞的侵害。蛋疼的是,它不適用於PHP7.事實上,Suhosin7 正在開發,但還沒有完成。作者不建議在生產伺服器上使用Suhosin7。

    優化PHP設定

    為優化PHP安全配置,我們可以採取的兩個最簡單的步驟是禁用未使用的模組,並最大限度地減少使用者可以獲得的有關當前PHP安裝的資訊。

    要檢視所有已編譯的PHP模組,請執行以下命令:

    $ php -m

    建議僅使用必要的模組來提高安全性。仔細檢查整個列表哪些是你不需要的模組。刪掉吧。

    保護PHP免受黑客攻擊還要隱藏有關係統的資訊。看看php.ini檔案中的這個配置:

    expose_php = Off

    確保此引數配置。否則,PHP將傳送版本號到X-Powered-Byhttp頭中的。

    同樣適用於網站上的PHP報錯。他們可以提供有關你的伺服器的一些額外資訊(Web伺服器版本,目錄結構等)。因此,強烈建議在生產伺服器上禁用此功能。

display_errors = Off 
log_errors = On 
error_log = /var/log/httpd/php_scripts_error.log

上面的設定允許你關閉顯示網站發生的報錯。此外,它們還會將錯誤記錄到指定的日誌中。

這些是初步步驟,可以幫助你提高在伺服器上使用PHP的安全性,即使沒有對系統進行任何重大修改。現在讓我們談談你可以新增到PHP配置(php.ini檔案)的一些特定配置:

file_uploads = Off #禁用檔案上傳

但是如果需要檔案上傳的功能,最好限制檔案大小。

file_uploads = on 
upload_max_filesize = 1M

2.控制系統資源

max_execution_time = 30 
max_input_time = 30 
memory_limit = 50M

你可以指定每個指令碼的最長執行時間,最大記憶體量和最大資料讀取時間。

3.關閉允許指令碼包含其他URL的PHP函式

allow_url_include = Off 
allow_url_fopen = Off

如果啟用了allow_url_fopen,PHP可以使用檔案函式,例如file_get_contents。有了它,PHP可以從遠端伺服器下載檔案。

4.禁用危險功能

 disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

在禁用之前,請確保你的網站不需要其中任何一個函式。

5.限制對檔案的訪問許可權

open_basedir =“/var/www” #允許訪問的目錄

該open_basedir的配置允許你設定在PHP可以使用函式訪問檔案的目錄如fopen,file_get_contents等。如果該檔案是在這個目錄之外,PHP將拒絕開啟它。

6.臨時路徑

session.save_path =“/tmp”

確保臨時路徑位於網站根目錄之外。此外,它不能被其他系統使用者讀取或寫入。

資料庫

採取什麼措施來確保資料庫安全性主要取決於應用程式的基礎結構。例如,Drupal的資料庫抽象層使你能夠在不同的資料庫之間進行選擇。它可以是MySQL,SQLite或PostgreSQL。此外,Drupal支援流行的MySQL分支,例如MariaDB和Percona。你應該瞭解每個系統可能有不同的安全規範。

還取決於你安置資料庫的位置。最簡單的(在安全性方面)是在擁有網站的同一臺伺服器上安裝資料庫。但是,這種方法可能會影響整個系統的效能,因此伺服器管理員可能決定在另外的伺服器上安裝資料庫(站庫分離)。對於高負載應用尤其如此。

完成伺服器環境配置後,你應該做的第一件事是檢查你的架構是否足夠強大,並且不容易被DoS攻擊破壞。事實上,即使在其工作負載的高峰期,伺服器也應該有一些資源儲備。

正如我之前提到的,資料庫安全性設定的具體情況具體取決於所選的資料庫 在本文中,我們來看一些一般性措施:

  • 資料庫訪問
    如果資料庫是在本地安裝的,則可以禁用從網路訪問它。如果你的資料庫位於單獨的伺服器上,則應該可以設定它將偵聽的IP地址。如果在Web伺服器和資料庫伺服器之間共享LAN,則僅設定LAN IP地址(無法通過Internet訪問)。可以通過編輯my.conf檔案來完成。下面是為資料庫和網站使用相同伺服器時的配置示例。
    bind-address=127.0.0.1

  • 資料庫,使用者和許可權

檢視資料庫,使用者和許可權,以查詢任何安全的缺陷。不要為使用者提供超出實際需要的許可權

  • PHPMyAdmin和類似工具,確保在使用完後禁用圖形工具再使用資料庫。如果你打算繼續使用這些工具,請嘗試儘可能難以訪問它們。例如,你可以通過.htaccess限制對PHPMyAdmin的訪問,並通過白名單允許從某些可信IP地址進行訪問。此外,你可以嘗試使用MySQL Workbench等本地工具,而不是使用Web型別的。

Drupal

Drupal有一個非常複雜的架構。為了確保這個複雜系統的安全性,最好將所有相關工作分成小部分。在此操作期間,你將遇到僅需要執行一次的配置(設定檔案許可權,配置settings.php檔案等)。將會有一些需要定期關注的任務(更新Drupal和模組)。也許其他人會要求你與Drupal社群密切合作。

以下是你應該記住的兩個關鍵時刻:

確保Drupal安全並不是一件容易的事情,但它對任何網站都非常重要。所以,你一定要努力做到這一點。安全需要你用心的關注。

檔案

確保Web伺服器對Drupal檔案沒有寫入許可權。只有快取檔案,上傳,session和臨時目錄才需要寫入許可權。以下命令授予對公共檔案目錄(Ubuntu或者 Debian)的寫許可權:

$ chown -R www-data:www-data sites / default / files

如果你的網站允許上傳檔案,請注意如何確保使用這些檔案的過程。僅允許上傳某些檔案型別。相對安全的是文字檔案和圖片。但是,這並沒有改變使用者可以上傳惡意程式碼的事情,例如具有.jpg或.txt副檔名的檔案。要避免此問題,你可以嘗試安裝ClamAV模組,該模組可以掃描上傳的檔案以查詢病毒和其他惡意程式碼。

settings.php

初始安裝後,請確保settings.php檔案沒有寫入許可權。有關此資訊可在相關公告(admin/reports/status in Drupal 8)中找到。

在settings.php中,你可以設定一個重要選項,以防止特殊的攻擊(https://www.drupal.org/node/1992030)。這種型別的攻擊稱為HTTP POST Header攻擊。為了保護Drupal 7網站免受他們的影響,請在你的設定中新增基本URL引數:

$ base_url ='http://www.example.com';

Drupal 8中類似的配置是:

$settings['hash_salt'] = file_get_contents('/home/example/salt.txt');

錯誤日誌

Drupal提供了一種監控網站狀態的機制。這裡我的意思是最近的日誌訊息和報告。嘗試定期檢查這些日誌並修復發現的問題。報告非常有用,尤其是在安裝網站後。例如,如果你忘記新增可信主機設定或者對settings.php檔案具有寫訪問許可權,它可以通知你。

只需檢視“最近的日誌訊息”頁面,即可跟蹤某些型別的可疑活動。舉一個例子,想象一下當你注意到新使用者註冊激增時的情況。

不要忘記禁用PHP錯誤的回顯。普通使用者不應該看到它們。雖然你可能會在“最近的日誌訊息”頁面上看到這些錯誤,但請記住它不會捕獲所有PHP錯誤。因此,有時請檢查你的伺服器日誌檔案。

Drupal核心和貢獻模組的變化

這部分是關於Drupal核心和貢獻模組的黑客攻擊。實際上,一個眾所周知的事實是,新開發人員可能會偷工減料並將他們的程式碼或一些更改直接放入Drupal核心或已安裝的貢獻模組中。這可能會導致Drupal本身的不可預測行為,以及漏洞的出現,或者惡意存放後門。

為了擺脫這些問題,我建議使用Hacked!模組。該模組掃描當前安裝的Drupal,貢獻的模組和主題,並將所有內容與drupal.org中的相應版本進行比較。如果你安裝了Diff模組,請使用Hacked!會告訴你有什麼放生了改變。這讓hacked!模組是任何網站寶貴的分析工具。

使用者和許可權

Drupal具有直觀且可自定義的許可權模型。許可權是此類系統中最簡單的元素。一組許可權可以按角色型別分組。然後可以將此角色型別分配給特定使用者。在更新Drupal核心和貢獻模組期間可能會出現新的許可權和角色型別。你應定期檢查(例如更新後)為你的網站上的每個使用者分配的角色型別以及這些角色型別中包含的許可權。嘗試最小化每個角色中包含的許可權。不要為使用者提供超出實際需要的許可權。

一個好的配置是使用非預設使用者名稱(例如不是admin或root),因為黑客將首先嚐試預設的使用者名稱。為了更高的安全性,甚至可以完全禁用管理員帳戶。

另一件好事是檢查你網站上的使用者活動並鎖定非活躍帳戶。使用者過期模組提供了定義特定使用者帳戶將被鎖定的功能。此外,它可以鎖定在一段時間內處於非活躍狀態的帳戶。

有用的模組

根據你的需要,你可以在drupal.org上找到許多有用的安全模組。以下是其中一些:

總結

在本文中,我們回顧了一些保護你網站的方法。還涵蓋了必要基礎架構的所有部分 - 從通用伺服器設定到某些Drupal模組的特定用例。

許多人忽略了監視其站點和伺服器基礎結構的安全性,直到出現明顯問題。雖然即使遵守一些簡單的規則也有助於避免它們的出現。請始終耐心始終關注系統的安全性。祝你好運!


作者:ADCI Solutions團隊負責人Evgeny Leonov
翻譯:i春秋翻譯小組-K0nJac
責任編輯:F0rmat
翻譯來源:https://medium.com/@ADCISolutions/security-for-drupal-and-related-server-software-f7008211f80b

大家有任何問題可以提問,更多文章可到i春秋論壇閱讀喲~