본문 바로가기

Syslog 중앙 허브로 만드는 통합 로그 인프라: 수집·정규화·재전달 전략

728x90

아키텍처 개념 정리

1) 논리 구조

[로그 소스들]
 ├─ 네트워크 장비 (방화벽, 스위치, 라우터, WAF 등)
 ├─ 리눅스 서버 (OS, 애플리케이션, DB)
 └─ 보안 솔루션 (EDR, AV, IPS, Proxy 등)
        │
        ▼
[중앙 수신 지점]  ← 단일 진입점 (rsyslog 컨테이너 or 물리 서버)
        │
        ├─ 수신 (UDP/TCP/TLS 514/6514)
        ├─ 정규화/필터링 (facility, severity, hostname, program, msg)
        ├─ 재분배/포워딩 (SIEM, 분석용 syslog, 장기보관, 테스트 서버)
        └─ 로컬 기록 (장애 시 버퍼 + 감사 추적용)
        ▼
[목적지]
 ├─ 보안 로그 서버 / SIEM
 ├─ 애플리케이션 로그 서버 (APM, Observability)
 ├─ 인프라/시스템 로그 서버
 └─ 장기 보관(Storage, S3, ES, DB 등)

키 포인트

  • 입구는 1곳 → 네트워크·방화벽·서버들에 설정하는 syslog 대상은 딱 하나.
  • 중앙 수신 서버에서
    • 로그 분류 (보안/네트워크/시스템/앱 등)
    • 중복 제거·정규화·태깅 (hostname alias, device type, zone 등)
    • 여러 곳으로 재전달 (여러 SIEM, 테스트 환경, DR 등)
300x250

구현 방식 개요 (rsyslog 컨테이너 기반)

1) 컴포넌트

  1. Docker 컨테이너 내 rsyslog
    • imudp, imtcp, 필요하면 imptcp, imrelp 모듈 로드
    • 입력 포트: 514/udp, 514/tcp, 6514/tcp(TLS)
  2. 분류/필터링 룰
    • facility / severity / hostname / program / msg 기반 조건
    • 보안 로그, 네트워크 장비, 앱, DB, OS 등으로 구분
  3. 출력(action)
    • omfwd 로 다른 syslog 서버로 포워딩
    • 동시에 로컬 파일 기록(Backup/Forensic)
  4. 큐(queue) 설정
    • 네트워크 장애 시 디스크 큐에 저장 후 재전송
    • 고가용성 및 장애 복구 구조

Dockerfile & 기본 rsyslog 설정 설명

1) Dockerfile

FROM ubuntu:22.04

RUN apt-get update && \
    apt-get install -y rsyslog rsyslog-relp && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# rsyslog 설정 파일 복사
COPY rsyslog.conf /etc/rsyslog.conf
COPY rsyslog.d/ /etc/rsyslog.d/

# 로그 디렉토리 생성
RUN mkdir -p /var/log/remote

EXPOSE 514/udp 514/tcp 6514/tcp

CMD ["rsyslogd", "-n"]
  • rsyslog-relp : 네트워크 로그 전송을 신뢰성 있게(RELp) 쓰고 싶을 때 사용 가능.
  • /etc/rsyslog.d/ : 유형별 룰을 파일로 분리해서 관리 (보안/네트워크/앱 등).

2) 메인 설정 (/etc/rsyslog.conf)

module(load="imudp")
input(type="imudp" port="514")

module(load="imtcp")
input(type="imtcp" port="514")

# 템플릿 정의 - 공통 포워딩 포맷
template(name="ForwardFormat" type="string"
         string="<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg%")

