

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

# 使用 Amazon S3 访问数据的权限 URIs
<a name="s3-sharing"></a>

您可以使用 HealthOmics API 操作或 Amazon S3 API 操作访问序列存储数据。

对于 HealthOmics API 访问， HealthOmics 权限通过 IAM 策略进行管理。但是，S3 访问需要两个级别的配置：商店的 S3 访问策略中的明确允许和 IAM 策略。要详细了解如何将 IAM 策略与配合使用 HealthOmics，请参阅[的服务角色 HealthOmics](permissions-service.md)。

有三种方法可以共享使用 Amazon S3 读取对象的功能 APIs：

1. 基于策略的共享 — 这种共享需要在 S3 访问策略中启用 IAM 委托人，并编写 IAM 策略并将其附加到 IAM 委托人。有关更多详细信息，请参阅下一个主题。

1.  预签名 URLs — 您还可以为序列存储中的文件生成可共享的预签名 URL。要了解有关 URLs 使用 Amazon S3 创建预签名的更多信息，请参阅 Amazon S3 [文档 URLs中的使用预签名](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html)。序列存储 S3 访问策略支持[限制预签名 URL 功能](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html#PresignedUrlUploadObject-LimitCapabilities)的语句。

1. 代入的角色-在数据所有者的账户中创建一个角色，该角色的访问策略允许用户担任该角色。

**Topics**
+ [基于策略的共享](#policy-based-sharing)
+ [限制示例](#example-restriction)

## 基于策略的共享
<a name="policy-based-sharing"></a>

如果您使用直接 S3 URI 访问序列存储数据，则会为关联的 S3 存储桶访问策略 HealthOmics 提供增强的安全措施。

以下规则适用于新的 S3 访问策略。对于现有策略，下次更新策略时将应用以下规则：
+ S3 访问策略支持以下[策略元素](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)
  + 版本、编号、陈述、Sid、效果、主体、操作、资源、条件
+ S3 访问策略支持以下[条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html#amazons3-policy-keys)：
  + s3:ExistingObjectTag/<key>、s3: 前缀、s3: signatureVersion、s3: TlsVersion
  + 策略还支持 aws:PrincipalArn ，使用以下条件运算符： ArnEquals 和 ArnLike 

如果您尝试添加或更新策略以包含不支持的元素或条件，则系统会拒绝该请求。

**Topics**
+ [默认 S3 访问策略](#default-access-policy)
+ [自定义访问策略](#customize-access-policy)
+ [IAM 策略](#iam-policy)
+ [基于标签的访问控制](#tag-based-access)

### 默认 S3 访问策略
<a name="default-access-policy"></a>

创建序列存储时， HealthOmics 会创建一个默认 S3 访问策略，授予数据存储所有者的根账户对序列存储中所有可访问对象的以下权限：S3: GetObject GetObjectTagging、S3 和 S3: ListBucket。默认创建的策略是：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":
    [
        {
            "Effect": "Allow",
            "Principal":
            {
                "AWS": "arn:aws:iam::111111111111:root"
            },
            "Action":
            [
                "s3:GetObject",
                "s3:GetObjectTagging"
            ],
            "Resource": "arn:aws:s3:us-west-2:222222222222:accesspoint/111111111111-1234567890/object/111111111111/sequenceStore/1234567890/*"
        },
        {
            "Effect": "Allow",
            "Principal":
            {
                "AWS": "arn:aws:iam::111111111111:root"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:us-west-2:222222222222:accesspoint/111111111111-1234567890/111111111111/sequenceStore/1234567890/*"
        }
    ]
}
```

------

### 自定义访问策略
<a name="customize-access-policy"></a>

如果 S3 访问策略为空，则不允许访问 S3。如果存在现有策略并且您需要删除 s3 访问权限，请使用`deleteS3AccessPolicy`删除所有访问权限。

要添加共享限制或向其他账户授予访问权限，您可以使用 `PutS3AccessPolicy` API 更新政策。对策略的更新不能超出序列存储的前缀或指定的操作。

### IAM 策略
<a name="iam-policy"></a>

要允许用户或 IAM 委托人使用 Amazon S3 进行访问 APIs，除了 S3 访问策略中的权限外，还需要创建一个 IAM 策略并将其附加到委托人以授予访问权限。允许 Amazon S3 API 访问权限的策略可以在序列存储级别或读取集级别应用。在读取集级别，可以通过前缀或使用资源标签过滤器来限制样本或主题 ID 模式。

如果序列存储使用客户托管密钥 (CMK)，则委托人还必须有权使用 KMS 密钥进行解密。有关更多信息，请参阅 AWS Key Management Service 开发者指南中的[跨账户 KMS 访问](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying-external-accounts.html)。

以下示例为用户提供了对序列存储的访问权限。您可以使用其他条件或基于资源的过滤器来微调访问权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111111:root"
      },
      "Action": 
      [ 
         "s3:GetObject", 
         "s3:GetObjectTagging" 
      ],
      "Resource": "arn:aws:s3:us-west-2:222222222222:accesspoint/111111111111-1234567890/object/111111111111/sequenceStore/1234567890/*",
      "Condition": {
        "StringEquals": {
          "s3:ExistingObjectTag/omics:readSetStatus": "ACTIVE"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111111:root"
      },
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:us-west-2:222222222222:accesspoint/111111111111-1234567890",
      "Condition": {
        "StringLike": {
          "s3:prefix": "111111111111/sequenceStore/1234567890/*"
        }
      }
    }
  ]
}
```

------

### 基于标签的访问控制
<a name="tag-based-access"></a>

要使用基于标签的访问控制，必须先更新序列存储以传播将要使用的标签密钥。此配置是在序列存储创建或更新期间设置的。一旦标签被传播，就可以使用标签条件来进一步添加限制。可以在 S3 访问策略或 IAM 策略中设置限制。以下是将要设置的基于选项卡的 S3 访问策略的示例：

```
{
    "Sid": "tagRestrictedGets",
    "Effect": "Allow",
    "Principal":
    {
        "AWS": "arn:aws:iam::<target_restricted_account_id>:root"
    },
    "Action":
    [
        "s3:GetObject",
        "s3:GetObjectTagging"
    ],
    "Resource": "arn:aws:s3:us-west-2:222222222222:accesspoint/111111111111-1234567890/object/111111111111/sequenceStore/1234567890/*",
    "Condition":
    {
        "StringEquals":
        {
            "s3:ExistingObjectTag/tagKey1": "tagValue1",
            "s3:ExistingObjectTag/tagKey2": "tagValue2"
        }
    }
}
```

## 限制示例
<a name="example-restriction"></a>

场景：创建一个共享，数据所有者可以在其中限制用户下载 “已撤回” 的数据的能力。

在这种情况下，数据所有者（账户 \$1111111111111）管理数据存储。该数据所有者与包括研究人员在内的广泛第三方用户共享数据（账户 \$1999999999999）。作为管理数据的一部分，数据所有者会定期收到撤回参与者数据的请求。为了管理这种撤回，数据所有者首先在收到请求时限制直接下载权限，并最终根据其要求删除数据。

为了满足这一需求，数据所有者设置了一个序列存储，每个读取集都会收到一个 “状态” 标签，如果提款请求通过，该标签将设置为 “已撤回”。对于标签设置为该值的数据，他们希望确保没有用户可以对此文件运行 “getObject”。要进行此设置，数据所有者需要确保采取两个步骤。

步骤 1：对于序列存储，请确保更新状态标签以进行传播。这是通过在呼叫`propogatedSetLevelTags`时将 “状态” 键添加到 “`createSequenceStore`或” 来完成的 `updateSequenceStore.`

步骤 2：更新商店的 s3 访问策略，将状态标签设置为已撤回的对象限制 getObject。这是通过使用 `PutS3AccesPolicy` API 更新商店访问策略来完成的。以下政策允许客户在列出对象时仍能看到已撤回的文件，但禁止他们访问这些文件：
+ 声明 1 (restrictedGetWithdrawal)：账户 999999999999 无法检索已提取的对象。
+ 声明 2 (ownerGetAll)：账户 111111111111（数据所有者）可以检索所有对象，包括已撤回的对象。
+ 声明 3 (everyoneListAll)：所有共享账户，111111111111和999999999999，都可以在整个前缀上运行该操作。**ListBucket**

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":
    [
        {
            "Sid": "restrictedGetWithdrawal",
            "Effect": "Allow",
            "Principal":
            {
                "AWS": "arn:aws:iam::999999999999:root"
            },
            "Action":
            [
                "s3:GetObject",
                "s3:GetObjectTagging"
            ],
            "Resource": "arn:aws:s3:us-west-2:222222222222:accesspoint/111111111111-1234567890/object/111111111111/sequenceStore/1234567890/*",
            "Condition":
            {
                "StringNotEquals":
                {
                    "s3:ExistingObjectTag/status": "withdrawn"
                }
            }
        },
        {
            "Sid": "ownerGetAll",
            "Effect": "Allow",
            "Principal":
            {
                "AWS": "arn:aws:iam::111111111111:root"
            },
            "Action":
            [
                "s3:GetObject",
                "s3:GetObjectTagging"
            ],
            "Resource": "arn:aws:s3:us-west-2:222222222222:accesspoint/111111111111-1234567890/object/111111111111/sequenceStore/1234567890/*",
            "Condition":
            {
                "StringEquals":
                {
                    "s3:ExistingObjectTag/omics:readSetStatus": "ACTIVE"
                }
            }
        },
        {
            "Sid": "everyoneListAll",
            "Effect": "Allow",
            "Principal":
            {
                "AWS": [
                    "arn:aws:iam::111111111111:root",
                    "arn:aws:iam::999999999999:root"
                ]
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:us-west-2:222222222222:accesspoint/111111111111-1234567890",
            "Condition":
            {
                "StringLike":
                {
                    "s3:prefix": "111111111111/sequenceStore/1234567890/*"
                }
            }
        }
    ]
}
```

------