恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Cloud Custodian 安全组自动修复实战:用 cloudtrail 事件模式与 set-permissions 实现近实时权限收敛
首页
资讯中心
/
Cloud Custodian 安全组自动修复实战:用 cloudtrail 事件模式与 set-permissions 实现近实时权限收敛
Cloud Custodian 安全组自动修复实战:用 cloudtrail 事件模式与 set-permissions 实现近实时权限收敛
发布时间:2026/10/10 2:39:54
云原生运维安全【免费下载链接】cloud-custodianRules engine for cloud security, cost optimization, and governance, DSL in yaml for policies to query, filter, and take actions on resources项目地址https://gitcode.com/gh_mirrors/cl/cloud-custodian点击查看免费下载导读本文基于 Cloud Custodian 官方 AWS 示例文档 securitygroupsaddpermission.rst讲解如何编写一条检测即修复的安全组策略当用户创建或修改安全组Authorize/Revoke SecurityGroupIngress时事件驱动的 Lambda 会在分钟级内自动移除全网段开放 SSH22 端口的危险入站规则并替换为运维指定的受控网段。读完本文你将掌握 cloudtrail 事件模式mode的配置方法、ingress 过滤器的匹配语义以及 set-permissions 动作中 remove-ingress / add-ingress 的完整参数用法并了解其底层实现与测试验证方式。一、策略要解决的核心问题默认允许0.0.0.0/0IPv4或::/0IPv6入站的 SSH 规则等于把实例管理端口暴露在公网是安全组配置中最常见的高危风险之一。仅靠人工事后排查攻击窗口可能长达数小时甚至数天。Cloud Custodian 给出的方案是事件驱动的近实时自动修复策略以mode: cloudtrail运行Cloud Custodian 会在当前账号与地域自动创建一条 CloudWatch Event Rule事件规则并部署触发型 Lambda 函数任何用户创建或修改安全组时相关 CloudTrail API 事件会触发 Lambda策略在事件携带的安全组上执行过滤与修复动作官方文档明确说明这类自动修复通常在一分钟内完成从而大幅缩小攻击窗口策略内置用户自定义规则即过滤命中后由运维定义的受控访问规则如1.1.1.1/32、2.2.2.2/32的 Ops/安全 SSH 访问会被添加到该安全组。二、完整策略示例原文档继承以下 YAML 是官方示例的完整原貌可直接作为策略文件使用policies: - name: sg-add-permission resource: security-group description: | Add rule to a security group. Filter any security group that allows 0.0.0.0/0 or ::/0 (IPv6) ingress on port 22, remove the rule and add user defined sg rule mode: type: cloudtrail events: - source: ec2.amazonaws.com event: AuthorizeSecurityGroupIngress ids: responseElements.securityGroupRuleSet.items[].groupId - source: ec2.amazonaws.com event: RevokeSecurityGroupIngress ids: requestParameters.groupId filters: - or: - type: ingress IpProtocol: -1 Ports: [22] Cidr: 0.0.0.0/0 - type: ingress IpProtocol: -1 Ports: [22] CidrV6: ::/0 actions: - type: set-permissions # remove the permission matched by a previous ingress filter. remove-ingress: matched # add a list of permissions to the group. add-ingress: # full syntax/parameters to authorize can be used. - IpPermissions: - IpProtocol: TCP FromPort: 22 ToPort: 22 IpRanges: - Description: Ops SSH Access CidrIp: 1.1.1.1/32 - Description: Security SSH Access CidrIp: 2.2.2.2/32三、逐段拆解mode 事件驱动机制3.1 cloudtrail 模式mode.type: cloudtrail表示策略以事件驱动方式部署。Cloud Custodian 会为策略自动生成并发布一个 Lambda 函数同时创建一条 CloudWatch Event Rule将 CloudTrail 记录到的匹配 API 调用路由到该 Lambda。因此该模式天然具备按账号与地域隔离部署示例文档明确说明规则与 Lambda 部署在your account and region近实时触发CloudTrail 事件进入 EventBridge 后通常在一分钟内完成处理与修复无需常驻轮询只在事件发生时消费资源适合这类低频但高风险的配置变更。3.2 events 事件定义与 ids 资源定位events: - source: ec2.amazonaws.com event: AuthorizeSecurityGroupIngress ids: responseElements.securityGroupRuleSet.items[].groupId - source: ec2.amazonaws.com event: RevokeSecurityGroupIngress ids: requestParameters.groupIdsource与event指定要监听的 CloudTrail 事件来源与名称。这里监听两个互补事件授权入站规则AuthorizeSecurityGroupIngress和撤销入站规则RevokeSecurityGroupIngress——这样无论用户添加还是删除规则策略都能拿到最新的安全组状态并重新评估。ids是一条 JSONPath 表达式用于从事件负载中提取受影响的资源 ID。可以看到两个事件的字段位置不同授权事件的响应体是responseElements.securityGroupRuleSet.items[].groupId可能一次授权多个规则故为数组遍历而撤销事件的请求体是requestParameters.groupId。这种精确的 ids 提取是事件驱动策略命中正确资源的关键。3.3 为什么监听两个事件只监听AuthorizeSecurityGroupIngress时如果某次变更把全网段 SSH 规则撤销后又以受控网段重新添加中间态可能绕过检测。同时监听撤销事件可以保证每次规则集合变化后都重新评估一次配合过滤器的当前状态判断见下节实现状态一致性的自动修复。四、逐段拆解ingress 过滤器匹配语义4.1 or 组合与双栈 CIDRfilters: - or: - type: ingress IpProtocol: -1 Ports: [22] Cidr: 0.0.0.0/0 - type: ingress IpProtocol: -1 Ports: [22] CidrV6: ::/0type: ingress使用安全组的IpPermissions入站规则作为过滤对象其实现为 c7n/resources/vpc.py 中的IPPermission过滤器对应的出站变体为egress/IPPermissionEgressor表示两个过滤器任一命中即整体命中用于覆盖 IPv4 与 IPv6 两种全网段开放形态IpProtocol: -1表示不限协议等价于所有协议配合端口过滤使用Ports: [22]是端口匹配语义源码 process_ports 的实现是当规则中FromPort port ToPort时即判定命中——因此这里匹配的是包含 22 端口的规则如 22-22 或 22-3389 都会命中而非必须精确等于 22-22Cidr: 0.0.0.0/0与CidrV6: ::/0分别匹配 IPv4对应规则中的IpRanges/CidrIp与 IPv6对应规则中的Ipv6Ranges/CidrIpv6实现见源码 process_cidrs。4.2 过滤器支持的完整匹配维度从 SGPermissionSchema 可以看到 ingress/egress 过滤器还可组合更多条件参数说明IpProtocol协议支持-1/tcp/udp/icmp/icmpv6也支持 value 过滤器表达式FromPort/ToPort直接按端口范围匹配也可用 value 表达式Ports端口列表规则端口区间覆盖任一列出的端口即命中OnlyPorts精确限制规则必须严格等于列出的端口首尾一致Cidr/CidrV6匹配 IPv4/IPv6 来源网段UserIdGroupPairs匹配源安全组引用SGReferences匹配引用的其他安全组按 value 过滤器求值SelfReference布尔值匹配规则是否自引用本安全组Description按规则描述匹配value 过滤器match-operator多条件之间的and/or组合默认and匹配命中的规则会被记录到资源的MatchedIpPermissions入站或MatchedIpPermissionsEgress出站注解中这正是后续remove-ingress: matched能够精准移除命中规则的数据来源见 过滤器注解逻辑。五、逐段拆解set-permissions 动作5.1 动作语义actions: - type: set-permissions remove-ingress: matched add-ingress: - IpPermissions: - IpProtocol: TCP FromPort: 22 ToPort: 22 IpRanges: - Description: Ops SSH Access CidrIp: 1.1.1.1/32 - Description: Security SSH Access CidrIp: 2.2.2.2/32remove-ingress: matched移除前面 ingress 过滤器命中的那些规则即全网段开放 22 端口的规则实现上读取注解MatchedIpPermissionsadd-ingress向安全组追加一条或多条规则可以使用与 AWSAuthorizeSecurityGroupIngressAPI 完全一致的完整语法IpPermissions、IpProtocol、FromPort、ToPort、IpRanges[].Description/CidrIp等。5.2 源码级实现c7n/resources/vpc.pyset-permissions的实现类是 SetPermissions其 schema 明确定义了四个参数参数取值说明add-ingress对象数组追加入站规则完整 AWS 授权语法add-egress对象数组追加出站规则remove-ingressall/matched/ 规则数组移除入站规则全部、过滤器命中的、或显式指定的完整规则remove-egressall/matched/ 规则数组移除出站规则同上执行顺序与幂等性设计process 方法先 add 后 remove策略先执行add-ingress/add-egress的authorize_*调用再调用内部的RemovePermissions执行revoke_*。这意味着即使 add 与 remove 的规则重叠例如测试中故意先添加一条待删除的重复规则最终仍能收敛到期望状态重复授权静默忽略add阶段捕获InvalidPermission.Duplicate客户端错误并跳过保证策略重复执行幂等不会报错见 vpc.pyadd 时自动注入 GroupId每个待添加的权限都会带上目标安全组的GroupId无需在策略中手写remove 支持三种形态matched读取过滤器注解、all清空全部出站默认全放行规则可用此快速收敛、或显式提供完整规则列表见 RemovePermissions.process配置校验validate会用 EC2 的AuthorizeSecurityGroupIngressRequest/AuthorizeSecurityGroupEgressRequest请求形状对add-*参数做 shape 校验错误配置在策略加载阶段即被发现vpc.py。5.3 所需 IAM 权限set-permissions动态计算所需权限get_permissions配置了add-ingress时需ec2:AuthorizeSecurityGroupIngressadd-egress时需ec2:AuthorizeSecurityGroupEgress配置了任一remove-*时需ec2:RevokeSecurityGroupIngress与ec2:RevokeSecurityGroupEgress。在本示例中至少需要ec2:AuthorizeSecurityGroupIngress与ec2:RevokeSecurityGroupIngress。事件驱动部署时Cloud Custodian 的 Lambda 角色需具备相应策略可通过c7n的自动角色创建流程生成。六、测试验证行为已被单元测试锁定该动作的正确性在 tests/test_vpc.py 的test_set_permission中得到了完整验证。测试策略从 AWS Config 源加载指定安全组过滤22 端口 0.0.0.0/0 入站然后执行set-permissionsremove-egress显式移除默认的-1/0.0.0.0/0出站规则remove-ingress显式移除TCP 22 0.0.0.0/0add-ingress故意先添加一条与待移除规则重复的规则验证重复添加被幂等跳过再添加 443 全网段规则并带描述SSL To The World。测试断言最终安全组IpPermissionsEgress为空默认出站全放行被移除IpPermissions仅剩443/tcp一条且描述、CIDR 均正确保留动作声明的权限集合恰为(ec2:AuthorizeSecurityGroupIngress, ec2:RevokeSecurityGroupIngress, ec2:RevokeSecurityGroupEgress)。这印证了先加后删 重复容忍的收敛逻辑也证明 add 时完整的Description等字段会如实写入 AWS。七、部署与运行在安装了 Cloud Custodianc7n的环境中将上文策略保存为sg-add-permission.yml执行# 事件驱动模式发布 CloudWatch Event Rule Lambda custodian run -s . sg-add-permission.yml # 或指定账号/地域运行 custodian run --region us-east-1 -s . sg-add-permission.yml首次运行会创建 Lambda 函数与事件规则mode策略也支持通过custodian schema校验策略合法性事件驱动策略的离线调试可配合仓库中的 测试夹具 与custodian run --dryrun思路进行若只想检测告警、暂不自动改可将actions替换为notify或参考同目录下的姊妹示例 securitygroupsdetectremediate.rst 了解先标记、后处置的两段式流程。八、延伸remove-permissions 与更精细的权限收敛除set-permissions外安全组资源还注册了独立的remove-permissions动作RemovePermissions只做删除、不做添加支持ingress: matched|all与egress: matched|allactions: - type: remove-permissions ingress: matched其底层就是set-permissions内部复用的同一套移除逻辑。实战中可根据需要组合只收敛remove-permissionsmatched把命中规则直接撤销不补新规则收敛 替换本文主示例set-permissions先remove-ingress: matched再add-ingress受控网段实现全网段 → 白名单的平滑替换完全收敛出站remove-egress: all清空默认全放行出站规则。小结本文策略以 CloudTrail 事件为触发源在用户每一次创建或修改安全组时近乎实时地评估入站规则凡是0.0.0.0/0或::/0开放 22 端口的规则都会被set-permissions精准移除并替换为运维定义的 Ops/安全 SSH 白名单1.1.1.1/32、2.2.2.2/32。结合 vpc.py 中过滤器的端口/CIDR 匹配语义与动作的先加后删、重复容忍设计这条策略既可以安全地重复执行也能把高危配置的攻击窗口压缩到分钟级。将该模式推广到 3389、数据库端口等其它高危端口即可快速建立一套配置即合规的安全组自愈体系。赞分享云原生运维安全【免费下载链接】cloud-custodianRules engine for cloud security, cost optimization, and governance, DSL in yaml for policies to query, filter, and take actions on resources项目地址https://gitcode.com/gh_mirrors/cl/cloud-custodian点击查看免费下载相关推荐Vagrant 开发环境构建与分发实战指南从 Quick Start 到源码级原理Vagrant 开发环境构建与分发实战指南从 Quick Start 到源码级原理 导读 本文基于 README.md https://link.gitcod云原生运维安全BuildKit Dockerfile 到 LLB 转换完全指南从 State API 到自定义 FrontendBuildKit Dockerfile 到 LLB 转换完全指南从 State API 到自定义 Frontend 本文是一份面向 BuildKit 开发者的云原生运维安全Cloud Custodian GCP Spanner IAM 权限治理set-iam-policy 为实例与数据库批量增删绑定Cloud Custodian GCP Spanner IAM 权限治理set iam policy 为实例与数据库批量增删绑定 本文以 Cloud Cust云原生运维安全上一篇TradeMaster 深度解析南洋理工大学开源的一站式强化学习量化交易平台与 LLM Agent 策略下一篇在 Wio Terminal 上读取光线传感器IoT-For-Beginners 传感器与执行器课程实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考