对 CodeArtifact 存储库的跨帐户访问

brn*_*o32 10 amazon-web-services amazon-iam aws-codeartifact

我在账户 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。该仓库的资源政策为

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::***:user/test-user"
            },
            "Action": "codeartifact:*",
            "Resource": "*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

$ aws codeartifact get-repository-endpoint --domain test-repo --domain-owner *** --query repositoryEndpoint --output text --repository test --format pypi
Run Code Online (Sandbox Code Playgroud)

结果是

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

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

但是,以下命令

$ aws codeartifact get-authorization-token --domain test-repo --domain-owner *** --query authorizationToken --output text
Run Code Online (Sandbox Code Playgroud)

失败了

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

我相信我已经遵循了这里的文档:

我想通过指定的主体来完成此任务,并且不想承担角色,因为这会使我的 CI/CD 管道变得复杂

Ami*_*min 9

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

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

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ContributorPolicy",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "codeartifact:*",
                "sts:GetServiceBearerToken"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalOrgID": "o-xxxxxxxxxx"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


use*_*042 6

我们必须做一些事情:

  1. 使用 CodeArtifact 的 AWS 账户:(域级别)> 编辑/创建策略
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<OTHER_AWS_ACCCOUNT_ID>:root"
            },
            "Action": "codeartifact:GetAuthorizationToken",
            "Resource": "*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)
  1. 具有 CodeArtifact 的 AWS 账户:(存储库级别)> 编辑/创建策略
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<OTHER_AWS_ACCCOUNT_ID>:root"
            },
            "Action": [
                "codeartifact:GetRepositoryEndpoint",
                "codeartifact:ReadFromRepository"
            ],
            "Resource": "arn:aws:codeartifact:*:<CURRENT_AWS_ACCCOUNT_ID>:repository/<REPOSITORY_NAME>/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)
  1. 具有 Amplify 应用程序的 AWS 账户:(与上述 1 和 2 不同的账户)常规 > 服务角色 > 编辑/创建服务角色
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "codeartifact:GetAuthorizationToken",
                "codeartifact:GetRepositoryEndpoint",
                "codeartifact:ReadFromRepository",
                "sts:GetServiceBearerToken"
            ],
            "Resource": "*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

这解决了我们跨帐户 NPM 包运行 Angular 应用程序的问题。