You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Terraform为AWS权限集添加多个内联策略?

解决AWS SSO权限集内联策略仅生效一条的问题

我创建了2条IAM策略,尝试将其作为内联策略附加到AWS SSO权限集,但仅能生效其中一条。请问如何让两条策略都作为内联策略应用到该权限集?

用户提供的Terraform代码(已添加中文注释):

# 创建拒绝非美国区域访问的IAM托管策略
resource "aws_iam_policy" "DenyAccess_nonUSRegions" {
  name        = "DenyAccess_nonUSRegions"
  description = "拒绝访问非美国区域"
  policy      = data.aws_iam_policy_document.DenyAccess_nonUSRegions.json
}

# 创建拒绝特定IAM操作的IAM托管策略
resource "aws_iam_policy" "role" {
  name        = "Deny_Specific_IAM_Actions"
  description = "拒绝特定IAM操作"
  policy      = data.aws_iam_policy_document.Deny_Specific_IAM_Actions.json
}

# 尝试附加拒绝特定IAM操作的内联策略到权限集
resource "aws_ssoadmin_permission_set_inline_policy" "role" {
  inline_policy      = data.aws_iam_policy_document.Deny_Specific_IAM_Actions.json
  instance_arn       = aws_ssoadmin_permission_set.permission.instance_arn
  permission_set_arn = aws_ssoadmin_permission_set.permission.arn
}

# 尝试附加拒绝非美国区域的内联策略到权限集
resource "aws_ssoadmin_permission_set_inline_policy" "DenyAccess_nonUSRegions" {
  inline_policy      = data.aws_iam_policy_document.DenyAccess_nonUSRegions.json
  instance_arn       = aws_ssoadmin_permission_set.permission.instance_arn
  permission_set_arn = aws_ssoadmin_permission_set.permission.arn
}

问题根源

AWS SSO权限集仅支持关联一个内联策略。当你为同一个权限集创建多个aws_ssoadmin_permission_set_inline_policy资源时,后创建的资源会覆盖先创建的,最终只有最后一条内联策略生效。

解决方案

方案1:合并两个策略为单个内联策略

将两条策略的规则合并到同一个IAM策略文档中,作为单个内联策略附加到权限集。

示例代码:

# 合并两条拒绝规则的策略文档
data "aws_iam_policy_document" "combined_deny_policies" {
  # 拒绝特定IAM操作的规则
  statement {
    effect    = "Deny"
    actions   = ["iam:CreateUser", "iam:DeleteUser"] # 替换为你需要拒绝的IAM动作
    resources = ["*"]
  }

  # 拒绝非美国区域访问的规则
  statement {
    effect    = "Deny"
    actions   = ["*"]
    resources = ["*"]
    condition {
      test     = "StringNotEquals"
      variable = "aws:RequestedRegion"
      values   = ["us-east-1", "us-west-2"] # 替换为你允许的区域
    }
  }
}

# 将合并后的策略作为内联策略附加到权限集
resource "aws_ssoadmin_permission_set_inline_policy" "combined_policy" {
  inline_policy      = data.aws_iam_policy_document.combined_deny_policies.json
  instance_arn       = aws_ssoadmin_permission_set.permission.instance_arn
  permission_set_arn = aws_ssoadmin_permission_set.permission.arn
}

方案2:将其中一条策略转为托管策略关联

保留一条内联策略,将另一条策略创建为IAM托管策略,再关联到权限集。

示例代码:

# 创建拒绝非美国区域访问的托管策略
resource "aws_iam_policy" "DenyAccess_nonUSRegions" {
  name        = "DenyAccess_nonUSRegions"
  description = "拒绝访问非美国区域"
  policy      = data.aws_iam_policy_document.DenyAccess_nonUSRegions.json
}

# 拒绝特定IAM操作的策略文档
data "aws_iam_policy_document" "Deny_Specific_IAM_Actions" {
  statement {
    effect    = "Deny"
    actions   = ["iam:CreateUser", "iam:DeleteUser"] # 替换为你需要拒绝的IAM动作
    resources = ["*"]
  }
}

# 附加拒绝特定IAM操作的内联策略到权限集
resource "aws_ssoadmin_permission_set_inline_policy" "Deny_Specific_IAM_Actions" {
  inline_policy      = data.aws_iam_policy_document.Deny_Specific_IAM_Actions.json
  instance_arn       = aws_ssoadmin_permission_set.permission.instance_arn
  permission_set_arn = aws_ssoadmin_permission_set.permission.arn
}

# 将托管策略关联到权限集
resource "aws_ssoadmin_permission_set_managed_policy_attachment" "non_us_regions_deny" {
  instance_arn       = aws_ssoadmin_permission_set.permission.instance_arn
  permission_set_arn = aws_ssoadmin_permission_set.permission.arn
  managed_policy_arn = aws_iam_policy.DenyAccess_nonUSRegions.arn
}

注意事项

  • 内联策略适合仅针对当前权限集的专属规则,托管策略适合需要在多个权限集或IAM角色间复用的规则。
  • 合并策略时需遵循IAM策略评估逻辑:拒绝规则优先级高于允许规则,确保合并后的策略逻辑符合你的访问控制需求。

内容的提问来源于stack exchange,提问作者sean1989

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:46:29