在Docker容器上部署单节点弹性堆栈集群

在本教程中,我们将学习如何在Docker容器上部署单节点Elastic Stack集群。 弹性堆叠,著名的ELK堆栈的下一个演变是一组开源软件项目:Elasticsearch,Logstash以及Kibana和Beats。 Elasticsearch是一个搜索和分析引擎,Logstash是一个服务器端数据处理管道,它同时从多个源中提取数据,将其转换,然后将其发送到诸如Elasticsearch之类的“存储”中,Kibana允许用户使用Elasticsearch和 节拍 是数据托运人。他们将系统日志,网络,基础架构数据等运送到Logstash进行进一步处理,或将Elasticsearch进行索引。

因此,在本教程中,我们将学习如何使用Docker和Docker compose部署Elastic Stack。

码头工人 是一个平台,使开发人员和系统管理员可以 建立,运行和共享 带容器的应用程序。它提供了命令行界面工具,例如 dockerdocker-compose 用于管理Docker容器的组件。虽然Docker是用于管理单个Docker容器的Docker CLI,但另一方面docker-compose用于运行和管理多个Docker容器。

在Docker容器上部署单节点弹性堆栈集群

先决条件

在开始在Docker容器上部署单个noe Elastic Stack集群之前,主机需要满足一些先决条件。

安装Docker引擎

根据您的主机系统发行版,您需要安装Docker引擎。您可以按照下面的链接在Ubuntu / Debian / CentOS 8上安装Docker Engine。

在Debian 10 Buster上安装和使用Docker

在Ubuntu 20.04上安装Docker CE

在CentOS 8上安装和使用Docker CE

检查已安装的Docker版本;

docker version
Client: Docker Engine - Community
 Version:           19.03.12
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        48a66213fe
 Built:             Mon Jun 22 15:45:44 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.12
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       48a66213fe
  Built:            Mon Jun 22 15:44:15 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

安装Docker Compose

为了使Docker compose正常工作,请确保已安装Docker Engine。您可以按照上面的链接安装Docker Engine。

在其上检查Docker Compose的当前稳定发行版 Github发布页面。在撰写本文时,Docker Compose版本1.26.2是当前的稳定版本。

在Linux系统上下载并安装Docker Compose。请务必更换 VER 下面的变量,其中包含当前Docker compose的稳定发行版的值。

VER=1.26.2
sudo curl -L "https://github.com/docker/compose/releases/download/$VER/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

这会将docker compose工具下载到 /usr/local/bin 目录。

使Docker组成二进制可执行文件;

chmod +x /usr/local/bin/docker-compose

您现在应该可以使用Docker compose(docker-compose)。

检查已安装的Docker compose的版本,以确认其按预期工作。

docker-compose version
docker-compose version 1.26.2, build eefe0d31
docker-py version: 4.2.2
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

分配Docker引擎足够的RAM

这里相对使用足够。但是请确保您的Docker Engine主机至少分配了4GB RAM。

free -h
              total        used        free      shared  buff/cache   available
Mem:          3.8Gi       236Mi       2.7Gi       1.0Mi       894Mi       3.4Gi
Swap:         2.0Gi          0B       2.0Gi

注意:我们都以非root用户身份运行Docker和Docker compose。为此,请确保将标准用户添加到 docker 组。

例如,以用户身份运行此设置 koromicha。因此,将用户添加到docker组。相应地替换用户名。

usermod -aG docker koromcha

注销并以添加到docker组的用户身份再次登录,您应该能够运行docker和docker-compose CLI工具。

使用Docker Compose部署单节点弹性堆栈集群

在此设置中,我们将部署一个单节点Elastic Stack集群,其中所有三个组件(Elasticsearch,Logstash和Kibana容器)与Docker容器运行在同一主机上。

首先,从中创建一个父目录,从中创建堆栈。

mkdir $HOME/elastic-docker

创建用于部署Elastic Stack的Docker Compose文件

根据 Docker Compose概述,“ Docker compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。

