# 了解waf
## 什么是WAF
Web應用防護系統(也稱:網站應用級入侵防御系統 。
英文:Web Application Firewall,簡稱: WAF)。
利用國際上公認的一種說法:Web應用 防火墻 是通過執行一系列針對HTTP/HTTPS的 安全策略 來專門為Web應用提供保護的一款產品。
## 常見的web入侵行為
### SQL注入
SQL注入恐怕是黑客們最為常見的入侵web站點的手段,黑客通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
### xss
只要是人做出了東西都會存在或多或少的缺陷,我們的web站點也不例外,xss攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶加載并執行攻擊者惡意制造的網頁程序。
### 不安全下載
這是運維工程師在網站部署時經常犯的錯誤,由于在部署網站是為了方便配置網站,運維工程師可能會把配置文件放在網站的根目錄下,如果有人訪問網站的根目錄里的配置文件(類似這些:code_backup.tar.gz .sql)那我們的整個網站將會暴露管理員的賬號也可能被盜走。
### 隱私文件訪問
這個原因同樣是因為管理員的配置不當使網站的重要信息暴露在外(類似這些文件:.svn .git)
### 弱口令
在當今很多地方以用戶名(帳號)和口令作為鑒權的世界,口令的重要性就可想而知了。口令就相當于進入家門的鑰匙,當他人有一把可以進入你家的鑰匙,想想你的安全、你的財物、你的隱私......害怕了吧。因為弱口令很容易被他人猜到或破解,所以如果你使用弱口令,就像把家門鑰匙放在家門口的墊子下面,是非常危險的,同理如果管理員把網站的后臺密碼設置的很簡單那無疑是把網站拱手讓給黑客
### 非授權范文
當管理員要把網站的數據庫信息交給客戶查看時,有時管理員可能忘記給數據庫加密碼這就造成了這個數據庫暴露在公網,這就造成了數據泄露。
### cc攻擊
cc攻擊無法避免,只能緩解,如果設置強有力的過濾規則則可能把正常的用戶請求拒絕在外。其中性能cc攻擊對網站可使網站直接經濟服務
### DDOS攻擊
DDOS攻擊對于那些帶寬大的網站他們能做的一是扛,二是擋,帶寬小的網站就比較悲劇了只能等攻擊者停止攻擊才能恢復網站的正常使用。網站也可以接入云清洗分散攻擊流量,道高一尺魔高一丈,如果攻擊者調用更多的攻擊流量來打網站,網站也只能跪,我們無法杜絕DDOS攻擊,為保證網站可以正常的使用我們所能做的是“扛”、“擋”、“分”。
### 總結
Nginx網站可以通過配置規則來抵御cc攻擊(頻率限制)、不安全下載(判斷后綴)、非授權訪問(后綴,認證)、測試防護(根據UA)、設置ip黑名單。但是其所實現的功能及其有限,為了保證網站的正常功能我們就需要借助更為強大的工具來應對各種威脅,waf由此應運而生。
## waf功能
1.支持IP白名單和黑名單功能,直接將黑名單的IP訪問拒絕。
2.支持URL白名單,將不需要過濾的URL進行定義。
3.支持User-Agent的過濾,匹配自定義規則中的條目,然后進行處理(返回403)。
4.支持CC攻擊防護,單個URL指定時間的訪問次數,超過設定值,直接返回403。
5.支持Cookie過濾,匹配自定義規則中的條目,然后進行處理(返回403)。
6.支持URL過濾,匹配自定義規則中的條目,如果用戶請求的URL包含這些,返回403。
7.支持URL參數過濾,原理同上。
8.支持日志記錄,將所有拒絕的操作,記錄到日志中去
## WAF的特點
### 異常檢測協議
Web應用防火墻會對HTTP的請求進行異常檢測,拒絕不符合HTTP標準的請求。并且,它也可以只允許HTTP協議的部分選項通過,從而減少攻擊的影響范圍。甚至,一些Web應用防火墻還可以嚴格限定HTTP協議中那些過于松散或未被完全制定的選項。
### 增強的輸入驗證
增強輸入驗證,可以有效防止網頁篡改、信息泄露、木馬植入等惡意網絡入侵行為。從而減小Web服務器被攻擊的可能性。
### 及時補丁
修補Web安全漏洞,是Web應用開發者最頭痛的問題,沒人會知道下一秒有什么樣的漏洞出現,會為Web應用帶來什么樣的危害。WAF可以為我們做這項工作了——只要有全面的漏洞信息WAF能在不到一個小時的時間內屏蔽掉這個漏洞。當然,這種屏蔽掉漏洞的方式不是非常完美的,并且沒有安裝對應的補丁本身就是一種安全威脅,但我們在沒有選擇的情況下,任何保護措施都比沒有保護措施更好。
### 基于規則的保護和基于異常的保護
基于規則的保護可以提供各種Web應用的安全規則,WAF生產商會維護這個規則庫,并時時為其更新。
用戶可以按照這些規則對應用進行全方面檢測。還有的產品可以基于合法應用數據建立模型,并以此為依據判斷應用數據的異常。但這需要對用戶企業的應用具有十分透徹的了解才可能做到,可現實中這是十分困難的一件事情。
### 狀態管理
WAF能夠判斷用戶是否是第一次訪問并且將請求重定向到默認登錄頁面并且記錄事件。通過檢測用戶的整個操作行為我們可以更容易識別攻擊。狀態管理模式還能檢測出異常事件(比如登陸失敗),并且在達到極限值時進行處理。這對暴力攻擊的識別和響應是十分有利的。
### 其他防護技術
WAF還有一些安全增強的功能,可以用來解決WEB程序員過分信任輸入數據帶來的問題。比如:隱藏表單域保護、抗入侵規避技術、響應監視和信息泄露保護。
## WAF與網絡防火墻的區別
網絡防火墻作為訪問控制設備,主要工作在OSI模型三、四層,基于IP報文進行檢測。只是對端口做限制,對TCP協議做封堵。其產品設計無需理解HTTP會話,也就決定了無法理解Web應用程序語言如HTML、SQL語言。因此,它不可能對HTTP通訊進行輸入驗證或攻擊規則分析。針對Web網站的惡意攻擊絕大部分都將封裝為HTTP請求,從80或443端口順利通過防火墻檢測。一些定位比較綜合、提供豐富功能的防火墻,也具備一定程度的應用層防御能力,如能根據TCP會話異常性及攻擊特征阻止網絡層的攻擊,通過IP分拆和組合也能判斷是否有攻擊隱藏在多個數據包中,但從根本上說他仍然無法理解HTTP會話,難以應對如SQL注入、跨站腳本、cookie竊取、網頁篡改等應用層攻擊。web應用防火墻能在應用層理解分析HTTP會話,因此能有效的防止各類應用層攻擊,同時他向下兼容,具備網絡防火墻的功能。
# 初探實現WAF
## WAF實現規劃
分析步驟如下:解析HTTP請求==》匹配規則==》防御動作==》記錄日志
具體實現如下:
解析http請求:協議解析模塊
匹配規則:規則檢測模塊,匹配規則庫
防御動作:return 403 或者跳轉到自定義界面
日志記錄:記錄到elk中
## OpenResty部署
安裝依賴包
[root@nginx ~]# yum install -y readline-devel pcre-devel openssl-devel
下載并編譯安裝openresty
[root@nginx ~]# wget https://openresty.org/download/ngx_openresty-1.9.3.2.tar.gz
[root@nginx ~]# tar zxf ngx_openresty-1.9.3.2.tar.gz
[root@nginx ~]# cd ngx_openresty-1.9.3.2
[root@nginx ngx_openresty-1.9.3.2]# ./configure --prefix=/usr/local/openresty-1.9.3.2 \
--with-luajit --with-http_stub_status_module \
--with-pcre --with-pcre-jit
[root@nginx ngx_openresty-1.9.3.2]# gmake && gmake install
[root@nginx ngx_openresty-1.9.3.2]#ln -s /usr/local/openresty-1.9.3.2/ /usr/local/openresty
測試openresty安裝
[root@nginx ngx_openresty-1.9.3.2]# vim /usr/local/openresty/nginx/conf/nginx.conf
server {
location /hello {
default_type text/html;
content_by_lua_block {
ngx.say("HelloWorld")
}
}
}
[root@nginx ~]# /usr/local/openresty/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/openresty-1.9.3.2/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/openresty-1.9.3.2/nginx/conf/nginx.conf test is successful
[root@nginx ~]# /usr/local/openresty/nginx/sbin/nginx
關閉防火墻
[root@nginx ~]# systemctl stop firewalld.service

