Loading
Loading
IAM (Identity and Access Management) is AWS's system for full permission control.
Grant only the minimum necessary permissions. Avoid AdministratorAccess except when absolutely necessary.
Each Policy contains Effect (Allow or Deny), a list of Actions, and a list of Resources.
import json
from dataclasses import dataclass, field
from typing import List, Dict
# āāā Data Classes āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
@dataclass
class IAMPolicy:
name: str
effect: str # "Allow" أ٠"Deny"
actions: List[str]
resources: List[str]
def to_document(self) -> dict:
return {
"Version": "2012-10-17",
"Statement": [{
"Effect": self.effect,
"Action": self.actions,
"Resource": self.resources,
}]
}
@dataclass
class IAMUser:
username: str
groups: List[str] = field(default_factory=list)
policies: List[str] = field(default_factory=list)
def attach_policy(self, name: str):
self.policies.append(name)
@dataclass
class IAMRole:
name: str
trusted_service: str
policies: List[str] = field(default_factory=list)
def get_trust_policy(self) -> dict:
return {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": self.trusted_service},
"Action": "sts:AssumeRole",
}]
}
# āāā IAM Manager āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
class IAMManager:
def __init__(self):
self.policies: Dict[str, IAMPolicy] = {}
self.users: Dict[str, IAMUser] = {}
self.roles: Dict[str, IAMRole] = {}
def create_policy(self, name, effect, actions, resources) -> IAMPolicy:
p = IAMPolicy(name, effect, actions, resources)
self.policies[name] = p
print(f" š Policy: {name}")
return p
def create_user(self, username) -> IAMUser:
u = IAMUser(username)
self.users[username] = u
print(f" š¤ User : {username}")
return u
def create_role(self, name, trusted_service) -> IAMRole:
r = IAMRole(name, trusted_service)
self.roles[name] = r
print(f" š Role : {name} ā {trusted_service}")
return r
def audit_report(self):
print(f"\nš ŲŖŁŲ±ŁŲ± IAM:")
print(f" Policies : {len(self.policies)}")
print(f" Users : {len(self.users)}")
print(f" Roles : {len(self.roles)}")
print(f"\nš„ Ų§ŁŁ
Ų³ŲŖŲ®ŲÆŁ
ŁŁ:")
for name, u in self.users.items():
print(f" ⢠{name}: {len(u.policies)} policies")
print(f"\nš Ų§ŁŲ£ŲÆŁŲ§Ų±:")
for name, r in self.roles.items():
print(f" ⢠{name} ā {r.trusted_service}")
# āāā ŲŖŁŁŲ¦Ų© IAM āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
iam = IAMManager()
print("š Ų„ŁŲ“Ų§Ų” Ł
ŁŲ§Ų±ŲÆ IAM:")
# Policies
iam.create_policy(
"BedrockInvoke", "Allow",
["bedrock:InvokeModel", "bedrock:ListFoundationModels"],
["arn:aws:bedrock:*::foundation-model/*"],
)
iam.create_policy(
"S3MLData", "Allow",
["s3:GetObject", "s3:PutObject", "s3:ListBucket"],
["arn:aws:s3:::ml-data-*", "arn:aws:s3:::ml-data-*/*"],
)
iam.create_policy(
"CloudWatchLogs", "Allow",
["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"],
["arn:aws:logs:*:*:*"],
)
# User ŁŁŁ
Ų·ŁŁŲ±
dev = iam.create_user("ai-developer")
dev.attach_policy("BedrockInvoke")
dev.attach_policy("S3MLData")
# Role ŁŁŁ Lambda
lambda_role = iam.create_role("LambdaAIRole", "lambda.amazonaws.com")
lambda_role.policies = ["BedrockInvoke", "S3MLData", "CloudWatchLogs"]
# Trust Policy
print(f"\nš Trust Policy ŁŁ Lambda Role:")
print(json.dumps(lambda_role.get_trust_policy(), indent=2, ensure_ascii=False))
# ŲŖŁŲ±ŁŲ±
iam.audit_report()
# ŁŲµŲ§Ų¦Ų Ų§ŁŲ£Ł
Ų§Ł
print(f"\nš Ł
ŲØŲ§ŲÆŲ¦ IAM Ų§ŁŲ£Ų³Ų§Ų³ŁŲ©:")
tips = [
"Ų§Ų³ŲŖŲ®ŲÆŁ
Roles ŁŁŁ Services ā Ł
ŁŲ§ŲŖŁŲ Ł
Ų¤ŁŲŖŲ© Ų£ŁŲ«Ų± Ų£Ł
Ų§ŁŲ§Ł",
"ŁŲ§ ŲŖŲ³ŲŖŲ®ŲÆŁ
Root Account ŁŁŲØŲ±Ł
Ų¬Ų© Ų£ŲØŲÆŲ§Ł",
"ŁŲ¹ŁŁ MFA ŁŲ¬Ł
ŁŲ¹ Ų§ŁŁ
Ų³ŲŖŲ®ŲÆŁ
ŁŁ",
"Ų±Ų§Ų¬Ų¹ Ų§ŁŲµŁŲ§ŲŁŲ§ŲŖ ŁŁ 90 ŁŁŁ
Ų§Ł",
"Ų§Ų³ŲŖŲ®ŲÆŁ
IAM Access Analyzer ŁŁŁŲ“٠ع٠اŁŲ«ŲŗŲ±Ų§ŲŖ",
]
for t in tips:
print(f" ā
{t}")