1

Ich arbeite an einer Lambda-Funktion, die Ereignisse von CloudTrail bekommt und sie analysiert.Parsen CloudTrail Protokolle mit Python

Ich habe dieses Skript:

s3.download_file(bucket, key, download_path) 
     with gzip.open(download_path, "r") as f: 
      data = json.loads(f.read()) 
      print json.dumps(data) 
      for event in data['Records']: 
       if event['eventName'] in event_list: 
        dateEvent = datetime.strptime(event['eventTime'], "%Y-%m-%dT%H:%M:%SZ") 
        for element in event['userIdentity']: 
         for session in element[0]['sessionContext']: 
          username = session['userName'] 
          role = session['arn'] 

Ich kann nicht aus dem Ereignis den Wert von userName und der arn bekommen. Ich erhalte diesen Fehler:

string indices must be integers: TypeError 
Traceback (most recent call last): 
File "/var/task/lambda_function.py", line 34, in lambda_handler 
for session in element[0]['sessionContext']: 
TypeError: string indices must be integers 

Wie macht man das? Was ist der richtige Weg? Hier

ist die json string:

"userIdentity": { 
       "principalId": "aaaaaaaaaaaaaaaaaaaa", 
       "accessKeyId": "aaaaaaaaaaaaaaaaaaaaa", 
       "sessionContext": { 
        "sessionIssuer": { 
         "userName": "aaaaaaaaaaaaa", 
         "type": "Role", 
         "arn": "arn:aws:iam::aaaaaaaaaaaaaaaaaa:role/aaaaaaa", 
         "principalId": "aaaaaaaaaaaaaaaaaa", 
         "accountId": "aaaaaaaaaaaaaaaaaaa" 
        }, 
        "attributes": { 
         "creationDate": "2017-09-14T15:03:08Z", 
         "mfaAuthenticated": "false" 
       } 
      }, 
     "type": "AssumedRole", 
     "arn": "aaaaaaaaaaaaaaaaaaaaaaaa", 
     "accountId": "aaaaaaaaaaaaaaaaaa" 
    }, 
+0

was tun Sie, wenn Sie 'Sitzung' drucken? Bist du vielleicht auf dem falschen Level im JSON? –

+0

Entschuldigung, ich habe den Fehler falsch gelesen, könnten Sie 'Element' drucken? –

Antwort

2

Das userIdentity Element kann oder nicht sessionContext Element kann, weil diese nur existieren, wenn temporäre IAM Anmeldeinformationen während dieses Ereignisses verwendet wurden.

Ein userIdentity Element ohne sessionContext sieht wie folgt aus:

"userIdentity": { 
    "type": "IAMUser", 
    "principalId": "AIDAJ45Q7YFFAREXAMPLE", 
    "arn": "arn:aws:iam::123456789012:user/Alice", 
    "accountId": "123456789012", 
    "accessKeyId": "AKIAIOSFODNN7EXAMPLE", 
    "userName": "Alice" 
} 

Aber ein userIdentity mit einem sessionContext Element würde wie so aussehen:

"userIdentity": { 
    "type": "AssumedRole", 
    "principalId": "AROAIDPPEZS35WEXAMPLE:AssumedRoleSessionName", 
    "arn": "arn:aws:sts::123456789012:assumed-role/RoleToBeAssumed/MySessionName", 
    "accountId": "123456789012", 
    "accessKeyId": "AKIAIOSFODNN7EXAMPLE", 
    "sessionContext": { 
     "attributes": { 
     "creationDate": "20131102T010628Z", 
     "mfaAuthenticated": "false" 
     }, 
     "sessionIssuer": { 
     "type": "Role", 
     "principalId": "AROAIDPPEZS35WEXAMPLE", 
     "arn": "arn:aws:iam::123456789012:role/RoleToBeAssumed", 
     "accountId": "123456789012", 
     "userName": "RoleToBeAssumed" 
     } 
    } 
} 

... oder es könnte auch so aussehen wenn keine Rollenföderation aufgetreten ist.

"userIdentity": { 
    "type": "IAMUser", 
    "principalId": "EX_PRINCIPAL_ID", 
    "arn": "arn:aws:iam::123456789012:user/Alice", 
    "accountId": "123456789012", 
    "accessKeyId": "EXAMPLE_KEY_ID", 
    "userName": "Alice", 
    "sessionContext": {"attributes": { 
     "mfaAuthenticated": "false", 
     "creationDate": "2014-03-06T15:15:06Z" 
    }} 
} 

Also, um Ihren Code zurück:

for element in event['userIdentity']: 
    for session in element[0]['sessionContext']: 
     username = session['userName'] 
     role = session['arn'] 

element[0] nicht existiert, weil sessionContext keine Liste ist.

Wenn Sie den verwendeten oder vermuteten Benutzernamen und Rolle ARN holen wollen, würde ich denken, das würde funktionieren. Es berücksichtigt Ereignisse, die direkt über IAMUser oder über AssumedRole durchgeführt wurden.

user_identity = event['userIdentity'] 

# check to see if we have a sessionContext[sessionIssuer] 
if 'sessionIssuer' in user_identity.get('sessionContext', {}): 
    user_name = user_identity['sessionContext']['sessionIssuer']['userName'] 
    arn = user_identity['sessionContext']['sessionIssuer']['arn'] 
else: 
    user_name = user_identity['userName'] 
    arn = user_identity['arn'] 

Und als Teil Ihrer Verarbeitungsschleife:

for event in data['Records']: 
    if event['eventName'] in event_list: 
     dateEvent = datetime.strptime(event['eventTime'], "%Y-%m-%dT%H:%M:%SZ") 
     user_identity = event['userIdentity'] 

     # check to see if we have a sessionContext[sessionIssuer] 
     if 'sessionIssuer' in user_identity.get('sessionContext', {}): 
      user_name = user_identity['sessionContext']['sessionIssuer']['userName'] 
      arn = user_identity['sessionContext']['sessionIssuer']['arn'] 
     else: 
      user_name = user_identity['userName'] 
      arn = user_identity['arn']