Cloud Custodian 实战:用 YAML 策略管理 IAM Access Key(枚举、筛选与治理)
云原生运维安全【免费下载链接】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点击查看免费下载IAM Access Key 是 AWS 账户中长期有效的静态凭据也是最常见的云安全治理对象之一。本文基于 cloud-custodian 官方示例文档 docs/source/aws/examples/iamaccesskey.rst讲解如何用 Cloud Custodian 的 YAML 策略对 IAM 访问密钥进行全量枚举、按状态/用户名/创建时间筛选并结合源码剖析iam-access-key资源类型的底层实现与测试验证帮助你快速落地密钥盘点、密钥轮换、密钥清理一类的治理策略。iam-access-key 资源类型源码层面的基本认识在开始写策略之前先理解 Cloud Custodian 是如何把 IAM 访问密钥建模为可查询资源的。在 c7n/resources/iam.py 中AccessKey类通过resources.register(iam-access-key)注册并继承自ChildResourceManager子资源管理器resources.register(iam-access-key) class AccessKey(ChildResourceManager): class resource_type(TypeInfo): service iam # Access keys dont have ARNs - they use AccessKeyId as identifier # Using access-key as arn_type for consistency but ARN construction will not be used arn_type access-key id name AccessKeyId date CreateDate # Denotes this resource type exists across regions global_resource True enum_spec (list_access_keys, AccessKeyMetadata, None) parent_spec (iam-user, UserName, None) # No detail spec needed as list_access_keys returns full metadata cfn_type AWS::IAM::AccessKey这段源码揭示了几个关键实现事实枚举方式enum_spec (list_access_keys, AccessKeyMetadata, None)即直接调用 IAM 的list_access_keysAPI返回体中的AccessKeyMetadata作为资源集合无需额外的 detail 调用。资源标识访问密钥没有 ARN使用AccessKeyId作为主键与名称字段id name AccessKeyId。父子关系parent_spec (iam-user, UserName, None)访问密钥以 IAM 用户为父资源按UserName关联这意味着密钥枚举依赖账户内用户清单。全局资源global_resource TrueIAM 是全局服务密钥不分区策略在任意区域执行结果一致。时间字段date CreateDate为后面按密钥年龄过滤提供了标准字段。在 c7n/resources/resource_map.py 中资源类型aws.iam-access-key被映射到c7n.resources.iam.AccessKey因此策略中的resource: iam-access-key会被正确解析并加载。每条访问密钥资源默认包含的字段与 AWS API 返回一致AccessKeyId、UserName、StatusActive / Inactive、CreateDate这些字段正是下面各筛选策略的操作对象。策略一列出账户内全部 IAM 访问密钥官方文档给出的第一个示例是最基础的全量盘点策略——不做任何筛选列出所有访问密钥policies: - name: all-iam-access-keys resource: iam-access-key执行后Cloud Custodian 会遍历账户内全部 IAM 用户汇总所有AccessKeyMetadata记录。这在以下场景中非常实用作为密钥盘点的基线输出配合-s指定输出目录如custodian run -c policy.yml -s .生成资源清单作为后续治理流程的上游输入例如先全量枚举、再在报告中人工核对。该策略对应的测试用例见 tests/test_iam.py 中的test_access_key_list测试通过 placebo 回放list_access_keys的飞行数据断言返回两条资源并逐一校验每条资源都包含AccessKeyId、UserName、Status、CreateDate四个关键字段def test_access_key_list(self): Test basic enumeration of access keys. factory self.replay_flight_data(test_iam_access_key_list) p self.load_policy( {name: iam-access-key-list, resource: iam-access-key}, session_factoryfactory, ) resources p.run() self.assertTrue(len(resources) 2) for resource in resources: # Verify required fields are present self.assertIn(AccessKeyId, resource) self.assertIn(UserName, resource) self.assertIn(Status, resource) self.assertIn(CreateDate, resource)这从测试侧印证了一条策略即可拿到密钥的完整元数据也是后续所有筛选逻辑的数据基础。策略二按密钥状态筛选只保留 Active 密钥AWS 的访问密钥状态只有两种Active启用与Inactive禁用。官方文档的第二个示例用value过滤器精确匹配状态字段policies: - name: active-iam-access-keys resource: iam-access-key filters: - type: value key: Status value: Activetype: value是 Cloud Custodian 最核心的通用值过滤器语法由ValueFilter实现位于 c7n/filters/core.py。它按key从资源字典中取值与value做比较默认比较操作符为相等op: eq因此本例等价于只保留Status Active的密钥。治理上的典型用法安全审计找出仍处于 Active 状态的长期密钥评估其轮换必要性反向排查把value: Inactive与最近使用时间类数据结合确认是否有大量僵尸密钥占用了 IAM 配额每个用户最多 2 个访问密钥。策略三按用户名筛选定位特定用户的密钥第三个示例将筛选对象落到具体用户适合按人治理的场景——例如只关注某个离职员工、特权账号或特定服务账号的密钥policies: - name: iam-access-keys-for-user resource: iam-access-key filters: - type: value key: UserName value: insert-username-here使用时将insert-username-here替换为真实用户名。注意这里的匹配是精确相等若希望做前缀/模糊匹配可以把op换成contains、starts-with等操作符由ValueFilter支持的操作符集提供。例如只查svc-前缀的服务账号密钥policies: - name: service-account-access-keys resource: iam-access-key filters: - type: value key: UserName op: starts-with value: svc-由于密钥枚举本身依赖父资源iam-user用户名过滤也可以视为在用户清单 × 密钥元数据结果集上的投影适合做分账号、分角色的密钥报表。策略四按创建时间过滤找出超过 90 天的旧密钥长期不轮换的密钥是凭据泄露与合规风险的高发点。官方文档的第四个示例利用value_type: age把CreateDate转换为已存在天数再与阈值比较policies: - name: old-iam-access-keys resource: iam-access-key filters: - type: value key: CreateDate value_type: age value: 90 op: greater-than语义解读仅保留创建时间距今超过 90 天的密钥。value_type: age会自动把日期字段折算为以天为单位的年龄op: greater-than表示大于。这套组合是 Cloud Custodian 中按资源年龄治理的标准写法同样适用于 AMI、快照、日志组等带时间戳的资源。对应的官方测试用例位于 tests/test_iam.py 的test_access_key_filter_by_age使用freezegun.freeze_time(2020-02-02)冻结当前时间再执行策略验证年龄过滤在固定时间基准下的筛选结果def test_access_key_filter_by_age(self): Test filtering access keys by age. factory self.replay_flight_data(test_iam_access_key_filter_age) p self.load_policy( { name: iam-access-key-old, resource: iam-access-key, filters: [ { type: value, key: CreateDate, value_type: age, value: 90, op: greater-than, } ], }, session_factoryfactory, ) with freezegun.freeze_time(2020-02-02): resources p.run() # Just check that we can run this without error # The actual age filter logic is handled by C7N core self.assertTrue(len(resources) 1)测试注释明确指出age 过滤逻辑由 C7N 核心实现即ValueFilter的value_type: age解析逻辑策略层只需声明字段与阈值即可。调整value的数值就能得到30 天未轮换180 天未轮换等不同强度的治理口径。进阶密钥治理的完整闭环思路iam-access-key资源在官方文档定位为枚举 筛选即先看清账户内密钥的全貌。若要形成发现即处置的闭环可以结合同一源码仓库中与密钥相关的实现用户级密钥过滤器在 c7n/resources/iam.py 中UserAccessKey注册名为access-key允许直接在iam-user资源上按密钥属性筛选用户并支持match-operator: and|or组合多个密钥条件。典型场景找出拥有 Active 密钥且密钥创建超过 90 天的用户再对该用户执行处置动作。相比iam-access-key的逐条筛选这种写法以用户为治理单元更贴近账号级整改的操作习惯policies: - name: iam-users-with-active-keys resource: iam-user filters: - type: access-key key: Status value: Active - type: access-key match-operator: and key: CreateDate value_type: age value: 90删除用户时的级联清理在 c7n/resources/iam.py 的delete_access_keys辅助函数中删除 IAM 用户前会先调用list_access_keys列出其全部密钥并逐个delete_access_key。这保证用户资源的delete动作不会因残留密钥而失败也从侧面说明了密钥治理与用户生命周期管理的关联性。密钥禁用/轮换的底层能力在 c7n/resources/iam.py 附近可以看到对update_access_key与delete_access_key的调用逻辑用于标记、禁用、删除密钥这些是构建旧密钥自动禁用或删除动作时可复用的底层 API 调用模式。需要说明的是从当前仓库源码看iam-access-key资源类型本身主要承载枚举与筛选自动处置禁用/删除/轮换建议通过iam-user资源上的access-key过滤器配合对应动作或基于c7n:matched-keys注解见UserAccessKey中的matched_annotation_key自定义动作实现确保策略行为与 IAM 权限模型一致。运行与验证策略文件编写完成后按 Cloud Custodian 的标准方式运行详细命令与参数见 docs/source/aws/usage.rstcustodian run -c iam-access-key.yml -s output-c指定策略文件路径-s指定输出目录运行结束后会生成包含匹配资源明细的resources.json执行策略所需的 IAM 权限至少包括iam:ListUsers枚举父资源与iam:ListAccessKeys枚举密钥该权限也明确声明在UserAccessKey过滤器的permissions中见 c7n/resources/iam.py。若希望做本地验证而不触碰真实账户可参照 tests/test_iam.py 的测试写法使用 placebo 回放录制的 AWS 响应对应tests/data/placebo下的飞行数据目录通过replay_flight_data构造 session 后直接调用p.run()断言结果实现策略逻辑的可重复回归测试。小结围绕官方示例文档本文完整覆盖了iam-access-key资源的四种基础策略全量枚举、按状态Active/Inactive筛选、按用户名筛选、按创建年龄90 天以上筛选并从 c7n/resources/iam.py 的注册源码与 tests/test_iam.py 的测试用例两个维度确认了资源字段、API 调用与过滤语义。把这四类策略组合进日常巡检即可形成一套可落地的密钥盘点 → 风险定位 → 整改处置治理链路为云账户凭据安全提供持续保障。赞分享云原生运维安全【免费下载链接】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 的 GCP DNS 托管区治理用 YAML 策略检查并启用 DNSSECCloud Custodian 的 GCP DNS 托管区治理用 YAML 策略检查并启用 DNSSEC 本文围绕 Cloud Custodianc7n在云原生运维安全Cloud Custodian GCP 指南用 YAML 策略清点、过滤与治理 Vertex AI EndpointCloud Custodian GCP 指南用 YAML 策略清点、过滤与治理 Vertex AI Endpoint 本文以 Cloud Custodian云原生运维安全Cloud Custodian IAM 策略管理实战用 set-policy 自动化附加/分离角色托管策略Cloud Custodian IAM 策略管理实战用 set policy 自动化附加/分离角色托管策略 本文基于 Cloud Custodian 官方示例云原生运维安全上一篇DynamicCow 实战如何在 iOS 16 的老机型上解锁灵动岛下一篇ai-memory 扩展事件词汇表extension 命名空间完全使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Parsr Header Footer Detection 模块深度解析:原理、配置与在文档处理流水线中的实战应用

