데이터베이스 보안 구현 가이드
📋 목차
1. 개요
1.1 목적
플랫폼 보안 요구사항에 따른 데이터베이스 보안 구현을 정의하고, 보안 위험을 최소화하는 방법을 제시합니다.
1.2 보안 원칙
- 최소 권한 원칙: 필요한 최소한의 권한만 부여
- 세션 관리: 유휴 세션 자동 종료로 보안 위험 차단
- 접근 제어: 네트워크 및 애플리케이션 레벨 접근 통제
- 감사 추적: 모든 중요 작업에 대한 로깅 및 모니터링
2. DB 세션 보안 관리
2.1 PLT-NFR-014 요구사항 구현
데이터베이스 연결은 적절한 세션 타임아웃을 설정하여 리소스 누수를 방지하고 보안 위험을 차단해야 한다.
🔒 보안 위험 요소
- 방치된 세션: 개발자가 로그아웃하지 않고 자리를 비운 경우
- 좀비 연결: 네트워크 문제로 정상 종료되지 않은 연결
- 악의적 접근: 권한이 있는 세션을 악용한 무단 접근
- 리소스 고갈: 세션 누적으로 인한 시스템 가용성 저하
✅ 구현 현황
Cloud SQL 세션 타임아웃 설정
위치: infrastructure/terragrunt/dev/cloudsql/terragrunt.hcl
# 데이터베이스 플래그
database_flags = {
"max_connections" = "100"
"log_min_duration_statement" = "1000" # 1초 이상 쿼리 로깅
"idle_in_transaction_session_timeout" = "1800000" # 30분 (1800초 * 1000ms)
}
🛡️ 보안 효과
- 🔒 무단 접근 방지: 30분 이상 방치된 세션 자동 종료
- 🚫 락 방지: 장시간 열린 트랜잭션으로 인한 시스템 마비 방지
- ⚡ 가용성 보장: 불필요한 연결 정리로 시스템 안정성 확보
- 🔍 감사 추적: 세션 종료 로그를 통한 접근 패턴 분석
🔧 환경별 보안 정책
| 환경 | 타임아웃 값 | 보안 수준 | 설명 |
|---|---|---|---|
| 개발(dev) | 30분 (1800초) | 보통 | 개발 및 디버깅 작업 고려, 적절한 보안 유지 |
| 스테이징(stage) | 20분 (1200초) | 높음 | 프로덕션 유사 환경, 강화된 보안 정책 |
| 프로덕션(prod) | 15분 (900초) | 최고 | 엄격한 보안 관리, 최소 노출 시간 |
2.2 PLT-CR-006 제약사항 준수
데이터베이스 세션 타임아웃 설정은 IaC(Infrastructure as Code)로 관리되어야 하며, 환경별로 적절한 값이 설정되어야 한다.
✅ IaC 관리 현황
- Terragrunt 구성: 환경별 설정 파일로 관리
- 버전 관리: Git을 통한 변경 이력 추적
- 승인 프로세스: Pull Request를 통한 변경 승인
- 자동 배포: CI/CD 파이프라인을 통한 안전한 배포
3. 접근 제어
3.1 네트워크 보안
VPC 및 방화벽 설정
# 네트워크 접근 제어
public_ip_enabled = true
private_network = "projects/${local.project}/global/networks/dta-cloud-de-dev-vpc"
require_ssl = true
보안 그룹 설정
- 화이트리스트: 허용된 IP 대역만 접근 가능
- SSL/TLS 필수: 모든 DB 연결에 암호화 적용
- 포트 제한: 표준 PostgreSQL 포트(5432) 외 접근 차단
3.2 인증 및 권한 관리
사용자 계정 보안
# 보안 강화된 사용자 생성
create_default_user = true
default_user_name = "admin"
default_user_password = "StrongP@ssw0rd123" # 복잡한 비밀번호 정책 적용
postgres_password = "PostGr3sP@ss123" # postgres 관리자 계정 보안
데이터베이스 사용자 암호 정책 (ISO 27001 준수)
🔐 PLT-SEC-007: 데이터베이스 암호 표준
목적: ISO 27001 A.9.4.3 패스워드 관리 시스템 요구사항 준수
암호 복잡성 요구사항:
- 최소 길이: 16자 이상
- 문자 조합: 영문 대문자(A-Z), 소문자(a-z), 숫자(0-9), 특수문자(!@#$%^&*) 모두 포함
- 엔트로피: 최소 80비트 이상의 암호학적 강도
- 패턴 금지: 연속된 문자, 반복 문자, 사전 단어, 개인정보 기반 암호 금지
암호 생성 방법:
# 안전한 랜덤 암호 생성 (16자, 높은 엔트로피)
openssl rand -base64 12 | tr -d "=+/" | cut -c1-16
# 또는 더 강한 20자 암호
openssl rand -base64 30 | tr -d "=+/" | cut -c1-20 | sed 's/[Il10O]//g'
암호 관리 정책:
- 변경 주기: 90일마다 필수 변경 (프로덕션), 180일(개발/스테이징)
- 재사용 금지: 최근 10개 암호 재사용 불가
- 저장 방식: Secret Manager에 해시값으로 암호화 저장
- 접근 제어: IAM 기반 최소 권한 원칙 적용
환경별 보안 강도:
| 환경 | 암호 길이 | 변경 주기 | 접근 제어 |
|---|---|---|---|
| 개발(dev) | 16자 이상 | 180일 | 개발팀 + DBA |
| 스테이징(stage) | 18자 이상 | 120일 | DevOps + DBA |
| 프로덕션(prod) | 20자 이상 | 90일 | SRE + DBA |
권한 분리 원칙
- 관리자 계정: DDL 및 시스템 관리 전용
- 애플리케이션 계정: DML 작업만 허용
- 개발자 계정: 읽기 전용 또는 제한된 스키마 접근
- 분석 계정: 분석용 뷰 및 리포트 접근만 허용
- 읽기 전용 계정: 보고서 및 분석용
- 백업 계정: 백업 작업 전용
4. 모니터링 및 알림
4.1 세션 상태 모니터링
실시간 세션 추적
-- 현재 활성 세션 수 확인
SELECT count(*) as active_sessions
FROM pg_stat_activity
WHERE state = 'active';
-- 유휴 트랜잭션 세션 확인 (보안 위험)
SELECT pid, usename, application_name, state, state_change, client_addr
FROM pg_stat_activity
WHERE state = 'idle in transaction'
AND state_change < now() - interval '10 minutes';
-- 장시간 연결된 세션 추적
SELECT pid, usename, application_name, backend_start, client_addr
FROM pg_stat_activity
WHERE backend_start < now() - interval '2 hours'
AND state != 'idle';
4.2 보안 알림 설정
알림 레벨
- 🟡 경고: 유휴 트랜잭션이 10분 이상 지속될 때
- 🟠 위험: 전체 연결 수가 최대 연결 수의 80% 초과 시
- 🔴 긴급: 세션 타임아웃 임계값 근접 또는 비정상 접근 패턴 탐지
자동 대응 액션
-- 위험한 세션 자동 종료 (관리자 승인 후)
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'idle in transaction'
AND state_change < now() - interval '25 minutes'; -- 타임아웃 5분 전
4.3 보안 감사 로깅
로그 수집 대상
- 로그인/로그아웃: 모든 DB 접속 기록
- 권한 변경: 사용자 권한 수정 이력
- DDL 작업: 스키마 변경 작업
- 세션 종료: 정상/비정상 종료 구분
5. 보안 모범 사례
5.1 애플리케이션 레벨 보안
연결 풀 보안 설정
// Prisma Client 보안 설정
const prisma = new PrismaClient({
datasources: {
db: {
url: process.env.DATABASE_URL,
},
},
log: ['query', 'info', 'warn', 'error'],
});
// 연결 풀 최적화 (보안 고려)
const connectionConfig = {
connectionLimit: 10, // 최대 연결 수 제한
acquireTimeout: 60000, // 연결 획득 타임아웃
timeout: 60000, // 쿼리 타임아웃
reconnect: true, // 자동 재연결
ssl: {
rejectUnauthorized: true, // SSL 인증서 검증
},
};
안전한 트랜잭션 패턴
// ✅ 보안을 고려한 트랜잭션 사용
async function secureUserUpdate(userId: string, data: UpdateData) {
return await prisma.$transaction(async (tx) => {
// 1. 권한 검증
const user = await tx.user.findUnique({ where: { id: userId } });
if (!user) throw new ForbiddenException('User not found');
// 2. 빠른 작업만 트랜잭션 내에서 수행
const updatedUser = await tx.user.update({
where: { id: userId },
data
});
// 3. 보안 감사 로그
await tx.auditLog.create({
data: {
userId,
action: 'UPDATE_PROFILE',
timestamp: new Date(),
ipAddress: request.ip
}
});
return updatedUser;
}, {
timeout: 5000, // 짧은 타임아웃으로 보안 위험 최소화
isolationLevel: 'ReadCommitted', // 적절한 격리 수준
});
}
// ❌ 보안 위험이 있는 패턴
async function insecureOperation() {
return await prisma.$transaction(async (tx) => {
// 외부 API 호출 - 트랜잭션을 너무 오래 유지
const externalData = await callExternalAPI(); // 보안 위험!
// 권한 검증 없음 - 보안 위험!
return await tx.user.update({ data: externalData });
});
}
5.2 환경별 보안 구성
개발 환경 보안
# 개발 환경 - 보안과 편의성 균형
inputs = {
# 보안 설정
deletion_protection = true
require_ssl = true
# 세션 관리 (개발 친화적)
database_flags = {
"idle_in_transaction_session_timeout" = "1800000" # 30분
"log_min_duration_statement" = "1000" # 느린 쿼리 로깅
"log_connections" = "on" # 연결 로깅
"log_disconnections" = "on" # 연결 해제 로깅
}
}
프로덕션 환경 보안
# 프로덕션 환경 - 최고 보안 수준
inputs = {
# 강화된 보안 설정
deletion_protection = true
require_ssl = true
backup_enabled = true
# 엄격한 세션 관리
database_flags = {
"idle_in_transaction_session_timeout" = "900000" # 15분
"statement_timeout" = "300000" # 5분
"log_min_duration_statement" = "100" # 모든 쿼리 로깅
"log_connections" = "on"
"log_disconnections" = "on"
"log_lock_waits" = "on" # 락 대기 로깅
}
}
5.3 보안 체크리스트
📋 일일 보안 점검
- 비정상적인 로그인 시도 확인
- 장시간 실행 중인 세션 점검
- 연결 수 임계값 모니터링
- 보안 알림 확인 및 대응
📋 주간 보안 점검
- 사용자 권한 검토
- 비밀번호 정책 준수 확인
- 보안 로그 분석
- 취약점 스캔 결과 검토
📋 월간 보안 점검
- 보안 정책 업데이트
- 접근 제어 목록 검토
- 백업 및 복구 테스트
- 보안 교육 실시
📚 관련 문서
- Platform Requirements - PLT-NFR-014, PLT-CR-006 요구사항
- ISO 27001 암호화 컴플라이언스 현황 - 전체 암호화 정책 및 현황
- Data Masking Implementation - 개인정보 보호 마스킹
- Infrastructure Audit Report - 인프라 보안 감사
- Security Overview - 전체 보안 아키텍처
문서 버전: 1.0.0
최종 업데이트: 2025-01-21
문서 승인: DTA-Wide 보안팀
다음 검토 예정: 2025-02-21
변경 이력
| 버전 | 날짜 | 작성자 | 변경 내용 |
|---|---|---|---|
| 1.0.0 | 2025-01-21 | bok@weltcorp.com | 데이터베이스 보안 구현 가이드 최초 작성 - PLT-NFR-014, PLT-CR-006 요구사항 구현 |