“使用撰写基本上是一个三步过程:

  1. 使用以下命令定义您的应用环境 Dockerfile 因此可以在任何地方复制。
  2. 定义组成您的应用程序的服务 docker-compose.yml 因此它们可以在隔离的环境中一起运行。
  3. docker-compose up 然后Compose启动并运行您的整个应用程序”

在此设置中,我们将使用Docker Compose文件构建所有内容。

为Elastic Stack设置Docker Compose文件

现在,我们已经定义了如何提取Docker映像,是时候为部署创建Docker Compose文件了。

vim $HOME/elastic-docker/docker-compose.yml
version: '3.8'
services:
  elasticsearch:
    container_name: kifarunix-demo-es
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.1
    environment:
      - node.name=kifarunix-demo-es
      - cluster.name=es-docker-cluster
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es-data:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic

  kibana:
    image: docker.elastic.co/kibana/kibana:7.8.1
    container_name: kifarunix-demo-kibana
    environment:
      ELASTICSEARCH_URL: http://kifarunix-demo-es:9200
      ELASTICSEARCH_HOSTS: http://kifarunix-demo-es:9200
    ports:
      - 5601:5601
    networks:
      - elastic
  
  logstash:
    image: docker.elastic.co/logstash/logstash:7.8.1
    container_name: kifarunix-demo-ls
    ports:
      - "5044:5044"
    volumes:
      - ./logstash/conf.d/:/usr/share/logstash/pipeline/:ro
    networks:
      - elastic

volumes:
  es-data:
    driver: local

networks:
  elastic:
    driver: bridge

有关所有Docker compose配置选项的完整描述,请参阅 Docker撰写参考页面

定义Logstash数据处理管道

在此设置中,我们将配置Logstash接收来自Beats(特定于Filebeat)的事件数据,以进行进一步处理并将其存储在搜索分析引擎Elasticsearch中。

请注意,仅在需要对事件数据进行进一步处理时,才需要Logstash。例如,从事件数据中提取自定义字段,对事件数据进行突变等。否则,您可以将数据从Beats直接推送到Elasticsearch。

在此设置中,我们将使用示例Logstash处理管道来获取ModSecurity审核日志。

mkdir $HOME/elastic-docker/logstash/conf.d
vim $HOME/elastic-docker/logstash/conf.d/modsec.conf
input {
  beats {
    port => 5044
  }
}
filter {
    # Extract event time, log severity level, source of attack (client), and the alert message.
    grok {
      match => { "message" => "(?%{MONTH}s%{MONTHDAY}s%{TIME}s%{YEAR})] [:%{LOGLEVEL:log_level}.*clients%{IPORHOST:src_ip}:d+]s(?.*)" }
    }
    # Extract Rules File from Alert Message
    grok {
      match => { "alert_message" => "(?[file "(/.+.conf)"])" }
    }	
    grok {
      match => { "rulesfile" => "(?/.+.conf)" }
    }	
    # Extract Attack Type from Rules File
    grok {
      match => { "rulesfile" => "(?[A-Z]+-[A-Z][^.]+)" }
    }	
    # Extract Rule ID from Alert Message
    grok {
      match => { "alert_message" => "(?[id "(d+)"])" }
    }	
    grok {
      match => { "ruleid" => "(?d+)" }
    }
    # Extract Attack Message (msg) from Alert Message 	
    grok {
      match => { "alert_message" => "(?[msg S(.*?)"])" }
    }	
    grok {
      match => { "msg" => "(?"(.*?)")" }
    }
    # Extract the User/Scanner Agent from Alert Message	
    grok {
      match => { "alert_message" => "(?User-Agent' SValue: `(.*?)')" }
    }	
    grok {
      match => { "scanner" => "(?:(.*?)')" }
    }	
    grok {
      match => { "alert_message" => "(?User-Agent: (.*?)')" }
    }	
    grok {
      match => { "agent" => "(?: (.*?)')" }
    }	
    # Extract the Target Host
    grok {
      match => { "alert_message" => "(hostname "%{IPORHOST:dst_host})" }
    }	
    # Extract the Request URI
    grok {
      match => { "alert_message" => "(uri "%{URIPATH:request_uri})" }
    }
    grok {
      match => { "alert_message" => "(?referer: (.*))" }
    }	
    grok {
      match => { "ref" => "(? (.*))" }
    }
    mutate {
      # Remove unnecessary characters from the fields.
      gsub => [
        "alert_msg", "["]", "",
        "user_agent", "[:"'`]", "",
        "user_agent", "^s*", "",
        "referer", "^s*", ""
      ]
      # Remove the Unnecessary fields so we can only remain with
      # General message, rules_file, attack_type, rule_id, alert_msg, user_agent, hostname (being attacked), Request URI and Referer. 
      remove_field => [ "alert_message", "rulesfile", "ruleid", "msg", "scanner", "agent", "ref" ]
    }	
}
output {
   elasticsearch {
     hosts => ["kifarunix-demo-es:9200"]
   }
}

