下面是一个适用于 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