CA-17 로그보관기간설정
가이드라인 원문
| 항목 | 내용 |
|---|
| 항목코드 | CA-17 |
| 점검내용 | 클라우드 서비스 로그 보관 기간을 기관 정책에 맞게 보관 여부 점검 |
| 점검대상 | 클라우드 플랫폼 |
| 판단기준 | 양호: 클라우드 서비스 로그 보관 기간을 기관 정책에 맞게 수립된 경우 |
| 판단기준 | 취약: 클라우드 서비스 로그 보관 기간을 기관 정책에 맞게 수립되지 않은 경우 |
| 조치방법 | 클라우드 서비스 로그 보관 기간을 기관 정책에 맞게 수립 설정 |
상세 설명
1. 항목 개요
클라우드 환경에서 발생하는 다양한 로그(CloudTrail, CloudWatch Logs, VPC Flow Logs, Audit Logs 등)는 보안 사고 조사, 규정 준수, 시스템 최적화에 필수적입니다. 적절한 로그 보관 기간을 설정하지 않으면, 과거 사고의 원인을 분석할 수 없거나 법적 요구사항을 충족하지 못할 수 있습니다.
2. 왜 이 항목이 필요한가요?
보안 위협 및 규정 준수:
- 사고 조사: 침해사고 발생 시 공격 경로와 시점 분석
- 규정 준수: 적용 대상 법령·계약·기관별 정책의 정확한 보관 요건 확인
- 포렌식: 디지털 포렌식을 위한 증거 보존
- 비용 최적화: 불필요하게 긴 보관 기간은 스토리지 비용 증가
점검 시나리오(가상)
- 사고 조사에 필요한 기간보다 로그를 짧게 보관했다면 발생 경위를 추적할 자료가 부족할 수 있습니다.
- 기관에 실제로 적용되는 별도 보관 의무를 확인하지 않고 기본 보관 기간만 사용하면 감사 요건을 충족하지 못할 수 있습니다.
3. 점검 대상
- CloudWatch Logs
- CloudTrail Logs (S3에 저장)
- VPC Flow Logs
- RDS/Aurora Logs
- Azure Monitor Logs
- GCP Cloud Audit Logs
- Object Storage 로그
4. 판단 기준
| 구분 | 기준 |
|---|
| 양호 | 로그 보관 기간이 기관 정책 및 법적 요구사항에 맞게 설정된 경우 |
| 취약 | 로그 보관 기간이 설정되지 않거나 너무 짧은 경우 |
5. 점검 방법
Step 1: CloudWatch Logs 보관 기간 확인
1
2
3
4
5
6
7
8
| # AWS CLI 예시
# 모든 로그 그룹의 보관 기간 확인
aws logs describe-log-groups \
--query "logGroups[].{logGroupName:logGroupName,retentionInDays:retentionInDays}"
# 보관 기간이 설정되지 않은 로그 그룹 확인
aws logs describe-log-groups \
--query "logGroups[?retentionInDays==null].logGroupName"
|
Step 2: S3 버킷 라이프사이클 확인
1
2
3
4
5
6
7
8
9
| # S3 버킷 라이프사이클 정책 확인
aws s3api get-bucket-lifecycle-configuration --bucket my-logs-bucket
# 모든 로그 버킷의 라이프사이클 확인
for bucket in $(aws s3 ls | grep logs | awk '{print $3}'); do
echo "Bucket: $bucket"
aws s3api get-bucket-lifecycle-configuration --bucket $bucket 2>/dev/null || echo "No lifecycle policy"
echo "---"
done
|
Step 3: Azure Log Analytics 보관 정책 확인
1
2
3
4
5
6
7
8
9
10
| # Azure CLI 예시
# 작업 영역 보관 정책 확인
az monitor log-analytics workspace show \
--name myworkspace \
--resource-group myresourcegroup \
--query "retentionInDays"
# 모든 작업 영역 확인
az monitor log-analytics workspace list \
--query "[].{name:name,resourceGroup:resourceGroup,retention:retentionInDays}"
|
Step 4: GCP Logging 보관 정책 확인
1
2
3
4
5
6
| # GCP CLI 예시
# 로그 버킷 보관 정책 확인
gcloud logging buckets list
# 특정 로그 버킷의 보관 기간 확인
gcloud logging buckets describe _Default --location global
|
6. 조치 방법
Step 1: CloudWatch Logs 보관 기간 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 로그 그룹별 보관 기간 설정 (1년 = 365일)
aws logs put-retention-policy \
--log-group-name /aws/lambda/my-function \
--retention-in-days 365
# 보관 기간 옵션:
# 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, 3653
# 중요 로그는 장기 보관 (5년)
aws logs put-retention-policy \
--log-group-name /aws/rds/instance/mydb/slowquery \
--retention-in-days 1827
# 모든 로그 그룹에 보관 기간 설정
for loggroup in $(aws logs describe-log-groups --query "logGroups[].logGroupName" --output text); do
echo "Setting retention for $loggroup"
aws logs put-retention-policy \
--log-group-name "$loggroup" \
--retention-in-days 90
done
|
Step 2: S3 라이프사이클 정책 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| # S3 버킷 라이프사이클 정책 생성
cat > lifecycle-policy.json <<EOF
{
"Rules": [
{
"Id": "CloudTrailLogsLifecycle",
"Status": "Enabled",
"Prefix": "AWSLogs/",
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER"
},
{
"Days": 365,
"StorageClass": "DEEP_ARCHIVE"
}
],
"Expiration": {
"Days": 2555 # 7년
}
}
]
}
EOF
# 라이프사이클 정책 적용
aws s3api put-bucket-lifecycle-configuration \
--bucket my-cloudtrail-logs \
--lifecycle-configuration file://lifecycle-policy.json
|
Step 3: VPC Flow Logs 보관 기간 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| # VPC Flow Logs를 CloudWatch Logs로 전송 시 보관 기간 설정
aws logs put-retention-policy \
--log-group-name /aws/vpc/flowlogs/my-vpc \
--retention-in-days 90
# VPC Flow Logs를 S3로 전송 시 라이프사이클 정책 설정
cat > flow-lifecycle-policy.json <<EOF
{
"Rules": [
{
"Id": "FlowLogsLifecycle",
"Status": "Enabled",
"Prefix": "vpcflowlogs/",
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER_IR"
}
],
"Expiration": {
"Days": 365
}
}
]
}
EOF
aws s3api put-bucket-lifecycle-configuration \
--bucket my-flowlogs-bucket \
--lifecycle-configuration file://flow-lifecycle-policy.json
|
Step 4: Azure Log Analytics 보관 정책 설정
1
2
3
4
5
6
7
8
9
10
11
12
| # 기본 보관 정책 설정 (90일)
az monitor log-analytics workspace update \
--name myworkspace \
--resource-group myresourcegroup \
--retention-time 90
# 장기 보관 (2년 = 730일)
az monitor log-analytics workspace update \
--name myworkspace \
--resource-group myresourcegroup \
--retention-time 730 \
--max-retention-time 730
|
Step 5: GCP Cloud Logging 보관 정책 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 기본 로그 버킷 보관 기간 수정 (30일)
gcloud logging buckets update _Default \
--location global \
--retention-days 30
# 새로운 로그 버킷 생성 (1년 보관)
gcloud logging buckets create my-logs-bucket \
--location global \
--retention-days 365
# 로그 싱크를 사용한 장기 보관 (Cloud Storage)
gcloud logging sinks create my-archival-sink \
storage.googleapis.com/my-logs-archive \
--log-filter='logName="projects/my-project/logs/*"' \
--include-children
# Cloud Storage 버킷 라이프사이클 설정
gsutil lifecycle set lifecycle-config.json gs://my-logs-archive
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| // lifecycle-config.json
{
"lifecycle": {
"rule": [
{
"action": {
"type": "SetStorageClass",
"storageClass": "ARCHIVE"
},
"condition": {
"age": 90
}
},
{
"action": {
"type": "Delete"
},
"condition": {
"age": 2555
}
}
]
}
}
|
7. 로그 보관 기간 결정
로그별 최소·권장 기간은 법령의 적용 대상, 계약, 기관 정책 및 사고 조사에 필요한 범위에 따라 달라집니다. 모든 CloudTrail 로그를 일률적으로 7년, 보안 로그를 1년 보관해야 한다는 식의 근거 없는 공통 기간은 적용하지 마세요. 조사 목적과 비용을 고려해 로그 유형별로 승인된 정책을 만들고, 서비스 설정값을 그 정책과 대조합니다. 앞의 CLI 숫자는 환경별 설정 예시이며 법적 보관 의무가 아닙니다.
8. 비용 최적화 전략
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| ┌─────────────────────────────────────────────────────────────┐
│ 로그 라이프사이클 │
├─────────────────────────────────────────────────────────────┤
│ │
│ [Hot Data] [Warm Data] [Cold Data] [Delete] │
│ │
│ 0-30일 30-90일 90-365일 365일 이후 │
│ ↓ ↓ ↓ ↓ │
│ CloudWatch Standard_IA Glacier 삭제 │
│ Logs Deep Archive │
│ │
│ (빈번 액세스) (가끔 액세스) (거의 액세스 없음) │
│ │
└─────────────────────────────────────────────────────────────┘
|
9. 자동화된 로그 아카이빙
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| # Lambda 함수를 활용한 자동 로그 아카이빙
import boto3
import datetime
s3 = boto3.client('s3')
def lambda_handler(event, context):
# 90일 이상 된 로그를 Glacier로 이동
bucket = 'my-cloudtrail-logs'
prefix = 'AWSLogs/'
# S3 객체 목록 조회
objects = s3.list_objects_v2(Bucket=bucket, Prefix=prefix)
for obj in objects.get('Contents', []):
last_modified = obj['LastModified']
age_days = (datetime.datetime.now(datetime.timezone.utc) - last_modified).days
if age_days >= 90:
# Glacier로 전환
s3.restore-object(
Bucket=bucket,
Key=obj['Key'],
RestoreRequest={
'Days': 30,
'GlacierJobParameters': {'Tier': 'Standard'}
}
)
print(f"Restored {obj['Key']} from Glacier")
|
10. 조치 시 주의사항
| 주의사항 | 설명 |
|---|
| 법적 요구사항 | 개인정보보호법, 금융규정 등에 따른 최소 보관 기간 준수 |
| 스토리지 비용 | 장기 보관은 비용 증가, 비용 최적화 필요 |
| 로그 무결성 | WORM(Write Once Read Many) 스토리지 사용 권장 |
| 데이터 삭제 | 보관 기간 만료 후 즉시 삭제 여부 검토 |
| 조사 중인 로그 | 보관 기간 만료라도 조사 중인 로그는 보존 |
11. 참고 자료
요약
로그보관기간설정은 클라우드 보안 사고 조사와 규정 준수를 위한 필수 항목입니다. 적용 대상 법령·계약과 기관 정책에 요구된 로그 종류·보관 기간을 먼저 확인하고, S3 라이프사이클 및 CloudWatch Logs 보관 정책을 이에 맞춰 설정하세요. 아래의 예시 기간은 보편적인 법적 의무가 아닙니다.
핵심 액션 아이템
- CloudWatch Logs는 로그별 조사·준수 요건에 따라 보관 기간 설정
- S3 라이프사이클 정책으로 장기 보관 및 비용 최적화
- CloudTrail/감사 로그의 보관 기간은 기관별 적용 요건을 확인해 결정
- 로그 분류별 차등 보관 기간 설정
- 정기적 로그 보관 정책 검토