Spacebar Campaigns

DBL-001 PostgreSQL Connection Log

Log ID:
DBL-001
Source:
SB-01 PostgreSQL DB server
Representative Path:
/var/log/postgresql/postgresql-16-main.log
Collection:
Filebeat 8.13.4 custom input
Current Status:
ELK 수집 및 BAS evidence 검증 완료
Primary Use:
DB 접속 계정, 출발지, database, App 서버의 DB 사용 정황 확인

공격 행위 요약

SB-01에서 공격자는 App 서버의 설정 파일에서 PostgreSQL 접속 정보를 확인한 뒤 DB 서버 172.31.8.65:5432에 접속한다. 이후 spacebar_booking 데이터베이스의 customers, reservations, audit_events 테이블을 조회하여 고객/예약 데이터를 수집할 수 있다.

로그 발생 위치

구분위치설명
DB 서버/var/log/postgresql/postgresql-16-main.logPostgreSQL 접속, 인증, 종료 로그
DB Serversb01-db / 172.31.8.65PostgreSQL 16.13
Databasespacebar_booking예약 서비스 데이터베이스
App DB Userbooking_appApp 서버가 사용하는 DB 계정
Allowed Sourcesb01-app private IP / App Security GroupDB 5432는 App 서버에서만 접근 허용
Tablescustomers, reservations, audit_events고객/예약/감사성 이벤트
Current Logginglog_connections, log_disconnections, log_statement='mod'접속/종료 중심. SELECT 조회 본문 탐지는 추가 설정 필요

수집 방식

구분방식
DB 서버PostgreSQL 로그를 /var/log/postgresql/postgresql-16-main.log에 기록
ELKFilebeat 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을 추가해야 한다.

주요 필드

필드의미예시
@timestampDB 이벤트 발생 시간2026-05-16 19:41:44.772 UTC
user.nameDB 접속 계정booking_app
database.name접속 DBspacebar_booking
source.ipDB 접속 출발지172.31.4.70
process.name클라이언트 프로그램psql, app connection pool
event.actionPostgreSQL 접속 이벤트connection authorized
messagePostgreSQL 원본 로그booking_app@spacebar_booking ... connection authorized

커버하는 Techniques Used

TechniqueMapping Reason
T1213.006 Data from Information Repositories: DatabasesApp 서버에서 DB 서버로 접속해 spacebar_booking 데이터베이스에 접근한 정황을 확인한다. SELECT 문 본문은 추가 감사 설정 후 직접 확인한다.
T1078 Valid Accounts정상 DB 계정 booking_app으로 접속했는지, App 서버에서 온 정상 흐름인지 확인한다.

탐지 포인트

Technique관찰할 행위주요 필드
T1213.006 DatabasesApp 서버에서 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"