繁体   English   中英

我们如何使用 Boto3 获取 IAM 服务上次访问的详细信息?

[英]How do we fetch IAM service last accessed details using Boto3?

以下是我在转换为 report\\csv 格式之前的代码

client=boto3.client('iam',aws_access_key_id='somedeclaredvariable',aws_secret_access_key='somedeclaredvariable')

users=client.list_users()

for x in users['Users']:

    response = client.generate_service_last_accessed_details(Arn=x['Arn'],Granularity='SERVICE_LEVEL')
    response1=client.get_service_last_accessed_details(JobId=response['JobId'])
    if(response1['JobStatus']!='IN_PROGRESS'):
        print(response1['ServicesLastAccessed'])

我得到的输出在 ServicesLastAccessed 列表中没有任何数据

它只是一个空列表: []

我在 AWS Lambda 中运行您的相同代码

import json
import boto3

def lambda_handler(event, context):
    # TODO implement
    client=boto3.client('iam')

    users=client.list_users()
    print(users)
    
    for x in users['Users']:
    
        response = client.generate_service_last_accessed_details(Arn=x['Arn'],Granularity='SERVICE_LEVEL')
        print(response)
        response1=client.get_service_last_accessed_details(JobId=response['JobId'])
        if(response1['JobStatus']!='IN_PROGRESS'):
            print(response1['ServicesLastAccessed'])

generate_service_last_accessed_details(**kwargs)

生成一份报告,其中包含有关上次尝试访问 AWS 服务时使用 IAM 资源(用户、组、角色或策略)的详细信息。 最近的活动通常会在四小时内出现。

我也没有得到GenerateServiceLastAccessedDetails结果。 但我尝试运行另一个使用相同用户角色的 Lambda。 这不是在这之后获得访问权限能够获得结果。

{'JobId': 'XXXXX', 'ResponseMetadata': {'RequestId': 'bac90379-dXXXXX', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': 'bac90XXXX', 'content-type': 'text/xml', 'content-length': '395', 'date': 'Thu, 15 Oct 2020 06:40:29 GMT'}, 'RetryAttempts': 0}}

明确表示get_service_last_accessed_details(**kwargs)检索使用GenerateServiceLastAccessedDetails操作创建的服务上次访问报告。 注意

  • 确保您拥有 IAM 角色的正确访问权限,该角色将获取用户详细信息
  • 它给最后四个小时的活动。 尝试立即访问然后运行此代码。

我发现您必须对 get_service_last_accessed_details(JobId=) 的结果进行轮询,直到您获得 COMPLETED 的 JobStatus。

我进行了一系列等待以涵盖快速响应案例和较慢的案例,例如。

for job_wait in (0.1, 0.1, 0.2, 0.4, 0.5, 1.0, 1.0):
  response = ...
  status = response.get('JobStatus', '')
  if status == 'COMPLETED':
  .... exit with result
  time.sleep(job_wait)
else:
  # loop completed without getting a result

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM