@@ -47,6 +47,9 @@ def load_kms_key_policies() -> dict:
4747# Global vars
4848RESOURCE_TYPE : str = ""
4949SOLUTION_NAME : str = "sra-bedrock-guardrails"
50+ BEDROCK_ORG_SOLUTION_NAME = "sra-bedrock-org"
51+ GUARDRAIL_RULE_NAME = "sra-bedrock-check-guardrails"
52+ ENCRYPTION_RULE_NAME = "sra-bedrock-check-guardrail-encryption"
5053GOVERNED_REGIONS = []
5154ORGANIZATION_ID = ""
5255SRA_ALARM_TOPIC_ARN : str = ""
@@ -460,6 +463,84 @@ def update_state_table_record(record_id: str, update_data: dict) -> None:
460463 return
461464
462465
466+ def check_bedrock_org_config_rules (component_name : str , account : str , region : str ) -> bool :
467+ """Check if sra-bedrock-org solution Bedrock Guardrail config rules are deployed.
468+
469+ Args:
470+ component_name: component name
471+ account: AWS account id
472+ region: AWS region
473+
474+ Returns:
475+ True or False
476+ """
477+ LOGGER .info ("Checking if Bedrock org config rules are enabled..." )
478+ item_found , _ = dynamodb .find_item (
479+ STATE_TABLE ,
480+ BEDROCK_ORG_SOLUTION_NAME ,
481+ {
482+ "component_name" : component_name ,
483+ "account" : account ,
484+ "component_region" : region ,
485+ },
486+ )
487+ return item_found
488+
489+
490+ def build_role_arns (acct : str , region : str ) -> list :
491+ """Build list of role ARNs based on enabled sra-bedrock-org solution config rules.
492+
493+ Args:
494+ acct: AWS account id
495+ region: AWS region
496+
497+ Returns:
498+ List of role arns or empty list
499+ """
500+ role_arns = []
501+
502+ config_rules = [GUARDRAIL_RULE_NAME , ENCRYPTION_RULE_NAME ]
503+
504+ for rule in config_rules :
505+ if check_bedrock_org_config_rules (rule , acct , region ):
506+ role_arn = f"arn:{ sts .PARTITION } :iam::{ acct } :role/{ rule } "
507+ role_arns .append (role_arn )
508+
509+ return role_arns
510+
511+
512+ def update_kms_key_policy (acct : str , region : str ) -> dict :
513+ """Update KMS key policy.
514+
515+ Args:
516+ acct: AWS account id
517+ region: AWS region
518+
519+ Returns:
520+ dict: KMS key policy
521+ """
522+ LOGGER .info ("Customizing key policy..." )
523+ kms_key_policy = json .loads (json .dumps (KMS_KEY_POLICIES [GUARDRAILS_KEY_ALIAS ]))
524+ LOGGER .info (f"kms_key_policy: { kms_key_policy } " )
525+ kms_key_policy ["Statement" ][0 ]["Principal" ]["AWS" ] = KMS_KEY_POLICIES [GUARDRAILS_KEY_ALIAS ]["Statement" ][0 ]["Principal" ][ # noqa ECE001
526+ "AWS"
527+ ].replace ("ACCOUNT_ID" , acct )
528+ principal_arns = build_role_arns (acct , region )
529+ if principal_arns != []:
530+ if len (kms_key_policy ["Statement" ]) < 2 :
531+ kms_key_policy ["Statement" ].append ({})
532+ kms_key_policy ["Statement" ][1 ] = {
533+ "Principal" : {"AWS" : principal_arns },
534+ "Sid" : "Allow IAM Role Access" ,
535+ "Effect" : "Allow" ,
536+ "Action" : "kms:Decrypt" ,
537+ "Resource" : "*" ,
538+ }
539+
540+ LOGGER .info (f"Customizing key policy...done: { kms_key_policy } " )
541+ return kms_key_policy
542+
543+
463544def create_kms_key (acct : str , region : str ) -> None :
464545 """Create a KMS key for the solution.
465546
@@ -472,24 +553,16 @@ def create_kms_key(acct: str, region: str) -> None:
472553 global LIVE_RUN_DATA
473554 global CFN_RESPONSE_DATA
474555 lambdas .LAMBDA_CLIENT = sts .assume_role (sts .MANAGEMENT_ACCOUNT , sts .CONFIGURATION_ROLE , "lambda" , sts .HOME_REGION )
475- execution_role_arn = lambdas .get_lambda_execution_role (os .environ ["AWS_LAMBDA_FUNCTION_NAME" ])
476- # Deploy KMS keys
477556
557+ # Deploy KMS keys
478558 kms .KMS_CLIENT = sts .assume_role (acct , sts .CONFIGURATION_ROLE , "kms" , region )
479559 search_bedrock_guardrails_kms_key , _ , bedrock_guardrails_key_id , _ = kms .check_alias_exists (kms .KMS_CLIENT , f"alias/{ GUARDRAILS_KEY_ALIAS } " )
480560 if search_bedrock_guardrails_kms_key is False :
481561 LOGGER .info (f"alias/{ GUARDRAILS_KEY_ALIAS } not found." )
482562 if DRY_RUN is False :
483563 LOGGER .info ("Creating SRA Bedrock guardrails KMS key" )
484564 LOGGER .info ("Customizing key policy..." )
485- kms_key_policy = json .loads (json .dumps (KMS_KEY_POLICIES [GUARDRAILS_KEY_ALIAS ]))
486- LOGGER .info (f"kms_key_policy: { kms_key_policy } " )
487- kms_key_policy ["Statement" ][0 ]["Principal" ]["AWS" ] = KMS_KEY_POLICIES [GUARDRAILS_KEY_ALIAS ]["Statement" ][0 ]["Principal" ][ # noqa ECE001
488- "AWS"
489- ].replace ("ACCOUNT_ID" , acct )
490-
491- kms_key_policy ["Statement" ][1 ]["Principal" ]["AWS" ] = execution_role_arn
492- LOGGER .info (f"Customizing key policy...done: { kms_key_policy } " )
565+ kms_key_policy = update_kms_key_policy (acct , region )
493566 LOGGER .info ("Searching for existing keys with proper policy..." )
494567 kms_search_result , kms_found_id = kms .search_key_policies (kms .KMS_CLIENT , json .dumps (kms_key_policy ))
495568 if kms_search_result is True :
0 commit comments