aws-samples/sample-secrets-manager-audit

GitHub: aws-samples/sample-secrets-manager-audit

一条命令解析 AWS Secrets Manager 密钥的完整访问权限,穿透 IAM 角色、Identity Center 和 EKS 服务账户,追溯至真实用户并生成多格式审计报告。

Stars: 1 | Forks: 0

# secrets-audit 解析并报告**谁**可以访问您的 AWS Secrets Manager 密钥——跨账户、透过 Identity Center,一直追溯到 IAM 角色背后的人类用户。 ## 问题背景 AWS Secrets Manager 让存储密钥变得简单,但要回答“到底谁能读取这个密钥?”却很困难: - **IAM 策略分散各处。** 访问权限可能来自附加到用户/角色的身份策略、密钥本身的资源策略或权限边界。没有单一的 API 能为您提供完整视图。 - **Identity Center 增加了间接层。** 在使用 AWS IAM Identity Center(IC,原 SSO)的组织中,您工作负载账户中的 IAM 角色是自动生成的名称,例如 `AWSReservedSSO_ReadOnlyAccess_abcdef123456`。要知道哪些*人类*拥有访问权限,您需要通过权限集、账户分配、用户和组来解析这些角色,而这些信息通常位于完全不同的账户中。 - **EKS 服务账户进一步模糊了界限。** 在 EKS 中运行的 Pod 通过 OIDC 联合承担 IAM 角色。信任策略告诉您这是一个 EKS 工作负载,但仅从角色名称来看并不明显。 - **Secrets Manager 会记录一个“上次访问”时间戳,但不会标识是哪个主体执行了访问**,您必须查询 CloudTrail 才能获取每个主体的访问详情。 `secrets-audit` 通过一条命令解决了所有这些问题。 ## 快速入门 ``` git clone https://github.com/aws-samples/sample-secrets-manager-audit.git cd secrets-audit pip install . secrets-audit --secret ``` ## 功能说明 ``` secrets-audit --secret --output table ``` 该工具运行一个 10 步流水线: 1. **验证输入** — 密钥名称/ARN 格式、账户 ID、角色 ARN 2. **创建 AWS 会话** — 使用您当前的凭证(无需长期密钥) 3. **识别操作者** — 通过 `sts:GetCallerIdentity` 记录谁运行了审计 4. **解析密钥元数据** — 调用 `DescribeSecret`(从不调用 `GetSecretValue`) 5. **枚举主体** — 列出所有 IAM 角色和用户。通过 `GetAccountAuthorizationDetails` 批量加载所有 IAM 策略数据(一次分页调用,而不是对每个主体发起 API 扇出)。使用 IAM Policy Simulator 并传入 `GetSecretValue`、`PutSecretValue`、`UpdateSecret`、`DeleteSecret`、`CreateSecret` 和 `DescribeSecret` 操作来模拟每个主体的访问,传递密钥的资源标签作为上下文,以便基于标签的策略条件能被正确评估。解析密钥的基于资源的策略以获取额外的允许授权。对于模拟器完全没有匹配语句并予以完全拒绝的主体,在本地评估其预加载的 IAM 策略,以检测模拟器无法检测的访问(例如,`secretsmanager:ResourceTag` 条件)。对于任何仍未解析的主体,通过 `GetContextKeysForPrincipalPolicy` 检查其策略上下文键,并在它们引用了本地评估器无法处理的条件时发出警告。 6. **对每个主体进行分类** — 检查信任策略以将其归类为 Identity Center 托管、EKS 服务账户或普通 IAM 7. **解析 Identity Center** — 承担跨账户角色进入管理账户,以映射权限集 → 账户分配 → 用户和组 8. **使用 CloudTrail 进行补充** *(仅在提供 `--last-accessed` 时)* — 查询 `LookupEvents` 以获取 `GetSecretValue` 调用,从而显示每个主体上次访问该密钥的时间 9. **构建报告** — 将元数据、主体和警告组合成结构化报告 10. **渲染输出** — 格式化为表格、JSON、CSV 或 PDF ## 架构 ``` ┌─────────────────────────────────────────────────────────┐ │ Workload Account │ │ │ │ ┌──────────────┐ ┌─────────┐ ┌───────────────────┐ │ │ │ Secrets Mgr │ │ IAM │ │ CloudTrail │ │ │ │DescribeSecret│ │ListRoles│ │ LookupEvents │ │ │ │GetResourcePol│ │GetRole │ │ (GetSecretValue) │ │ │ └──────────────┘ │Simulate │ └───────────────────┘ │ │ └─────────┘ │ └──────────────────────┬──────────────────────────────────┘ │ sts:AssumeRole ▼ ┌─────────────────────────────────────────────────────────┐ │ Management Account │ │ │ │ ┌──────────────────┐ ┌────────────────────────────┐ │ │ │ SSO Admin │ │ Identity Store │ │ │ │ ListInstances │ │ DescribeUser │ │ │ │ ListPermissionSets│ │ DescribeGroup │ │ │ │ ListAccountAssign │ │ ListGroupMemberships │ │ │ └──────────────────┘ └────────────────────────────┘ │ └─────────────────────────────────────────────────────────┘ ``` 该工具**在设计上是只读的**。它从不修改 IAM 策略、密钥值或 Identity Center 分配。 ## 前置条件 - Python 3.11 或更高版本 - 您通过 `aws login`(用于 IAM Identity Center)、环境变量或实例配置文件配置的 AWS 凭证。该工具使用您当前的会话,不会提示输入凭证。 - 用于 Identity Center 解析:管理账户中的跨账户 IAM 角色(参见下方 [所需 IAM 权限](#required-iam-permissions)) ## 安装说明 需要 Python 3.11+。 ``` # 从源码安装 pip install . # 用于开发(包含测试依赖) pip install -e ".[test]" ``` ## 依赖项 运行时(固定在 `pyproject.toml` 中): | 包 | 版本 | 用途 | |---|---|---| | `boto3` | 1.38.15 | AWS SDK — 所有针对 Secrets Manager、IAM、STS、Identity Center、CloudTrail 的 API 调用 | | `click` | 8.1.8 | CLI 框架 — 参数解析、帮助文本、退出码 | | `reportlab` | 4.4.10 | PDF 报告生成 | 可选 (Web UI): | 包 | 版本 | 用途 | |---|---|---| | `streamlit` | >=1.45.0 | Web UI 框架 — 基于浏览器的审计界面 (`pip install secrets-audit[web]`) | 测试: | 包 | 版本 | 用途 | |---|---|---| | `pytest` | 8.3.5 | 测试运行器 | | `hypothesis` | 6.122.3 | 针对验证器、分类器和渲染器的基于属性的测试 | | `moto` | 5.1.3 | 用于集成测试的 AWS API 模拟 | | `pytest-cov` | 6.1.1 | 覆盖率报告 | 没有任何依赖项会向 AWS API 端点之外发起出站网络调用。 ## 用法 ### 基础用法 (单账户,表格输出) ``` secrets-audit --secret ``` ### 指定特定区域 ``` # 在 us-west-2 中按名称审计 secret(无需完整的 ARN) secrets-audit --secret rds/prod-db-west/app_user --region us-west-2 ``` ### 包含 Identity Center 解析 有两种方法可以为 Identity Center 解析提供管理账户访问权限: ``` # 选项 A:指定的 AWS CLI profile(如果已配置,推荐使用) secrets-audit --secret \ --master-profile management-account \ --expand-groups # 选项 B:显式的 account ID 和 role ARN secrets-audit --secret \ --region us-west-2 \ --master-account-id \ --cross-account-role-arn arn:aws:iam:::role/SecretsAuditReadOnly \ --expand-groups ``` ### 包含来自 CloudTrail 的上次访问时间戳 ``` # 包含来自 CloudTrail 的最后访问时间戳(在高吞吐量账户上较慢) secrets-audit --secret my/secret --last-accessed --output table ``` ### 隐藏进度消息 ``` # 在脚本/自动化使用时抑制进度消息 secrets-audit --secret my/secret --quiet --output json > report.json ``` ### 包含密钥版本元数据 ``` # 在报告中包含 version ID、staging label 和创建日期 secrets-audit --secret my/secret --versions --output table ``` ### 输出格式 ``` # JSON(机器可读,包含完整细节) secrets-audit --secret my/secret --output json # CSV(适合电子表格,包含 IC group 成员行) secrets-audit --secret my/secret --output csv # PDF(格式化用于打印/审计提交) secrets-audit --secret my/secret --output pdf # 写入文件而不是 stdout secrets-audit --secret my/secret --output json --output-file report.json secrets-audit --secret my/secret --output csv --output-file report.csv secrets-audit --secret my/secret --output pdf --output-file audit-report.pdf ``` ### 使用密钥 ARN 代替名称 ``` secrets-audit --secret arn:aws:secretsmanager:us-east-1:111122223333:secret:rds/prod-db-west/app_user-AbCdEf ``` ### CLI 参考 | 选项 | 必需 | 默认值 | 描述 | |---|---|---|---| | `--secret` | 是 | — | 密钥名称或完整 ARN。名称遵循分层路径(例如 `service/environment/name`) | | `--output` | 否 | `table` | 输出格式:`table`、`json`、`csv` 或 `pdf` | | `--region` | 否 | — | 审计会话的 AWS 区域(例如 `us-west-2`)。默认为环境配置的区域。在非默认区域按名称审计密钥时很有用。 | | `--master-account-id` | 否 | — | 用于 Identity Center 解析的 12 位 AWS 管理账户 ID | | `--cross-account-role-arn` | 否 | — | 要在管理账户中承担的 IAM 角色 ARN | | `--master-profile` | 否 | — | 用于管理账户访问的命名 AWS CLI 配置文件。与 `--master-account-id` 和 `--cross-account-role-arn` 互斥。 | | `--last-accessed` | 否 | `false` | 启用 CloudTrail 上次访问补充。查询 CloudTrail 以获取 GetSecretValue 事件,以显示每个主体上次访问该密钥的时间。在事件量大的账户上可能会显著增加执行时间。 | | `--versions` | 否 | `false` | 在报告中包含密钥版本元数据(版本 ID、暂存标签、创建日期)。调用 `ListSecretVersionIds`(只读,无密钥值)。 | | `--expand-groups` | 否 | `false` | 将 Identity Center 组成员扩展为单个用户 | | `--quiet` | 否 | `false` | 抑制长时间运行的步骤期间写入 stderr 的进度消息。适用于脚本化或自动化使用。 | | `--allow-partial` | 否 | `false` | 在跨账户访问失败时继续生成部分报告。如果没有此标志,跨账户失败时工具将立即退出。仅在提供 `--master-account-id`/`--cross-account-role-arn` 或 `--master-profile` 时适用。 | | `--ic-region` | 否 | — | Identity Center API 调用的 AWS 区域(例如 `us-east-1`)。可选:该工具在省略时会通过尝试常见区域来自动检测 IC 区域。仅在提供跨账户标志时适用。 | | `--output-file` | 否 | — | 将报告写入文件而不是标准输出 | | `--expiry-warning-minutes` | 否 | `15` | 凭证过期前发出警告的分钟数。设置为 0 以禁用。如果凭证即将过期,将在模拟步骤之前发出警告。如果凭证在运行期间过期,工具将生成部分报告而不是崩溃。 | | `--max-workers` | 否 | `5` | 最大并发 `SimulatePrincipalPolicy` 调用数。较高的值可以加速大型账户,但会增加节流压力。自适应重试配置会自动处理节流。 | 要进行 Identity Center 解析,请使用 `--master-profile` 或 `--master-account-id` / `--cross-account-role-arn` 对,不要同时使用两者。如果未提供任何选项,该工具仍会报告所有主体,但无法将 IC 角色名称解析为人类用户。 当提供 `--region` 以及 `--secret` 的完整 ARN 时,对于 Secrets Manager 调用,ARN 中嵌入的区域优先。不会产生冲突,也不会报错。 ## 所需 IAM 权限 ### 工作负载账户 (密钥所在位置) 操作者的 IAM 身份需要这些只读权限: ``` { "Version": "2012-10-17", "Statement": [ { "Sid": "SecretsAuditWorkloadAccount", "Effect": "Allow", "Action": [ "secretsmanager:DescribeSecret", "secretsmanager:GetResourcePolicy", "secretsmanager:ListSecretVersionIds", "iam:ListRoles", "iam:ListUsers", "iam:GetRole", "iam:SimulatePrincipalPolicy", "iam:GetContextKeysForPrincipalPolicy", "iam:GetAccountAuthorizationDetails", "iam:ListRolePolicies", "iam:GetRolePolicy", "iam:ListAttachedRolePolicies", "iam:GetPolicy", "iam:GetPolicyVersion", "iam:ListUserPolicies", "iam:GetUserPolicy", "iam:ListAttachedUserPolicies", "sts:GetCallerIdentity", "cloudtrail:LookupEvents" ], "Resource": "*" } ] } ``` ### 管理账户 (用于 Identity Center 解析) 创建一个具有此策略的跨账户角色: ``` { "Version": "2012-10-17", "Statement": [ { "Sid": "SecretsAuditIdentityCenterReadOnly", "Effect": "Allow", "Action": [ "sso:ListInstances", "sso:ListPermissionSets", "sso:DescribePermissionSet", "sso:ListAccountAssignments", "identitystore:DescribeUser", "identitystore:DescribeGroup", "identitystore:ListGroupMemberships" ], "Resource": "*" } ] } ``` 以及一个允许工作负载账户承担该角色的信任策略: ``` { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam:::root" }, "Action": "sts:AssumeRole" } ] } ``` ## 安全模型 | 保证 | 强制执行方式 | |---|---| | 从不读取密钥值 | 该工具仅调用 `DescribeSecret`、`GetResourcePolicy` 和 `ListSecretVersionIds`。从不导入或调用 `GetSecretValue`。 | | 无凭证持久化 | 跨账户凭证仅保存在内存中。不写入任何文件。 | | 无修改操作 | 该工具仅调用读取/列表/描述/模拟 API。它从不创建、更新或删除任何 AWS 资源。 | | 输入验证 | 所有 CLI 输入(密钥名称、ARN、账户 ID、角色 ARN、区域、配置文件名称)在进行任何 API 调用之前都会根据正则表达式模式进行验证。 | | 输出安全 | 渲染的输出从不包含密钥值、完整的策略 JSON 或原始 STS 凭证。仅显示派生的访问级别。 | ## 优雅降级 该工具旨在生成尽可能好的报告,即使某些数据源不可用: | 场景 | 行为 | |---|---| | 跨账户角色承担失败 | 默认情况下,在任何昂贵的流水线步骤运行之前,该工具会立即退出并显示明确的错误。使用 `--allow-partial` 改为继续生成部分报告:IC 托管角色显示权限集名称,但不显示已解析的用户/组,并包含一条警告。 | | Master 配置文件凭证失败 | 行为与跨账户失败相同:默认快速失败,使用 `--allow-partial` 生成部分报告。 | | CloudTrail 访问被拒绝 | 所有 `last_accessed` 字段显示 "Unknown (CloudTrail unavailable)"。报告的其余部分是完整的。 | | 版本元数据访问被拒绝 | 当使用 `--versions` 但 `ListSecretVersionIds` 被拒绝时,将省略版本部分并包含一条警告。报告的其余部分是完整的。 | | 单个 IC 用户被删除 | 显示 "User ID: [id] (deleted)" 而不是显示名称。 | | 没有主体拥有访问权限 | 输出 "No IAM principals have access to this secret" 以及完整的元数据头。 | | 凭证在运行期间过期 | 该工具使用过期前收集的任何数据生成部分报告。警告指出哪个阶段被中断以及评估了多少个主体。使用 `--expiry-warning-minutes` 在模拟步骤之前获得早期警告。 | | 上下文键检查被拒绝 | 当某个主体的 `GetContextKeysForPrincipalPolicy` 被拒绝时,该工具将跳过该主体并继续检查其他主体。如果所有主体都被拒绝(例如,操作者角色缺乏该权限),该工具将正常完成而不会出现限制警告 — 报告的其余部分不受影响。 | | 策略获取被拒绝 | 当本地策略评估无法获取某个主体的策略时(例如,AWS 服务链接角色被拒绝 `ListRolePolicies`),该工具将跳过该主体并继续。会记录警告但报告不受影响。 | ## 输出示例 以下示例展示了包含 Identity Center 解析和版本元数据的完整功能调用: ``` secrets-audit --secret rds/prod-db-west/app_user \ --region us-east-1 \ --master-account-id 999988887777 \ --cross-account-role-arn arn:aws:iam::999988887777:role/SecretsAuditReadOnly \ --versions --last-accessed --expand-groups --output table ``` ### 表格 ``` Secret: rds/prod-db-west/app_user ARN: arn:aws:secretsmanager:us-east-1:111122223333:secret:rds/prod-db-west/app_user-AbCdEf Region: us-east-1 Report generated: 2026-03-21T12:00:00+00:00 Generated by: arn:aws:iam::111122223333:role/SecurityAuditor Tool: secrets-audit v1.3.3 PRINCIPAL TYPE PRINCIPAL NAME IC USER / GROUP ACCESS LEVEL LAST ACCESSED -------------- ---------------------------------------------------- -------------------------------------- ------------ --------------------------- IAM Role AWSReservedSSO_ReadOnlyAccess_abcdef123456 jane@example.com Read 2026-03-15 09:30 UTC IAM Role AWSReservedSSO_DatabaseAdmin_789abc012345 Group: DBA-Team Read/Write 2026-03-20 14:22 UTC alice@example.com (Enabled) bob@example.com (Enabled) IAM Role eks-pod-role Service Account (EKS) Read/Write No recent access (>90 days) IAM User deploy-bot N/A Admin 2026-03-18 08:15 UTC SECRET VERSIONS VERSION ID STAGING LABELS CREATED DATE -------------------------------------- ------------------------- --------------------------- a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 AWSCURRENT 2026-03-10 06:00 UTC a1b2c3d4-5678-90ab-cdef-EXAMPLE22222 AWSPREVIOUS 2026-02-15 12:30 UTC ``` ### JSON (缩略版) `(或其他服务特定的标签条件键)的策略不会被模拟器评估。该工具通过本地策略评估进行补偿,即在客户端获取并解析实际策略文档,检测 `StringEquals`、`StringEqualsIgnoreCase`、`StringLike` 及其 `IfExists` 变体的访问权限。对于不支持的条件运算符或非标签条件键,将改为发出警告。请参阅 [IAM policy simulator 文档](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_testing-policies.html)。 | 对于支持的条件运算符无需采取行动。对于不支持的运算符,请重写策略以使用 `aws:ResourceTag/` 而不是 `secretsmanager:ResourceTag/`。 | | IAM Policy Simulator 速率限制 | `SimulatePrincipalPolicy` 被限制为每秒约 5 个请求。该工具并行化调用(默认 5 个工作线程,可通过 `--max-workers` 调整)并使用自适应重试。拥有 600 个角色的账户大约在 30 秒内完成。 | 使用 `--max-workers` 根据您账户的速率限制调整并发。 | ## 常见问题 **这个工具会读取我的密钥值吗?** 不会。该工具仅调用 `DescribeSecret` 和 `GetResourcePolicy`。它从不调用 `GetSecretValue`。代码库中甚至不存在该导入。它只需要元数据、策略和 Identity Center 分配来构建访问报告。 **为什么在大型账户上报告需要这么长时间?** 主要瓶颈是 IAM Policy Simulator API (`SimulatePrincipalPolicy`),其速率限制为每秒约 5 个请求。该工具使用有界线程池(默认 5 个工作线程,可通过 `--max-workers` 调整)并行化这些调用。拥有 600 个角色的账户可以在约 30 秒而不是 3 分钟内完成模拟。Identity Center 解析也进行了并行化(4 个并发工作线程)。IAM 策略数据通过 `GetAccountAuthorizationDetails` 批量加载(一次分页调用,而不是按主体扇出)。进度消息出现在 stderr 上,以便您知道工具正在运行。在脚本中使用 `--quiet` 来抑制它们。CloudTrail 补充 (`--last-accessed`) 是可选的,对于大多数密钥会增加 3-10 秒。 **如果我没有到管理账户的跨账户访问权限会怎样?** 如果您提供了跨账户标志(`--master-account-id`/`--cross-account-role-arn` 或 `--master-profile`)并且凭证错误,该工具将在运行昂贵的 IAM Policy Simulator 步骤之前立即退出并显示明确的错误。错误消息会告诉您出了什么问题,并建议使用 `--allow-partial` 如果您仍然想要部分报告。使用 `--allow-partial`,该工具会继续并生成包含所有主体访问级别和分类的完整报告,但 IC 托管角色显示的是权限集名称(例如 `PS: ReadOnlyAccess`)而不是已解析的用户名。如果您根本不提供任何跨账户标志,该工具将在没有 IC 解析的情况下正常运行。 **我可以一次审计多个密钥吗?** 不能在单次调用中完成。该工具每次运行审计一个密钥。要进行批量审计,请编写脚本: ``` for secret in rds/prod-db-west/app_user saas/datadog/api-key snowflake/prod/etl_user; do secrets-audit --secret "$secret" --output json --output-file "${secret//\//-}.json" done ``` **为什么会出现一些我不认识的 IAM 角色?** Policy Simulator 会评估账户中的每个 IAM 角色,包括 AWS 服务链接角色、SSO 配置的角色以及由其他团队或自动化创建的角色。如果角色拥有授予 `secretsmanager:*` 或广泛资源访问权限(`Resource: "*"`)的策略,它将出现在报告中。这是故意的。审计人员需要完整的情况,而不仅仅是您期望的角色。 **`--region` 如何与完整的密钥 ARN 交互?** 它们可以无冲突地共存。当您同时传入 `--region us-west-2` 和 `--secret arn:aws:secretsmanager:us-east-1:...` 时,会话将在 `us-west-2` 中创建,但 `DescribeSecret` 会路由到 `us-east-1`,因为 ARN 具有权威性。报告元数据将显示会话区域。在实践中,如果您使用完整的 ARN,则不需要 `--region`。它在通过名称引用密钥时最有用。 **何时应该使用 `--master-profile` 而不是 `--master-account-id` / `--cross-account-role-arn`?** 如果您的 `~/.aws/config` 中已经有一个用于管理账户的命名配置文件(例如,配置了 `role_arn` 和 `source_profile`),请使用 `--master-profile`。它可以节省按键次数并避免在命令中硬编码 ARN。如果您尚未设置配置文件,或者您正在编写脚本并希望角色 ARN 在命令中可见,请使用显式的 `--master-account-id` + `--cross-account-role-arn` 对。这两种方法是互斥的。如果混合使用,工具将报错。 **如果我的 Identity Center 与我的配置文件默认值不在同一个区域怎么办?** 该工具会自动检测 IC 区域。它首先尝试您会话的默认区域,然后检查常见的 IC 部署区域(us-east-1、us-west-2、eu-west-1、eu-central-1、ap-southeast-1),直到找到实例。您不需要知道 IC 在哪个区域。如果自动检测太慢或者您想跳过额外的 API 调用,请使用 `--ic-region us-east-1`(或您的 IC 所在的任何区域)直接定位它。 **该工具如何处理 `secretsmanager:ResourceTag` 条件?** IAM Policy Simulator 无法评估服务特定的条件键,例如 `secretsmanager:ResourceTag/`。该工具通过本地策略评估进行补偿:它获取实际策略文档并在客户端评估 Action、Resource 和 Condition 块。这涵盖了 `StringEquals`、`StringEqualsIgnoreCase`、`StringLike` 及其 `IfExists` 变体。对于本地评估器不支持的条件运算符,将发出警告,指出该主体并建议改用 `aws:ResourceTag/`,模拟器和本地评估器都能正确处理它。有关模拟器限制的背景,请参阅 [IAM policy simulator 文档](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_testing-policies.html)。 ## Web UI 该工具包含一个由 Streamlit 提供支持的可选基于浏览器的界面。它使用您现有的 AWS 凭证在本地计算机上运行,并且仅连接到 AWS API 端点。不会向第三方服务发送任何数据。 ### 安装说明 ``` pip install secrets-audit[web] ``` ### 启动 ``` secrets-audit-web ``` 这将在 `http://localhost:8501` 上启动一个本地 Streamlit 服务器并打开您的浏览器。侧边栏提供了与 CLI 相同的选项:密钥名称/ARN、区域、Identity Center 配置、CloudTrail 补充、版本元数据和输出格式。 结果显示为您可以排序和浏览的交互式表格。下载按钮允许您直接从浏览器将报告保存为 PDF 或 CSV。 Web UI 仅绑定到 localhost,并且除了 AWS API 端点之外不进行任何网络调用。 ## 版本控制 本项目遵循 [语义化版本控制](https://semver.org/)。版本在 `pyproject.toml` 和 `secrets_audit/__init__.py` 中定义。它出现在每个报告头中为 `Tool: secrets-audit v1.3.8`。 ## 许可证 MIT。请参阅 [LICENSE](LICENSE)。
标签:AWS, DevSecOps, DPI, EKS, IAM, Identity Center, JSONLines, Kubernetes, OIDC, Python, Secrets Manager, SSO, Streamlit, 上游代理, 二进制发布, 开源工具, 敏感数据, 无后门, 权限分析, 策略解析, 聊天机器人, 访问控制, 身份与访问管理, 逆向工具, 零信任