该项目是《白帽子安全开发实战》的第十章内容零信任安全。开发语言为go语言,此项目由三部分组成:反向代理与路由模块(并非隐式代理,没有实现将代理隐藏的功能),认证模块,鉴权模块。详细开发过程我还正在学习中,由于没有接触过go语言,很多地方并不是很懂,都得从零开始学习。
此项目的github地址为:
http://github.com/netxfly
在本机上跑这个项目我遇到了很多的问题,首先是go语言的依赖包的问题,很多外网和github上的包由于网络问题无法下载,我通过修改go mod和go init等命令外加修改go语言的网络代理和打开代理才解决这个问题。这样这个项目在本机vscode才不报错,其次就是很奇怪的网络的问题,此项目的前面各个部分的demo在本机都能跑通,但就是最后一个集成完成的测试demo在本机总是跑不通,服务端无法收到并记录客户端的访问请求和一些基础ip信息。最后解决办法是在linux虚拟机上从头开始配置相关文件,最终庆幸的是最终在linux虚拟机上最终跑通了。
项目展示结果:
有一个B站视频是该项目的运行效果https://www.bilibili.com/video/BV1uK4y1S7Ny?from=search&seid=12273164360537456600
实现效果如下:
首先是运行zero-trust-demo下的main.go文件,实现效果是启动四个端口,其中8081,8082,8083是上端服务器,8000是代理服务器,当我们访问8000端口的时候,会自动跳转到8081,8082,8083其中一个上端服务器
演示效果:
直接访问8000端口,会直接告诉你i am proxy
直接访问上游服务器端口8081,8082,8083
这个上游服务器的作用是每次用户访问时输出后端的监听地址,后端服务器的host,用户请求的url和header,是利用中间件实现的。
当访问url为8000端口下的/blog目录的时候,此时8000端口是允许的,会自动跳动到上游服务器,如下图,每次刷新后都会随机跳动到8081,8082,8083的其中一个服务器。
控制台打印出来的信息和以上上有服务器blog目录下的东西差不多:
如下
代码展示以及个人理解
主函数:
此项目结构目录
在server.go 和server.go 两个包下主要是一些相关函数和中间件的实现和调用
看了一下,以我目前的能力很多地方和函数都不是能够理解和使用,所以这快先暂时不解释源码了。
下面就是重头戏了,zero-trust-proxy的实现
一部分一部分来看
反向代理模块的实现与配置文件
反向代理的配置文件由三部分组成:前端服务器(反向代理本身),后端服务器(反向代理的上游服务器),路由(也就是url,根据不同的url
,实现不同的操作)
配置文件:
第一部分server配置文件:
server:
listen_ip: 0.0.0.0
//反向代理服务器监听的ip,我一直没有搞明白监听ip是什么意思
listen_port: 443
//反向代理服务器监听的端口
timeout: 30s
//读写超过时间
idle_timeout: 30s
//空闲会话超过时间
tls_context:
//证书的配置
certificate_path: certs/server.crt
private_key_path: certs/server.key
这里的配置文件主要是填充http.Server结构体中对应的字段。至于公钥和私钥文件是通过方法加载的,暂时先不讨论
第二部分上游服务器的配置
upstreams:
- name: xsec1
//后端服务器的名字
connect_timeout: 5s
//会话超过时间
url: http://127.0.0.1:8081
//后端服务器的协议与地址
- name: xsec2
connect_timeout: 5s
url: http://127.0.0.1:8082
主要是为了填充
中的
// ReverseProxyConfig configuration settings for a proxy instance
type ReverseProxyConfig struct {
ConnectTimeout time.Duration
Timeout time.Duration
IdleTimeout time.Duration
}
此结构体
第三部分路由模块
routes:
- host: p.xsec.io
rules:
- request.ip.network("10.211.55.0/24")
- request.email == "xsec888@gmail.com"
http:
paths:
- path: /
upstream: xsec1
authentication: true
- host: blog.xsec.io
rules:
- request.ip == "10.211.55.3"
- request.email == "xsec888@gmail.com"
http:
paths:
- path: /blog/
upstream: xsec1
authentication: true
使用了路由框架,根据配置文件的host,upstream,path封装了相应的路由设置函数,代码没看懂