本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
儲存庫政策
CodeArtifact 使用以資源為基礎的權限來控制存取。以資源為基礎的權限可讓您指定誰可存取儲存庫以及他們可以執行的動作。根據預設,只有儲存庫擁有者可存取儲存庫。您可以套用原則文件,讓其他IAM主參與者存取您的存放庫。
如需詳細資訊,請參閱以資源為基礎的原則和以身分識別為基礎的原則和以資源為基
建立資源策略以授與讀取存取權
資源策略是JSON格式的文本文件。檔案必須指定主參與者 (actor)、一或多個動作,以及效果 (Allow
或Deny
)。例如,下列資源策略會授與帳號從存放庫下載套件的123456789012
權限。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:ReadFromRepository" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
123456789012
:root" }, "Resource": "*" } ] }
因為只會針對其所附加儲存庫的作業評估原則,因此您不需要指定資源。由於資源是隱含的,所以您可以將設定Resource
為*
。為了讓套件管理員從此儲存庫下載套件,也需要建立跨帳戶存取的網域原則。網域原則必須至少授與主體的codeartifact:GetAuthorizationToken
權限。如需授與跨帳戶存取權的完整網域原則範例,請參閱此網域原則範例處。
注意
動codeartifact:ReadFromRepository
作只能在存放庫資源上使用。您無法將套件的 Amazon 資源名稱 (ARN) 做為資源,以允許讀取存放庫中套件子集的動作。codeartifact:ReadFromRepository
指定的主體可以讀取儲存庫中的所有套件,也可以不讀取其中一個套件。
由於存放庫中指定的唯一動作是ReadFromRepository
,帳戶中的使用者和角色1234567890
可以從存放庫下載套件。但是,他們無法對其執行其他動作 (例如,列出套件名稱和版本)。通常,除了從存放庫下載套件的使用者也需要ReadFromRepository
以其他方式與其互動之外,您還必須在下列原則中授與權限。
{ "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": "*" } ] }
設定策略
建立原則文件之後,請使用以下put-repository-permissions-policy
指令將其附加至儲存庫:
aws codeartifact put-repository-permissions-policy --domain
my_domain
--domain-owner111122223333
\ --repositorymy_repo
--policy-documentfile:///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 資源名稱 (ARN)、政策文件的完整內容以及修訂識別碼。您可以put-repository-permissions-policy
使用--policy-revision
選項將修訂識別元傳遞給。這可確保文件的已知修訂版本會被覆寫,而不是由其他作者設定的較新版本。
閱讀政策
使用get-repository-permissions-policy
指令讀取原則文件的現有版本。若要格式化輸出以提高可讀性,請使用--output
和與 Python json.tool
模組--query policy.document
一起使用。
aws codeartifact get-repository-permissions-policy --domain
my_domain
--domain-owner111122223333
\ --repositorymy_repo
--output text --query policy.document | python -m json.tool
輸出範例:
{ "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": "*" } ] }
刪除政策
使用delete-repository-permissions-policy
指令從儲存庫刪除原則。
aws codeartifact delete-repository-permissions-policy --domain
my_domain
--domain-owner111122223333
\ --repositorymy_repo
輸出的格式與get-repository-permissions-policy
命令的格式相同。
授與主參與者的讀取存取權
當您將帳號的 root 使用者指定為策略文件中的主參與者時,即授與該帳號中所有使用者和角色的存取權。若要限制對選取的使用者或角色的存取,請ARN在策略的Principal
區段中使用他們的。例如,使用下列指令將讀取存取權授予帳IAM戶bob
中的使用者123456789012
。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:ReadFromRepository" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
123456789012
:user/bob
" }, "Resource": "*" } ] }
授與封裝的寫入存取權
此codeartifact:PublishPackageVersion
動作可用來控制發佈新版封裝的權限。與此動作搭配使用的資源必須是封裝。 CodeArtifact 包的格ARNs式如下。
arn:aws:codeartifact:
region-id
:111122223333
:package/my_domain
/my_repo
/package-format
/package-namespace
/package-name
下面的例子顯示ARN了在域my_repo
存儲庫ui
中的範圍@parity
和名稱的 npm 包my_domain
。
arn:aws:codeartifact:
region-id
:111122223333
:package/my_domain
/my_repo
/npm
/parity
/ui
對ARN於沒有範圍的 npm 包具有命名空間字段的空字符串。例如,以下是ARN針對沒有範圍且在域中my_repo
存儲庫react
中具有名稱的軟件包my_domain
。
arn:aws:codeartifact:
region-id
:111122223333
:package/my_domain
/my_repo
/npm
//react
下列策略授與帳號123456789012
權限,以便在my_repo
存放庫@parity/ui
中發行版本。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:PublishPackageVersion" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
123456789012
:root" }, "Resource": "arn:aws:codeartifact:region-id
:111122223333
:package/my_domain
/my_repo
/npm
/parity
/ui
" } ] }
重要
要授予發布 Maven 和 NuGet 包版本的權限,除了添加以下權限codeartifact:PublishPackageVersion
。
NuGet:
codeartifact:ReadFromRepository
並指定儲存庫資源釋界:
codeartifact:PutPackageMetadata
由於此原則會將網域和存放庫指定為資源的一部分,因此只有在附加至該存放庫時才允許發行。
授與存放庫的寫入權限
您可以使用萬用字元來授與存放庫中所有套件的寫入權限。例如,使用下列原則授與帳號權限,以寫入my_repo
存放庫中所有套件。
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "codeartifact:PublishPackageVersion" ], "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
123456789012
:root" }, "Resource": "arn:aws:codeartifact:region-id
:111122223333
:package/my_domain
/my_repo
/*" } ] }
儲存庫與網域原則之間的互動
CodeArtifact 支援網域和儲存庫的資源策略。資源策略是可選的。每個域可能有一個策略,並且域中的每個存儲庫可能有自己的存儲庫策略。如果同時存在網域原則和存放庫原則,則會在判斷對 CodeArtifact 存放庫的要求是否允許或拒絕時評估兩者。網域和存放庫原則正在使用下列規則進行評估:
-
執行帳號層級作業 (例如或) 時,不會評估任何資源策略。ListDomainsListRepositories
-
執行網域層級作業 (例如DescribeDomain或 ListRepositoriesInDomain) 時,不會評估儲存區域原則。
-
執行時不會評估網域原則PutDomainPermissionsPolicy。請注意,此規則可防止鎖定。
-
執行時會評估網域原則 PutRepositoryPermissionsPolicy,但不會評估儲存庫原則。
-
任何策略中的明確拒絕會覆寫另一個策略中的允許。
-
只有一個資源策略需要明確允許。如果網域原則允許該動作,省略儲存庫原則中的動作將不會導致隱含拒絕。
-
如果沒有資源策略允許採取動作,則結果為隱含拒絕,除非呼叫主體的帳戶是網域擁有者或存放庫管理員帳戶,且以身分識別為基礎的策略允許執行動作。
當用於在單一帳戶案例中授與存取權時,資源原則是選用的,其中用於存取存放庫的來電者帳戶與網域擁有者和存放庫管理員帳戶相同。在跨帳戶案例中,呼叫者的帳戶與網域擁有者或存放庫管理員帳戶不同時,需要資源原則才能授與存取權。中的跨帳戶存取 CodeArtifact 遵循跨帳戶存取的一般IAM規則,如《使用者指南》中確定是否允許跨帳戶請求中所述。IAM
-
網域擁有者帳戶中的主體可以透過以身分識別為基礎的原則,授與網域中任何存放庫的存取權。請注意,在此情況下,網域或存放庫原則不需要明確允許。
-
網域擁有者帳戶中的主體可以透過網域或存放庫原則授與任何存放庫的存取權。請注意,在這種情況下,以身分為基礎的策略不需要明確允許。
-
存放庫管理員帳戶中的主參與者可透過以識別為基礎的原則授與存放庫的存取權。請注意,在此情況下,網域或存放庫原則不需要明確允許。
-
只有在至少一個資源策略和至少一個以身分識別為基礎的策略允許時,才會授與另一個帳號中的主體存取權,而沒有任何政策明確拒絕動作。