Suricata + ELK 연동

empty·2021년 7월 30일
0

SURICATA

목록 보기
2/2

Suricata + ELK

로그 관제의 용이성을 높이기 위해서 ELK와 연동시킨다.

  • ELK는 Docker를 이용해서 컨테이너로 띄운다.

Requirements

  • Docker
  • Suricata
  1. ELK 설치 (노션링크)

    • 실시간으로 수집되는 로그가 많기 때문에 ES를 Cluster구성하는 것을 추천한다.

    • Docker Compose로 ES 클러스터 구성

      1. 호스트 커널의 vm.max_map_count 수 확인

        • 프로덕션 환경에서 무리없이 사용하려면 최소 262144 이상이어야 한다.
        > sysctl vm.max_map_count
        vm.max_map_count = 65530
        
        > sysctl -w vm.max_map_count=262144
      2. ES를 Swarm모드로 변경

        elasticsearch의 environment에

        • network.publish_host
        • node.name
        • discovery.type
        • network.publishhost: _enp2s0f0
        • discovery.seed_hosts
        • cluster.initial_master_nodes
        vi docker-stack.yaml
        
        elasticsearch:
            image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
            ports:
              - "9200:9200"
              - "9300:9300"
            configs:
              - source: elastic_config
                target: /usr/share/elasticsearch/config/elasticsearch.yml
            environment:
              ES_JAVA_OPTS: "-Xmx256m -Xms256m"
              ELASTIC_PASSWORD: Dpffprkdtmgkek!
              # Use single node discovery in order to disable production mode and avoid bootstrap checks
              # see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
              ################
              # ES Swarm Mode
              # ##############
              node.name: elk_elasticsearch.{{.Task.Slot}}
              discovery.type: ''
              network.publish_host: _enp2s0f0_
              discovery.seed_hosts: tasks.elasticsearch
              cluster.initial_master_nodes: elk_elasticsearch.1,elk_elasticsearch.2,elk_elasticsearch.3
            networks:
              - elk
            deploy:
              mode: replicated
              replicas: 1
      3. 포트매핑 & 디스크 볼륨 지정

        vi docker-compose.yaml
        version: '3.2'
        
        services:
          elasticsearch:
            build:
              context: elasticsearch/
              args:
                ELK_VERSION: $ELK_VERSION
            volumes:
              - type: bind
                source: ./elasticsearch/config/elasticsearch.yml
                target: /usr/share/elasticsearch/config/elasticsearch.yml
                read_only: true
              - type: volume
                source: elasticsearch
                target: /usr/share/elasticsearch/data
            ports:
              - "9200"
              - "9300"
            environment:
              ES_JAVA_OPTS: "-Xmx256m -Xms256m"
              ELASTIC_PASSWORD: Dpffprkdtmgkek!
              # Use single node discovery in order to disable production mode and avoid bootstrap checks
              # see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
              discovery.type: single-node
              node.max_local_storage_nodes: '3'
            networks:
              - elk
      4. Elasticsearch Scale out

        docker-compose up -d --scale elasticsearch=3
  2. Suricata 데이터 추가
    Suricata는 Kibana에서 기본적으로 제공해주는 로그 템플릿이 존재하기 때문에 이를 사용한다.

    • Kibana 접속 → 'Add Data' → 'Security 탭' → Suricata logs 클릭
  3. Filebeat 설치

    클릭하면 Filebeat을 설치하라고 나오는데 Filebeat은 파일에 저장되는 실시간 로그를 Logstash로 전달해주는 서비스이다.

    친절하게 가이드가 나와있으니 가이드대로 설치하면 된다.

    # 1. filebeat 설치
    curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.10.0-amd64.deb
    sudo dpkg -i filebeat-7.10.0-amd64.deb
    
    # 2. filebeat 설정파일 수정
    vi /etc/filebeat/filebeat.yasml
    
    # Elasticsearch와 Kibana의 정보를 입력
    output.elasticsearch:
      hosts: ["localhost:9200"]
      username: "elastic"
      password: "<password>"
    setup.kibana:
      host: "localhost:5601"
    
    # 3. suricata의 모듈 활성화
    filebeat modules enable suricata
    
    # 4. filebeat 실행
    filebeat setup -e
    service filebeat start
  4. 대시보드 확인

    좌측 Kibana 메뉴에서 Dashboard 메뉴를 클릭하게되면 [Filebeat].. 이름의 수많은 대시보드들이 생성되어있는 것을 확인할 수 있다.

    Suricata로 검색하면 Suricata의 대시보드를 확인할 수 있다.

    • Alert는 Event Type이 'Alert' 인 대시보드이고 Events는 eve.json에서 발생하는 모든 로그가 기록된다.

    해당 대시보드로 들어가게 되면 그 동안 수집된 로그들을 확인할 수 있다.

이렇게 대시보드 연동하는 작업을 해보았는데 중요한점은 Suricata로 수집되는 실시간 로그가 지나치게 많으면 ES에 가해지는 부하량이 올라가고 ES의 성능이 중요해진다. 필요한 로그만 수집할 수 있도록 필터링을 걸거나, ES의 성능을 높이거나 해야한다.

  • 지금은 Container로 구성했기 때문에 Container단에서 Memory나 CPU를 제한할 수도 있고 Java Heap 메모리를 늘려줘도 된다.
> docker stats
CONTAINER ID   NAME                             CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O         PIDS
0e30b9638f63   docker-elk-kor_logstash_1        2.24%     608.2MiB / 11.71GiB   5.07%     70.7kB / 413kB   0B / 16.3MB       99
14ec7320c48d   docker-elk-kor_kibana_1          0.83%     261.3MiB / 11.71GiB   2.18%     105MB / 24.6MB   172kB / 0B        12
5f18ca840b74   docker-elk-kor_elasticsearch_1   4.66%     2.81GiB / 11.71GiB    24.00%    406MB / 93.8MB   19.5MB / 1.08GB   178

Reference

0개의 댓글