# 설정 파일 분리 관리
$IncludeConfig /etc/rsyslog.d/*.conf
  • ForwardFormat: 외부로 내보낼 때 공통 포맷(타임스탬프·호스트·태그·메시지 일관성 유지).
  • 추후 SIEM·ELK가 이 포맷 기준으로 필드 파싱.

유형별 분류 / 재분배 구성 상세

1) 기본 분류 예시 (/etc/rsyslog.d/10-filter-and-forward.conf)

############################
# 1) 보안(인증) 로그
############################
if $syslogfacility-text == 'auth' or $syslogfacility-text == 'authpriv' then {
    action(type="omfwd" 
           target="security-siem.example.com" 
           port="514" 
           protocol="tcp"
           template="ForwardFormat"
           queue.type="LinkedList"
           queue.filename="security-queue"
           action.resumeRetryCount="-1")
    stop
}
  • SSH 로그인, sudo, PAM 인증 실패 등 계정·권한 관련 이벤트는 바로 보안 SIEM으로.
############################
# 2) 방화벽/네트워크 장비 로그
############################
if $hostname startswith 'fw-' or $hostname startswith 'firewall-' then {
    action(type="omfwd" 
           target="security-siem.example.com" 
           port="514" 
           protocol="tcp"
           template="ForwardFormat"
           queue.type="LinkedList"
           queue.filename="fw-queue"
           action.resumeRetryCount="-1")
    stop
}

# 예: UFW, iptables 등
if $programname == 'ufw' or $programname == 'kernel' and $msg contains 'IN=' then {
    action(type="omfwd" 
           target="security-siem.example.com" 
           port="514" 
           protocol="tcp"
           template="ForwardFormat")
    stop
}
  • hostname 네이밍 규칙을 fw-XXX, sw-XXX 등으로 맞춰두면 필터링이 훨씬 깔끔해짐.
############################
# 3) 애플리케이션 로그 (local0~local3)
############################
if $syslogfacility-text startswith 'local' and 
   ($syslogfacility >= 16 and $syslogfacility <= 19) then {
    action(type="omfwd" 
           target="app-log-server.example.com" 
           port="514" 
           protocol="tcp"
           template="ForwardFormat"
           queue.type="LinkedList"
           queue.filename="app-queue"
           action.resumeRetryCount="-1")
    stop
}
  • 내부 서비스는 local0~local3를 표준으로 쓰도록 개발 가이드를 주면 좋음.
############################
# 4) 웹 서버 로그
############################
if $programname contains 'nginx' or 
   $programname contains 'apache' or 
   $programname contains 'httpd' then {
    action(type="omfwd" 
           target="web-log-server.example.com" 
           port="514" 
           protocol="tcp"
           template="ForwardFormat")
    stop
}
############################
# 5) DB 로그
############################
if $programname contains 'mysqld' or 
   $programname contains 'postgres' or 
   $programname contains 'mongodb' then {
    action(type="omfwd" 
           target="db-log-server.example.com" 
           port="514" 
           protocol="tcp"
           template="ForwardFormat")
    stop
}
############################
# 6) 나머지 시스템/인프라 로그
############################
*.* action(type="omfwd" 
           target="infra-log-server.example.com" 
           port="514" 
           protocol="tcp"
           template="ForwardFormat"
           queue.type="LinkedList"
           queue.filename="infra-queue"
           action.resumeRetryCount="-1")

메시지 내용 기반 추가 필터링 (고급)

보안 솔루션, WAF, IDS, EDR 등에서 특정 키워드·패턴 기반 분류를 하고 싶을 때.

# /etc/rsyslog.d/20-content-based-filter.conf

# 심각 에러(0~3 severity) 별도 경보 채널
if $syslogseverity <= 3 then {
    action(type="omfwd"
           target="critical-alerts.example.com"
           port="514"
           protocol="tcp")
}

# 인증 실패, 에러 키워드 기반 보안 로그 추가 전송
if $msg contains 'FAILED' or 
   $msg contains 'ERROR' or 
   $msg contains 'authentication failure' then {
    action(type="omfwd" 
           target="security-siem.example.com" 
           port="514" 
           protocol="tcp")
    stop
}

# 정규표현식 활용 예시
if re_match($msg, ".*SQL injection.*") then {
    action(type="omfwd" 
           target="security-siem.example.com" 
           port="514" 
           protocol="tcp")
    stop
}
  • 중앙 rsyslog에서 1차 탐지/태깅 후 SIEM으로 넘기기 전략에 유용.
  • 추후 set $!meta!threat_level = "high" 처럼 메시지에 커스텀 필드 추가도 가능.

TLS/SSL 기반 암호화 전달

네트워크 경계 넘는 구간(예: IDC→클라우드 SIEM)은 반드시 TLS 6514 권장.

module(load="omfwd")

global(
    DefaultNetstreamDriver="gtls"
    DefaultNetstreamDriverCAFile="/etc/ssl/certs/ca-bundle.crt"
)

action(type="omfwd" 
       target="secure-siem.example.com" 
       port="6514" 
       protocol="tcp"
       StreamDriver="gtls"
       StreamDriverMode="1"                # 1: TLS 전용
       StreamDriverAuthMode="x509/name"
       StreamDriverPermittedPeers="*.example.com")
  • 보안 관점 체크포인트
    • 내부망이라도 “보안 로그”는 가급적 TLS 사용.
    • 인증 모드(x509)로 서버 인증 + 필요 시 클라이언트 인증까지.

Docker Compose 운영 예시

version: '3.8'

services:
  rsyslog-router:
    build: .
    container_name: rsyslog-router
    hostname: rsyslog-router
    ports:
      - "514:514/udp"
      - "514:514/tcp"
      - "6514:6514/tcp"
    volumes:
      - ./rsyslog.conf:/etc/rsyslog.conf:ro
      - ./rsyslog.d:/etc/rsyslog.d:ro
      - rsyslog-queues:/var/spool/rsyslog
      - rsyslog-logs:/var/log/remote
    restart: unless-stopped
    networks:
      - syslog-network
    environment:
      - TZ=Asia/Seoul

volumes:
  rsyslog-queues:
  rsyslog-logs:

networks:
  syslog-network:
    driver: bridge
  • rsyslog-queues : 디스크 큐(네트워크 장애 시 로그 유실 방지).
  • rsyslog-logs : 로컬 백업·트러블슈팅용 파일 저장.

모니터링 & 통계 수집

rsyslog 자체 상태, 큐 상태, 드랍 여부 모니터링

# /etc/rsyslog.d/30-stats.conf

module(load="impstats" 
       interval="60" 
       severity="7" 
       log.file="/var/log/rsyslog-stats.log")
  • 60초마다 큐 길이, 액션 상태, 드랍 이벤트 기록.
  • 이 파일을 다시 수집해 ELK/SIEM에 넣으면 로깅 인프라 헬스 모니터링 가능.

테스트 & 검증

1) 로컬 테스트

# 보안 로그 (auth facility)
logger -n localhost -P 514 -p auth.info "Test security log"

# 애플리케이션 로그 (local0)
logger -n localhost -P 514 -p local0.info "Test application log"

# 시스템 로그
logger -n localhost -P 514 -p daemon.info "Test system log"
  • 각 로그가 의도한 목적지(syslog 서버, SIEM)에 도착하는지 확인.
  • tcpdump로 포트별 전송도 같이 확인해 보면 좋음.

2) 장비별 테스트

  • 방화벽: syslog target을 rsyslog-router로 설정 후, 규칙 블록/허용 이벤트 발생 → 보안 SIEM 도착 확인.
  • 서버: /etc/rsyslog.d/ 또는 /etc/rsyslog.conf 에 remote target 설정 → 중앙에서 정상 수신 여부 확인.

설계/운영 가이드 & 점검 포인트

1) 설계/정책 관점

  1. 로그 분리 정책
    • 보안/인증/접근 관련 로그는 의무 보관 기간(예: 1년 이상) 명시.
    • 고객 로그와 내부 운영 로그 분리(테넌트 구분 필요 시 hostname/조직ID 태깅).
  2. 표준화 가이드
    • 서버·네트워크 장비 hostname 규칙 (예: fw-, sw-, db-, web-).
    • 애플리케이션에서 사용하는 syslog facility (local0=웹, local1=배치, …).
    • timezone 통일(UTC or Asia/Seoul + offset 명시).
  3. 접근 통제
    • 중앙 rsyslog 컨테이너에 접속 가능한 IP를 방화벽/SG로 제한.
    • 관리자는 bastion/jump host 통해서만 접속.

2) 기술/운영 점검 포인트

  • 네트워크
    • UDP 대신 중요 로그는 가능한 TCP/TLS 사용.
    • 대량 로그 발생 시 네트워크 사용량 모니터링, QoS 필요 여부 검토.
  • 가용성
    • 디스크 큐 용량(queue.maxdiskspace) 설정 → 디스크 Full 방지.
    • 중앙 rsyslog를 이중화(active/standby or active/active) 하고
      장비 syslog 설정에 primary/secondary target 도입.
  • 무결성
    • 중요 로그는 수신 이후 해시체인/서명 고려(예: 일 단위 파일 해시 후 별도 저장).
    • rsyslog → 저장소(ES, DB) 전송 시, 전송 실패/누락을 모니터링.
  • 프라이버시 / 민감정보
    • 애플리케이션 로그에 개인정보, 카드번호, 비밀번호가 찍히지 않도록 개발 가이드 필수.
    • 필요 시 rsyslog 단계에서 정규식으로 마스킹(예: 주민번호, 카드번호) 수행도 가능.
  • 감사/점검
    • 중앙 rsyslog 설정 변경 시 Git 관리 + 변경이력 남기기.
    • 분기 룰이 많아질수록, 정기적으로 불필요/중복 룰 정리.

정리

  • 중앙 수신점(Entry Point)을 1곳으로 통합하고,
  • rsyslog 컨테이너에서 유형별로 필터·분류·정규화·재전달하는 구조로 가면
    • 장비/서버 측 설정은 단순해지고,
    • 보안 정책(보관, 마스킹, 분리, 전송 방식)을 중앙에서 일괄 관리할 수 있습니다.
  • 위 예시 설정을 토대로,
    • 회사 내에서 실제 사용하는 장비 네이밍 규칙, facility 사용 규칙, 로그 목적지(SIEM/ELK/DB)에 맞춰 튜닝해 나가면 됩니다.
728x90
그리드형(광고전용)

댓글