AWS CodeCommit跨帐户存储库访问无效

时间:2017-02-18 20:31:05

标签: amazon-web-services amazon-iam aws-codecommit

我的帐户中有一个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关闭吗?
  4. 不幸的是,我找到的其他问题没有一个对我有用的答案......

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

1 个答案:

答案 0 :(得分:2)

凭证帮助程序是使用临时会话凭证(如从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获取临时会话凭据,从而有效地承担Administrator对target_account的角色。

您的.gitconfig应指定target_account个人资料。

如果您使用的是msysgit,则应尝试升级到适用于Windows 2.x的Git。凭证助手将发送:作为用户名和AWS V4签名作为密码。会话密钥通常很长,在msysgit中,curl会将用户名截断为256个字符,不包括完整的会话密钥。

我希望这有帮助!