检查Docker Compose文件语法;

docker-compose -f docker-compose.yml config

或者如果您在同一目录中 docker-compose.yml 文件位于,只需运行;

docker-compose config

使用Docker Compose文件部署Elastic Stack

现在一切都已设置好,我们准备使用以下命令构建和启动我们的Elastic Stack实例。 docker-compose up 命令。

导航至Docker撰写文件所在的主目录。在我的设置中,目录为 $HOME/elastic-docker

cd $HOME/elastic-docker
docker-compose up

该命令在前台创建并启动容器。

样品输出;

...
kifarunix-demo-es | {"type": "server", "timestamp": "2020-08-10T19:35:00,516Z", "level": "INFO", "component": "o.e.c.m.MetadataIndexTemplateService", "cluster.name": "es-docker-cluster", "node.name": "kifarunix-demo-es", "message": "adding template [.monitoring-alerts-7] for index patterns [.monitoring-alerts-7]", "cluster.uuid": "DBy4Mwk-TB2Jum_AWDY0jw", "node.id": "4Fb4-CZ0QhG2KcZL79-8cw"  }
kifarunix-demo-ls | [2020-08-10T19:35:00,590][INFO ][logstash.inputs.beats    ][main] Beats inputs: Starting input listener {:address=>"0.0.0.0:5044"}
kifarunix-demo-ls | [2020-08-10T19:35:00,606][INFO ][logstash.javapipeline    ][main] Pipeline started {"pipeline.id"=>"main"}
kifarunix-demo-ls | [2020-08-10T19:35:00,672][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
kifarunix-demo-ls | [2020-08-10T19:35:00,730][INFO ][org.logstash.beats.Server][main][ee92a68a4dc1b148e25ac3c899680db31f95563138e922a364e18e3dc052d084] Starting server on port: 5044
kifarunix-demo-ls | [2020-08-10T19:35:00,947][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
...
...
kifarunix-demo-kibana | {"type":"log","@timestamp":"2020-08-10T19:36:49Z","tags":["status","plugin:[email protected]","info"],"pid":8,"state":"green","message":"Status changed from uninitialized to green - Ready","prevState":"uninitialized","prevMsg":"uninitialized"}
kifarunix-demo-kibana | {"type":"log","@timestamp":"2020-08-10T19:36:49Z","tags":["listening","info"],"pid":8,"message":"Server running at http://0:5601"}
kifarunix-demo-es | {"type": "server", "timestamp": "2020-08-10T19:36:49,957Z", "level": "INFO", "component": "o.e.c.m.MetadataMappingService", "cluster.name": "es-docker-cluster", "node.name": "kifarunix-demo-es", "message": "[.kibana_task_manager_1/a3B8lwzxQjiNHtFEAExOaQ] update_mapping [_doc]", "cluster.uuid": "DBy4Mwk-TB2Jum_AWDY0jw", "node.id": "4Fb4-CZ0QhG2KcZL79-8cw"  }
kifarunix-demo-kibana | {"type":"log","@timestamp":"2020-08-10T19:36:50Z","tags":["info","http","server","Kibana"],"pid":8,"message":"http server running at http://0:5601"}
...

当您停止 docker-compose up 命令,所有容器均已停止。

从另一个控制台,您可以检查正在运行的容器。请注意,您可以使用 docker-compose 如你所愿 docker 命令。

docker-compose ps
        Name                       Command               State                Ports              
-------------------------------------------------------------------------------------------------
kifarunix-demo-es       /tini -- /usr/local/bin/do ...   Up      0.0.0.0:9200->9200/tcp, 9300/tcp
kifarunix-demo-kibana   /usr/local/bin/dumb-init - ...   Up      0.0.0.0:5601->5601/tcp          
kifarunix-demo-ls       /usr/local/bin/docker-entr ...   Up      0.0.0.0:5044->5044/tcp, 9600/tcp

从输出中,您可以看到容器正在运行,并且其端口在主机上公开(任何IP地址)以允许外部访问。

您可以使用以下命令在后台运行堆栈容器 -d 选项。你可以按 ctrl+c 取消命令并停止容器。

在后台重新启动容器

docker-compose up -d
Starting kifarunix-demo-ls     ... done
Starting kifarunix-demo-es     ... done
Starting kifarunix-demo-kibana ... done

您还可以使用docker命令列出正在运行的容器;

docker ps
CONTAINER ID        IMAGE                                                 COMMAND                  CREATED             STATUS              PORTS                              NAMES
130eec8df661        docker.elastic.co/kibana/kibana:7.8.1                 "/usr/local/bin/dumb…"   38 minutes ago      Up About a minute   0.0.0.0:5601->5601/tcp             kifarunix-demo-kibana
6648df61c44b        docker.elastic.co/logstash/logstash:7.8.1             "/usr/local/bin/dock…"   41 minutes ago      Up About a minute   0.0.0.0:5044->5044/tcp, 9600/tcp   kifarunix-demo-ls
db9936abbee2        docker.elastic.co/elasticsearch/elasticsearch:7.8.1   "/tini -- /usr/local…"   41 minutes ago      Up About a minute   0.0.0.0:9200->9200/tcp, 9300/tcp   kifarunix-demo-es

要查找每个容器的详细信息,请使用 docker inspect 命令。例如

docker inspect kifarunix-demo-es

要获取容器的日志,请使用以下命令 docker logs [OPTIONS] CONTAINER。例如,获取Elasticsearch容器日志;

docker logs kifarunix-demo-es

如果您需要检查特定数量的日志,可以使用 tail 选项。例如获取最后50条日志行;

docker logs --tail 50 kifarunix-demo-es

从浏览器访问Kibana容器

一旦堆栈启动并运行,您就可以使用主机IP地址和暴露它的端口从外部访问Kibana。在我们的设置中,Kibana容器端口5601暴露在主机的同一端口上。

docker port kifarunix-demo-kibana
5601/tcp -> 0.0.0.0:5601

这意味着您可以通过主机上的任何接口(端口5601)访问Kibana容器端口。类似地,您可以使用上面的命令检查容器端口暴露情况。

因此,您可以使用您的容器主机地址访问Kibana, http://:5601

如您所见,我们的堆栈中还没有任何数据。

将数据发送到Elastic Stack

因为我们配置了Logstash从Beats接收事件数据,所以我们将配置Filebeat来转发事件。

在前面的指南中,我们已经介绍了如何安装和配置Filebeat以转发事件数据。

在CentOS 8上安装和配置Filebeat

在Fedora 30 / Fedora 29 / CentOS 7上安装Filebeat

在Ubuntu 18.04 / Debian 9.8上安装和配置Filebeat 7

将数据转发到Logstash容器后,下一步需要创建Kibana索引。

打开菜单,然后转到 堆栈管理 > 基巴纳 > 指数 模式。

完成后,前往“发现”菜单查看数据。现在,您应该能够看到已填充的Logstash自定义字段。

在Docker容器上部署单节点弹性堆栈集群

这标志着本教程有关如何在Docker容器上部署单节点Elastic Stack集群的结尾。

参考

在Docker上运行Elastic Stack

Sidebar