Parsr Header Footer Detection 模块深度解析:原理、配置与在文档处理流水线中的实战应用

后端数据工程 【免费下载链接】Parsr Transforms PDF, Documents and Images into Enriched Structured Data 项目地址: https://gitcode.com/gh_mirrors/pa/Parsr 点击查看 免费下载 导读 本文围绕 Parsr 服务器端处理模块之一——Header Footer Detection&#…

2026/10/10 2:33:00 阅读更多 →
每日 AI 研究简报 · 2026-10-09

每日 AI 研究简报 · 2026-10-09

(本文借助 AI 大模型及工具辅助整理) 一句话总结:Personal Agent 竞争进入"抢入口"阶段,模型性价比战升级为"超快推理 免费",而 AI 安全治理正从呼吁走向制度与工具双轨落地。 🌊 AI…

2026/10/10 2:33:00 阅读更多 →
STM32F756ZG与PCA9422电源管理方案:硬件连接、寄存器配置与低功耗调试实战

STM32F756ZG与PCA9422电源管理方案:硬件连接、寄存器配置与低功耗调试实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 2:32:00 阅读更多 →

最新新闻

Docker安装报错全解析:从daemon权限到内核模块的排查指南

Docker安装报错全解析:从daemon权限到内核模块的排查指南

你有没有遇到过这样的场景:费了好大劲把 Docker 装上,兴冲冲地敲下docker ps,结果屏幕上一行红字:permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock这种感觉就像门锁装好了…

