下面是一个适用于 ELK Stack 的完整 docker-compose.yml 文件,启用了基本认证(用户名与密码)但未使用 TLS 证书加密,这在测试环境或内网场景中非常常见。

一、📦 ELK Stack docker-compose.yml(启用基本认证,无 TLS)

version: '3.7'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.4.3
    container_name: elasticsearch
    restart: unless-stopped
    environment:
      - node.name=elasticsearch
      - discovery.type=single-node
      - xpack.security.enabled=true
      - ELASTIC_PASSWORD=修改为自己设置的密码
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms1g -Xmx1g
    ports:
      - "9200:9200"
      - "9300:9300"
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ulimits:
      memlock:
        soft: -1
        hard: -1
    networks:
      - elk

  kibana:
    image: docker.elastic.co/kibana/kibana:8.4.3
    container_name: kibana
    restart: unless-stopped
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - ELASTICSEARCH_SERVICEACCOUNTTOKEN=修改为步骤2的服务账号令牌
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    networks:
      - elk

  logstash:
    image: docker.elastic.co/logstash/logstash:8.4.3
    container_name: logstash
    restart: unless-stopped
    environment:
      - xpack.monitoring.enabled=true
      - xpack.monitoring.elasticsearch.username=修改为步骤三创建的账号
      - xpack.monitoring.elasticsearch.password=修改为步骤三创建的密码
      - xpack.monitoring.elasticsearch.hosts=http://elasticsearch:9200
    ports:
      - "5044:5044"
      - "9600:9600"
    volumes:
      - ./logstash/pipeline:/usr/share/logstash/pipeline
    depends_on:
      - elasticsearch
    networks:
      - elk

volumes:
  esdata:

networks:
  elk:
    driver: bridge

二、Kibana配置并启用容器Kibana(此过程已启用容器elasticsearch)

**注意:**Kibana 无法使用 elastic 用户写入它所需的系统索引。你需要改用 服务账号令牌(Service Account Token) 来连接。

❌ 为什么不能用 elastic 用户?

  • elastic 是超级用户,只用于管理用途(如安全、集群操作)
  • Kibana 在后台会自动写入一些系统索引(如 .kibana
  • 出于安全最佳实践,Elastic 8.x 明确禁止使用超级用户做此类写入

✅ 正确做法:使用 Kibana 服务账号令牌

步骤一:提前创建并运行 Elasticsearch 容器

确保你已准备好 Docker Compose 中的 Elasticsearch 服务定义,并启动它:

docker-compose up -d elasticsearch

等容器启动完成后,可以使用以下命令查看状态:

docker logs elasticsearch | grep "started"

如果输出中包含 started,说明 Elasticsearch 已运行。

🔐 步骤二:进入 Elasticsearch 容器

进入容器交互模式:

docker exec -it elasticsearch /bin/bash

🎟️ 步骤三:创建 Kibana 服务账号令牌

正确的命令格式如下:

bin/elasticsearch-service-tokens create elastic/kibana <token-name>

例如:

bin/elasticsearch-service-tokens create elastic/kibana kibana-token

这样你就会得到一个如下格式的输出:

elastic/kibana/kibana-token: eyJ2ZXN...(base64令牌)

复制这个令牌后,在 docker-compose.yml 的 Kibana 配置中加入:

environment:
  - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
  - ELASTICSEARCH_SERVICEACCOUNTTOKEN=eyJ2ZXN...(你的令牌)

然后启动 Kibana 即可。

sudo docker-compose up -d kibana

三、Logstash配置并启动容器Logstash

注意:logstash也无法使用elastic超级管理员连接,Logstash 不再使用 elastic\:changeme,而改用: 自定义低权限用户

如何使用kibana里面的Dev Tools 创建了 logstash_user 用户和角色

🛠️ 正确做法:使用自定义 Logstash 用户

你可以通过 Kibana Dev Tools 创建一个专用的低权限用户来供 Logstash 使用:

✅ 第一步:创建角色(logstash_writer)

POST /_security/role/logstash_writer
{
  "cluster": ["monitor"],
  "indices": [
    {
      "names": ["*"],
      "privileges": ["write", "create_index"]
    }
  ]
}

✅ 第二步:创建用户(logstash_user)

POST /_security/user/logstash_user
{
  "password": "logstash_pass_999999",
  "roles": ["logstash_writer"]
}

你可以把这个过程在 Kibana → Dev Tools 中直接复制粘贴执行,也可以通过 REST API 或 curl 发起。

🔧 在 logstash.conf 中使用该用户

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    user => "logstash_user"
    password => "logstash_pass_999999"
    index => "logstash-%{+YYYY.MM.dd}"
  }
}

也别忘了在 docker-compose.yml 的环境变量中添加这对账号密码,以供监控插件使用:

environment:
  - xpack.monitoring.elasticsearch.username=logstash_user
  - xpack.monitoring.elasticsearch.password=logstash_pass_999999

📁 项目结构建议

elk-server/
├── docker-compose.yml
└── logstash/
    └── pipeline/
        └── logstash.conf

