Skip to content

YFGo/dinghai_waf

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

软件介绍:

定海WAF网站防火墙适用于个人开发者,工作室,小公司的开源防火墙.保护网站安全,降低网站漏洞带来的数据泄露等风险.致力于将定海开发为一个更加灵活,性能高效,更加安全的防火墙.

初衷:

1. **便捷: **如果是单纯的从自己的日志或者nginx,apache日志等查看信息不方便 , 不知道自己的网站到底谁在访问,请求了什么. waf在网站或者API防护可以更方便用户查询这些信息,做出及时的处理.
2. **DIY: **在开发过程中一些特定的功能加入自己的想法.

技术栈

项目上层服务使用kratos框架进行开发,内核服务使用coraza waf开源引擎,提高内核开发效率.

需要掌握的知识:

  1. golang 【置顶】Go语言学习之路/Go语言教程 | 李文周的博客
  2. kratos 简介 | Kratos
  3. resetful 重新认识RESTful | 少个分号
  4. grpc Basics tutorial | Go | gRPC
  5. proto3+protobufvalidate Language Guide (proto 3) | Protocol Buffers Documentation
  6. coraza waf OWASP Coraza - Enterprise-grade open source web application firewall library
  7. mysql + gorm GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
  8. redis
  9. kafka
  10. etcd
  11. clickhouse 什么是ClickHouse? | ClickHouse Docs

接入方式

CNAME 接入

修改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

新建API或grpc协议文件

项目目录下执行

# 初始化项目需要的软件包
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

数据库ER图

项目更新日志

v1.0.0

  1. 内核具有基础防护功能 , 支持动态更新策略 , 以及各个网站之间的waf实列隔离,简单的实现了反向代理,将请求转发至真正的后端地址支持coraza内置防护策略,包括:SQL注入(SQLi),跨站点脚本(XSS),PHP和Java代码注入,HTTPoxy,Shellshock,脚本/扫描器/机器人检测&元数据和错误泄漏。可以将攻击事件落地本地磁盘的csv文件.
  2. 上层服务,用户配置需要防护的网站,策略,规则组以及自定义规则. 目前内置规则不支持用户自定义.

v1.0.1

  1. 日志插件和waf内核部通过docker简化部署方式
  2. 增加了数据看板, 可以查看各个网站的防护情况
  3. 优化平台服务代码结构 , 删除冗余代码
  4. 增加白名单功能 , 目前支持URI和IP两种
  5. 内核新增配置文件 , 更加灵活
  6. 搭建了线上环境配置 , 以及链路追踪 , 服务注册框架

v2.0.0

  1. 内核可记录正常http请求
  2. 修改MakeFile文件 , 让搭建项目结构更加方便 ......

软件UI管理界面