Skip to content

Commit 57e3278

Browse files
author
ievgeniia ieromenko
committed
updated kms policy
1 parent 158521e commit 57e3278

File tree

2 files changed

+84
-22
lines changed

2 files changed

+84
-22
lines changed

aws_sra_examples/solutions/genai/bedrock_guardrails/lambda/src/app.py

Lines changed: 83 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ def load_kms_key_policies() -> dict:
4747
# Global vars
4848
RESOURCE_TYPE: str = ""
4949
SOLUTION_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"
5053
GOVERNED_REGIONS = []
5154
ORGANIZATION_ID = ""
5255
SRA_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+
463544
def 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:

aws_sra_examples/solutions/genai/bedrock_guardrails/lambda/src/sra_kms_keys.json

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,7 @@
1111
},
1212
"Action": "kms:*",
1313
"Resource": "*"
14-
},
15-
{
16-
"Sid": "Allow IAM Role Full Access",
17-
"Effect": "Allow",
18-
"Principal": {
19-
"AWS": "arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"
20-
},
21-
"Action": [
22-
"kms:*"
23-
],
24-
"Resource": "*"
25-
}
14+
}
2615
]
2716
}
2817
}

0 commit comments

Comments
 (0)