1
1
import logging
2
+ from typing import Any
2
3
from typing import Dict
3
- from typing import List
4
4
5
5
import boto3
6
6
import neo4j
7
7
8
- from . util import get_botocore_config
8
+ from cartography . client . core . tx import load
9
9
from cartography .graph .job import GraphJob
10
- from cartography .models .aws .ec2 .keypairs import EC2KeyPairSchema
10
+ from cartography .intel .aws .ec2 .util import get_botocore_config
11
+ from cartography .models .aws .ec2 .keypair import EC2KeyPairSchema
11
12
from cartography .util import aws_handle_regions
12
13
from cartography .util import timeit
13
14
16
17
17
18
@timeit
18
19
@aws_handle_regions
19
- def get_ec2_key_pairs (boto3_session : boto3 .session .Session , region : str ) -> List [ Dict ]:
20
+ def get_ec2_key_pairs (boto3_session : boto3 .session .Session , region : str ) -> list [ dict [ str , Any ] ]:
20
21
client = boto3_session .client ('ec2' , region_name = region , config = get_botocore_config ())
21
22
return client .describe_key_pairs ()['KeyPairs' ]
22
23
23
24
25
+ def transform_ec2_key_pairs (
26
+ key_pairs : list [dict [str , Any ]],
27
+ region : str ,
28
+ current_aws_account_id : str ,
29
+ ) -> list [dict [str , Any ]]:
30
+ transformed_key_pairs = []
31
+ for key_pair in key_pairs :
32
+ key_name = key_pair ["KeyName" ]
33
+ transformed_key_pairs .append ({
34
+ 'KeyPairArn' : f'arn:aws:ec2:{ region } :{ current_aws_account_id } :key-pair/{ key_name } ' ,
35
+ 'KeyName' : key_name ,
36
+ 'KeyFingerprint' : key_pair .get ("KeyFingerprint" ),
37
+ })
38
+ return transformed_key_pairs
39
+
40
+
24
41
@timeit
25
42
def load_ec2_key_pairs (
26
- neo4j_session : neo4j .Session , data : List [Dict ], region : str , current_aws_account_id : str ,
27
- update_tag : int ,
43
+ neo4j_session : neo4j .Session ,
44
+ data : list [dict [str , Any ]],
45
+ region : str ,
46
+ current_aws_account_id : str ,
47
+ update_tag : int ,
28
48
) -> None :
29
- ingest_key_pair = """
30
- MERGE (keypair:KeyPair:EC2KeyPair{arn: $ARN, id: $ARN})
31
- ON CREATE SET keypair.firstseen = timestamp()
32
- SET keypair.keyname = $KeyName, keypair.keyfingerprint = $KeyFingerprint, keypair.region = $Region,
33
- keypair.lastupdated = $update_tag
34
- WITH keypair
35
- MATCH (aa:AWSAccount{id: $AWS_ACCOUNT_ID})
36
- MERGE (aa)-[r:RESOURCE]->(keypair)
37
- ON CREATE SET r.firstseen = timestamp()
38
- SET r.lastupdated = $update_tag
39
- """
40
-
41
- for key_pair in data :
42
- key_name = key_pair ["KeyName" ]
43
- key_fingerprint = key_pair .get ("KeyFingerprint" )
44
- key_pair_arn = f'arn:aws:ec2:{ region } :{ current_aws_account_id } :key-pair/{ key_name } '
45
-
46
- neo4j_session .run (
47
- ingest_key_pair ,
48
- ARN = key_pair_arn ,
49
- KeyName = key_name ,
50
- KeyFingerprint = key_fingerprint ,
51
- AWS_ACCOUNT_ID = current_aws_account_id ,
52
- Region = region ,
53
- update_tag = update_tag ,
54
- )
49
+ # Load EC2 keypairs as known by describe-key-pairs
50
+ logger .info (f"Loading { len (data )} EC2 keypairs for region '{ region } ' into graph." )
51
+ load (
52
+ neo4j_session ,
53
+ EC2KeyPairSchema (),
54
+ data ,
55
+ Region = region ,
56
+ AWS_ID = current_aws_account_id ,
57
+ lastupdated = update_tag ,
58
+ )
55
59
56
60
57
61
@timeit
@@ -61,11 +65,16 @@ def cleanup_ec2_key_pairs(neo4j_session: neo4j.Session, common_job_parameters: D
61
65
62
66
@timeit
63
67
def sync_ec2_key_pairs (
64
- neo4j_session : neo4j .Session , boto3_session : boto3 .session .Session , regions : List [str ], current_aws_account_id : str ,
65
- update_tag : int , common_job_parameters : Dict ,
68
+ neo4j_session : neo4j .Session ,
69
+ boto3_session : boto3 .session .Session ,
70
+ regions : list [str ],
71
+ current_aws_account_id : str ,
72
+ update_tag : int ,
73
+ common_job_parameters : dict [str , Any ],
66
74
) -> None :
67
75
for region in regions :
68
76
logger .info ("Syncing EC2 key pairs for region '%s' in account '%s'." , region , current_aws_account_id )
69
77
data = get_ec2_key_pairs (boto3_session , region )
70
- load_ec2_key_pairs (neo4j_session , data , region , current_aws_account_id , update_tag )
78
+ transformed_data = transform_ec2_key_pairs (data , region , current_aws_account_id )
79
+ load_ec2_key_pairs (neo4j_session , transformed_data , region , current_aws_account_id , update_tag )
71
80
cleanup_ec2_key_pairs (neo4j_session , common_job_parameters )
0 commit comments