1

我的账户中有一个 AWS IAM 用户(我们称之为 originAccount),该用户可以访问另一个账户(targetAccount),我正在尝试使用我的 Windows 机器上的 originAccount 凭证克隆存在于 targetAccount 中的 CodeCommit 存储库。

我可以登录并将角色切换到 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 关闭?

不幸的是,我发现的其他问题都没有对我有用的答案......

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

4

1 回答 1

2

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

我发现以下模式很容易使用 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 上的管理员角色。

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

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

我希望这有帮助!

于 2017-02-19T01:31:47.880 回答