실습에 앞서
이전 포스팅에서 curl 명령을 통해 OpenStack API를 호출하여 로그를 추출하려고 했지만 DevStack으로 OpenStack을 설치해서인지 원활히 진행되지 않았습니다.
공식 문서에 시스템 로그를 조회하는 journalctl 명령을 통해 DevStack을 통해 설치한 OpenStack에서의 로그 수집 방법이 나와 있어서 이를 통해 로그 파일을 생성하고, ELK와 연동하여 임의로 가정한 특정 공격에 대한 이벤트를 가시화하는 실습을 진행하겠습니다.
https://docs.openstack.org/devstack/latest/systemd.html
구축 환경은 다음과 같습니다.
- VMware workstation 17 pro in Windows OS
- Ubuntu 22.04 LTS
DevStack으로 OpenStack 설치하였고, Elasticsearch, Kibana, Logstash 또한 설치하였습니다.
전반적인 아이디어
본 실습에서는 journalctl 명령어를 통해 nova.log 파일을 생성한 후, 이를 ELK와 연동하여 임의로 가정한 특정 이벤트를 Kibana 대시보드로 가시화하도록 하겠습니다.
이번 실습에서 특정 이벤트란 짧은 시간동안 많은 인스턴스를 생성하는 공격으로 가정하겠습니다.
ElasticSearch, Kibana 파일 설정
1. elasticsearch.yml 파일 설정
원격 접속이 가능하도록 network.host를 0.0.0.0으로 설정하였고, http.port를 9200(기본)으로 설정하였습니다.
# ------------------------------------ Node ------------------------------------
node.name: node-1
# ---------------------------------- Network -----------------------------------
network.host: 0.0.0.0
#
http.port: 9200
#
# --------------------------------- Discovery ----------------------------------
discovery.seed_hosts: ["127.0.0.1"]
#
cluster.initial_master_nodes: ["node-1"]
2. jvm 설정 파일 편
Xms와 Xmx는 동일하게 지정하며, 서버 메모리의 절반정도 할당할 것을 권장합니다.
## IMPORTANT: JVM heap size
-Xms256m
-Xmx256m
3. kibana.yml 파일 설정
server.host를 0.0.0.0으로 설정하였고, server.port를 5601(기본)으로 설정하였습니다.
server.port: 5601
#
server.host: "0.0.0.0"
#
# The URLs of the Elasticsearch instances to use for all your queries.
elasticsearch.hosts: ["http://192.168.244.132:9200"]
이제 192.168.244.132:5601로 접속하면 Kibana 대시보드를 확인할 수 있습니다.
journalctl 명령어
journalctl 명령을 통해 로그를 조회하고, 이를 nova.log 파일로 생성합니다. 명령어 옵션은 다음과 같습니다.
① -f : 로그의 실시간 흐름을 볼 수 있도록 합니다.
② -o short-iso : 로그를 간단한 형식으로 출력하고, 날짜와 시간을 ISO 8601 형식으로 표시합니다.
③ --unit devstack@n-* : devstack 유닛 이름이 n-으로 시작하는 로그를 필터링합니다. (Nova)
sudo journalctl -f -o short-iso --unit devstack@n-* > nova.log
명령어를 실행한 디렉터리에 nova.log 파일이 생성됩니다. 실제 확인해보면 계속 로그가 쌓이고 있는 것을 확인할 수 있습니다. 이 로그 파일의 경로는 앞으로 logstash configuration 파일의 Input 블록에 필요합니다!
logstash config 파일 설정
Logstash의 conf 파일이란 Logstash가 기동할 때 실행할 데이터 파이프라인에 대한 설정을 미리 작성해둔 파일입니다. conf 파일은 Input, Filter, Output 3단계로 구성됩니다.
/etc/logstash/conf.d 디렉터리에 접속해서 nova_log.conf 파일을 생성합니다. Input의 path에는 로그 파일이 저장된 위치를, filter에는 로그 메시지에 [Action: 'create'] 문자열을 찾고 grok 패턴을 사용하여 정형 데이터로 변환합니다.
input {
file {
path => "/opt/stack/logs/nova.log"
start_position => "beginning"
codec => plain { charset => "UTF-8" }
}
}
filter {
if "Action: 'create'" in [message] {
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{LOGLEVEL:severity} %{GREEDYDATA:message}" }
}
date {
match => [ "timestamp", "ISO8601" ]
target => "@timestamp"
}
}
}
output {
elasticsearch {
hosts => ["http://192.168.244.132:9200"]
index => "devstack-nova-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
logstash의 conf 파일을 변경할 경우 꼭 다음 명령을 실행하여 변경 사항을 적용하고 재실행해야 합니다.
sudo systemctl daemon-reload
sudo systemctl restart logstash
Kibana 대시보드
Kibana 대시보드(192.168.244.132:5601)로 접속한 후 [Kibana]의 [Index Patterns]에서 [Create Index Pattern]으로 가시화하고자 하는 로그 파일을 추가합니다. 이전에 logstash의 Output 블록에서 elasticsearch로 전달한 index pattern으로 형성되어 있는 것을 확인할 수 있습니다. (devstack-nova-%{+YYYY.MM.dd}")
[Analytics]의 [Discover]에서 앞서 가정한 이벤트에 대한 로그를 가시화하도록 하겠습니다. 추가한 Index Patterns를 등록하고, 찾고자 하는 문자열을 입력합니다. 공격을 통해 생성한 인스턴스 이름이 Attack_Instance로 시작하므로 Attack_Instance와 create를 검색하도록 하겠습니다.
따단~
'보안 > OpenStack' 카테고리의 다른 글
[OpenStack] Openstack API 토큰 발급 (0) | 2023.05.11 |
---|---|
[OpenStack] 오픈스택과 핵심 요소 (0) | 2023.05.09 |
[OpenStack] 오픈 스택 설치 (0) | 2023.05.03 |
[OpenStack] 오픈 스택 환경 구축 실습 (0) | 2023.04.30 |