본문으로 건너뛰기

데이터베이스 보안 구현 가이드

📋 목차

  1. 개요
  2. DB 세션 보안 관리
  3. 접근 제어
  4. 모니터링 및 알림
  5. 보안 모범 사례

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 보안 체크리스트

📋 일일 보안 점검

  • 비정상적인 로그인 시도 확인
  • 장시간 실행 중인 세션 점검
  • 연결 수 임계값 모니터링
  • 보안 알림 확인 및 대응

📋 주간 보안 점검

  • 사용자 권한 검토
  • 비밀번호 정책 준수 확인
  • 보안 로그 분석
  • 취약점 스캔 결과 검토

📋 월간 보안 점검

  • 보안 정책 업데이트
  • 접근 제어 목록 검토
  • 백업 및 복구 테스트
  • 보안 교육 실시

📚 관련 문서


문서 버전: 1.0.0
최종 업데이트: 2025-01-21
문서 승인: DTA-Wide 보안팀
다음 검토 예정: 2025-02-21

변경 이력

버전날짜작성자변경 내용
1.0.02025-01-21bok@weltcorp.com데이터베이스 보안 구현 가이드 최초 작성 - PLT-NFR-014, PLT-CR-006 요구사항 구현