

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Amazon S3 URIs 存取資料的許可
<a name="s3-sharing"></a>

您可以使用 HealthOmics API 操作或 Amazon S3 API 操作來存取序列存放區資料。

對於 HealthOmics API 存取，HealthOmics 許可是透過 IAM 政策管理。不過，S3 存取需要兩個層級的組態：在存放區的 S3 存取政策和 IAM 政策中明確允許。若要進一步了解如何搭配 HealthOmics 使用 IAM 政策，請參閱 [ HealthOmics 的服務角色](permissions-service.md)。

有三種方式可以共用使用 Amazon S3 APIs 讀取物件的功能：

1. 以政策為基礎的共用 – 此共用需要在 S3 存取政策中啟用 IAM 主體，並撰寫 IAM 政策並將其連接到 IAM 主體。如需詳細資訊，請參閱下一個主題。

1.  預先簽章URLs – 您也可以為序列存放區中的檔案產生可共用的預先簽章 URL。若要進一步了解如何使用 Amazon S3 建立預先簽章URLs，請參閱 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 存取序列存放區資料，HealthOmics 會為相關聯的 S3 儲存貯體存取政策提供增強的安全措施。

下列規則適用於新的 S3 存取政策。對於現有政策，規則會在您下次更新政策時套用：
+ S3 存取政策支援下列[政策元素](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)
  + 版本、ID、陳述式、Sid、Effect、委託人、動作、資源、條件
+ S3 存取政策支援下列[條件金鑰](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html#amazons3-policy-keys)：
  + s3：ExistingObjectTag/<key>、s3：prefix、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、S3GetObjectTagging 和 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) 管理資料存放區。此資料擁有者會與廣泛的第三方使用者共用資料，包括研究人員 （帳戶編號 999999999999)。在管理資料的過程中，資料擁有者會定期收到撤銷參與者資料的請求。若要管理此撤回，資料擁有者會先限制接收請求時的直接下載存取權，最後根據其需求刪除資料。

為了滿足此需求，資料擁有者會設定序列存放區，而且每個讀取集都會收到「狀態」的標籤，如果提取請求通過，則會將其設定為「撤銷」。對於標籤設定為此值的資料，他們想要確保沒有任何使用者可以在此檔案上執行「getObject」。若要執行此設定，資料擁有者將需要確保採取兩個步驟。

步驟 1. 對於序列存放區，請確定狀態標籤已更新為要傳播。方法是在呼叫 `createSequenceStore`或 `propogatedSetLevelTags`時，將「狀態」金鑰新增至 。 `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/*"
                }
            }
        }
    ]
}
```

------