보안로그 상관분석하기
상관분석 개념
상관 분석
- 보안 솔루션/시스템에서 발생한 다수의 이벤트 발생 관계를 분석하는 행위
- 여러 보안 사건을 전체적으로 하나의 통합 보안 사건으로 간주하여 거시적인 대응 방안 수립
> 이후 각각의 보안 이벤트에 대한 적절한 대응 방안도 수립
상관 분석의 필요성
- 수집되고 분석해야 하는 보안 로그의 수가 기하급수적으로 증가
- 단순 필터링, 패턴 매칭으로는 정확한 로그 분석이 불가
> 오탐 가능성
- 해킹 방법의 복잡화로 인해 여러 관점에서의 분석이 필요
상관 분석의 주의점
- 정확한 보안 로그의 분류
> 보안 사건과 관계없는 일반 에러 로그를 같이 분석하는 경우 전혀 다른 결과 도출
- 보안 솔루션의 오탐, 미탐 가능성을 염두
> 완벽한 보안 솔루션, 보안 정책은 없다는 것을 인지
> 보안 이벤트의 오탐 유무를 확인
- 중복된 로그 및 상관없는 로그 처리
> 분석 시간은 한정적이기 때문에 분석 효율 중요
상관 분석 목적
상관 분석 목적
- Minor한 보안 사건 간의 연관 관계 확인
> 특정 보안 사건의 원인이 다른 보안 사건인 경우도 있음
- 확인된 연관 관계에 대한 종합적인 사고 발생 범위와 경위를 조사
> 거시적인 범위부터 점차 세부적으로 진행
- 전체 보안 사건에 대한 통합 대응 방안 도출
- 도출된 통합 대응 방안을 바탕으로 예방 및 재발 방지 대책을 도출
보안 로그 분석 과정
- 1. 탐지 오탐 및 정탐 판정 내용과 탐지된 보안 이벤트를 상호 비교
> 보안 이벤트 확인 후 오탐인지 정탐인지 기업 내 기준에 따라 비교하여 판정
- 2. 보안 이벤트에 대한 공격 경로, 피해 유무를 파악
> 공격자의 주소 확인 및 공격자 주소에 대해 공격 경로 분석
> 공격 받은 대상 시스템 확인 및 해당 시스템의 업무 영역, 업무 부서, 피해 종류, 피해 유형을 파악
- 3. 타 보안 장비 및 시스템 로그를 활용한 상관 분석을 수행
> 보안 이벤트 발생 내역에서 탐지를 확인한 보안 시스템 확인
> 보안 시스템에서 각각의 보안 이벤트 수집(보안 시스템 종류, 로그, 이벤트 내용)
> 보안 이벤트들의 연관성, 공격 방법 등을 분석하여 원인, 공격 목적 도출
- 4. 상관 분석 결과를 바탕으로 공격의 정확한 경로, 시나리오 도출
> 분석 결과 확인 및 공격 경로 도식화
> 과거 동일, 유사한 공격이나 사례가 존재하는지 확인
ESM
ESM (Enterprise Security Management)
- 통합 보안 관리 시스셈
- GUI를 통해서 각종 보안 솔루션에서 발생한 데이터를 통합적으로 관리(모니터링)하기 위한 목적의 보안 시스템
- 하나의 기업에서 사용하는 보안 솔루션의 종류는 많다.
- 해당 보안 솔루션들에서 발생하는 로그 데이터, 시스템 데이터 등등을 한번에 확인 / 분석 할 필요가 있음
- 다양한 보안 솔루션이 도입된 기업에서 사용할 필요가 있는 장비
elastic stack
- 보안 솔루션에서부터 발생하는 데이터를 실시간으로 수집하여 검색, 분석, 시각화 해주는 서비스
- 설치 프로그램
> 1. elasticsearch
ㄴ 수집된 데이터를 저장하고 검색하는 프로그램
> 2. log stash
ㄴ 일반 데이터를 가공하여 elasticsearch로 전송해주는 프로그램
> 3. beats
ㄴ 실시간으로 데이터를 수집하는 프로그램(로그 데이터 수집 : filebeats, 시스템 데이터 수집 : matricbeats)
> 4. kibana
ㄴ 수집된 데이터를 GUI 형태로 시각화하여 보여주는 프로그램
ESM 구축
iptables에서 발생한 로그 데이터를 가공하여 ESM과 연동
수집된 데이터를 kibana로 확인
1. iptables centos : 192.168.50.50(jdk, filebeat, logstash 파일 옮기기)
2. elasticsearch centos - 192.168.50.60(jdk, kibana, elasticsearch 파일 옮기기)
<elasticsearch centos>
# rpm -ivh jdk-8u191-linux-x64.rpm
# rpm -ivh elasticsearch-6.3.2.rpm
# vim /etc/elasticsearch/elasticsearch.yml //elasticsearch 설정파일
17 cluster.name: "esm-server"
23 node.name: "kh100"
55 network.host: "0.0.0.0"
56 transport.host: "localhost"
59 http.port: "9200"
61 transport.tcp.port: "9300"
# service elasticsearch restart
# netstat -antup | grep java
tcp 0 0 :::9200 :::* LISTEN 4034/java
tcp 0 0 ::1:9300 :::* LISTEN 4034/java
tcp 0 0 ::ffff:127.0.0.1:9300 :::* LISTEN 4034/java
# sysctl net.ipv6.conf.all.disable_ipv6=1
# sysctl net.ipv6.conf.default.disable_ipv6=1
# sysctl net.ipv6.conf.lo.disable_ipv6=1
# service elasticsearch restart
# netstat -antup | grep java
tcp 0 0 0.0.0.0:9200 0.0.0.0:* LISTEN 4253/java
tcp 0 0 127.0.0.1:9300 0.0.0.0:* LISTEN 4253/java
# rdate -s time.bora.net
<iptables centos>
# rpm -ivh jdk-8u191-linux-x64.rpm
# tar -zxvf logstash-6.3.2.tar.gz
# mv logstash-6.3.2 /usr/local/src
# cd /usr/local/src/logstash-6.3.2/
# bin/logstash -e 'input { stdin {} } output { stdout {} }' //logstash 동작 확인 명령어
test {
"@timestamp" => 2024-01-08T10:51:41.757Z,
"message" => "test",
"host" => "localhost.localdomain",
"@version" => "1"
}
# vim config/iptables-log.conf# vim iptables.grok
IPTABLES %{IPTABLES_ETHERNET} %{IPTABLES_IP}
IPTABLES_ETHERNET %{DATA:msg} IN=%{DATA:iface} OUT=(%{DATA:oface})?(MAC=%{NETFILTERMAC})?
NETFILTERMAC %{MAC:dest_mac}:%{MAC:src_mac}:%{ETHTYPE:ethtype}
ETHTYPE (?:(?:[A-Fa-f0-9]{2}):(?:[A-Fa-f0-9]{2}))
IPTABLES_IP %{IPTABLES_IP_START} %{IPTABLES_IP_PAYLOAD}
IPTABLES_IP_START SRC=%{IP:src_ip} DST=%{IP:dest_ip} LEN=%{INT:length} TOS=%{BASE16NUM:tos} PREC=%{BASE16NUM:prec} TTL=%{INT:ttl} ID=%{INT:ip_id}(?: %{IPTABLES_IP_FRAGFLAG:flags})?(?: FRAG: %{INT:fragment})?
IPTABLES_IP_FRAGFLAG ((?<= )(CE|DF|MF))*
IPTABLES_IP_PAYLOAD %{IPTABLES_PROTOCOL} (%{IPTABLES_PORT_PAIR} %{IPTABLES_TCP_DETAILS})?(%{IPTABLES_ICMP_DETAILS})?
IPTABLES_PROTOCOL PROTO=%{WORD:proto}
IPTABLES_PORT_PAIR SPT=%{INT:src_port} DPT=%{INT:dest_port}
IPTABLES_TCP_DETAILS WINDOW=%{INT:tcp_window}
RES=%{BASE16NUM:res} %{IPTABLES_TCP_FLAGS:tcp_flags}
IPTABLES_TCP_FLAGS ((?<= )CWR|ECE|URG|ACK|PSH|RST|SYN|FIN)
IPTABLES_ICMP_DETAILS TYPE=%{INT:icmp_type} CODE=%{INT:icmp_code}
ID=%{INT:icmp_id} SEQ=%{INT:seq}
# mv iptables.grok vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/iptables.grok
# service iptables start
# iptables -F
# iptables -A OUTPUT -p icmp -j LOG --log-prefix "[icmp detect]"
# iptables -A OUTPUT -p tcp -j LOG --log-prefix "[tcp detect]"
# touch /var/log/iptables.log
# vim /etc/rsyslog.conf
kern.warn /var/log/iptables.log
# service rsyslog restart
# tail -f /var/log/iptables.log //새로운 터미널을 열고 ping 8.8.8.8을 하면 로그가 잘 남는다.
<새로운 터미널>
# mv /root/바탕화면/filebeat-6.3.2-linux-x86_64.tar.gz .
# tar -zxvf filebeat-6.3.2-linux-x86_64.tar.gz
# cd filebeat-6.3.2-linux-x86_64
# chmod 744 filebeat
# chmod 644 filebeat.yml
# chmod -R 644 modules.d
# vim filebeat.yml
24 enabled: true
28 - /var/log/iptables.log
143 #output.elasticsearch:
145 # hosts: ["localhost:9200"]
153 output.logstash:
155 hosts: ["localhost:5044"]
# ./filebeat -e -c filebeat.yml -d "publish"
# rdate -s time.bora.net
<기존 터미널>
# bin/logstash -f config/iptables-log.conf --config.reload.automatic
# iptables -F
# iptables -A OUTPUT -p icmp -j LOG
# iptables -A OUTPUT -p tcp -j LOG
# rm -rf /var/log/iptables.log
# touch /var/log/iptables.log
# service rsyslog restart
<elasticsearch centos>
# mv /root/바탕화면/kibana-6.3.2-linux-x86_64.tar.gz .
# tar -zxf kibana-6.3.2-linux-x86_64.tar.gz
# cd kibana-6.3.2-linux-x86_64
# vim config/kibana.yml
2 server.port: 5601
7 server.host: "0.0.0.0"
28 elasticsearch.url: "http://localhost:9200"
# bin/kibana
# curl -X GET "localhost:9200/_cat/indices?v"
# curl -X DELETE "localhost:9200/_cat/indices?pretty" //로그 용량 지우는법
<Win10>
192.168.50.60:5601Management -> Index Patterns -> index pattern에 iptables* 입력 -> next step -> @timestamp -> create index pattern 클릭 Visualize -> create a visualization -> Vertical Bar -> iptables*