利用京東雲Web應用防火牆實現Web入侵防護
摘 要
本指南描述如何利用京東雲Web應用防火牆(簡稱WAF),對一個簡單的網站(無論運行在京東雲、其它公有云或者IDC)進行Web完全防護的全過程。該指南包括如下內容:
1 準備環境
1.1 在京東雲上準備Web網站
1.2 購買京東雲Web應用防火牆實例
2 配置Web應用防火牆
2.1 增加Web應用防火牆實例的網站配置
2.2 在雲平台放行WAF回源IP
2.3 本地驗證配置
2.4 修改域名解析配置
3 測試Web防護效果
3.1 發起正常訪問
3.2 發起異常攻擊
3.3 分析安全報表
4 環境清理
1 準備環境
1 .1 在京東雲上準備Web網站
在京東雲上選擇CentOS系統創建一台雲主機,分配公網IP,安裝Nginx,並在域名解析服務上配置域名和IP的映射。具體的Web應用信息如下:
# 操作系統信息
[root@waf-demo ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
# 安裝dig命令,該命令可顯示域名的解析情況
bash
[root@waf-demo ~]# yum install bind-utils -y
[root@waf-demo ~]# dig -v
DiG 9.9.4-RedHat-9.9.4-72.el7
# Nginx服務信息
[root@waf-demo ~]# service nginx status
Redirecting to /bin/systemctl status nginx.service
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
...
在配置完域名和公網IP映射後,通過dig命令可獲得域名解析情況。
[root@waf-demo ~]$ dig waf-demo.jdcoe.top +trace
...
waf-demo.jdcoe.top. 60 IN A 114.67.85.98
;; Received 63 bytes from 153.99.179.161#53(ns2.jdgslb.com) in 13 ms
通過互聯網遠程訪問該Web網站。
MacBook:~ user001$ curl http://waf-demo.jdcoe.top -I
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Mon, 24 Dec 2018 03:22:21 GMT
Content-Type: text/html
Content-Length: 3700
Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT
Connection: keep-alive
ETag: "5a9e5ebd-e74"
Accept-Ranges: bytes
1.2 購買京東雲Web應用防火牆實例
進入京東雲控制枱,點擊雲安全, Web應用防火牆, 套餐購買, 進入"Web應用防火牆 - 購買“界面,選擇需要企業版套餐(每種套餐規格請參考套餐詳情)。具體的購買界面如下圖:
在購買完成後,將在實例管理界面中看到所購買的實例信息。
2 配置Web應用防火牆
在使用京東雲Web應用防火牆保護網站前,需要完成下列配置,才能實現用户提交的HTTP/HTTPS訪問請求通過Web應用防火牆檢測後,再發送到Web網站。
2.1 配置Web應用防火牆實例的防護網站
在Web應用防火牆界面,點擊網站配置,添加網站, 在下面界面中輸入相關配置信息。
界面參數具體描述如下:
域名:輸入需要保護的網站的域名;
- 協議:缺省選擇HTTP,如果網站支持HTTPS,則選擇HTTPS,並選擇SSL證書;
- 服務器地址:網站的IP;
- 服務器端口:網站的訪問端口;
- 是否已使用代理:缺省選擇"否",但如果網站還使用了IP高防服務,也就是訪問請求來自於IP高防,則應選擇“是";
- 負載均衡算法:當配置多個源站IP,WAF在將過濾後的訪問請求回源時,將按照IP Hash或輪詢的方式去做負載均衡。
新創建的網站配置的防護設置是處於關閉狀態,需要點擊防護配置鏈接進入配置界面。
在網站防護配置界面中,設置Web應用攻擊防護狀態為On模式為防護,防護規則策略等級為嚴格。設置CC安全防護狀態為On,模式為正常。
2.2 本地驗證配置
在網站配置列表界面中,能獲得為被防護網站生成的CNAME。針對域名“waf-demo.jdcoe.top",生成的WAF CNAME是waf-demo.jdcoe.top-15f08249c274.jdcloudwaf.com.
通過執行ping命令,能獲得Web應用防火牆的IP地址為101.124.23.163。
MacBook:etc user001$ ping waf-demo.jdcoe.top-15f08249c274.jdcloudwaf.com
PING waf-demo.jdcoe.top-15f08249c274.jdcloudwaf.com (101.124.23.163): 56 data bytes
64 bytes from 101.124.23.163: icmp_seq=0 ttl=49 time=57.525 ms
^C
--- waf-demo.jdcoe.top-15f08249c274.jdcloudwaf.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 57.525/57.525/57.525/0.000 ms
應用安全網站不允許通過生成的CNAME或者IP地址進行訪問,如果直接訪問,將報“Bad Request“錯誤。
MacBook:etc user001$ curl waf-demo.jdcoe.top-15f08249c274.jdcloudwaf.com
<h1> Bad Request </h1>MacBook:etc user001$
MacBook:etc user001$ curl 101.124.23.163
<h1> Bad Request </h1>MacBook:etc user001$
修改本機IP地址101.124.23.163和域名waf-demo.jdcoe.top的映射,在Linux下,域名配置文件為/etc/hosts。
1101.124.23.163 waf-demo.jdcoe.top
然後在本地執行如下命令“curl waf-demo.jdcoe.top -I”,將在顯示Server是jfe,表明已經通過Web應用防火牆。
MacBook:~ user001$ curl waf-demo.jdcoe.top -I
HTTP/1.1 200 OK
Server: jfe
Date: Mon, 24 Dec 2018 07:12:03 GMT
Content-Type: text/html
Content-Length: 3700
Connection: keep-alive
Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT
ETag: "5a9e5ebd-e74"
Accept-Ranges: bytes
此時,看Web的訪問日誌,將看到如下信息,表明請求已經通過Web應用防火牆,然後轉發到Web源站。
1101.124.23.116 - - [24/Dec/2018:15:12:04 +0800] "HEAD / HTTP/1.0" 200 0 "-" "curl/7.54.0" "117.136.0.210"
2.3 在雲平台放行WAF回源IP
在對源站配置了WAF服務後,源站原則上只能接收來自WAF的轉發請求。網站雲主機最初的安全組配置如下,這樣任何客户端都可以直接訪問Web網站。
通過curl命令能直接訪問Web網站。
MacBook:~ user001$ curl 114.67.85.98 -I
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Mon, 24 Dec 2018 07:20:08 GMT
Content-Type: text/html
Content-Length: 3700
Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT
Connection: keep-alive
ETag: "5a9e5ebd-e74"
Accept-Ranges: bytes
京東雲WAF服務所採用的IP地址為如下:
101.124.31.248/30
101.124.23.116/30
14.116.246.0/29
103.40.15.0/29
因此需要在安全組中刪除允許所有源IP都可訪問Web網站的規則,並增加允許上述地址段可以訪問Web網站的規則。修改後的安全組配置信息如下圖:
這樣Web網站將只接收來自WAF的請求,而不能直接訪問。
# 不能直接訪問源站
MacBook:~ user001$ curl 114.67.85.98 -I
^C
# 可以通過WAF服務訪問源站
MacBook:~ user001$ curl waf-demo.jdcoe.top -I
HTTP/1.1 200 OK
Server: jfe
Date: Mon, 24 Dec 2018 07:52:19 GMT
Content-Type: text/html
Content-Length: 3700
Connection: keep-alive
Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT
ETag: "5a9e5ebd-e74"
Accept-Ranges: bytes
2.4 修改域名解析配置
最後,需要在域名解析上修改原域名的解析規則,下面是京東雲的雲解析為例,配置域名waf-demo.jdcoe.top的CNAME為waf-demo.jdcoe.top-15f08249c274.jdcloudwaf.com。
最後刪除本機域名和IP地址的靜態映射,然後執行dig命令,將看到為域名waf-demo.jdcoe.top配置的CNAME。
[root@waf-demo ~]# dig waf-demo.jdcoe.top +trace
...
waf-demo.jdcoe.top. 60 IN CNAME waf-demo.jdcoe.top-15f08249c274.jdcloudwaf.com.
;; Received 107 bytes from 59.37.144.32#53(ns1.jdgslb.com) in 28 ms
3 測試Web防護效果
3.1 發起正常訪問
在一台機器上正常訪問頁面,能獲得正常響應,同時在Web網站上能看到訪問日誌。
[root@jdcoe-bastion ~]# curl waf-demo.jdcoe.top/index.html -I
HTTP/1.1 200 OK
Server: jfe
Date: Mon, 24 Dec 2018 08:35:24 GMT
Content-Type: text/html
Content-Length: 3700
Connection: keep-alive
Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT
ETag: "5a9e5ebd-e74"
Accept-Ranges: bytes
Nginx網站訪問日誌
101.124.31.248 - - [24/Dec/2018:16:35:24 +0800] "HEAD /index.html HTTP/1.0" 200 0 "-" "curl/7.29.0" "114.67.95.131"
3.2 發起異常攻擊
下面模擬一個"文件讀取/包含攻擊",也就是説在HTTP請求中包含讀取特定的系統問題。在無WAF防護的情況下,Web網站將返回如下信息:
[root@waf-demo ~]# curl localhost/index.html/etc/passwd -I
HTTP/1.1 404 Not Found
Server: nginx/1.12.2
Date: Mon, 24 Dec 2018 08:37:15 GMT
Content-Type: text/html
Content-Length: 3650
Connection: keep-alive
ETag: "5a9e5ebd-e42"
但是如果通過WAF防護,WAF將檢測出請求中包含了對敏感文件訪問,因此阻止該訪問請求。
[root@jdcoe-bastion ~]# curl waf-demo.jdcoe.top/index.html/etc/passwd -I
HTTP/1.1 403 Forbidden
Server: jfe
Date: Mon, 24 Dec 2018 08:37:22 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
3.3 安全分析報表
京東雲WAF將根據配置阻斷非法的HTTP請求,並通過安全報表獲得攻擊的來源和攻擊類型的相關信息。下圖是WAF實例下的waf-demo.jdcoe.top網站的防護報告。
4 環境清理
本指南會用到雲主機、公網帶寬和Web應用防火牆等收費資源。如果購買時採用按配置計費,建議刪除資源。
總結:
本指南介紹瞭如何利用Web應用防火牆實現一個網站的安全防護。通過Web應用防火牆對HTTP/HTTPS請求的檢測和過濾,減少因應用安全漏洞所造成的信息泄漏風險。
- 應用健康度隱患刨析解決系列之數據庫時區設置
- 對於Vue3和Ts的心得和思考
- 一文詳解擴散模型:DDPM
- zookeeper的Leader選舉源碼解析
- 一文帶你搞懂如何優化慢SQL
- 京東金融Android瘦身探索與實踐
- 微前端框架single-spa子應用加載解析
- cookie時效無限延長方案
- 聊聊前端性能指標那些事兒
- Spring竟然可以創建“重複”名稱的bean?—一次項目中存在多個bean名稱重複問題的排查
- 京東金融Android瘦身探索與實踐
- Spring源碼核心剖析
- 深入淺出RPC服務 | 不同層的網絡協議
- 安全測試之探索windows遊戲掃雷
- 關於數據庫分庫分表的一點想法
- 對於Vue3和Ts的心得和思考
- Bitmap、RoaringBitmap原理分析
- 京東小程序CI工具實踐
- 測試用例設計指南
- 當你對 redis 説你中意的女孩是 Mia