## WAF部署
安裝git
[root@nginx ~]# yum -y install git
克隆WAF項目
[root@nginx ~]#git clone https://github.com/unixhot/waf.git
把waf目錄拷貝到Nginx配置目錄下
[root@nginx ~]#cp -a ./waf/waf /usr/local/openresty/nginx/conf/
修改Nginx的配置文件,加入以下配置。注意路徑,同時WAF日志默認存放在/tmp/日期_waf.log
[root@nginx ~]# vim /usr/local/openresty/nginx/conf/nginx.conf
#WAF
lua_shared_dict limit 50m;
lua_package_path "/usr/local/openresty/nginx/conf/waf/?.lua";
init_by_lua_file "/usr/local/openresty/nginx/conf/waf/init.lua";
access_by_lua_file "/usr/local/openresty/nginx/conf/waf/access.lua";
[root@nginx ~]# /usr/local/openresty/nginx/sbin/nginx –t
[root@nginx ~]# /usr/local/openresty/nginx/sbin/nginx
根據日志記錄位置,創建日志目錄
[root@nginx ~]# mkdir /tmp/waf_logs
[root@nginx ~]# chmod 777 /tmp/waf_logs(為了測試權限直接設置為777,大家千萬不要學)
## 學習配置模塊
WAF上生產之前,建議不要直接上生產,而是先記錄日志,不做任何動作。確定WAF不產生誤殺
config.lua即WAF功能詳解
```
root@nginx waf]# pwd
/usr/local/openresty/nginx/conf/waf
[root@nginx waf]# cat config.lua
--WAF config file,enable = "on",disable = "off"
--waf status
config_waf_enable = "on" #是否開啟配置
--log dir
config_log_dir = "/tmp/waf_logs" #日志記錄地址
--rule setting
config_rule_dir = "/usr/local/nginx/conf/waf/rule-config"
#匹配規則縮放地址
--enable/disable white url
config_white_url_check = "on" #是否開啟url檢測
--enable/disable white ip
config_white_ip_check = "on" #是否開啟IP白名單檢測
--enable/disable block ip
config_black_ip_check = "on" #是否開啟ip黑名單檢測
--enable/disable url filtering
config_url_check = "on" #是否開啟url過濾
--enalbe/disable url args filtering
config_url_args_check = "on" #是否開啟參數檢測
--enable/disable user agent filtering
config_user_agent_check = "on" #是否開啟ua檢測
--enable/disable cookie deny filtering
config_cookie_check = "on" #是否開啟cookie檢測
--enable/disable cc filtering
config_cc_check = "on" #是否開啟防cc攻擊
--cc rate the xxx of xxx seconds
config_cc_rate = "10/60" #允許一個ip60秒內只能訪問10此
--enable/disable post filtering
config_post_check = "on" #是否開啟post檢測
--config waf output redirect/html
config_waf_output = "html" #action一個html頁面,也可以選擇跳轉
--if config_waf_output ,setting url
config_waf_redirect_url = "http://www.baidu.com"
config_output_html=[[ #下面是html的內容
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Language" content="zh-cn" />
<title>網站防火墻</title>
</head>
<body>
<h1 align="center"> # 您的行為已違反本網站相關規定,注意操作規范.
</body>
</html>
]]
```
## 學習access.lua的配置
```
root@nginx waf]# pwd
/usr/local/openresty/nginx/conf/waf
[root@nginx waf]# cat access.lua
require 'init'
function waf_main()
if white_ip_check() then
elseif black_ip_check() then
elseif user_agent_attack_check() then
elseif cc_attack_check() then
elseif cookie_attack_check() then
elseif white_url_check() then
elseif url_attack_check() then
elseif url_args_attack_check() then
--elseif post_attack_check() then
else
return
end
end
waf_main()
```
書寫書序:先檢查白名單,通過即不檢測;
再檢查黑名單,不通過即拒絕,檢查UA,UA不通過即拒絕;
檢查cookie;URL檢查;URL參數檢查,post檢查.
# 啟動WAF并測試
## 模擬sql注入
顯示效果如下:

