5

我在账户 A 中有一个具有管理员权限的 IAM 用户,并且arn:aws:iam::aws:policy/AWSCodeArtifactReadOnlyAccess附加了很好的措施。

来自账户 A 的 iam 用户的 arn 为arn:aws:iam::***:user/test-user

账户 B 有一个 CodeArtifact 存储库,其 arn 为arn:aws:codeartifact:***:***:domain/test-repo. 这个 repo 的资源策略是

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

运行 AWS CLI 命令时,我使用来自账户 A 的 IAM 用户的访问密钥。以下命令有效:

$ aws codeartifact get-repository-endpoint --domain test-repo --domain-owner *** --query repositoryEndpoint --output text --repository test --format pypi

结果是

https://test-repo-***.d.codeartifact.***.amazonaws.com/pypi/test/

这表明我的资源策略正在运行(将 翻转EffectDeny成功会使上述命令失败)。

但是,以下命令

$ aws codeartifact get-authorization-token --domain test-repo --domain-owner *** --query authorizationToken --output text

失败了

调用 GetAuthorizationToken 操作时发生错误 (AccessDeniedException):用户:arn:aws:iam::: user/test-user 无权执行:codeartifact:GetAuthorizationToken on resource:arn:aws:codeartifact:: ***:域/测试仓库

我相信我已经关注了这里的文档:

我想使用指定的委托人来完成此任务,并且不想承担任何角色,因为它会使我的 CI/CD 管道复杂化

4

2 回答 2

4

几天来我遇到了同样的问题,最后发现需要将策略应用于存储库和 codeartifact 域。

此示例使用基于组织的策略,但任何主体都应该有效,唯一重要的部分是sts:GetServiceBearerToken

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ContributorPolicy",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "codeartifact:*",
                "sts:GetServiceBearerToken"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "o-xxxxxxxxxx"
                }
            }
        }
    }
}
于 2022-01-04T16:01:07.297 回答
0

根据文档,您还需要"sts:GetServiceBearerToken"在访问策略中添加访问权限。

调用 GetAuthorizationToken API 需要 codeartifact:GetAuthorizationToken 和 sts:GetServiceBearerToken 权限。

其次,在您的用户权限中,在访问策略中明确提及 codeartifact 资源,就像您在资源策略中提及 IAM 用户一样。

例如

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "codeartifact:*"
            ],
            "Effect": "Allow",
            "Resource": "<insert cross account resource's ARN>"
        },
        {
            "Effect": "Allow",
            "Action": "sts:GetServiceBearerToken",
            "Resource": "<insert cross account resource's ARN>",
            "Condition": {
                "StringEquals": {
                    "sts:AWSServiceName": "codeartifact.amazonaws.com"
                }
            }
        }
    ]
}
于 2021-06-10T07:49:49.500 回答