什么是ZeroTrust(零信任安全)? 零信任安全是一种IT安全模型,要求对尝试访问专用网络上的资源的每个人和设备进行严格的身份验证,无论他们是位于网络边界内部还是外部。ZTNA(ZeroTrustNetworkAccess,零信任网络访问)是与零信任架构相关的主要技术,但零信任是一种全面的网络安全方法,它结合了几种不同的原则和技术。Cloudflare 如其所定义一样,ZeroTrust(零信任安全)是一种IT安全模型,它结合了好几种不同的安全原则和技术。比如,Tunnel提供对私有网络的访问,应用策略对客户端进行访问控制,SSO提供对资源访问的统一认证,安全网关可进行病毒查杀、流量审计,还有日志服务对所有的请求进行记录、分析等。 Tunnel工作原理 使用Cloudflare隧道,无需将流量发送到外网IP,而是在主机上运行一个轻量级守护程序,该守护程序只与Cloudflare边缘网络创建出站连接,该主机可访问Cloudflare边缘网络即可。 CloudflareTunnel与用户帐户中的DNS记录一一对应,对特定域名的请求首先到达Cloudflare的边缘网络,然后Cloudflare边缘网络通过隧道将这些请求发送到源服务器 示意图如下: 0x02设置隧道 前置要求:将站点添加至Cloudflare域名服务器修改为Cloudflare 注:Cloudflare提供两种方式进行隧道设置,一种命令行模式,另一种图形化方式。图形化方式设置、管理都更为方便,推荐使用图形化方式。这里对两种配置方式都进行一次记录。一、命令行模式 1。安装Cloudflaredwgetqhttps:github。comcloudflarecloudflaredreleaseslatestdownloadcloudflaredlinuxamd64。debdpkgicloudflaredlinuxamd64。deb 2。认证 执行命令cloudflaredtunnellogin 运行此命令将生成一个链接,点击该链接,打开浏览器窗口并按提示登录Cloudflare帐户。 登录后,选择对应的域,点击授权 完成后,会在在默认的Cloudflare缓存目录中生成帐户证书(root。cloudflaredcert。pem)。 3。创建隧道cloudflaredtunnelcreate隧道名 运行此命令将以提供的名称创建一个隧道,同时会生成一个UUID与该隧道进行关联。记下隧道的UUID和隧道凭据文件的路径。 e。g 确认隧道是否创建成功cloudflaredtunnellist 4。创建配置文件 在默认Cloudflared配置文件目录中创建对应的配置文件。该配置文件将配置隧道将指定源的流量路由至你指定的主机名上。 语法:url:http:localhost:8000tunnel:TunnelUUIDcredentialsfile:root。cloudflaredTunnelUUID。json e。g 5。流量路由 配置一个CNAME记录,将对应子域名的流量定向到隧道。 路由单个应用cloudflaredtunnelroutednsUUIDorNAMEhostname e。g 验证路由配置是否生效,Cloudflare控制面板DNS配置处,确认是否正确配置对应的CNAME记录。 6。运行隧道cloudflaredtunnelrun隧道名或UUID或cloudflaredtunnelconfigpathyourconfigfile。yamlrun 注意:如果配置文件名进行了自定义,或者路径不是在默认的。cloudflare目录中,则需使用config选项来指定对应的配置文件路径。 e。g 7。检查隧道cloudflaredtunnelinfo隧道名或UUID 8。测试 Web访问正常 Web访问测试正常,但CobaltStrike上线测试报错。原因是因为请求中的域名localhost与listener证书中的域名不匹配导致。 查看文档之后,发现cloudflared使用名为Ingress的规则进行配置。 修改其配置,设置配置项noTLSVerifytrue,不进行SSL证书验证。 注意:Ingress是通过hostname与Path进行匹配的,匹配到即进行对应设置的路由转发。且需强制配置一个CatchAll条件,即访问请求不匹配任何Ingress规则时,所执行的转发动作,如这里的httpstatus:404,否则会报错。 e。g 二、图形化方式配置 登录Cloudflare,进入ZeroTrust主页 首次使用,会要求配置团队名 选择免费计划、付款方式,然后支付 进入ZeroTrust主页面板后,访问菜单【Access】【Tunnels】即可对所有隧道进行管理。 创建新的隧道 按安装指令进行安装 完成之后,进行相应的路由配置。可以配置只转发单个服务,也可以配置转发整个网络。 注意:通过Cloudflared控制面板对命令行方式创建的隧道进行管理,需要先对其进行配置迁移。Cloudflare提供了自动化迁移步骤,几乎一键迁移。 e。g 至此,我们即可将内网端口通过Cloudflare的隧道转发出来了。 e。g CobaltStrike新建了一个Listener,监听8743端口,但是未开启防火墙,所以正常情况是无法访问的。但是,通过Cloudflare隧道转发出来的域名却可以访问。 e。g 现在内网的端口是转发出来了,但是还存在一个问题。比如这里如果域名被扫描器扫到了,那么我们的CS服务器就会被暴露,可能会被标记,这是我们不可接受的。这里就需要利用到CloudflareZeroTrust的另一功能。 0x03ZeroTrust授权配置 正如Cloudfalre对其ZeroTrust的描述一样零信任安全是一种IT安全模型,要求尝试访问专用网络上的资源的每个人和设备进行严格的身份验证,无论他们是位于网络边界内还是外部。CloudflareZeroTrust可以给服务添加强制认证。 1。生成ServiceToken 隧道配置完成之后,第一步先生成ServiceToken。CloudfalreZeroTrust控制面板处,访问【Access】【ServiceAuth】,创建ServiceToken 2。配置应用 然后,CloudfalreZeroTrust控制面板,访问【Access】【Application】,选择添加应用Addanapplication,选择Selfhosted。 配置应用名、超时时间、子域名信息后,选择下一步。 接下来,需要配置策略。策略用于访问控制和认证等配置,控制谁可以访问该应用。 策略使用规则进行定义,规则用于配置基于哪种条件进行访问控制。比如,IP地址、IP地理位置、用户邮箱、客户端证书、ServiceToken等。这里我们使用ServiceToken,选择上一步生成的ServiceToken,继续下一步。 接下来是一些额外的配置,包括跨域、cookie属性等,按需设置,完成。这里保持默认。3。测试 完成之后,再次访问转发出来的域名,则需要进行访问控制校验。 添加ServiceToken后,再次访问,可以访问资源但是还需要进行二次认证。 这里使用OTP认证,使用邮箱接收OTP密码后,即可正常访问资源。 对于一般Web应用来说,我们的需求已经实现了。但是,对于CobaltStrike上线来说,该机制过于安全了,因为对于Beacon来说,是无法通过邮箱接收OTP密码或者进行二次认证的。 查阅文档后,CloudflareZeroTrust提供不使用第三方认证服务的选项,即只使用客户端证书、ServiceToken进行认证。 重新编辑应用策略,【Action】选项处选择ServiceAuth即可。 再次测试,使用ServiceToken即可访问对应资源了。4。CobaltStrike上线 修改CobaltStrikeprofile,在所有的ClientHTTP请求(httpget、httppost、httpstager)配置块中加入对应的ServiceToken请求头。 e。g 成功上线。 0x04总结 本文介绍了CloudflareZeroTrust功能。CloudfalreTunnel可将内网服务,或公网服务但不开放防火墙的情况下开放至公网,同时利用ZeroTrust功能对其进行访问控制及认证,可极大程度地保证对私有服务访问的安全性。 另外,还详细记录了利用ZeroTrust进行CobaltStrike上线,并为其Listener添加认证机制的配置过程。 最后,目前只对Cloudflaretunnel功能针对HTTP协议进行了研究实验,其他协议如SOCKS,甚至于对私有网络的转发还需进一步研究。 0x05参考 https:developers。cloudflare。comcloudflareoneconnectionsconnectappsinstallandsetuptunnelguidehttps:developers。cloudflare。comcloudflareoneconnectionsconnectappsinstallandsetuptunnelguidelocallocalmanagementingressnotlsverifyhttps:0xsp。comoffensiveredopstechniquesabusecloudflarezerotrustforc2channels fromhttps:mp。weixin。qq。coms?bizMzIzODAwMTYxNQmid2652143041idx1sn41a4831164eabffb17beda16a3d4d67a