/home/ubunt/elk/docker-compose.yml
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
container_name: elasticsearch
command: >
sh -c "bin/elasticsearch-plugin install analysis-nori && exec /usr/local/bin/docker-entrypoint.sh"
ports:
- "9200:9200"
- "9300:9300"
environment:
- discovery.type=single-node
volumes:
- ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
- ./elastic_logs:/usr/share/elasticsearch/logs
- ./es_data:/usr/share/elasticsearch/data
networks:
- elk_network
kibana:
image: docker.elastic.co/kibana/kibana:7.10.1
container_name: kibana
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
depends_on:
- elasticsearch
networks:
- elk_network
volumes:
- ./kibana.yml:/usr/share/kibana/config/kibana.yml:ro
logstash:
image: docker.elastic.co/logstash/logstash:7.10.1
container_name: logstash
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
ports:
- "5044:5044"
environment:
- LS_JAVA_OPTS=-Xmx256m -Xms256m
depends_on:
- elasticsearch
networks:
- elk_network
networks:
elk_network:
driver: bridge
이 YAML 파일은 Docker Compose 파일로, Docker 컨테이너에서 Elasticsearch, Kibana, 그리고 Logstash (ELK 스택)를 실행하기 위해 사용된다.
- version: Docker Compose 파일의 버전이다.
- services: 실행하려는 서비스들을 정의한다.
- elasticsearch: Elasticsearch 서비스를 설정한다. Elasticsearch 이미지를 사용하며, 포트 9200과 9300을 사용한다. 또한 elasticsearch.yml 파일, 로그, 데이터를 각각의 볼륨에 마운트한다. Elasticsearch가 단일 노드로 동작하도록 설정하며, Nori(한국어를 위한 플러그인)를 설치하도록 커맨드를 실행한다.
- kibana: Kibana 서비스를 설정한다. Kibana 이미지를 사용하며, 포트 5601을 사용한다. Elasticsearch가 실행되고 난 후에 시작하도록 설정한다. 또한 kibana.yml 파일을 볼륨에 마운트한다.
- logstash: Logstash 서비스를 설정한다. Logstash 이미지를 사용하며, 포트 5044를 사용한다. Elasticsearch가 실행되고 난 후에 시작하도록 설정하며, logstash.conf 파일을 볼륨에 마운트한다.
- networks: elk_network 라는 이름의 네트워크를 설정하며, 이 네트워크는 bridge 드라이버를 사용한다.
이 Docker Compose 파일은 ELK 스택을 편리하게 실행하도록 한다. Elasticsearch, Kibana, 그리고 Logstash 서비스가 동시에 시작되며, 개별적으로 각각의 서비스를 설정하고 실행하는 수고를 줄일 수 있다.
/home/ubunt/elk/elasticsearch.yml
cluster.name: my-cluster
node.name: my-node
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node
path.logs: /usr/share/elasticsearch/logs
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
Elasticsearch는 실시간 분산 검색 및 분석 엔진으로, 해당 설정은 Elasticsearch 서비스를 운영하기 위한 주요 설정을 담고 있다.
- cluster.name: Elasticsearch 클러스터의 이름을 설정한다. 여러 노드를 하나의 클러스터로 구성할 때, 동일한 클러스터 이름을 갖는 노드들이 하나의 클러스터를 형성한다.
- node.name: Elasticsearch 노드의 이름을 설정한다.
- network.host: Elasticsearch 서비스가 수신을 대기할 네트워크 인터페이스를 설정한다. **0.0.0.0**은 모든 네트워크 인터페이스에서 수신을 대기하도록 한다.
- http.port: Elasticsearch 서비스가 사용할 HTTP 포트를 설정한다.
- discovery.type: Elasticsearch의 디스커버리 타입을 설정. **single-node**는 단일 노드 운영을 의미.
- path.logs: Elasticsearch 로그의 저장 위치를 설정.
- xpack.security.enabled: Elasticsearch의 X-Pack 보안 기능을 활성화한다.
- xpack.security.transport.ssl.enabled: Elasticsearch 간 통신에 SSL을 사용하도록 설정한다. 이는 노드 간 통신에 암호화를 적용한다.
/home/ubunt/elk/kibana.yml
server.name: kibana
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elasticsearch:9200"]
xpack.security.enabled: true
elasticsearch.username: "elastic" # 또는 해당 권한을 가진 다른 사용자
elasticsearch.password: "******"
xpack.security.encryptionKey: "something_at_least_32_characters"
xpack.security.session.idleTimeout: 600000
xpack.encryptedSavedObjects.encryptionKey: "bstrongandsecureencryptionkey12345"
xpack.reporting.encryptionKey: "******"
이 설정은 Kibana 서비스의 kibana.yml 설정 파일이다. Kibana는 Elasticsearch와 함께 사용되는 데이터 시각화 도구로, 해당 설정은 Kibana 서비스를 운영하기 위한 주요 설정을 담고 있다.
- server.name: Kibana 서버의 이름을 설정한다.
- server.host: Kibana 서버가 수신을 대기할 호스트 주소를 설정합니다. **0.0.0.0**은 모든 네트워크 인터페이스에서 수신을 대기하도록 한다.
- elasticsearch.hosts: Kibana가 접속할 Elasticsearch 서버의 주소를 설정한다.
- xpack.security.enabled: Elasticsearch의 X-Pack 보안 기능을 활성화한다.
- **elasticsearch.username**와 elasticsearch.password: Elasticsearch 서버에 접속할 때 사용할 사용자 이름과 비밀번호를 설정한다.
- xpack.security.encryptionKey: 세션 데이터를 암호화하는데 사용하는 키를 설정한다. 이 키는 32자 이상이어야 한다.
- xpack.security.session.idleTimeout: 사용자 세션이 유휴 상태로 되는 시간을 밀리초 단위로 설정한다.
- xpack.encryptedSavedObjects.encryptionKey: 암호화된 저장 객체를 암호화하는 데 사용하는 키를 설정한다.
- xpack.reporting.encryptionKey: 보고서 생성 기능을 암호화하는 데 사용하는 키를 설정한다.
이 설정을 통해 Kibana는 Elasticsearch와 연동되어 동작하며, 사용자 인증 및 세션 관리, 보안 기능 등을 제공한다.
/home/ubunt/elk/logstash.conf
input {
kafka {
bootstrap_servers => "메인서버주소:29092"
topics => ["logs"]
}
}
filter {
json {
source => "message"
target => "parsed"
}
mutate {
copy => { "[parsed][message]" => "actual_message" }
}
grok {
match => { "actual_message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{INT:value} --- \\\\[%{DATA:thread}\\\\] .* : %{GREEDYDATA:content}" }
}
}
output {
elasticsearch {
hosts => ["<http://elasticsearch:9200>"]
user => "elastic"
password => "1q2w3e4r!"
index => "helloworld_logs-%{+YYYY.MM.dd}"
}
}
이 설정은 Logstash 서비스의 logstash.conf 설정 파일의 예시이다. Logstash는 서버 로그를 처리하고 Elasticsearch 같은 곳으로 보내는 데이터 수집 파이프라인 도구이다.
- input: 입력 데이터를 설정한다. 여기서는 Kafka 서버에서 logs 토픽으로 데이터를 수집하도록 설정되어있다.
- filter: 입력 받은 데이터를 처리하는 설정.
- json: message 필드를 JSON 형식으로 파싱하고, 파싱된 데이터를 parsed 필드에 저장한다.
- mutate: parsed.message 필드의 값을 actual_message 필드에 복사한다.
- grok: actual_message 필드를 분석하여 로그 메시지를 구성하는 여러 부분을 추출한다. timestamp, loglevel, value, thread, content 등의 필드로 분리된다.
- output: 처리된 데이터를 보낼 목적지를 설정한다. 여기서는 Elasticsearch 서버로 보내지며, 인덱스 이름은 **helloworld_logs-**에 날짜가 붙은 형식으로 설정되어 있다.
이 설정을 통해 Logstash는 Kafka에서 로그 데이터를 수집, 필요한 필터를 거쳐 가공, 그리고 Elasticsearch에 보낸다. 가공 과정에서 로그 메시지의 일부분을 각각의 필드로 분리하여 Elasticsearch에서 이를 쉽게 검색하고 분석할 수 있게 돕는다.
ELK 보안설정
키바나에 접속하게되면 지속적으로 보안 설정을 하라고 귀찮은 메세지가 뜬다.
필자는 프로젝트를 진행하면서 Redis, MariaDB 등 데이터베이스와 관련된 암호설정을 하지않아, 하루가 지나면 저장했던 데이터가 모두 사라져있는 현상을 보게되었다. 그래서 서버를 구축하기위해 데이터 관련 보안이 중요하다고 생각하여 ELK에서도 보안 설정을 해주려고한다.
- 먼저, 실행 중인 Elasticsearch 컨테이너의 ID를 찾기 위해 다음 명령어를 실행한다
docker ps
출력에서 Elasticsearch 컨테이너를 찾고, 해당하는 컨테이너 ID를 기억해둔다.
docker exec -it <container_id> /bin/bash
여기서 <container_id>는 이전 단계에서 찾은 Elasticsearch 컨테이너 ID이다.
Elasticsearch 컨테이너 내부에서 elasticsearch-setup-passwords 명령어를 실행한다.
bin/elasticsearch-setup-passwords interactive
이후 비밀번호를 설정한다.
이전 포스팅에서 elasticsearch.yml에서 다음과 같은 코드가 작성되어있다.
xpack.security.enabled: true
kibana 역시 보안 설정을 위해 kibana.yml에서 다음과 같은 코드가 작성되어있다.
elasticsearch.username: "elastic" # 또는 해당 권한을 가진 다른 사용자
elasticsearch.password: "******"
xpack.security.encryptionKey: "something_at_least_32_characters"
xpack.security.session.idleTimeout: 600000
'기타 > 인프라 구축과정' 카테고리의 다른 글
[문제점] - HelloWorld Project (0) | 2023.06.05 |
---|---|
[Infra] 10. 최종 아키텍처 - HelloWorld Project (0) | 2023.06.05 |
[Infra] 8. Main 서버 FileBeats - HelloWorld Project (0) | 2023.06.01 |
[Infra] 7. ELK Stack & Kafka 흐름 - HelloWorld Project (0) | 2023.06.01 |
[Infra] 6. 무중단 배포 - HelloWorld Project (1) | 2023.05.24 |
댓글