ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

AWS CLI 实战:使用 `aws accessanalyzer validate-policy` 校验 IAM 策略并解读 Findings

AWS CLI 实战:使用 `aws accessanalyzer validate-policy` 校验 IAM 策略并解读 Findings AWS CLI 实战使用aws accessanalyzer validate-policy校验 IAM 策略并解读 Findings【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cliaws accessanalyzer validate-policy是 AWS CLI 中用于请求 IAM Access Analyzer 对策略文档进行静态校验的命令它会基于一套策略检查规则返回一组 findings帮助你发现策略中的错误、安全告警、警告与可优化建议。本文以仓库中自带的实战示例validate-policy.rst为主体逐条解读一份 Cognito 身份池信任策略暴露出的三类问题并结合当前仓库中的 AWS 服务模型定义service-2.json深入剖析命令的完整参数、findings 结构与定位信息让你掌握写策略 → 校验 → 看懂报告 → 修复的完整闭环。一、命令概览validate-policy能做什么IAM Access Analyzer 的ValidatePolicyAPI 会请求对策略进行校验并返回一组 findings。这些 findings 帮助你识别问题并提供可操作的建议从而让你编写出符合安全最佳实践且可正常工作的策略。该 API 是只读操作readonly: true不会修改任何策略也不会触发实际授权判断而是纯静态分析。从服务模型看该操作对应的 HTTP 请求为POST /policy/validation见 service-2.json可能抛出的异常包括InternalServerException服务端内部错误ValidationException请求参数不合法ThrottlingException请求过于频繁被限流AccessDeniedException调用者没有足够权限执行该操作也就是说执行该命令至少需要具备调用accessanalyzer:ValidatePolicy的 IAM 权限。在 AWS CLI 中命令对应形态为aws accessanalyzer validate-policy \ --policy-document file://myfile.json \ --policy-type RESOURCE_POLICY其中--policy-document传入 JSON 策略文档可直接给字符串也可用file://前缀读取本地文件--policy-type声明策略类型。二、示例场景校验一份 Cognito 角色信任策略仓库中 validate-policy.rst 给出的示例是一份用于 Web 身份联合的 Amazon Cognito 角色信任策略。所谓信任策略trust policy是一种资源策略它决定哪些身份可以代入该 IAM 角色因此这里--policy-type使用RESOURCE_POLICY。示例命令aws accessanalyzer validate-policy \ --policy-document file://myfile.json \ --policy-type RESOURCE_POLICY待校验的myfile.json内容如下{ Version: 2012-10-17, Statement: [ { Sid: , Effect: Allow, Principal: { Federated: cognito-identity.amazonaws.com }, Action: [ sts:AssumeRole, sts:TagSession ], Condition: { StringEquals: { cognito-identity.amazonaws.com:aud: us-west-2_EXAMPLE } } } ] }这份策略的意图很典型允许 Cognito 身份池cognito-identity.amazonaws.com在满足aud条件身份池 ID 为us-west-2_EXAMPLE的情况下代入该角色。但正如输出所示这份策略存在三处问题其中两处是会导致策略失效的ERROR。三、逐条解读 Findings 报告执行上述命令后返回的 JSON 输出如下为便于阅读已格式化{ findings: [ { findingDetails: Add a value to the empty string in the Sid element., findingType: SUGGESTION, issueCode: EMPTY_SID_VALUE, locations: [ { path: [ { value: Statement }, { index: 0 }, { value: Sid } ], span: { end: { column: 21, line: 5, offset: 81 }, start: { column: 19, line: 5, offset: 79 } } } ] }, { findingDetails: The sts:AssumeRole action is invalid with the following principal(s): cognito-identity.amazonaws.com. Use a SAML provider principal with the sts:AssumeRoleWithSAML action or use an OIDC provider principal with the sts:AssumeRoleWithWebIdentity action. Ensure the provider is Federated if you use either of the two options., findingType: ERROR, issueCode: MISMATCHED_ACTION_FOR_PRINCIPAL, locations: [ { path: [ { value: Statement }, { index: 0 }, { value: Action }, { index: 0 } ], span: { end: { column: 32, line: 11, offset: 274 }, start: { column: 16, line: 11, offset: 258 } } }, { path: [ { value: Statement }, { index: 0 }, { value: Principal }, { value: Federated } ], span: { end: { column: 61, line: 8, offset: 202 }, start: { column: 29, line: 8, offset: 170 } } } ] }, { findingDetails: The following actions: sts:TagSession are not supported by the condition key cognito-identity.amazonaws.com:aud. The condition will not be evaluated for these actions. We recommend that you move these actions to a different statement without this condition key., findingType: ERROR, issueCode: UNSUPPORTED_ACTION_FOR_CONDITION_KEY, locations: [ { path: [ { value: Statement }, { index: 0 }, { value: Action }, { index: 1 } ], span: { end: { column: 32, line: 12, offset: 308 }, start: { column: 16, line: 12, offset: 292 } } }, { path: [ { value: Statement }, { index: 0 }, { value: Condition }, { value: StringEquals }, { value: cognito-identity.amazonaws.com:aud } ], span: { end: { column: 79, line: 16, offset: 464 }, start: { column: 58, line: 16, offset: 443 } } } ] } ] }Finding 1EMPTY_SID_VALUE类型SUGGESTION第一条 finding 指出为Sid元素中的空字符串添加一个值。 策略中Sid: 是一个空值虽然不会影响访问控制结果但不属于规范的写法。这是一个风格类建议SUGGESTION按官方解释Suggestions 只是推荐不影响访问控制的风格改进。修复方式就是给Sid一个有意义的标识例如CognitoWebIdentityAssumeRole。Finding 2MISMATCHED_ACTION_FOR_PRINCIPAL类型ERROR这是本示例中最关键的问题。finding 指出sts:AssumeRole动作对于 principalcognito-identity.amazonaws.com是无效的并给出两条修复路径使用 SAML provider principal 配合sts:AssumeRoleWithSAML动作使用 OIDC provider principal 配合sts:AssumeRoleWithWebIdentity动作同时强调无论选择哪种方案都必须确保 provider 是Federated类型。原因在于Cognito 身份池属于 OIDC 联合federated身份这类主体只能通过sts:AssumeRoleWithWebIdentity代入角色而sts:AssumeRole面向的是 IAM 实体或通过sts:AssumeRole显式授权的角色与Federatedprincipal 不匹配。示例文档明确提示与 Cognito 配合使用的正确代入动作是sts:AssumeRoleWithWebIdentity。这是一个ERROR级别的发现——意味着策略的这一部分实际上无法正常工作。注意该 finding 的locations包含两个定位点一处指向Statement[0].Action[0]即sts:AssumeRole另一处指向Statement[0].Principal.Federated即cognito-identity.amazonaws.com。这体现了 Access Analyzer 会同时标注问题动作与关联主体帮助你在策略中快速定位问题的两端。Finding 3UNSUPPORTED_ACTION_FOR_CONDITION_KEY类型ERROR第三条 finding 指出条件键cognito-identity.amazonaws.com:aud不支持sts:TagSession动作因此该条件对sts:TagSession不会生效The condition will not be evaluated for these actions。建议是把这些动作移到不使用该条件键的独立 statement 中。这也是一个ERROR。结合上下文理解sts:TagSession与sts:AssumeRoleWithWebIdentity均会返回会话标签相关的授权信息但cognito-identity.amazonaws.com:aud这一条件键只与代入类动作如AssumeRoleWithWebIdentity的上下文中可用并非所有动作都支持该条件键。修复方案通常是将sts:TagSession拆到单独的 statement或调整动作集合使条件键只应用于支持它的动作。该 finding 的两个定位点分别指向Statement[0].Action[1]sts:TagSession与Statement[0].Condition.StringEquals[cognito-identity.amazonaws.com:aud]条件键本身。修复后的策略示例综合三条 finding可以给出修正版本Sid补齐、动作换成sts:AssumeRoleWithWebIdentity、sts:TagSession单独成句以避开不受支持的条件键{ Version: 2012-10-17, Statement: [ { Sid: CognitoWebIdentityAssumeRole, Effect: Allow, Principal: { Federated: cognito-identity.amazonaws.com }, Action: sts:AssumeRoleWithWebIdentity, Condition: { StringEquals: { cognito-identity.amazonaws.com:aud: us-west-2_EXAMPLE } } }, { Sid: TagSession, Effect: Allow, Principal: { Federated: cognito-identity.amazonaws.com }, Action: sts:TagSession } ] }将修改后的文档再次执行validate-policy若返回findings: []即为通过校验。四、从服务模型理解完整参数validate-policy命令的每个参数都直接对应ValidatePolicyRequest结构体见 service-2.json。其中policyDocument与policyType是必填参数其余为可选参数必填说明--policy-document是JSON 策略文档支持字符串或file://文件路径--policy-type是要校验的策略类型见下方枚举--locale否用于本地化 findings 的语言区域见下方枚举--max-results否响应中返回的最大结果数走 query string--next-token否分页游标用于获取后续结果走 query string--validate-policy-resource-type否资源策略要附加的资源类型仅在policy-type为RESOURCE_POLICY时指定--policy-type的合法取值按服务模型中的PolicyType枚举service-2.json共四种IDENTITY_POLICY身份策略为 IAM principal 授予权限包括 IAM 角色、用户、组的托管策略与内联策略RESOURCE_POLICY资源策略为 AWS 资源授予权限包括 IAM 角色的信任策略、Amazon S3 桶策略等SERVICE_CONTROL_POLICY服务控制策略SCP挂载到 AWS 组织、组织单元OU或账号的组织策略RESOURCE_CONTROL_POLICY资源控制策略RCP。模型文档还特别说明RESOURCE_POLICY既接受身份策略 / 资源策略这类通用输入也接受托管策略 / S3 桶策略这类具体输入。--validate-policy-resource-type的合法取值当策略类型为RESOURCE_POLICY时可通过该参数声明策略将挂载到哪类资源从而让检查更精准。服务模型中ValidatePolicyResourceType的枚举service-2.json包括AWS::S3::BucketAWS::S3::AccessPointAWS::S3::MultiRegionAccessPointAWS::S3ObjectLambda::AccessPointAWS::IAM::AssumeRolePolicyDocumentAWS::DynamoDB::Table例如校验一份要挂到 S3 桶的资源策略可写--validate-policy-resource-type AWS::S3::Bucket。文档同时说明对于不在该枚举中的资源类型例如 KMS 密钥可以不指定该参数此时 Access Analyzer 会运行适用于所有资源策略的通用检查。--locale的合法取值服务模型中Locale枚举service-2.json支持DE德语、EN英语、ES西班牙语、FR法语、IT意大利语、JA日语、KO韩语、PT_BR巴西葡萄牙语、ZH_CN简体中文、ZH_TW繁体中文。未指定时默认返回英文。五、Findings 的数据结构机器可读的定位与分级每个 finding 都对应服务模型中的ValidatePolicyFinding结构体service-2.json其五个字段全部为必填字段含义findingDetails本地化的发现描述说明问题并给出处理建议findingType发现的影响级别issueCode问题的标识码如EMPTY_SID_VALUE、MISMATCHED_ACTION_FOR_PRINCIPALlearnMoreLink指向该类型 finding 详细说明文档的链接locations策略文档中与该 finding 相关的位置列表findingType 的四个级别服务模型ValidatePolicyFindingType枚举service-2.json定义了四类ERROR策略中的某部分无法正常工作本示例中的两个问题即属此类SECURITY_WARNING策略允许的访问过于宽松存在安全风险WARNING策略不符合策略编写最佳实践非安全问题SUGGESTION对策略的风格改进建议不影响访问控制本示例中的EMPTY_SID_VALUE即属此类。locations精确定位到行列locations数组中的每个元素是Location结构体service-2.json包含两部分path策略中的路径由一系列路径元素组成。value表示对象键名如Statement、Sid、Principalindex表示数组下标如Statement的第 0 个元素、Action的第 0 项。因此[{value:Statement},{index:0},{value:Action},{index:0}]精确指向第一个 statement 中第一个 actionspan一段跨度的起止位置。每个位置Position见 service-2.json由line行号从 1 开始、column列号从 1 开始与offset字符偏移共同刻画。这种结构化定位非常适合自动化工具CI/CD 管道可以根据issueCode直接拦截ERROR级别问题并把locations映射回源码文件的行列实现策略即代码Policy as Code的静态检查环节。六、延伸使用与最佳实践结合其他 Access Analyzer 示例使用validate-policy属于 Access Analyzer 命令家族中的策略校验能力同仓库 awscli/examples/accessanalyzer 目录下还有check-no-public-access.rst、check-access-not-granted.rst、check-no-new-access.rst访问权限验证、create-access-preview.rst、get-access-preview.rst访问预览等示例可组合出策略校验 权限验证的完整安全评估流程。写入 CI 校验策略把--policy-document file://...指向仓库中的策略文件用--policy-type区分身份策略与资源策略将命令输出中的findings交给 CI 判断任何ERROR/SECURITY_WARNING都应在合并前修复。利用--locale本地化报告团队使用非英语环境时可传--locale ZH_CN获得本地化的findingDetails便于非英语成员直接阅读问题描述。精准指定资源类型校验 S3 桶策略、DynamoDB 表策略或角色信任策略时尽量传入--validate-policy-resource-type让检查覆盖该资源类型专属的规则而不是退回到通用检查。留意分页当策略包含多个问题时findings 可能超过单页上限--max-results此时响应中的nextToken可用于继续取回剩余结果。七、小结通过aws accessanalyzer validate-policy开发者可以在部署前完成策略的静态自检。本示例展示了 Access Analyzer 的三类典型发现风格建议EMPTY_SID_VALUE、主体与动作不匹配的功能性错误MISMATCHED_ACTION_FOR_PRINCIPAL、条件键与动作不兼容的功能性错误UNSUPPORTED_ACTION_FOR_CONDITION_KEY。结合服务模型中的参数枚举与 finding 结构定义你可以把这条命令无缝接入日常开发与 CI 流程让每一次策略变更都经过写策略 → 校验 → 看懂报告 → 修复的标准化闭环。【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表