簡體   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