##使用ab壓測工具模擬防cc攻擊
yum安裝Apache
[root@nginx ~]# yum -y install httpd


## 模擬ip黑名單
將請求ip放入ip黑名單中
[root@nginx rule-config]# echo "192.168.0.16" >>/usr/local/openresty/nginx/conf/waf/rule-config/blackip.rule
顯示結果如下:

## 模擬ip白名單
將請求ip放入ip白名單中,此時將不對此ip進行任何防護措施
[root@nginx rule-config]# echo "192.168.0.16" >>/usr/local/openresty/nginx/conf/waf/rule-config/whiteip.rule
顯示結果如下:

## 模擬URL參數檢測
在瀏覽器輸入:http://192.168.0.14/?a=select * from table
顯示結果如下:

詳細規定在arg.rule中有規定,對請求進行了規范
# 總結
WAF它的定位就決定了只能是一款輔助性安全防御產品,無法從根本上解決產品自身存在的安全缺陷。考慮到安全與效率,WAF也不可能去攔截所有的入侵嘗試,畢竟繞過WAF的奇技淫巧還是非常之多的。
根本性的防御措施還是需要放在安全開發流程、安全規范的落地和推行上面。
在眾多的安全防御產品中,有的產品和方案需要花很多錢,但是收益卻并不怎么明顯。而WAF,在綜合考量下它性價比超高,雖然治標不治本,但對于提高攻擊成本、降低入侵概率還是很有幫助的。
- 獻給我的朋友們
- 一、個人對學習的看法
- 二、運維技能圖譜
- 三、運維常用技能
- 3.1 Vim(最好用的編輯器)
- 3.2 Nginx & Tengine(Web服務)
- 1. Nginx介紹和部署
- 2. Nginx配置解析
- 3. Nginx常用模塊
- 4. Nginx 的session 一致性問題
- 3.3 Tomcat(Web中間件)
- 3.4 Keepalived(負載均衡高可用)
- 3.5 Memcache(分布式緩存)
- 3.6 Zookeeper(分布式協調系統)
- 3.7 KVM(開源虛擬化)
- 1. 虛擬化介紹
- 2. KVM基礎
- 3. 設置VNC和時間同步
- 4. kvm虛擬機快照備份
- 5. kvm虛擬機在線擴展磁盤
- 6. kvm虛擬機靜態遷移
- 7. kvm虛擬機動態遷移
- 8. kvm虛擬機存儲池配置
- 9. cpu添加虛擬化功能
- 3.8 GitLab(版本控制)
- 3.8.1 GitLab安裝與漢化
- 3.9 Jenkins(運維自動化)
- 3.10 WAF(Web防火墻)
- 3.10.1初探WAF
- 四、常用數據庫
- 4.1 MySQL(關系型數據庫)
- 1. MySQL源碼安裝
- 4.2 Mongodb(適用與大數據分析的數據庫)
- 4.3 Redis(非關系數據庫)
- 五、自動化運維工具
- 5.1 Cobbler(系統自動化部署)
- 5.2 Ansible(自動化部署)
- 5.3 Puppet(自動化部署)
- 5.4 SaltStack(自動化運維)
- 六、存儲
- 6.1 GFS(文件型存儲)
- 6.2 Ceph(后端存儲)
- 七、運維監控工具
- 7.1 對監控的理解
- 7.2 Zabbix(運維監控)
- 7.2.1 Zabbix簡介
- 7.2.2 Zabbix服務部署
- 1. Zabbix服務端部署
- 2. Zabbix客服端部署
- 3. 配置前端展示
- 4. zabbix告警配置
- 7.2.3 Zabbix監控服務
- 1. 監控網絡設備
- 2. 自定義Nginx監控
- 7.3 云鏡(安全監控)
- 7.4 ELK(日志收集展示)
- 八、運維云平臺
- 8.1 OpenStack(開源云操作系統)
- 8.1.1 OpenStack簡介
- 8.1.2 實驗架構設計
- 8.1.3 集群環境準備
- 8.1.4 controller節點部署
- 1. 安裝Mariadb Galera Cluster集群
- 2. 安裝RabbitMQ Cluster集群
- 3. 安裝Pacemaker
- 4. 安裝HAProxy
- 5. 安裝配置Keystone
- 6. 安裝配置glance
- 1. 制作鏡像模板
- 7. 安裝配置nova
- 8. 安裝配置neutron
- 1. 配置虛擬機網絡
- 9. 安裝Dashboard
- 10. 安裝配置cinder
- 8.1.5 compute節點部署
- 1. 安裝相關軟件包
- 2. 安裝Neutron
- 3. 配置cinder
- 4. 創建第一個虛擬機
- 8.1.6 OpenStack報錯處理
- 1. cinder僵尸卷刪除
- 8.1.7 快速孵化虛擬機方案
- 8.1.8 Kolla容器化部署OpenStack
- 1. 單點部署
- 2. 多節點部署
- 8.2 Tstack(騰訊云平臺)
- 8.3 K8s(微服務容器化)
- 九、運維編程技能
- 9.1 Shell(運維必會語言)
- 9.2 Python(萬能的膠水語言)
- 十、Devops運維
- 10.1 理念
- 10.2 Devops實戰