在ubuntu16.04中安裝apache2+modsecurity以及自定義WAF規則詳解
一、Modsecurity規則語法示例
SecRule是ModSecurity主要的指令,用於建立安全規則。其基本語法如下:
SecRule VARIABLES OPERATOR [ACTIONS]
-
VARIABLES
代表HTTP包中的標識項,規定了安全規則針對的物件。常見的變數包括:ARGS(所有請求引數)、FILES(所有檔名稱)等。
-
OPERATOR
代表操作符,一般用來定義安全規則的匹配條件。常見的操作符包括:@rx(正則表示式)、@streq(字串相同)、@ipmatch(IP相同)等。
-
ACTIONS
代表響應動作,一般用來定義資料包被規則命中後的響應動作。常見的動作包括:deny(資料包被拒絕)、pass(允許資料包通過)、id(定義規則的編號)、severity(定義事件嚴重程度)等。
值得注意的是,如需獲取更加深入的語法,請參考官方手冊。由於本實驗中涉及到了自定義安全規則,故將其中涉及到的三條規則做詳細說明,如下:
規則1:防XSS攻擊
SecRule ARGS|REQUEST_HEADERS "@rx <script>" "id:001,msg: 'XSS Attack',severity:ERROR,deny,status:404"
-
VARIABLES
ARGS:所有請求引數;REQUEST_HEADERS:請求資料頭部。
-
OPERATOR
@rx <script>:如果正則匹配字串"<script>"成功,則規則執行。
-
ACTIONS
id:001規定該條規則編號為001;msg: 'XSS Attack'代表記錄資訊為:XSS Attack;severity:ERROR表示嚴重程度為ERROR;deny表示拒絕所有請求包;status:404表示伺服器響應狀態編號為404。
說明:嚴重程度分為8級: EMERGENCY (0)、ALERT (1)、CRITICAL (2)、ERROR (3)、WARNING (4)、NOTICE (5)、INFO (6) 、DEBUG (7)
該規則表明:所有請求引數中包含字串"<script>"的HTTP包均會被伺服器攔截並記錄。
規則2:設定白名單
SecRule REMOTE_ADDR "@ipmatch 192.168.1.9" "id:002,phase:1,t:none,
nolog,pass,ctl:ruleEngine=off"
-
VARIABLES
REMOTE_ADDR:遠端主機IP
-
OPERATOR
@ipmatch 192.168.1.9:如果請求主機IP地址為192.168.1.9,則規則執行。
-
ACTIONS
id:002規定該條規則編號為002;phase:1表示規則執行的範圍為請求頭部;t:none表示VARIABLES的值不需要轉換(t代表transform);nolog代表不記錄日誌;pass代表繼續下一條規則;ctl:ruleEngine=off代表關閉攔截模式,所有規則失效。
說明:phase編號規定如下:Request Headers (1), Request Body (2), Response Headers (3), Response Body (4) and Logging (5).
該規則表明:對於主機192.168.1.9傳送的HTTP包,伺服器關閉攔截模式,允許所有包通過。
規則3:chain規則
SecRule ARGS:username "@streq admin" chain,deny,id:003
SecRule REMOTE_ADDR "!streq 192.168.1.9"
-
VARIABLES
ARGS:username所有表示請求引數中的使用者名稱資訊。
-
OPERATOR
@streq admin表示使用者名稱等於字串"admin",則執行ACTIONS。
-
ACTIONS
id:003規定該條規則編號為003;chain表示使用者名稱等於admin的情況下,必須完成第二行規則的匹配(遠端主機IP不是192.168.1.9),才能執行下一個動作;deny表示所有請求包被拒絕。
該規則表明:所有主機名為admin,但對應主機IP地址不是192.168.1.9的請求包均會被伺服器拒絕。也就意味著只有某一臺主機可以用admin使用者登入(一般情況是系統管理員的主機),大大提高了系統安全性。
二、一鍵安裝LAMP環境
-
執行命令apt-get update。
-
執行命令apt-get install lamp-server^。
-
在安裝過程中會跳出Mysql資料庫root使用者密碼設定視窗,按要求輸入密碼:123,按Tab鍵選擇"Ok",按回車進入下一步,如下圖所示:
-
-
重複輸入密碼:123,按Tab鍵選中"Ok",按回車繼續安裝,如下圖所示:
- 開啟瀏覽器,在位址列輸入:http://localhost,可以驗證apache2安裝成功,如下圖所:
5.輸入命令mysql -u root -p ,成功進入mysql視窗,mysql安裝成功。
三、安裝modsecurity
-
安裝libapache2-modsecurity模組及其依賴包,輸入:
$ apt-get install libxml2 libxml2-dev libxml2-utils libapache2-modsecurity
-
查詢ModSecurity版本號,驗證安裝是否成功,輸入:
$ dpkg -s libapache2-modsecurity | grep Version
注意:看清Version的大小寫。
-
重啟Apache服務,輸入:
$ service apache2 reload
-
配置modsecurity,啟用攔截模式,輸入:
$ cd /etc/modsecurity
$ mv modsecurity.conf-recommended modsecurity.conf
$ vim modsecurity.conf
上述操作將安裝包中的推薦配置檔案改名為標準的配置檔名,並啟用Vim編輯器編輯該配置檔案。
-
編輯modsecurity.conf,將"SecRuleEngine DetectionOnly"改為"SecRuleEngine On",儲存並退出。如下圖所示:
上述操作將開啟安全規則引擎,即啟用攔截模式,過濾HTTP流量。
四、配置自定義規則
-
進入資料夾activated_rules,將啟動檔案關聯到此資料夾中,採用軟連結的方式,輸入:
$ cd /usr/share/modsecurity-crs/activated_rules
$ ln -s ../modsecurity_crs_10_setup.conf ./modsecurity_crs_10_setup.conf
$ tree
-
執行命令vim MY.conf,建立自己的規則檔案MY.conf。寫入防XSS規則(編號001)如下:
SecRule ARGS|REQUEST_HEADERS "@rx <script>" "id:003,msg: 'XSS Attack',severity:ERROR,deny,status:404"
-
設定配置檔案security2.conf,輸入:
$ vim /etc/apache2/mods-available/security2.conf
-
在該檔案中新增:IncludeOptional /usr/share/modsecurity-crs/activated_rules/*.conf,如下圖所示:
-
重啟apache服務,輸入:
$ service apache2 reload
五、驗證防護效果
-
登入主機"hacker",進入攻擊者模式。在瀏覽器位址列輸入:http://localhost/ ?q=<script> alert(1)</script>。實驗結果如下圖所示:
-
執行命令vim /var/log/apache2/modsec_audit.log,檢視WAF攔截日誌,如下圖所示:
由上圖可知,從本地主機發出的GET請求被規則檔案MY.conf中的001號規則準確命中,訊息中包含的惡意程式碼被攔截。