ELK 스택을 활용한 Cisco 장비 로그 수집 및 분석 시스템 구축

Rsyslog을 통한 Cisco 네트워크 장비 로그 수집 설정

1. Rsyslog 서비스 설치 및 구성

Cisco 장비에서 발생하는 시스템 로그를 중앙에서 수집하기 위해 Linux 서버에 rsyslog를 설치하고, UDP/TCP 기반의 syslog 수신 환경을 구성한다.

yum install -y rsyslog

다음은 /etc/rsyslog.conf 파일의 핵심 설정 내용이다:

$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514

$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on
$IMJournalStateFile imjournal.state

# 기본 시스템 로그 라우팅
*.info;mail.none;authpriv.none;cron.none    /var/log/messages
authpriv.*                                  /var/log/secure
mail.*                                      -/var/log/maillog
cron.*                                      /var/log/cron
local7.*                                    /var/log/boot.log

# 사용자 정의 로그 포맷 및 저장 경로 정의
$template LogFormatNoTimestamp,"%FROMHOST-IP%: %msg:2:$%\n"
$template CiscoLogPath,"/net-log/cisco/%FROMHOST-IP%.log"

# local4 우선도의 모든 로그를 지정된 형식으로 저장
local4.* ?CiscoLogPath;LogFormatNoTimestamp

설정 완료 후 rsyslog 서비스 재시작:

systemctl restart rsyslog.service

2. Cisco 장비 측 설정 (요약)

네트워크 장비에서는 아래와 유사한 명령어로 로그 전송 대상을 지정한다:

logging 192.169.5.128
logging trap informational

실제 설정은 네트워크 운영팀에서 수행하며, 목적지 IP는 rsyslog 서버의 주소로 지정해야 한다.

3. 로그 수집 확인

로그가 정상적으로 수신되고 있는지 확인:

tree /net-log/
/net-log/
└── cisco
    └── 192.169.5.249.log

tail -1 /net-log/cisco/192.169.5.249.log
001068: Jun 18 12:29:49: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet1/0/12, changed state to down

Filebeat을 통한 로그 전달 파이프라인 구성

1. Filebeat 설정 파일 작성

수집된 로그를 Kafka로 전달하기 위해 Filebeat를 사용하여 로그 파일을 모니터링한다.

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /net-log/cisco/*.log
  fields_under_root: true
  fields:
    type: net-cisco

filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false

setup.template.settings:
  index.number_of_shards: 1

name: net-log-collector

processors:
  - add_host_metadata: ~
  - drop_fields:
      fields: ["sort", "beat", "input_type", "offset", "source", "agent"]

output.kafka:
  enabled: true
  hosts: ["172.16.160.121:9092", "172.16.160.123:9092"]
  topic: '%{[type]}'

2. Systemd를 이용한 서비스 등록

Filebeat를 백그라운드 서비스로 실행하기 위한 unit 파일 생성:

[Unit]
Description=Filebeat Log Shipper
After=network.target

[Service]
User=root
Group=root
ExecStart=/usr/local/filebeat/filebeat \
  -c /usr/local/filebeat/filebeat.yml \
  --path.logs /usr/local/filebeat/logs
Restart=always

[Install]
WantedBy=multi-user.target

서비스 등록 및 시작:

systemctl daemon-reload
systemctl enable filebeat
systemctl restart filebeat

3. Kafka 전달 상태 검증

Kafka 클러스터에서 토픽 생성 여부 확인:

/usr/local/kafka/bin/kafka-topics.sh --list --zookeeper 172.16.160.121:2181
# 출력 예상: net-cisco

토픽 데이터 소비 테스트:

/usr/local/kafka/bin/kafka-console-consumer.sh \
  --bootstrap-server 172.16.160.121:9092 \
  --topic net-cisco --from-beginning

Logstash를 통한 로그 파싱 및 Elasticsearch 적재

Logstash는 Kafka에서 메시지를 소비하여 구조화된 형태로 변환한 후 Elasticsearch로 전송한다.

input {
  kafka {
    bootstrap_servers => "172.16.160.121:9092,172.16.160.123:9092"
    topics => ["net-cisco"]
    group_id => "logstash-consumer-group"
    decorate_events => true
    type => "net-cisco"
    codec => "json"
  }
}

filter {
  # 로그 메시지를 콜론 기준으로 분할
  mutate {
    split => ["message", ": "]
    add_field => {
      "client_ip"   => "%{[message][0]}"
      "sequence"    => "%{[message][1]}"
      "timestamp_raw" => "%{[message][2]}"
      "event_code"  => "%{[message][3]}"
      "log_message" => "%{[message][4]}"
    }
  }

  # 원본 메시지 필드 제거
  mutate { remove_field => ["message"] }

  # 날짜 형식 변환
  date {
    match => ["timestamp_raw", "MMM dd HH:mm:ss"]
    target => "@timestamp"
    timezone => "Asia/Seoul"
  }

  # 불필요 필드 정리
  mutate { remove_field => ["timestamp_raw"] }
}

output {
  if [type] == "net-cisco" {
    elasticsearch {
      hosts => ["172.160.125:9200", "172.160.126:9200", "172.160.127:9200"]
      index => "net-cisco-%{+YYYY.MM.dd}"
      document_type => "_doc"
    }
  }
}

Logstash 구성 검증 및 실행:

bin/logstash -f net-cisco.conf --config.test_and_exit
nohup bin/logstash -f net-cisco.conf > logs/logstash_cisco.log &

Kibana에서 로그 시각화

Elasticsearch에 데이터가 적재되면 Kibana에서 다음과 같은 절차로 인덱스 패턴을 생성한다:

  1. Management > Stack Management > Kibana > Index Patterns 이동
  2. 인덱스 이름 입력: net-cisco-*
  3. 타임 기반 필드 선택: @timestamp
  4. 생성 후 Discover 메뉴에서 실시간 로그 조회 가능

주요 필드 예시:

  • client_ip: 로그 발생 장비 IP
  • event_code: 시스로그 이벤트 코드
  • log_message: 상세 이벤트 설명

운영 시 고려사항

  • timestamp 및 type 필드: Filebeat에서 삭제가 불가능하므로 filter 단계에서 처리 필요
  • 파일 수정 방식: 테스트용 로그 추가 시 echo 사용 권장. vim 사용 시 inode 변경으로 전체 재전송 발생
  • Filebeat 로깅 옵션: -e--path.logs는 동시에 사용 불가
  • Kafka 토픽 자동 생성: 비활성화된 경우 새로운 로그 유형마다 수동으로 토픽 생성 필요
  • Kibana 인덱스 패턴 사라짐 현상: 간헐적 문제 발생 시 Kibana 서비스 재시작으로 해결 가능
  • Filebeat 프로세스 관리: nohup보다는 systemctl 또는 supervisord 사용 권장

태그: rsyslog filebeat Logstash elasticsearch Kibana

6월 11일 20:57에 게시됨