Security 查找AWS访问密钥的所有者

Security 查找AWS访问密钥的所有者,security,amazon-web-services,Security,Amazon Web Services,我有一个服务,它使用AWS访问密钥将内容推送到S3。我要去日落服务,我有AWS的访问密钥和密码。但是,我在IAM或帐户的安全凭据中找不到此密钥 是否有方法枚举整个AWS帐户的所有访问密钥?您可以使用AWS命令行界面枚举特定帐户的所有访问密钥 这些步骤有几个例子 如果您没有指定IAM用户名,并且正在使用帐户的主访问密钥触发请求,则应列出与AWS帐户关联的所有用户。如果您没有访问帐户的主访问密钥的权限,但您确实拥有对IAM具有足够访问权限的访问密钥,您可以枚举帐户中的所有用户,然后列出每个用户的访问

我有一个服务,它使用AWS访问密钥将内容推送到S3。我要去日落服务,我有AWS的访问密钥和密码。但是,我在IAM或帐户的安全凭据中找不到此密钥


是否有方法枚举整个AWS帐户的所有访问密钥?

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

这些步骤有几个例子


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

如果您没有访问帐户的主访问密钥的权限,但您确实拥有对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…

输出示例:

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

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

aws iam list-access-keys
然后,您可以由用户对其进行grep

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

读取元键日期状态用户时;做
echo$key;

done<如果您只想找到访问密钥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提供的新命令是:

web控制台中的反向查找 如果您没有耐心或信心创建脚本,那么很容易忽略您可以进行反向查找,至少可以找到拥有某个密钥的用户。我知道一个用户可以有多个键,但这会大大减少搜索空间


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

我制作了一个shell脚本,用于通过访问密钥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;
您还可以在my GitHub Gist中看到脚本:


aws iam get user——查询“user.Arn”

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

aws iam get-access-key-last-used --access-key-id $AWS_ACCESS_KEY_ID --query 'UserName' --output text
请注意,如果找到,它将返回零的退出代码,如果没有,则返回非零的退出代码。这是@dols3m在对当前公认答案的评论中提出的方法,更多详细信息请参阅文档

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

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

有关更多信息,请参阅文档。

太好了。为我工作。获取用户列表的一个可能的改进是:
$(aws iam list users——查询“users[*].UserName”——输出文本)
,而不是通过管道发送到
awk
,希望用户名始终位于最后一列。实际上,您不需要运行多个命令。这是获取用户名的方法:
aws iam获取上次使用的访问密钥--access key id$aws_access_key_id--query'username'--输出文本。
“arn:aws:sts::1234456789:federated user/john.doe”}
❯ 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-access-key-last-used --access-key-id $AWS_ACCESS_KEY_ID --query 'UserName' --output text
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