

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

# 儲存庫政策
<a name="repo-policies"></a>

CodeArtifact 使用資源型許可來控制存取。以資源為基礎的權限可讓您指定誰可存取儲存庫以及他們可以執行的動作。根據預設，只有儲存庫擁有者可存取儲存庫。您可以套用政策文件，允許其他 IAM 主體存取您的儲存庫。

如需詳細資訊，請參閱以[資源為基礎的政策和](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_resource-based)[以身分為基礎的政策和以資源為基礎的政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)。

## 建立資源政策以授予讀取存取權
<a name="creating-a-resource-policy-to-grant-read-access"></a>

資源政策是 JSON 格式的文字檔案。檔案必須指定委託人 （演員）、一或多個動作和效果 (`Allow` 或 `Deny`)。例如，下列資源政策會授予帳戶從儲存庫下載套件的`123456789012`許可。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "codeartifact:ReadFromRepository"
            ],
            "Effect": "Allow",
            "Principal": {
                 "AWS": "arn:aws:iam::123456789012:root"
            },
            "Resource": "*"
        }
    ]
}
```

------

由於政策只會針對其連接的儲存庫評估操作，因此您不需要指定資源。由於資源是隱含的，因此您可以將 `Resource` 設定為 `*`。為了讓套件管理員從此儲存庫下載套件，也需要建立跨帳戶存取的網域政策。網域政策必須至少將`codeartifact:GetAuthorizationToken`許可授予委託人。如需授予跨帳戶存取權的完整網域政策範例，請參閱此 [網域政策範例](domain-policies.md#domain-policy-example)。

**注意**  
`codeartifact:ReadFromRepository` 動作只能用於儲存庫資源。您無法使用 將套件的 Amazon Resource Name (ARN) 做為資源`codeartifact:ReadFromRepository`，做為允許讀取儲存庫中套件子集的動作。指定的委託人可以讀取儲存庫中的所有套件，也可以讀取它們。

由於儲存庫中指定的唯一動作是 `ReadFromRepository`，來自 帳戶的使用者和角色`1234567890`可以從儲存庫下載套件。不過，他們無法對其執行其他動作 （例如，列出套件名稱和版本）。一般而言，除了 之外，您還會授予下列政策的許可，`ReadFromRepository`因為從儲存庫下載套件的使用者也需要以其他方式與其互動。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "codeartifact:DescribePackageVersion",
                "codeartifact:DescribeRepository",
                "codeartifact:GetPackageVersionReadme",
                "codeartifact:GetRepositoryEndpoint",
                "codeartifact:ListPackages",
                "codeartifact:ListPackageVersions",
                "codeartifact:ListPackageVersionAssets",
                "codeartifact:ListPackageVersionDependencies",
                "codeartifact:ReadFromRepository"
            ],
            "Effect": "Allow",
            "Principal": {
                 "AWS": "arn:aws:iam::123456789012:root"
            },
            "Resource": "*"
        }
    ]
}
```

------

## 設定政策
<a name="setting-a-policy"></a>

建立政策文件之後，請使用 `put-repository-permissions-policy`命令將其連接至儲存庫：

```
aws codeartifact put-repository-permissions-policy --domain my_domain --domain-owner 111122223333 \
          --repository my_repo --policy-document file:///PATH/TO/policy.json
```

當您呼叫 時`put-repository-permissions-policy`，評估許可時會忽略儲存庫上的資源政策。這可確保網域擁有者無法將自己鎖定在儲存庫之外，這會使他們無法更新資源政策。

**注意**  
 您無法將許可授予另一個 AWS 帳戶，以使用資源政策更新儲存庫上的資源政策，因為在呼叫 put-repository-permissions-policy 時會忽略資源政策。

輸出範例：

```
{
    "policy": {
        "resourceArn": "arn:aws:codeartifact:region-id:111122223333:repository/my_domain/my_repo",
        "document": "{ ...policy document content...}",
        "revision": "MQlyyTQRASRU3HB58gBtSDHXG7Q3hvxxxxxxx="
    }
}
```

命令的輸出包含儲存庫資源的 Amazon Resource Name (ARN)、政策文件的完整內容，以及修訂識別符。您可以使用 `put-repository-permissions-policy` `--policy-revision`選項將修訂識別符傳遞至 。這可確保文件的已知修訂被覆寫，而不是由另一個寫入器設定的較新版本。

## 讀取政策
<a name="reading-a-policy"></a>

使用 `get-repository-permissions-policy`命令讀取政策文件的現有版本。若要格式化輸出以提高可讀性，請使用 `--output`和 `--query policy.document`搭配 Python `json.tool`模組。

```
aws codeartifact get-repository-permissions-policy --domain my_domain --domain-owner 111122223333 \
          --repository my_repo --output text --query policy.document | python -m json.tool
```

輸出範例：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": [
                "codeartifact:DescribePackageVersion",
                "codeartifact:DescribeRepository",
                "codeartifact:GetPackageVersionReadme",
                "codeartifact:GetRepositoryEndpoint",
                "codeartifact:ListPackages",
                "codeartifact:ListPackageVersions",
                "codeartifact:ListPackageVersionAssets",
                "codeartifact:ListPackageVersionDependencies",
                "codeartifact:ReadFromRepository"
            ],
            "Resource": "*"
        }
    ]
}
```

------

## 刪除政策
<a name="deleting-a-policy"></a>

使用 `delete-repository-permissions-policy`命令從儲存庫刪除政策。

```
aws codeartifact delete-repository-permissions-policy --domain my_domain --domain-owner 111122223333 \
          --repository my_repo
