AWS CLI 实战:使用aws accessanalyzer get-finding查询 IAM Access Analyzer 安全发现详情
【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli
本文是 AWS CLI 官方示例文档 get-finding.rst 的深度解读与实战指南。IAM Access Analyzer 会在你的「信任区域」(账户或组织)之外检测到外部实体可访问的资源时生成 finding(发现项)。当通过list-findings拿到发现项 ID 后,get-finding就是定位到单个发现项、查看其完整详情(外部主体、允许的操作、触发条件、资源类型与状态)的标准手段。读完本文,你将掌握get-finding的参数结构、输出字段语义、常见异常与 IAM 权限要求,并能结合仓库内服务模型与相邻示例独立排查外部分享风险。
一、命令概览:一次调用,拿到单个 finding 全量信息
get-finding是 IAM Access Analyzer 服务(API 操作名GetFinding)在 AWS CLI 中的对应命令。其核心语义是:根据 analyzer 的 ARN 与 finding 的 ID,检索指定 finding 的详细信息。对应的底层 HTTP 请求定义可在仓库服务模型 service-2.json 中找到:
"GetFinding": { "name": "GetFinding", "http": { "method": "GET", "requestUri": "/finding/{id}", "responseCode": 200 }, "input": {"shape": "GetFindingRequest"}, "output": {"shape": "GetFindingResponse"}, ... "readonly": true }可以看出,这是一次只读的GET /finding/{id}请求,finding 的 ID 直接嵌入 URL 路径,analyzer ARN 则作为查询字符串参数传递。
官方示例文档给出了最简洁的调用形态:
aws accessanalyzer get-finding \ --analyzer-arn arn:aws:access-analyzer:us-west-2:111122223333:analyzer/ConsoleAnalyzer-organization \ --id 0910eedb-381e-4e95-adda-0d25c19e6e90其中:
--analyzer-arn:生成该 finding 的分析器 ARN,示例中指向组织级分析器ConsoleAnalyzer-organization;--id:要检索的 finding 的唯一 ID(UUID 格式)。
命令执行的三个前提
- 已配置 AWS CLI 凭证(默认读取
~/.aws/credentials与环境变量),且具备下文「权限要求」中所述的 IAM 权限; - analyzer 必须已经存在:如果 ARN 对应的分析器不存在或已被删除,请求将失败。分析器的创建见 create-analyzer.rst;
- finding ID 必须真实存在:ID 一般通过 list-findings.rst(或控制台)获得,找不到对应发现项时会返回
ResourceNotFoundException。
二、输出字段逐项拆解:理解一个 finding 的完整画像
官方示例的运行输出如下:
{ "finding": { "id": "0910eedb-381e-4e95-adda-0d25c19e6e90", "principal": { "Federated": "cognito-identity.amazonaws.com" }, "action": [ "sts:AssumeRoleWithWebIdentity" ], "resource": "arn:aws:iam::111122223333:role/Cognito_testpoolAuth_Role", "isPublic": false, "resourceType": "AWS::IAM::Role", "condition": { "cognito-identity.amazonaws.com:aud": "us-west-2:EXAMPLE0-0000-0000-0000-000000000000" }, "createdAt": "2021-02-26T21:17:50.905000+00:00", "analyzedAt": "2024-02-16T18:17:47.888000+00:00", "updatedAt": "2021-02-26T21:17:50.905000+00:00", "status": "ACTIVE", "resourceOwnerAccount": "111122223333" } }响应被包装在finding对象中(对应响应结构GetFindingResponse的成员,见 service-2.json)。各字段的语义与底层Finding结构定义(service-2.json)一一对应:
| 字段 | 类型 | 含义 | 本示例取值 |
|---|---|---|---|
id | string | finding 的唯一 ID(必返回) | 0910eedb-381e-4e95-adda-0d25c19e6e90 |
principal | map | 对信任区域内资源具有访问权限的外部主体 | {"Federated": "cognito-identity.amazonaws.com"}(联合身份) |
action | list | 分析策略语句中外部主体获准使用的操作 | ["sts:AssumeRoleWithWebIdentity"] |
resource | string | 外部主体可访问的资源 ARN | arn:aws:iam::111122223333:role/Cognito_testpoolAuth_Role |
isPublic | boolean | 生成该 finding 的策略是否允许公共访问 | false |
resourceType | string | 被识别资源类型(如AWS::IAM::Role、AWS::S3::Bucket) | AWS::IAM::Role |
condition | map | 分析策略语句中导致 finding 的条件 | cognito-identity.amazonaws.com:aud限定受众池 |
createdAt | timestamp | finding 生成时间 | 2021-02-26T21:17:50.905000+00:00 |
analyzedAt | timestamp | 该资源最近一次被分析的时间 | 2024-02-16T18:17:47.888000+00:00 |
updatedAt | timestamp | finding 最近更新时间 | 2021-02-26T21:17:50.905000+00:00 |
status | string | finding 当前状态 | ACTIVE |
resourceOwnerAccount | string | 拥有该资源的 AWS 账户 ID | 111122223333 |
解读本示例:一条典型的“联合身份越权访问”发现
从输出可以还原出完整的安全场景:一条外部联合身份主体(cognito-identity.amazonaws.com,即 Cognito Identity 联合身份服务)被允许对账户111122223333中的 IAM 角色Cognito_testpoolAuth_Role执行sts:AssumeRoleWithWebIdentity(通过 Web 身份令牌代入角色)。condition中cognito-identity.amazonaws.com:aud将受众限定为us-west-2:EXAMPLE0-0000-0000-0000-000000000000身份池,说明访问并未对所有人开放(isPublic: false),但该信任关系仍被识别为超出信任区域的外部访问,因此生成ACTIVE状态发现项。
完整的 Finding 结构还包括的“可选字段”
除了示例中出现的字段,Finding结构还定义了三个按需返回的成员(示例场景下不出现):
error:分析该资源时产生的错误信息;sources:finding 的来源(指明访问是如何被授予的),仅对 Amazon S3 桶类 finding 填充;resourceControlPolicyRestriction:资源所有者通过 Organizations 资源控制策略(RCP)对该 finding 施加的限制类型。
finding 状态机:ACTIVE / ARCHIVED / RESOLVED
status字段的取值由枚举FindingStatus限定(service-2.json):
ACTIVE:发现项处于激活状态,表示当前仍存在该外部访问(需要关注并处理);ARCHIVED:已被归档(例如通过 update-findings.rst 主动归档);RESOLVED:已解决——外部访问已消失,或通过 Archive Rule / RCP 等机制被抑制。
三、请求参数详解:analyzerArn 与 id 的获取与校验
GetFindingRequest结构(service-2.json)要求analyzerArn与id两个必填参数:
| 参数 | CLI 选项 | 在 HTTP 请求中的位置 | 说明 |
|---|---|---|---|
analyzerArn | --analyzer-arn | 查询字符串analyzerArn | 生成该 finding 的分析器 ARN |
id | --id | URL 路径/finding/{id} | 要检索的 finding ID |
analyzer ARN 的典型形态
- 账户级分析器:
arn:aws:access-analyzer:us-west-2:111122223333:analyzer/ConsoleAnalyzer-account - 组织级分析器:
arn:aws:access-analyzer:us-west-2:111122223333:analyzer/ConsoleAnalyzer-organization
list-findings的输出会同时给出analyzerArn与每条id,是拼接get-finding命令最直接的数据来源,参见 list-findings.rst。
从 list-findings 到 get-finding 的完整排查链路
先列出某分析器下所有 finding(可加过滤器缩小范围):
aws accessanalyzer list-findings \ --analyzer-arn arn:aws:access-analyzer:us-west-2:111122223333:analyzer/ConsoleAnalyzer-account \ --filter '{"resource": {"contains": ["Cognito"]}, "resourceType": {"eq": ["AWS::IAM::Role"]}}'拿到目标id(如ce0e221a-85b9-4d52-91ff-d7678075442f)后,再用get-finding查看该条发现的完整详情。这种「先列表、后详情」的两步式排查,正是 IAM Access Analyzer 命令行工作流的标准用法。
四、权限要求与异常处理
IAM 权限
根据服务模型中的操作文档说明,GetFinding与GetFindingV2都在 IAM 策略语句的Action元素中使用access-analyzer:GetFinding。也就是说,调用该命令的执行主体必须拥有以下权限:
{ "Effect": "Allow", "Action": "access-analyzer:GetFinding", "Resource": "*" }若缺少该权限,服务端将返回AccessDeniedException。
支持的 analyzer 类型(重要限制)
服务模型明确标注了一个关键约束:
GetFinding is supported only for external access analyzers. You must use GetFindingV2 for internal and unused access analyzers.
即get-finding仅支持外部访问分析器(external access analyzer);对于内部访问分析器(internal)与未使用访问分析器(unused),必须改用get-finding-v2(对应操作GetFindingV2,CLI 示例见 get-finding-v2.rst)。这是选择命令时最容易踩的坑。
可能抛出的错误
GetFinding操作注册了五类错误(service-2.json):
| 错误 | 含义 | 常见排查方向 |
|---|---|---|
ResourceNotFoundException | 找不到指定的分析器或 finding | 核对--analyzer-arn与--id是否真实存在、是否属于同一分析器 |
ValidationException | 参数校验失败 | 检查 ARN 格式、ID 是否为合法 UUID |
InternalServerException | 服务端内部错误 | 稍后重试 |
ThrottlingException | 请求被限流 | 降低调用频率或增加退避 |
AccessDeniedException | 缺少access-analyzer:GetFinding权限 | 检查 IAM 策略 |
五、get-finding 与 get-finding-v2 的对比:如何选择
两者的请求参数完全相同(--analyzer-arn+--id),差异集中在响应结构上:
| 维度 | get-finding | get-finding-v2 |
|---|---|---|
| 适用分析器 | 仅 external access analyzer | external / internal / unused 均可 |
| 响应顶层 | finding对象(扁平字段) | findingDetails数组 + 顶层元数据 |
| finding 详情 | 直接内嵌principal、action、condition等字段 | 按findingType分组到externalAccessDetails等详情结构 |
| 示例输出 | 见上文第二节 | 增加findingType(如ExternalAccess)字段 |
对比 get-finding-v2.rst 的输出可以看到,v2 将外部访问详情(action、condition、isPublic、principal)收敛进findingDetails[].externalAccessDetails,并在顶层提供findingType: "ExternalAccess"、error: null等补充字段,结构更适合程序化消费。建议:新项目统一优先使用 v2,仅在需要兼容外部访问分析器旧场景时使用 v1。
六、在 AWS CLI 中运行本文命令的前提
- 安装 AWS CLI:本文基于仓库 aws-cli(Universal Command Line Interface for Amazon Web Services)仓库中的官方示例展开,示例命令可直接在已安装 AWS CLI 的终端执行;
- 配置凭证与区域:
aws configure设置访问密钥与默认区域(示例中的us-west-2),或通过--region显式指定,确保与 analyzer 所在区域一致; - 验证 analyzer 存在:可先执行
aws accessanalyzer list-analyzers(示例见 list-analyzers.rst)确认 ARN 有效。
结语
aws accessanalyzer get-finding虽然只有两个必填参数,却是 IAM Access Analyzer 安全运营闭环中「定位单点风险」的关键一环:从list-findings拿到发现项列表,用get-finding展开某一条的完整画像(外部主体、操作、条件、资源与状态),再结合update-findings或 Archive Rule 完成处置。配合本仓库 examples/accessanalyzer 目录下的全套示例(创建分析器、归档规则、策略生成等),你可以把外部访问治理的整套 CLI 工作流串起来。需要特别牢记的是:内部与未使用访问分析器请使用get-finding-v2,并确保调用主体拥有access-analyzer:GetFinding权限。
【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考