AWS CodeCommit 跨账户存储库访问不起作用

AWS CodeCommit cross-account respository access not working

我的账户中有一个 AWS IAM 用户(我们称它为 originAccount)可以访问另一个账户 (targetAccount),我正在尝试使用我的 Windows机.

我可以登录并将角色切换到 targetAccount 就好了,这就是我最初创建存储库的方式。除了计费之外,我拥有对 targetAccount 的完全访问权限。我的 IAM 用户确实启用了 MFA。我试过暂时关闭它,但没有用。但是,在关闭 MFA 的情况下,我可以 aws s3 ls 成功地完成 targetAccount 的错误。

SSH 和 HTTPS 都不起作用。作为测试,我 可以 使用静态凭据克隆它,但长期来看这是不可接受的。我很惊讶这些东西在 AWS 上的难度...

我在 originAccount 中的用户有这个政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:aws:iam::000000000000:role/Administrator"
            ]
        }
    ]
}

管理员角色可以访问所有内容。 targetAccount 具有此信任关系:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111111:user/MyUser"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
    }
  ]
}

我尝试移除 MFA 位;没有帮助。我什至在我的用户帐户上禁用了 MFA,但这也没有帮助。

我的 .aws\credentials 文件包含这些行:

[default]
aws_access_key_id = [originAccountKey]
aws_secret_access_key = [originAccountSecret]

[targetAccount]
aws_access_key_id = [originAccountKey]
aws_secret_access_key = [originAccountSecret]

我正在使用环境变量来设置要使用的配置文件,例如:

set AWS_DEFAULT_PROFILE=targetAccount

我的 .gitconfig 包含:

[credential "https://git-codecommit.us-east-1.amazonaws.com"]
    helper = !'C:\path\to\git-credential-AWSSV4.exe' --profile='targetAccount'
    UseHttpPath = true

最初是使用默认配置文件,但也没有用。

问题:

  1. 这可能吗?我做错了什么?
  2. SSH和HTTPS都可以跨账户访问吗?文档令人困惑,但似乎表明只有带有凭据助手的 HTTPS 才能工作(据称)。
  3. 这是否适用于多重身份验证?如果没有,是否可以仅为 CodeCommit 关闭它?

不幸的是 none 我找到的其他问题的答案对我有用...

我为 Windows 卸载并重新安装了 Git 只是为了确保没有安装它的凭据管理器(我不记得了),但它仍然不起作用,说repository '...' not found。不过,我可以通过 HTTPS 克隆 originAccount 中的存储库。

credential-helper 是使用临时会话凭据(例如从 AssumeRole 获取的凭据)对 CodeCommit 进行身份验证的唯一方法。 SSH 将无法工作,因为 SSH 身份验证是通过验证上传的 public 密钥完成的,这不是临时的。

我发现使用 AssumeRole 进行身份验证时,以下模式很容易遵循。在您的 .aws\credentials 文件中:

[profile target_account]
role_arn = arn:aws:iam::000000000000:role/Administrator
mfa_serial = arn:aws:iam::000000000000:mfa/MFA_DEVICE
source_profile = origin_account

[profile origin_account]
aws_access_key_id = [originAccountKey]
aws_secret_access_key = [originAccountSecret]

这将允许 AWS 客户端工具通过使用来自 origin_account 的 AssumeRole 从 target_account 获取临时会话凭证,有效地承担 target_account.[=16= 上的管理员角色]

您的 .gitconfig 应该指定 target_account 配置文件。

如果您正在使用 msysgit,您应该尝试升级到 Git Windows 2.x。 credential-helper 将发送 : 作为用户名和 AWS V4 签名作为密码。会话密钥通常很长,在 msysgit 中,curl 会将用户名截断为 256 个字符,其中不包括完整的会话密钥。

希望对您有所帮助!