📄完整的Logstash 配置文件(logstash.conf

路径建议:./logstash/pipeline/logstash.conf

input {
  beats {
    port => 5044
    ssl => false
  }
}

filter {
  ##################################################
  # 🌐 Nginx 日志处理
  ##################################################
  if [event][module] == "nginx" {
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
      overwrite => [ "message" ]
    }
  }

  ##################################################
  # 🖥️ System 日志处理
  ##################################################
  if [event][module] == "system" {
    grok {
      match => {
        "message" => [
          "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_host} %{DATA:syslog_program}: %{GREEDYDATA:syslog_message}"
        ]
      }
    }
  }

  ##################################################
  # 🔧 通用元数据处理
  ##################################################
  mutate {
    # 主机名处理(Filebeat 会自动添加)
    add_field => { "[@metadata][host]" => "%{[host][name]}" }

    # 环境字段处理(由 Filebeat processors 添加)
    add_field => { "[@metadata][env]" => "%{environment}" }
  }

  # 时间戳标准化(如 nginx 有 timestamp 字段)
  date {
    match => [ "timestamp", "ISO8601" ]
    target => "@timestamp"
  }
}

output {
  elasticsearch {
    hosts    => ["http://elasticsearch:9200"]
    user     => "logstash_user"
    password => "logstash_pass_999999"
    index    => "%{[@metadata][host]}-%{[@metadata][env]}-%{[event][module]}-logs-%{+YYYY.MM.dd}"
  }
}

然后启动容器logstash即可。

sudo docker-compose up -d logstash

四、📝 ubuntu客户端 Filebeat 配置(filebeat.yml

🧰 步骤一:在 Ubuntu 上安装 Filebeat

1. 添加 Elastic APT 源

curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list

sudo apt update

2. 安装 Filebeat

sudo apt install filebeat

⚙️ 步骤二:配置 Filebeat

编辑配置文件:sudo vim /etc/filebeat/filebeat.yml


# ============================== Filebeat Inputs ===============================

filebeat.inputs:
  # 系统日志
  - type: log
    enabled: true
    paths:
      - /var/log/syslog
      - /var/log/auth.log

  # Nginx 日志
  - type: log
    enabled: true
    paths:
      - /var/log/nginx/access.log
      - /var/log/nginx/error.log
    fields:
      service: nginx
    fields_under_root: true

# ============================== Filebeat Modules =============================

# 启用系统模块(可选)
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false

# ======================= Elasticsearch or Logstash Output ====================

# 使用 Logstash 作为输出
output.logstash:
  hosts: ["your-logstash-server-ip:5044"]
  ssl.enabled: false

# 🌱 环境变量标签(用于索引区分)
fields:
  environment: prod       # 你可以改成 dev / staging 等
  app: web-server-jumpserver-11.15

# 🌐 添加主机名(配合 Logstash 使用)
fields_under_root: true
setup.template.enabled: false
setup.ilm.enabled: false


# 自定义日志字段映射
# ============================== Processors ===================================
processors:
  - add_host_metadata: ~
  - add_fields:
      target: ''
      fields:
        role: frontend

✍️ 注意:your-logstash-server-ip 替换为实际 Logstash IP 或主机名

五、📝 centos客户端 Filebeat 配置(filebeat.yml

📦 第一步:导入 Elastic 官方 GPG 密钥

sudo rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

🗂️ 第二步:添加 Filebeat 仓库配置

创建 YUM repo 文件:

sudo tee /etc/yum.repos.d/elastic.repo <<EOF
[elastic-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF

🔽 第三步:安装 Filebeat

sudo yum install filebeat -y

🧭 第四步:启用并配置所需模块(如 system、nginx)

sudo filebeat modules enable system
sudo filebeat modules enable nginx

可选测试模块配置:

sudo filebeat modules list
sudo filebeat test modules system nginx

📝 第五步:编辑 Filebeat 主配置文件 /etc/filebeat/filebeat.yml

🔧 示例(发送到 Logstash):

filebeat.modules:
  - module: system
    syslog:
      enabled: true
    auth:
      enabled: true

  - module: nginx
    access:
      enabled: true
    error:
      enabled: true

output.logstash:
  hosts: ["your-logstash-server-ip:5044"]
  ssl.enabled: false

fields:
  environment: prod
  app: centos-host
fields_under_root: true

processors:
  - add_host_metadata: ~
  - add_fields:
      target: ''
      fields:
        role: webserver

✍️ 注意:your-logstash-server-ip 替换为实际 Logstash IP 或主机名

🚀 第六步:启动并设为开机启动

sudo systemctl enable filebeat
sudo systemctl start filebeat

查看服务状态:

sudo systemctl status filebeat

🔍 第七步:确认日志是否成功发送

检查日志:

sudo tail -f /var/log/filebeat/filebeat.log

在 Kibana → Discover 中选择匹配的索引模式,如:

centos-host-prod-system-logs-YYYY.MM.dd

最终效果图如下:

Copyright © https://yan-jian.com 2023 all right reserved更新时间: 2025-07-29 13:59:48

results matching ""

    No results matching ""