本公众号发布的文章均转载自互联网或经作者投稿授权的原创,文末已注明出处,其内容和图片版权归原网站或作者本人所有,并不代表安世加的观点,若有无意侵权或转载不当之处请联系我们处理,谢谢合作!
欢迎各位添加微信号:asj-jacky
加入安世加 交流群 和大佬们一起交流安全技术
笔者早年进入互联网行业之时,微服务未起,Nginx未兴。那些年有段时间我每天的工作之一就是配置大量的Apache重写规则,把请求路径用一系列复杂的正则匹配重定向到SEO希望的路径。我们那时候的期望就是能够通过努力提升我们的网站在SEO的排名。
时至今日,我们早已远去了那些刀耕火种的岁月。现在的同学可能对Apache的理解只是一个软件基金会了,但是这个名字曾经属于一个反向代理。软件的更迭是如此迅速,Redis的作者在文章中这样描述:我相信软件虽然很棒,但不会像一本存活了几个世纪的书一样伟大,这绝不是因为它本身不好,而是因为其中的副作用,并且,它终将被更有用的软件替换掉。因此有时我会觉得自己做的一切终将都是徒劳的。国内一位著名的Golang推广者也曾说相比于做一款软件,其更愿意发明一门语言,因为语言的寿命也许是百年。
-
基于Nginx或Openrestry二次开发
-
完全自研
-
基于开源社区已有的成熟产品开发
// Nginx配置
server_name test.com;
location /wwww/test {}
// 基于条件表达式的ZFE配置
req_host_in("test.com") && req_path_in("/www/test")
cond: req_user_type_in("departure") && req_host_in("a.com|b.com|c.com")
effect: block
cond: req_host_in("a.com|b.com|c.com") && req_user_action_in("privacy")
effect: record
cond: req_cookie_contain("sessionid")
cond: req_ssouserid_in("234|3444")
策略引擎
-
产品线(product):策略生效的产品线。
-
身份主体(principal):描述策略授权的身份实体。包括用户、应用、API、设备、用户组和角色等实体。
-
操作(action):满足条件后授权的操作。
-
效力(effect):描述声明产生的结果是“允许”还是“显式拒绝”。包括 allow(允许)和 deny (显式拒绝)两种情况,对应于action。
-
资源(resource):描述授权的具体数据即资源。资源采用分段式设计,不同的段代表不同的区间,一般而言从大范围向小范围递进,直到能够标志具体数据。
-
条件(cond):描述策略生效的约束条件,这里由高级表达式实现。
{
"version": "2.0",
"statement": [
{
"product":"sec",
"effect": "allow",
"action": "api:GetUserInfo",
"principal": {
"zto": "zto:iam:ztemp:1234567"
},
"resource": "*",
"cond": "remote_ip_in(10.217.182.3/24|11.21.33.72/24)"
}
]
}
该样例表示允许sec产品线中属于zto租户下的ztempy用户池(zt employee) 的用户 1234567在 10.217.182.* 或者 111.21.33.* 网段对iam服务中的api:GetUserInfo的访问。 ZFE基于策略可以实现针对各种复杂场景无侵入的访问控制,但是ZFE如何基于自然语言而不是传统的ACL来实现真正的应用层的零信任? 上述条件表达式举例中仍然部分沿用了传统网络的基于IP的描述符,可以做一定的过渡和兼容,但我们演进的方向是利用全局唯一的资源名称、身份实体、操作及其上的元数据,利用打标签的形式来构建元数据体系,从而应用在使用自然语言书写的表达式中,构成跨越传统网络边界的更具有普适灵活性的基于策略访问控制模型。在实际的落地中我们要解决诸如:
-
资源、身份实体、操作收集和定义的问题 -
标签库的梳理建立和自动化聚合更新的问题 -
访问资源行为的多级依赖关系梳理和动态更新问题 -
策略的统一管理、动态更新、策略冲突处理等问题 -
......
-
账号失陷检测 -
主机失陷检测 -
数据泄漏检测 -
内部用户滥用 -
提供事件调查的上下文
一流的可见性
HTTP_BACKEND_CONN_ALL与后端建立的总连接数
HTTP_BACKEND_CONN_SUCC与后端建立成功的连接数
HTTP_BACKEND_REQ_ALL转发到后端的总请求数
HTTP_BACKEND_REQ_SUCC成功转发到后端的请求数
HTTP_PANIC_BACKEND_READ后端READ协程panic的次数
HTTP_PANIC_BACKEND_WRITE后端WRITE协程panic的次数
HTTP_PANIC_CLIENT_FLUSH_LOOP客户端FLUSH协程panic的次数
HTTP_PANIC_CLIENT_WATCH_LOOP客户端WATCH协程panic的次数
强大的流量控制能力
不错的性能
借助于golang语言,虽然ZFE本身的极限性能略逊色于Nginx,但仍能让人满意,在高峰时期,ZFE整体内存开销也并不算高。
异步传输
提起Nginx一般首先会想到的是高性能,其实Nginx在高性能之外的异步传输是其能够迅速普及的另外一大优势。
原生支持各种协议
作为中通Nginx的替代方案,ZFE自然需要支持各种常见的协议。
反向代理
目前ZFE的一项主要工作就是替换中通的Nginx,所以ZFE会继续在这一块努力,对于Nginx的兼容性是一个主要的考虑方向,未来会继续改进。
云原生Ingress ZFE
流量入口代理作为互联网系统的门户组件,具备众多选型:从老牌代理 HAProxy、Nginx,再到容器化Ingress规范与实现,不同选型间功能、性能、可扩展性、适用场景参差不齐,这其中更有Envoy这个后期之秀。之所以把容器化Ingress这个方向作为ZFE的发展方向之一是因为中通的云原生平台也正在如火如荼的进行中,在和兄弟部门的沟通中我们同样看到了ZFE在这个领域,在中通的巨大需求。乘势而为,方能有所为。
SDP隐身网关
软件定义的边界(SDP)是由云安全联盟(CSA)开发的一种安全框架,它根据身份控制对资源的访问。该框架基于美国国防部的“need to know”模型——每个终端在连接服务器前必须进行验证,确保每台设备都是被允许接入的。其核心思想是通过SDP架构隐藏核心网络资产与设施,使之不直接暴露在互联网下,使得网络资产与设施免受外来安全威胁。
SDP有时被说成是“黑云”,因为应用架构是“黑”的——根据美国国防部的定义,这个“黑”代表了架构无法被检测到。如果攻击者无法知道目标在何方,那么攻击将无法进行。因此,在SDP架构中,服务器没有对外暴露的DNS或者IP地址,只有通过授权的SDP客户端才能使用专有的协议进行连接。
看到这里我想读者应该已经明白为何ZFE会把SDP隐身网关作为方向之一,往往技术的发展会在想象不到的地方开花结果,但一切又是这么理所当然。
作者简介
王佳君,中通快递高级安全工程师,负责中通零信任安全代理的开发。积极的开源参与者。
https://github.com/iwannay
https://doc.traefik.io/traefik/
kubernetes云原生纪元:
https://blog.csdn.net/weixin_37546425/article/details/104179122
https://github.com/alibaba/Sentinel
本文始发于微信公众号(安世加):技术干货 | 中通零信任安全代理ZFE
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论