【问题标题】:Find the owner of an AWS Access Key查找 AWS 访问密钥的所有者
【发布时间】:2014-07-24 13:58:39
【问题描述】:

我有一项服务,它使用 AWS 访问密钥将内容推送到 S3。我将停止服务,并且我拥有 AWS 访问密钥和秘密。但是,我在 IAM 或帐户的安全凭证中找不到此密钥。

有没有办法枚举整个 AWS 账户的所有访问密钥?

【问题讨论】:

  • 这个类似的答案可能会在未来帮助某人$ aws sts get-caller-identity { "UserId": "1234456789:john.doe", "Account": "1234456789", "Arn": "arn:aws:sts::1234456789:federated-user/john.doe" }

标签: security amazon-web-services


【解决方案1】:

您可以使用 AWS 命令​​行界面枚举特定账户的所有访问密钥。

步骤are shown here 附几个例子。

如果您没有指定 IAM 用户名并且使用您账户的主访问密钥来触发请求,它应该列出与您的 AWS 账户关联的所有用户名。

【讨论】:

    【解决方案2】:

    如果您无权访问您账户的主访问密钥,但您拥有一个对 IAM 具有足够访问权限的访问密钥,您可以枚举账户中的所有用户,然后列出每个用户的访问密钥。例如:

    for user in $(aws iam list-users --output text | awk '{print $NF}'); do
        aws iam list-access-keys --user $user --output text
    done
    

    【讨论】:

    • 太棒了。为我工作。获取用户列表的一个可能改进:$(aws iam list-users --query 'Users[*].UserName' --output text) 而不是通过管道传递到 awk 并希望用户名始终位于最后一列。
    • 其实你不需要运行多个命令。这是获取用户名的方法:aws iam get-access-key-last-used --access-key-id $AWS_ACCESS_KEY_ID --query 'UserName' --output text
    【解决方案3】:

    您可以使用find-iam-user-by-key 工具,即使您有多个帐户,也可以一键查找任何用户。它还会生成缓存,因此您无需每次运行时都等待aws iam ...

    输出示例:

    $ ./find_user_by_key BENEEP2THOOLAI8OOKOH
    ./database/default:ACCESSKEYMETADATA    BENEEP2THOOLAI8OOKOH    2014-09-11T23:22:53Z    Active  john.doe
    

    【讨论】:

      【解决方案4】:

      您可以通过以下命令列出所有访问密钥:

      aws iam list-access-keys
      

      然后您可以通过用户对其进行 grep。

      要仅列出一个键,请尝试(如果您有更多用户,请增加 100):

      while read meta key date status user; do
        echo $key;
      done < <(aws iam list-access-keys --output text --page-size 100)
      

      【讨论】:

      • list-access-keys 一次只返回一个用户(当前登录的用户或通过 --user 传入的名称)
      【解决方案5】:

      如果您只想找到访问密钥 ID 的所有者,更直接的技巧是使用带有密钥 ID 和密钥的 AWS CLI 来访问随机 AWS 服务。 AWS CLI 将引发访问被拒绝错误,其中包含访问密钥所有者信息的完整详细信息,如下所示:

      $ aws iam get-user
      
      
      An error occurred (AccessDenied) when calling the GetUser operation: 
      User: arn:aws:iam::xxxxxxx:user/xxxx is not authorized to perform: 
      iam:GetUser on resource: user xxxxx
      

      从错误消息中,您将获得帐户 ID、用户名。

      如果用户有权访问 IAM,您将获得该用户的完整详细信息,如下所示:

      {
          "User": {
              "Path": "/",
              "UserName": "xxx",
              "UserId": "xxx",
              "Arn": "arn:aws:iam::75xxx:user/xxx",
              "CreateDate": "2019-09-10T07:10:26+00:00",
              "PasswordLastUsed": "2020-05-26T07:51:50+00:00"
          }
      }
      

      更新

      AWS 提供的新命令是here

      $ aws sts get-caller-identity
      
      
      {
          "UserId": "AIDASYJLxxxxx",
          "Account": "18xxxxxxxxxx",
          "Arn": "arn:aws:iam::18xxxxxxxxx:user/xxxxxxx"
      }
      

      【讨论】:

        【解决方案6】:

        Web 控制台中的反向查找

        如果您没有耐心或信心来创建脚本,很容易错过您可以进行反向查找以至少找到拥有某个密钥的用户。我知道一个用户可以有多个键,但它会显着修剪搜索空间。

        https://console.aws.amazon.com/iam/home?region=us-east-1#/users

        【讨论】:

        • 似乎“按访问密钥搜索”部分在新的 IAM 控制台中已被弃用 =/
        【解决方案7】:

        我喜欢 Jonathan Kamens 的解决方案,但代码返回了所有密钥及其所有者的列表。

        我制作了一个 shell 脚本,用于通过 Access Key Id 获取用户名。看:

        #!/bin/bash
        
        # exit when the command fails
        set -o errexit;
        
        # exit when try to use undeclared var
        set -o nounset;
        
        accessKeyToSearch=${1?"Usage: bash $0 AccessKeyId"}
        
        for username in $(aws iam list-users --query 'Users[*].UserName' --output text); do
            for accessKeyId in $(aws iam list-access-keys --user-name $username --query 'AccessKeyMetadata[*].AccessKeyId' --output text); do
                if [ "$accessKeyToSearch" = "$accessKeyId" ]; then
                    echo $username;
                    break;
                fi;
            done;
        done;
        

        您还可以在我的 GitHub Gist 中查看脚本:https://gist.github.com/cauealvesbraz/1121c0a0375648db13b137b31ef8955d

        【讨论】:

          【解决方案8】:
          ❯ aws --profile my-aws-account iam get-user
          {
              "User": {
                  "Path": "/",
                  "UserName": "my-username",
                  "UserId": XXXXXX",
                  "Arn": "arn:aws:iam::000000000000:user/my-username",
                  "CreateDate": "2019-10-27T08:53:53Z"
              }
          }
          

          aws iam get-user --query 'User.Arn'

          【讨论】:

            【解决方案9】:

            要回答标题“查找 AWS 访问密钥的所有者”中提出的问题,请检查所有者,并因此检查密钥是否存在:

            aws iam get-access-key-last-used --access-key-id $AWS_ACCESS_KEY_ID --query 'UserName' --output text
            

            请注意,如果找到,它将返回零退出代码,否则返回非零。这是@dols3m 在对当前接受的答案的评论中建议的方法,更多详细信息在get-access-key-last-used 的文档中。

            要枚举帐户中的所有密钥,请执行以下操作:

            for user in $(aws iam list-users --query 'Users[*].UserName' --output text); do
              aws iam list-access-keys --user $user --query "AccessKeyMetadata[].AccessKeyId" --output text
            done
            

            有关更多信息,请参阅 list-userslist-access-keys 的文档。

            【讨论】:

            • 我宁愿将此答案作为已接受的答案,因为它回答“谁拥有此密钥?”而不是对用户执行 N+1 来检查他们是否碰巧拥有密钥。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-10
            • 2017-03-23
            • 2021-12-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多