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) 컴포넌트
- Docker 컨테이너 내 rsyslog
imudp,imtcp, 필요하면imptcp,imrelp모듈 로드- 입력 포트: 514/udp, 514/tcp, 6514/tcp(TLS)
- 분류/필터링 룰
- facility / severity / hostname / program / msg 기반 조건
- 보안 로그, 네트워크 장비, 앱, DB, OS 등으로 구분
- 출력(action)
omfwd로 다른 syslog 서버로 포워딩- 동시에 로컬 파일 기록(Backup/Forensic)
- 큐(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년 이상) 명시.
- 고객 로그와 내부 운영 로그 분리(테넌트 구분 필요 시 hostname/조직ID 태깅).
- 표준화 가이드
- 서버·네트워크 장비 hostname 규칙 (예:
fw-,sw-,db-,web-). - 애플리케이션에서 사용하는 syslog facility (
local0=웹,local1=배치, …). - timezone 통일(UTC or Asia/Seoul + offset 명시).
- 서버·네트워크 장비 hostname 규칙 (예:
- 접근 통제
- 중앙 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
그리드형(광고전용)
댓글