- 공유 링크 만들기
- X
- 이메일
- 기타 앱
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
AWS IAM 권한 실수 방지 가이드 (백엔드 개발자를 위한)
안녕하세요! 오늘은 AWS IAM(Identity and Access Management) 권한을 안전하게 관리하는 방법에 대해 알아보겠습니다. 특히 백엔드 개발자들이 자주 실수하는 부분들을 중심으로 설명드리겠습니다.
1. IAM 기본 원칙
1.1 최소 권한 원칙
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::your-bucket/your-prefix/*"
}
]
}
1.2 권한 분리
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::read-only-bucket/*"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::write-only-bucket/*"
}
]
}
2. 자주 발생하는 실수와 해결법
2.1 과도한 권한 부여
# 나쁜 예시
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:*"],
"Resource": "*"
}
]
}
# 좋은 예시
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::your-bucket/your-prefix/*"
}
]
}
2.2 조건부 권한 미사용
# 나쁜 예시
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:PutObject"],
"Resource": "arn:aws:s3:::your-bucket/*"
}
]
}
# 좋은 예시
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:PutObject"],
"Resource": "arn:aws:s3:::your-bucket/*",
"Condition": {
"StringEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
}
}
]
}
3. 권한 관리 모범 사례
3.1 IAM 역할 생성
def create_iam_role():
iam = boto3.client('iam')
assume_role_policy = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
response = iam.create_role(
RoleName='EC2S3AccessRole',
AssumeRolePolicyDocument=json.dumps(assume_role_policy)
)
return response['Role']['Arn']
3.2 권한 정책 연결
def attach_policy_to_role():
iam = boto3.client('iam')
policy_document = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::your-bucket/*"
}
]
}
response = iam.create_policy(
PolicyName='S3AccessPolicy',
PolicyDocument=json.dumps(policy_document)
)
iam.attach_role_policy(
RoleName='EC2S3AccessRole',
PolicyArn=response['Policy']['Arn']
)
4. 권한 모니터링
4.1 CloudTrail 로깅 설정
def enable_cloudtrail():
cloudtrail = boto3.client('cloudtrail')
response = cloudtrail.create_trail(
Name='IAMActivityTrail',
S3BucketName='your-logging-bucket',
IncludeGlobalServiceEvents=True,
IsMultiRegionTrail=True
)
cloudtrail.start_logging(
Name='IAMActivityTrail'
)
return response['TrailARN']
4.2 IAM 액세스 분석기 설정
def enable_access_analyzer():
accessanalyzer = boto3.client('accessanalyzer')
response = accessanalyzer.create_analyzer(
analyzerName='IAMAnalyzer',
type='ACCOUNT'
)
return response['arn']
5. 권한 검토 및 정리
5.1 미사용 권한 검사
def check_unused_permissions():
iam = boto3.client('iam')
# 사용자 목록 가져오기
users = iam.list_users()['Users']
for user in users:
# 사용자의 정책 목록 가져오기
policies = iam.list_attached_user_policies(
UserName=user['UserName']
)['AttachedPolicies']
# 미사용 정책 확인
for policy in policies:
last_used = iam.get_policy_last_used(
PolicyArn=policy['PolicyArn']
)
if not last_used['LastUsed']:
print(f"Unused policy found: {policy['PolicyName']}")
5.2 권한 정리
def clean_up_permissions():
iam = boto3.client('iam')
# 사용자 목록 가져오기
users = iam.list_users()['Users']
for user in users:
# 사용자의 정책 목록 가져오기
policies = iam.list_attached_user_policies(
UserName=user['UserName']
)['AttachedPolicies']
# 미사용 정책 제거
for policy in policies:
last_used = iam.get_policy_last_used(
PolicyArn=policy['PolicyArn']
)
if not last_used['LastUsed']:
iam.detach_user_policy(
UserName=user['UserName'],
PolicyArn=policy['PolicyArn']
)
6. 보안 모범 사례
6.1 MFA 강제 설정
def enforce_mfa():
iam = boto3.client('iam')
mfa_policy = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
response = iam.create_policy(
PolicyName='MFAPolicy',
PolicyDocument=json.dumps(mfa_policy)
)
return response['Policy']['Arn']
6.2 비밀번호 정책 설정
def set_password_policy():
iam = boto3.client('iam')
iam.update_account_password_policy(
MinimumPasswordLength=12,
RequireSymbols=True,
RequireNumbers=True,
RequireUppercaseCharacters=True,
RequireLowercaseCharacters=True,
AllowUsersToChangePassword=True,
MaxPasswordAge=90,
PasswordReusePrevention=24,
HardExpiry=False
)
7. 권한 위임
7.1 권한 경계 설정
def set_permissions_boundary():
iam = boto3.client('iam')
boundary_policy = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::your-bucket/*"
}
]
}
response = iam.create_policy(
PolicyName='PermissionsBoundary',
PolicyDocument=json.dumps(boundary_policy)
)
return response['Policy']['Arn']
7.2 권한 위임 설정
def delegate_permissions():
iam = boto3.client('iam')
delegation_policy = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:CreateUser",
"iam:CreateAccessKey"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"iam:PermissionsBoundary": "arn:aws:iam::account-id:policy/PermissionsBoundary"
}
}
}
]
}
response = iam.create_policy(
PolicyName='DelegationPolicy',
PolicyDocument=json.dumps(delegation_policy)
)
return response['Policy']['Arn']
결론
AWS IAM 권한을 안전하게 관리하는 것은 클라우드 보안의 핵심입니다. 이 가이드에서 설명한 모범 사례를 따르면 권한 관련 실수를 방지하고, 더 안전한 AWS 환경을 구축할 수 있습니다. 추가적인 질문이나 궁금한 점이 있으시면 댓글로 남겨주세요!
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
댓글
댓글 쓰기