미사용 IAM 리소스 자동 정리 전략
1단계: IAM Access Analyzer를 통한 미사용 접근 식별
2026년 기준, 가장 강력한 도구는 IAM Access Analyzer의 '미사용 접근 분석(Unused access analysis)' 기능입니다.
기능: 조직(Organizations) 전체를 스캔하여 90일(또는 설정 기간) 동안 한 번도 사용되지 않은 IAM 사용자, 역할(Role), 액세스 키를 자동으로 찾아 리포트를 생성합니다.
장점: 개별 로그를 뒤질 필요 없이 대시보드에서 한눈에 '정리 대상'을 파악할 수 있습니다.
2단계: 자격 증명 보고서(Credential Report) 자동 추출
정밀한 자동화를 원하신다면 IAM Credential Report를 활용한 Lambda 스크립트 구성을 추천합니다.
로직: 1. Lambda가 매일 밤
GenerateCredentialReportAPI를 호출합니다.2. 생성된 CSV 파일에서
access_key_1_last_used_date또는user_creation_date를 체크합니다.3. 마지막 사용일이 90일이 넘은 항목을 리스트업합니다.
미사용 IAM 액세스 키 자동 비활성화 파이프라인EventBridge → Lambda → SNS로 이어지는 표준적인 서버리스 아키텍처를 따릅니다.Amazon EventBridge (Scheduler): 매일 새벽(예: 03:00)에 Lambda 함수를 실행합니다.AWS Lambda (Auditor): 모든 사용자의 자격 증명 보고서를 분석하여 90일 이상 미사용된 키를 식별합니다.Amazon SNS (Notificator): 조치 내역을 보안 담당자나 슬랙(Slack) 채널로 즉시 전송합니다.IAM (Action): 식별된 키의 상태를 Inactive로 변경합니다. |
import boto3
from datetime import datetime, timezone, timedelta
# 설정: 90일 이상 미사용 시 비활성화
MAX_AGE = 90
iam = boto3.client('iam')
sns = boto3.client('sns')
SNS_TOPIC_ARN = 'arn:aws:sns:region:account-id:YourTopicName'
def lambda_handler(event, context):
users = iam.list_users()['Users']
deactivated_keys = []
for user in users:
username = user['UserName']
access_keys = iam.list_access_keys(UserName=username)['AccessKeyMetadata']
for key in access_keys:
key_id = key['AccessKeyId']
# 마지막 사용 기록 확인
last_used = iam.get_access_key_last_used(AccessKeyId=key_id)
last_used_date = last_used['AccessKeyLastUsed'].get('LastUsedDate')
# 키가 사용된 적이 있거나, 생성된 지 얼마 안 된 경우 체크
if last_used_date:
age = (datetime.now(timezone.utc) - last_used_date).days
else:
# 사용된 적 없는 키는 생성일 기준으로 판단
age = (datetime.now(timezone.utc) - key['CreateDate']).days
if age >= MAX_AGE and key['Status'] == 'Active':
# 키 비활성화 조치
iam.update_access_key(UserName=username, AccessKeyId=key_id, Status='Inactive')
deactivated_keys.append(f"User: {username}, Key: {key_id}, Age: {age} days")
# 결과 통보
if deactivated_keys:
message = "미사용 IAM 키 자동 비활성화 보고:\n\n" + "\n".join(deactivated_keys)
sns.publish(TopicArn=SNS_TOPIC_ARN, Message=message, Subject="[AWS Security] IAM Key Deactivation Alert")
return {"status": "success", "deactivated": deactivated_keys}3단계: 단계적 조치 (Soft-Landing)
갑자기 삭제하면 운영 중인 서비스가 중단될 위험이 있습니다. 다음과 같은 3단계 프로세스를 자동화하세요.
알림 (D-7): Amazon SNS를 통해 해당 사용자(또는 관리자)에게 "7일 후 키가 비활성화될 예정"임을 메일/SNS(Slack)으로 알립니다.
비활성화 (D-Day): 키의 상태를
Inactive로 변경합니다. (이때 문제가 생기면 즉시Active로 되돌릴 수 있어 안전합니다.)삭제 (D+30): 비활성화 후 30일 동안 아무런 컴플레인이 없다면, 그때 영구 삭제합니다.
4단계: AWS Config를 통한 상시 감시
자동화 스크립트 외에도 AWS Config Rule을 활용해 규정을 강제할 수 있습니다.
iam-user-unused-credentials-check: 미사용 자격 증명을 가진 사용자를 실시간으로 찾아 '비준수(Non-compliant)' 상태로 표시합니다.
iam-access-key-max-age: 액세스 키의 수명이 일정 기간(예: 90일)을 넘으면 자동으로 알람을 울립니다.
수동 관리 vs 자동화 관리 비교
항목 | 수동 관리 (Manual) | 자동화 전략 (Automated) |
식별 속도 | 몇 시간 (로그 분석 필요) | 실시간/정기적 (자동 추출) |
실수 가능성 | 높음 (잘못 삭제할 위험) | 낮음 (조건 기반 로직 실행) |
운영 부담 | 계정이 늘어날수록 기하급수적 상승 | 계정 수와 무관하게 일정함 |
보안 수준 | 담당자의 부지런함에 의존 | 규정(Policy)에 의해 강제됨 |
댓글
댓글 0개
이 문서에는 댓글을 달 수 없습니다.