温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何构建基于WAF的s3cmd安全体系

发布时间:2021-12-30 16:26:24 来源:亿速云 阅读:108 作者:iii 栏目:云计算

这篇文章主要讲解了“如何构建基于WAF的s3cmd安全体系”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何构建基于WAF的s3cmd安全体系”吧!

需求描述

有线上项目需要对RGW的bucket的访问进行白名单控制,只允许白名单内的IP去访问指定的bucket,简单写了个demo,基本思路是通过openresty写一个WAF模块,去实现设置bucket、IP白名单设置。

基本原理

OpenResty 处理一个请求,它的处理流程请参考下图(从 Request start 开始):

如何构建基于WAF的s3cmd安全体系

几个关键阶段的简介如下

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*: 会话完成后本地异步完成日志记录(日志可以记录在本地,还可以同步到其他机器)

本文的原理非常简单:通过设置bucket和IP的白名单,在access_by_lua阶段对request里面的host和uri等字段进行规则匹配再决定是否放行。

nginx配置

配置文件路径 /etc/nginx/conf.d/default.conf

upstream zone_write {
    server 10.63.48.18:7480 weight=13;#对应后端RGW civetweb节点
    keepalive 30;
}

server {
    listen       80;
    server_name s3.ceph.work *.s3.ceph.work; #endpoint对应的域名

    location  / {
    proxy_ignore_client_abort on ;
    proxy_http_version 1.1; #指定http版本,减少低版本带来的安全隐患
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    access_by_lua_file /etc/nginx/conf.d/access.lua; #WAF脚本
    proxy_pass http://zone_write;
    }
}

WAF脚本

脚本路径 /etc/nginx/conf.d/access.lua

local uri = ngx.var.uri
local client_ip = ngx.var.remote_addr
local host = ngx.var.host
local endpoint = 's3.ceph.work' #endpoint地址
local white_ip_list = {["127.0.0.1"]=true} #IP白名单
local bucket_list = {["bucket1"]=true,["bucket2"]=true} #bucket白名单

function get_bucketname(host,uri,endpoint)
    local bucket_name = string.match(host, '^[%w-]+.' .. tostring(endpoint) .. '$')
    if (string.match(host, '^' .. tostring(endpoint) .. '$')) then
        if (string.match(uri,'^/$')) then
            return
        end
        local bucket_name = string.match(uri, '^/[%w-]+/')
        return string.sub(bucket_name,2,string.len(bucket_name)-1)
    elseif bucket_name then
        return string.sub(bucket_name,1,string.len(bucket_name)-string.len(endpoint)-1)
    else
        return
    end
end

if true == bucket_list[get_bucketname(host,uri,endpoint)] then
    if true ~= white_ip_list[client_ip] then
        ngx.log(ngx.ERR,"Forbidden:",client_ip)
        ngx.exit(ngx.HTTP_FORBIDDEN)
    end
end

功能验证

在一个IP白名单以外的机器访问

curl bucket1.s3.ceph.work/asdasd #virtual hosted style 方式
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h2>403 Forbidden</h2></center>
<hr><center>nginx</center>
</body>
</html>


curl s3.ceph.work/bucket2/1233 #path-style 方式
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h2>403 Forbidden</h2></center>
<hr><center>nginx</center>
</body>
</html>

对应的nginx日志

2017/09/21 14:05:42 [error] 30725#0: *28 [lua] access.lua:29: forbidden:10.xx.xx.xx, client: 10.xx.xx.xx, server: s3.ceph.work, request: "GET /asdasd HTTP/1.1", host: "bucket1.s3.ceph.work"

2017/09/21 14:02:47 [error] 30725#0: *22 [lua] access.lua:29: forbidden:10.xx.xx.xx, client: 10.xx.xx.xx, server: s3.ceph.work, request: "GET /bucket2/1233 HTTP/1.1", host: "s3.ceph.work"

感谢各位的阅读,以上就是“如何构建基于WAF的s3cmd安全体系”的内容了,经过本文的学习后,相信大家对如何构建基于WAF的s3cmd安全体系这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI