

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用标签控制对 CodePipeline 资源的访问权限
<a name="tag-based-access-control"></a>

IAM 策略声明中的条件是您用来指定 CodePipeline 操作所需资源权限的语法的一部分。使用条件中的标签是控制对资源和请求的访问的一种方法。有关为 CodePipeline 资源添加标签的信息，请参阅[为资源添加标签](tag-resources.md)。本主题讨论了基于标签的访问控制。

在设计 IAM 策略时，您可以通过授予对特定资源的访问权限来设置精细权限。但随着您管理的资源数量的增加，此任务会变得日益复杂。标记资源并在策略声明条件中使用标签可以简化这一任务。您可以向具有特定标签的任何资源批量授予访问权限。然后，在创建期间或之后，您可以将此标签反复应用到相关资源。

标签可以附加到资源，也可以从请求传入支持标签的服务。在中 CodePipeline，资源可以有标签，有些操作可以包含标签。在创建 IAM 策略时，您可以使用标签条件键来控制：
+ 基于资源已有的标签，哪些用户可以对管道资源执行操作。
+ 哪些标签可以在操作的请求中传递。
+ 特定的标签键是否能在请求中使用。

利用字符串条件运算符，您可以构建基于键与字符串值的对比来限制访问的 `Condition` 元素。除 Null 条件，您可在任何条件运算符名称的末尾添加 `IfExists`。如果您是指“如果请求的内容中存在策略键，则依照策略所述来处理键。如果该键不存在，则条件元素的计算结果将为 true。” 例如，您可以使用 `StringEqualsIfExists` 按条件键进行限制，这些条件键可能不存在于其他类型的资源上。

有关标签条件键的完整请求和语义，请参阅[使用标签控制访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_tags.html)。有关条件键的更多信息，请参阅以下资源。本节中的 CodePipeline策略示例与以下有关条件键的信息保持一致，并通过 CodePipeline 诸如资源嵌套之类的细微差别示例对其进行扩展。
+ [字符串条件运算符](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String)
+ [Amazon Web Services 服务 可以与 IAM 配合使用](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)
+ [SCP 语法](https://docs.amazonaws.cn/IAM/latest/UserGuide/orgs_manage_policies_scps_syntax.html)
+ [IAM JSON 策略元素：Condition](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition.html)
+ [aws: RequestTag /tag-key](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag)
+ [的条件密钥 CodePipeline](https://docs.amazonaws.cn/IAM/latest/UserGuide/list_awscodepipeline.html#awscodepipeline-policy-keys)

以下示例演示了如何为 CodePipeline 用户指定策略中的标签条件。

**Example 1：基于请求中的标签限制操作**  
`AWSCodePipeline_FullAccess`托管用户策略为用户提供了对任何资源执行任何 CodePipeline 操作的无限权限。  
以下策略将限制此权力，不允许未经授权的用户在请求中列出特定标签的情况下创建管道。为此，如果请求指定一个名为 `Project` 的带有值为 `ProjectA` 或 `ProjectB` 的标签，则它会拒绝 `CreatePipeline` 操作。（`aws:RequestTag` 条件键用于控制可以通过 IAM 请求传递哪些标签。）   
在下面的示例中，该策略的目的是不允许未经授权的用户使用指定的标签值创建管道。但是，创建管道需要访问管道本身之外的资源（例如，管道操作和阶段）。由于策略中指定的 `'Resource'` 是 `'*'`，因此将针对每个具有 ARN 并且在创建管道时创建的资源，评估该策略。这些其他资源没有标签条件键，因此 `StringEquals` 检查会失败，并且不会向用户授予创建任何管道的能力。要解决此问题，请改用 `StringEqualsIfExists` 条件运算符。这样，仅当条件键存在时才会进行测试。  
您可能会读到以下内容：“如果所检查的资源具有标签 `"RequestTag/Project"` 条件键，则仅当键值以 `projectA` 开头时允许操作。如果所检查的资源没有改条件键，则无需担心。”   
此外，该策略使用 `aws:TagKeys` 条件键，不允许标签修改操作中包含这些相同的标签值，从而防止这些未经授权的用户篡改资源。除托管用户策略外，客户的管理员还必须将此 IAM 策略附加到未经授权的管理用户。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "codepipeline:CreatePipeline",
        "codepipeline:TagResource"
      ],
      "Resource": "*",
      "Condition": {
        "StringEqualsIfExists": {
          "aws:RequestTag/Project": ["ProjectA", "ProjectB"]
        }
      }
    },
    {
      "Effect": "Deny",
      "Action": [
        "codepipeline:UntagResource"
      ],
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringEquals": {
          "aws:TagKeys": ["Project"]
        }
      }
    }
  ]
}
```

**Example 2：基于资源标签限制标记操作**  
`AWSCodePipeline_FullAccess`托管用户策略为用户提供了对任何资源执行任何 CodePipeline 操作的无限权限。  
以下策略限制此权力并拒绝未经授权的用户具有对指定项目管道执行操作的权限。为此，如果资源具有名为 `Project` 的带有值 `ProjectA` 或 `ProjectB` 之一的标签，那么它会拒绝某些操作。（使用 `aws:ResourceTag` 条件键，基于资源上的标签控制对这些资源的访问。） 除托管用户策略外，客户的管理员还必须将此 IAM 策略附加到未经授权的 IAM 用户。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "codepipeline:TagResource"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Project": ["ProjectA", "ProjectB"]
        }
      }
    }
  ]
}
```

**Example 3：基于请求中的标签允许操作**  
以下策略授予用户在 CodePipeline 中创建开发管道的权限。  
为此，如果请求指定一个名为 `Project` 的带有值 `ProjectA` 的标签，则它允许 `CreatePipeline` 和 `TagResource` 操作。换句话说，唯一可以指定的标签键是 `Project`，它的值必须是 `ProjectA`。  
`aws:RequestTag` 条件键用于控制可以通过 IAM 请求传递哪些标签。`aws:TagKeys` 条件确保标签键区分大小写。对于未附加 `AWSCodePipeline_FullAccess` 托管用户策略的用户或角色，此策略非常有用。托管策略为用户提供了对任何资源执行任何 CodePipeline 操作的无限权限。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "codepipeline:CreatePipeline",
        "codepipeline:TagResource"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/Project": "ProjectA"
        },
        "ForAllValues:StringEquals": {
          "aws:TagKeys": ["Project"]
        }
      }
    }
  ]
}
```

**Example 4：基于资源标签限制取消标记操作**  
`AWSCodePipeline_FullAccess`托管用户策略为用户提供了对任何资源执行任何 CodePipeline 操作的无限权限。  
以下策略限制此权力并拒绝未经授权的用户具有对指定项目管道执行操作的权限。为此，如果资源具有名为 `Project` 的带有值 `ProjectA` 或 `ProjectB` 之一的标签，那么它会拒绝某些操作。  
此外，该策略使用 `aws:TagKeys` 条件键，不允许标签修改操作完全删除 `Project` 标签，从而防止这些未经授权的用户篡改资源。除托管用户策略外，客户的管理员还必须将此 IAM 策略附加到未经授权的用户或角色。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "codepipeline:UntagResource"
      ],
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringEquals": {
          "aws:TagKeys": ["Project"]
        }
      }
    }
  ]
}
```