```

輸出的格式與 `get-repository-permissions-policy`命令的格式相同。

## 將讀取存取權授予委託人
<a name="granting-read-access-to-specific-principals"></a>

 當您將帳戶的根使用者指定為政策文件中的委託人時，您會授予該帳戶中所有使用者和角色的存取權。若要限制對所選使用者或角色的存取，請在政策的 `Principal`區段中使用其 ARN。例如，使用下列項目將讀取存取權授予帳戶 `bob`中的 IAM 使用者`123456789012`。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "codeartifact:ReadFromRepository"
            ],
            "Effect": "Allow",
            "Principal": {
                 "AWS": "arn:aws:iam::123456789012:user/bob"
            },
            "Resource": "*"
        }
    ]
}
```

------

## 授予套件的寫入存取權
<a name="granting-write-access-to-specific-packages"></a>

 `codeartifact:PublishPackageVersion` 動作用於控制發佈新版本套件的許可。與此動作搭配使用的資源必須是套件。CodeArtifact 套件 ARNs的格式如下。

```
arn:aws:codeartifact:region-id:111122223333:package/my_domain/my_repo/package-format/package-namespace/package-name
```

下列範例顯示網域 中儲存`my_repo`庫`ui`中範圍`@parity`和名稱為 npm 套件的 ARN`my_domain`。

```
arn:aws:codeartifact:region-id:111122223333:package/my_domain/my_repo/npm/parity/ui
```

沒有範圍之 npm 套件的 ARN 具有命名空間欄位的空白字串。例如，以下是網域 中儲存`my_repo`庫`react`中沒有範圍和名稱之套件的 ARN`my_domain`。

```
arn:aws:codeartifact:region-id:111122223333:package/my_domain/my_repo/npm//react
```

下列政策授予帳戶在 `my_repo`儲存庫`@parity/ui`中發佈 版本的`123456789012`許可。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "codeartifact:PublishPackageVersion"
            ],
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Resource": "arn:aws:codeartifact:us-east-1:111122223333:package/my_domain/my_repo/npm/parity/ui"
        }
    ]
}
```

------

**重要**  
若要授予發佈 Maven 和 NuGet 套件版本的許可，除了 之外，請新增下列許可`codeartifact:PublishPackageVersion`。  
NuGet： `codeartifact:ReadFromRepository` 並指定儲存庫資源
Maven： `codeartifact:PutPackageMetadata`

 由於此政策指定網域和儲存庫做為資源的一部分，因此只有在連接到該儲存庫時才允許發佈。

## 授予對儲存庫的寫入存取權
<a name="granting-write-access-to-a-repository"></a>

 您可以使用萬用字元來授予儲存庫中所有套件的寫入許可。例如，使用以下政策授予 帳戶寫入儲存`my_repo`庫中所有套件的許可。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "codeartifact:PublishPackageVersion"
            ],
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Resource": "arn:aws:codeartifact:us-east-1:111122223333:package/my_domain/my_repo/*"
        }
    ]
}
```

------

## 儲存庫與網域政策之間的互動
<a name="interaction-repo-domain-policies"></a>

 CodeArtifact 支援網域和儲存庫的資源政策。資源政策是選用的。每個網域可能有一個政策，而網域中的每個儲存庫可能都有自己的儲存庫政策。如果網域政策和儲存庫政策都存在，則在決定是否允許或拒絕對 CodeArtifact 儲存庫的請求時，會評估兩者。網域和儲存庫政策正在評估使用下列規則：
+ 執行 [ListDomains](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListDomains.html) 或 [ListRepositories](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListRepositories.html) 等帳戶層級操作時，不會評估資源政策。
+ 執行 [DescribeDomain](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_DescribeDomain.html) 或 [ListRepositoriesInDomain](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_ListRepositoriesInDomain.html) 等網域層級操作時，不會評估儲存庫政策。
+ 執行 [PutDomainPermissionsPolicy](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_PutDomainPermissionsPolicy.html) 時，不會評估網域政策。請注意，此規則可防止鎖定。
+ 執行 [PutRepositoryPermissionsPolicy](https://docs.aws.amazon.com/codeartifact/latest/APIReference/API_PutRepositoryPermissionsPolicy.html) 時會評估網域政策，但不會評估儲存庫政策。
+ 任何政策中的明確拒絕都會覆寫另一個政策中的允許。
+ 一個資源政策中只需要明確允許。如果網域政策允許動作，從儲存庫政策省略動作不會導致隱含拒絕。
+ 如果資源政策不允許 動作，則結果為隱含拒絕，除非呼叫主體的帳戶是網域擁有者或儲存庫管理員帳戶，且身分型政策允許 動作。

 資源政策在單一帳戶案例中用於授予存取權時為選用，其中用於存取儲存庫的發起人帳戶與網域擁有者和儲存庫管理員帳戶相同。在呼叫者帳戶與網域擁有者或儲存庫管理員帳戶不同的情況下，需要資源政策才能授予存取權。CodeArtifact 中的跨帳戶存取遵循跨帳戶存取的一般 IAM *規則，如 IAM 使用者指南*中的[判斷是否允許跨帳戶請求](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html#policy-eval-cross-account)中所述。
+ 網域擁有者帳戶中的主體可能會透過身分型政策獲得網域中任何儲存庫的存取權。請注意，在此情況下，網域或儲存庫政策不需要明確允許。
+ 網域擁有者帳戶中的主體可以透過網域或儲存庫政策授予對任何儲存庫的存取權。請注意，在此情況下，身分型政策不需要明確允許。
+ 儲存庫管理員帳戶中的主體可以透過身分型政策授予儲存庫的存取權。請注意，在此情況下，網域或儲存庫政策不需要明確允許。
+ 只有在至少一個資源政策和至少一個以身分為基礎的政策允許時，沒有政策明確拒絕動作時，才會授予另一個帳戶中的委託人存取權。