

# 标签和访问控制策略
<a name="tagging-and-policies"></a>

您还可以使用权限策略（桶和用户策略）管理对象标签相关权限。有关策略操作，请参阅以下主题：
+  [对象操作](security_iam_service-with-iam.md#using-with-s3-actions-related-to-objects) 
+  [存储桶操作](security_iam_service-with-iam.md#using-with-s3-actions-related-to-buckets)

对象标签支持用于管理权限的精细访问控制。您可以基于对象标签授予条件权限。Amazon S3 支持以下条件键，这些键可用于授予基于对象标签的条件权限：
+ `s3:ExistingObjectTag/{{<tag-key>}}` - 使用此条件键可验证现有对象标签是否有特定标签键和值。
**注意**  
当授予 `PUT Object` 和 `DELETE Object` 操作的权限时，此条件键不受支持。也就是说，您无法创建这样一个策略：允许或拒绝用户基于对象的现有标签删除或覆盖该对象。
+ `s3:RequestObjectTagKeys` - 使用此条件键可限制要在对象上允许的标签键。当使用 PutObjectTagging 和 PutObject 以及 POST 对象请求将标签添加到对象时，这很有用。
+ `s3:RequestObjectTag/{{<tag-key>}}` - 使用此条件键可限制要在对象上允许的标签键和值。当使用 PutObjectTagging 和 PutObject 以及 POST 桶请求将标签添加到对象时，这很有用。

有关特定于 Amazon S3 服务的条件键的完整列表，请参阅 [使用条件键的存储桶策略示例](amazon-s3-policy-keys.md)。以下权限策略说明了对象标签如何支持精细访问权限管理。

**Example 1：允许用户仅读取具有特定标签和键值的对象**  
以下权限策略限制用户只能读取具有 `environment: production` 标签键和值的对象。请注意，该策略使用 `s3:ExistingObjectTag` 条件键来指定标签键和值。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
  {
    "Principal": {
      "AWS": [
        "arn:aws:iam::{{111122223333}}:role/{{JohnDoe}}"
      ]
    },
    "Effect": "Allow",
    "Action": ["s3:GetObject", "s3:GetObjectVersion"],
    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
    "Condition": {
      "StringEquals": 
        {"s3:ExistingObjectTag/environment": "production"}
    }
  }
  ]
}
```

**Example 2：限制用户可以添加哪些对象标签键**  
以下权限策略将向用户授予执行 `s3:PutObjectTagging` 操作的权限，这使用户可以将标签添加到现有对象。条件使用 `s3:RequestObjectTagKeys` 条件键指定允许的标签键，例如 `Owner` 或 `CreationDate`。有关更多信息，请参阅《IAM 用户指南》**中的[创建测试多个键值的条件](https://docs.amazonaws.cn//IAM/latest/UserGuide/reference_policies_multi-value-conditions.html)。  
该策略确保在请求中指定的每个标签键都是授权的标签键。条件中的 `ForAnyValue` 限定符确保请求中必须至少存在指定的值之一。    
****  

```
{
   "Version":"2012-10-17",		 	 	 
  "Statement": [
    {"Principal":{"AWS":[
            "arn:aws:iam::{{111122223333}}:role/{{JohnDoe}}"
         ]
       },
 "Effect": "Allow",
      "Action": [
        "s3:PutObjectTagging"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/*"
      ],
      "Condition": {"ForAnyValue:StringEquals": {"s3:RequestObjectTagKeys": [
            "Owner",
            "CreationDate"
          ]
        }
      }
    }
  ]
}
```

**Example 3：在允许用户添加对象标签时需要特定的标签键和值**  
以下示例策略将向用户授予执行 `s3:PutObjectTagging` 操作的权限，这使用户可以将标签添加到现有对象。条件要求用户包含值设置为 `{{X}}` 的特定标签键（如 `{{Project}}`)。    
****  

```
{
   "Version":"2012-10-17",		 	 	 
  "Statement": [
    {"Principal":{"AWS":[
       "arn:aws:iam::{{111122223333}}:user/{{JohnDoe}}"
         ]
       },
      "Effect": "Allow",
      "Action": [
        "s3:PutObjectTagging"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/*"
      ],
      "Condition": {"StringEquals": {"s3:RequestObjectTag/{{Project}}": "{{X}}"
        }
      }
    }
  ]
}
```