2026/10/10 3:19:15 阅读更多 →
CE318太阳光度计数据处理:AOD与WV反演实战指南

CE318太阳光度计数据处理:AOD与WV反演实战指南

简介:这份资源面向大气科学、遥感与气象观测方向的学习者和科研人员,围绕CE318型太阳光度计的观测数据,提供从原始数据读取到气溶胶光学厚度(AOD)与水汽含量(WV)反演的完整处理思路。资源包共5个…

2026/10/10 3:19:15 阅读更多 →
C++排序选型指南:sort、stable_sort与partial_sort

C++排序选型指南:sort、stable_sort与partial_sort

最开始被排序这件事坑到,是在某个线上榜单的开发任务里。数据量其实不大,也就几千条,需求说得很直白:按分数从高到低排,分数相同的先提交者靠前。我想都没想就调了sort,自己写了个分数比较的lambda&#xf…

2026/10/10 3:19:15 阅读更多 →
环境模拟中的木马程序分析:从渗透测试到防御反推

环境模拟中的木马程序分析:从渗透测试到防御反推

"基于环境模拟的木马程序制作与渗透测试"——说实话,第一次看到这个标题的人,多半会以为这是某种"黑客速成教程"。但我做了几年安全方向的研究,可以负责任地说:真正有价值的东西不在"制作"本身&…

2026/10/10 3:19:15 阅读更多 →
练得够不够狠?openGym的RIR/RPE努力度评分及统计功能详解

练得够不够狠?openGym的RIR/RPE努力度评分及统计功能详解

练得够不够狠?openGym的RIR/RPE努力度评分及统计功能详解 【免费下载链接】openGym https://github.com/DuarteSantos8/openGym 项目地址: https://gitcode.com/gh_mirrors/ope/openGym openGym 是一款自托管的健身训练追踪器,除了记录重量和次数…

2026/10/10 3:19:15 阅读更多 →
C++编译期分支全解析:if constexpr、enable_if与标签分发

C++编译期分支全解析:if constexpr、enable_if与标签分发

1. 为什么编译期的“分支”值得单独拿出来讲1.1 一个每天都在发生的真实场景写 C 模板写久了,谁都会被同一件事卡过:函数模板里拿到一个泛型 T,你想对不同的 T 做不同的处理,最直觉的写法是在函数体里写一个运行期 if 去判断类型&…

2026/10/10 3:18:15 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →