定海WAF网站防火墙适用于个人开发者,工作室,小公司的开源防火墙.保护网站安全,降低网站漏洞带来的数据泄露等风险.致力于将定海开发为一个更加灵活,性能高效,更加安全的防火墙.
初衷:
1. **便捷: **如果是单纯的从自己的日志或者nginx,apache日志等查看信息不方便 , 不知道自己的网站到底谁在访问,请求了什么. waf在网站或者API防护可以更方便用户查询这些信息,做出及时的处理.
2. **DIY: **在开发过程中一些特定的功能加入自己的想法.
项目上层服务使用kratos框架进行开发,内核服务使用coraza waf开源引擎,提高内核开发效率.
需要掌握的知识:
- golang 【置顶】Go语言学习之路/Go语言教程 | 李文周的博客
- kratos 简介 | Kratos
- resetful 重新认识RESTful | 少个分号
- grpc Basics tutorial | Go | gRPC
- proto3+protobufvalidate Language Guide (proto 3) | Protocol Buffers Documentation
- coraza waf OWASP Coraza - Enterprise-grade open source web application firewall library
- mysql + gorm GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
- redis
- kafka
- etcd
- clickhouse 什么是ClickHouse? | ClickHouse Docs
修改DNS,让域名解析到反向代理服务器。所有流量经过反向代理进行检测,检测无问题之后再回源至真正的Web服务器。
- 优点
- 隐藏真正的后端web服务地址
- 缺点
- 权限过高,容易造成不可预计的风险
尽可能的保证waf内核的轻量级,避免出现过多的冗余功能,保证waf内核的稳定性. 用户通过上层服务去设置防护配置,利用etcd的watch属性进而修改内置中waf实列的配置.
├─api #/ 下面维护了微服务使用的proto文件以及根据它们所生成的go文件
│ ├─dashBorad # 数据看板
│ │ └─v1
│ ├─user # 用户相关服务
│ │ └─v1
│ └─wafTop # 防护配置
│ └─v1
├─app # app
│ ├─dashBorad # 数据看板相关服务
│ │ ├─cmd # // 整个项目启动的入口文件
│ │ │ └─dashBorad
│ │ ├─configs
│ │ ├─internal // 该服务所有不对外暴露的代码,通常的业务逻辑都在这下面,使用internal避免错误引用
│ │ │ ├─biz // 业务逻辑的组装层
│ │ │ ├─conf // 内部使用的config的结构定义,使用proto格式生成
│ │ │ ├─data // 业务数据访问,包含 cache、db 等封装,实现了 biz 的 repo 接口。
│ │ │ ├─server // http和grpc实例的创建和配置
│ │ │ └─service // 实现了 api 定义的服务层,类似 DDD 的 application 层
│ │ └─third_party
│ │ ├─errors
│ │ ├─google
│ │ │ ├─api
│ │ │ └─protobuf
│ │ │ └─compiler
│ │ ├─openapi
│ │ │ └─v3
│ │ └─validate
│ ├─user # 用户相关服务
│ │ ├─cmd // 整个项目启动的入口文件
│ │ │ └─user
│ │ ├─configs
│ │ ├─internal
│ │ │ ├─biz
│ │ │ │ └─iface
│ │ │ ├─conf
│ │ │ ├─data
│ │ │ │ └─model
│ │ │ ├─server
│ │ │ │ └─plugin
│ │ │ └─service
│ │ └─third_party
│ │ ├─errors
│ │ ├─google
│ │ │ ├─api
│ │ │ └─protobuf
│ │ │ └─compiler
│ │ ├─openapi
│ │ │ └─v3
│ │ └─validate
│ └─wafTop # 上层防护配置相关服务
│ ├─cmd
│ │ └─wafTop
│ ├─configs
│ └─internal
│ ├─biz # 业务逻辑
│ │ ├─iface
│ │ ├─rule
│ │ ├─site
│ │ └─strategy
│ ├─conf
│ ├─data # 数据处理
│ │ ├─dto
│ │ └─model
│ ├─server
│ │ └─plugin
│ └─service #
│ ├─rule
│ ├─site
│ └─strategy
└─third_party # 依赖的外部porto文件
├─buf
│ └─validate
│ └─priv
├─errors
├─google
│ ├─api
│ └─protobuf
│ └─compiler
├─openapi
│ └─v3
└─validate
项目目录下执行
# 初始化项目需要的软件包
make init
# 启用项目运行需要的docker软件
make docker
# 生成项目需要的wire文件
make wire
# go mod tidy
make tidy
# 一键初始化项目运行需要的所有环境
make all
# 新建http服务协议文件
kratos proto add api/http_admin/user.proto
# 新建grpc服务协议文件
kratos proto add api/grpc_user/user.proto
# 新建mq消费数据协议文件
kratos proto add api/mq_consume/user.proto
项目目录下执行
# 新建http服务
kratos new app/http_admin/ --nomod
# 新建grpc服务
kratos new app/grpc_user/ --nomod
# 新建cron服务
kratos new app/cron/ --nomod
# 新建mq消费服务
kratos new app/mq_consume/ --nomod
进入app下某个模块下执行
# 模块配置文件proto生成go文件
make config
# 模块微服务proto生成go文件(仅用于微服务开发)
make grpc
# 模块http服务proto生成go文件(仅用于http服务开发)
make http
# 模块错误码proto生成go文件
make errors
# 模块proto文件生成go文件(一般用在根据proto协议生成go数据结构,纯粹用于数据结构定义)
make proto
# ent ORM初始化
make entinit
# ent ORM生成,根据`ent/schema`数据库表生成go文件
make ent
# ent ORM导入,导入数据库表数据schema,要求较高的请通过在线工具手动定制。
make entimport
# 模块wire生成
make wire
# generate代码生成
make generate
# 编译项目可执行程序
make build
# 运行测试
make test
# 运行
make run
项目目录下执行
make docker
v1.0.0
- 内核具有基础防护功能 , 支持动态更新策略 , 以及各个网站之间的waf实列隔离,简单的实现了反向代理,将请求转发至真正的后端地址支持coraza内置防护策略,包括:SQL注入(SQLi),跨站点脚本(XSS),PHP和Java代码注入,HTTPoxy,Shellshock,脚本/扫描器/机器人检测&元数据和错误泄漏。可以将攻击事件落地本地磁盘的csv文件.
- 上层服务,用户配置需要防护的网站,策略,规则组以及自定义规则. 目前内置规则不支持用户自定义.
v1.0.1
- 日志插件和waf内核部通过docker简化部署方式
- 增加了数据看板, 可以查看各个网站的防护情况
- 优化平台服务代码结构 , 删除冗余代码
- 增加白名单功能 , 目前支持URI和IP两种
- 内核新增配置文件 , 更加灵活
- 搭建了线上环境配置 , 以及链路追踪 , 服务注册框架
v2.0.0
- 内核可记录正常http请求
- 修改MakeFile文件 , 让搭建项目结构更加方便 ......