DBL-001 PostgreSQL Connection Log
공격 행위 요약
SB-01에서 공격자는 App 서버의 설정 파일에서 PostgreSQL 접속 정보를 확인한 뒤 DB 서버 172.31.8.65:5432에 접속한다. 이후 spacebar_booking 데이터베이스의 customers, reservations, audit_events 테이블을 조회하여 고객/예약 데이터를 수집할 수 있다.
로그 발생 위치
| 구분 | 위치 | 설명 |
| DB 서버 | /var/log/postgresql/postgresql-16-main.log | PostgreSQL 접속, 인증, 종료 로그 |
| DB Server | sb01-db / 172.31.8.65 | PostgreSQL 16.13 |
| Database | spacebar_booking | 예약 서비스 데이터베이스 |
| App DB User | booking_app | App 서버가 사용하는 DB 계정 |
| Allowed Source | sb01-app private IP / App Security Group | DB 5432는 App 서버에서만 접근 허용 |
| Tables | customers, reservations, audit_events | 고객/예약/감사성 이벤트 |
| Current Logging | log_connections, log_disconnections, log_statement='mod' | 접속/종료 중심. SELECT 조회 본문 탐지는 추가 설정 필요 |
수집 방식
| 구분 | 방식 |
| DB 서버 | PostgreSQL 로그를 /var/log/postgresql/postgresql-16-main.log에 기록 |
| ELK | Filebeat custom input으로 PostgreSQL 로그와 DB 서버 auth log 수집 |
| 조회 감사 | 현재 log_connections=on, log_disconnections=on, log_statement='mod' 기준. SELECT 본문이 필요하면 짧은 검증 시간 동안 log_statement='all' 또는 pgaudit 적용 |
실무 환경에서 모든 SELECT를 항상 기록하면 로그량과 개인정보 노출 위험이 커질 수 있다. 따라서 운영 기준에서는 pgaudit, 특정 role/database 대상 감사, slow query, 또는 의심 세션 중심 로깅을 우선 고려한다.
실제 관측 로그 예시
2026-05-16 19:41:44.707 UTC [1828] [unknown]@[unknown] 172.31.4.70(49102) [unknown] LOG: connection received: host=172.31.4.70 port=49102
2026-05-16 19:41:44.772 UTC [1828] booking_app@spacebar_booking 172.31.4.70(49102) [unknown] LOG: connection authenticated: identity="booking_app" method=scram-sha-256 (/etc/postgresql/16/main/pg_hba.conf:133)
2026-05-16 19:41:44.772 UTC [1828] booking_app@spacebar_booking 172.31.4.70(49102) [unknown] LOG: connection authorized: user=booking_app database=spacebar_booking SSL enabled (protocol=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384, bits=256)
2026-05-16 19:41:44.796 UTC [1828] booking_app@spacebar_booking 172.31.4.70(49102) [unknown] LOG: disconnection: session time: 0:00:00.089 user=booking_app database=spacebar_booking host=172.31.4.70 port=49102
이 로그는 App 서버 172.31.4.70에서 DB 서버의 spacebar_booking 데이터베이스로 booking_app 계정이 접속한 실제 PostgreSQL 로그다. 현재 설정에서는 SELECT 문 본문이 남지 않으므로, 고객/예약 테이블 조회 행위를 직접 보려면 검증 시간 동안 log_statement='all' 또는 pgaudit을 추가해야 한다.
주요 필드
| 필드 | 의미 | 예시 |
@timestamp | DB 이벤트 발생 시간 | 2026-05-16 19:41:44.772 UTC |
user.name | DB 접속 계정 | booking_app |
database.name | 접속 DB | spacebar_booking |
source.ip | DB 접속 출발지 | 172.31.4.70 |
process.name | 클라이언트 프로그램 | psql, app connection pool |
event.action | PostgreSQL 접속 이벤트 | connection authorized |
message | PostgreSQL 원본 로그 | booking_app@spacebar_booking ... connection authorized |
커버하는 Techniques Used
탐지 포인트
| Technique | 관찰할 행위 | 주요 필드 |
| T1213.006 Databases | App 서버에서 DB 계정으로 spacebar_booking에 접속한다. 후속 감사 설정에서 customers, reservations 조회가 확인되면 우선순위가 높다. | source.ip, user.name, database.name, message |
| T1078 Valid Accounts | 유효한 DB 계정 booking_app으로 접속하지만, 시간대/출발지/클라이언트 프로그램이 평소 App API 패턴과 다르다. | user.name, source.ip, process.name, event.action |
ELK Query 예시
sb01_server:db AND sb01_log_type:postgresql
sb01_server:db AND sb01_log_type:postgresql AND message:"database=spacebar_booking"
sb01_server:db AND sb01_log_type:postgresql AND message:"connection authorized"