構建基於WAF的S3安全體系
1
需求描述
有線上項目需要對RGW的bucket的訪問進行白名單控制,只允許白名單內的IP去訪問指定的bucket,簡單寫了個demo,基本思路是通過openresty寫一個WAF模塊,去實現設置bucket、IP白名單設置。
2
基本原理
OpenResty 處理一個請求,它的處理流程請參考下圖(從 Request start 開始):
幾個關鍵階段的簡介如下
set_by_lua*:流程分支處理判斷變數初始化
rewrite_by_lua*:轉發、重定向、緩存等功能(例如特定請求代理到外網)
access_by_lua*:IP 准入、介面許可權等情況集中處理(例如配合 iptable 完成簡單防火牆)
content_by_lua*:內容生成
header_filter_by_lua*:響應頭部過濾處理(例如添加頭部信息)
body_filter_by_lua*:響應體過濾處理(例如完成應答內容統一成大寫)
log_by_lua*:會話完成後本地非同步完成日誌記錄(日誌可以記錄在本地,還可以同步到其他機器)
openresty詳細介紹可以參考:https://moonbingbing.gitbooks.io/openresty-best-practices/ngx_lua/phase.html
本文的原理非常簡單:通過設置bucket和IP的白名單,在access_by_lua階段對request裡面的host和uri等欄位進行規則匹配再決定是否放行。
3
nginx配置
配置文件路徑 /etc/nginx/conf.d/default.conf
4
WAF腳本
腳本路徑 /etc/nginx/conf.d/access.lua
5
功能驗證
在一個IP白名單以外的機器訪問
對應的nginx日誌
6
後話
通過上面的例子可以看到openresty在和RGW整合方面非常強大,可以滲透到整個S3的request處理過程,大家可以根據上面的例子去舉一反三,實現對各種S3 RESTful介面的控制,擺脫對ceph版本的依賴,實現真正的松耦合以及標準自定義。最後,因為個人身體原因,可能本公眾號會暫停更新一段時間,多謝各位一直以來的支持。
歡迎訂閱Ceph圈內乾貨最多的對象存儲公眾號,老司機教你手把手擼對象存儲。
TAG:Ceph對象存儲方案 |