기타/인프라 구축과정

[Infra] 9. Sub 서버 ELK & 보안 설정 - HelloWorld Project

배발자 2023. 6. 1.
반응형

 

/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에서도 보안 설정을 해주려고한다. 

 

 

  1. 먼저, 실행 중인 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

 

 

 

 

반응형

댓글