Elasticsearch 容器化安全配置指南

在 Linux 环境下通过 Docker 部署 Elasticsearch 时,默认安装不启用安全认证,这将导致未授权访问风险。以下是通过容器化方式配置账号密码的完整方案:


环境准备

确保已安装 Docker 和 docker-compose。推荐使用官方 Elasticsearch 镜像版本 7.0+(安全功能需 X-Pack 支持):

docker pull elasticsearch:8.3.2

单节点基础认证配置

创建 docker-compose.yml 文件配置基础安全:

version: '3'
services:
  elasticsearch:
    image: elasticsearch:8.3.2
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=true
      - ELASTIC_PASSWORD=YourStrongPassword
    ports:
      - "9200:9200"
    volumes:
      - es/share/elasticsearch/data
volumes:

关键参数说明:

  • xpack.security.enabled=true 启用安全模块
  • ELASTIC_PASSWORD 设置默认用户 elastic 的密码

启动服务后通过以下命令验证:

curl -u elastic:YourStrongPassword http://localhost:9200

多节点集群认证配置

对于生产集群,需配置节点间通信加密。示例 docker-compose.yml

version: '3'
services:
  es01:
    image: elasticsearch:8.3.2
    environment:
      - node.name=es01
      - cluster.name=secured-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.transport.ssl.enabled=true
    volumes:
      - es01_data:/usr/share/elasticsearch/data
    networks:
      - elastic

  es02:
    depends_on: 
      - es01
    environment:
      - node.name=es02
      # 其他环境变量同es01...
  
  es03:
    depends_on:
      - es01
    environment:
      - node.name=es03
      # 其他环境变量同es01...

  kibana:
    image: kibana:8.3.2
    ports:
      - "5601:5601"
    environment:
      - ELASTICSEARCH_HOSTS=http://es01:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=YourKibanaPassword
    depends_on:
      - es01

volumes:
  es01_data:
  es02_data:
  es03_data:

networks:
  elastic:
    driver: bridge

自定义用户与角色管理

容器启动后,进入容器内部执行用户管理命令:

docker exec -it <container_id> /bin/bash

使用 elasticsearch-users 工具创建新用户:

bin/elasticsearch-users useradd <username> -p <password> -r <role>

常用内置角色:

  • superuser 完全控制权限
  • kibana_system Kibana 服务账号
  • beats_system Beats 组件账号

TLS 证书配置(可选)

生成自签名证书并挂载到容器:

mkdir certs && cd certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout elasticsearch.key -out elasticsearch.crt

修改 compose 文件添加证书挂载:

volumes:
  - ./certs:/usr/share/elasticsearch/config/certs
environment:
  - xpack.security.http.ssl.enabled=true
  - xpack.security.http.ssl.key=/usr/share/elasticsearch/config/certs/elasticsearch.key
  - xpack.security.http.ssl.certificate=/usr/share/elasticsearch/config/certs/elasticsearch.crt

故障排查

常见问题解决方法:

  • 证书权限问题:chmod 644 *.key 设置适当权限
  • 内存锁定失败:在 compose 中添加 memlock: trueulimits: memlock: -1:-1
  • 密码未生效:确认环境变量名称正确(8.x 版本使用 ELASTIC_PASSWORD

日志查看命令:

docker logs -f <container_id>

最佳实践建议

  1. 避免在 compose 文件中硬编码密码,使用 Docker secrets 或环境变量文件
  2. 定期轮换密码,特别是 elastic 超级用户
  3. 为不同服务创建独立角色,遵循最小权限原则
  4. 生产环境建议配置 LDAP 或 SAML 集成认证

通过以上配置可建立具备基本认证能力的 Elasticsearch 容器化环境,后续可根据需要扩展 TLS 双向认证、审计日志等高级安全功能。

更多推荐