上一篇【第06篇】Elasticsearch索引生命周期管理与数据流下一篇【第08篇】Elasticsearch集群扩展与运维——水平扩展与节点管理摘要在生产环境中运行Elasticsearch集群安全配置是不可忽视的一环。从7.1版本开始Elasticsearch免费开放了基础安全特性X-Pack Security Basic包括TLS/SSL加密通信和基于用户名密码的Basic认证。本文将系统讲解ES集群安全配置的完整流程首先介绍Elasticsearch密钥库Keystore的创建与管理用于安全存储敏感配置信息接着演示如何使用elasticsearch-certutil工具生成CA证书和节点证书然后详细说明Transport层和HTTP层的TLS/SSL配置方法最后讲解如何启用内置用户和Basic Auth认证以及跨集群复制的安全设置。通过本文的学习读者可以为自己的ES集群搭建一套完整的安全防护体系。一、Elasticsearch安全性概述在默认配置下Elasticsearch没有任何安全防护——任何人只要知道节点地址就可以访问所有数据、执行任意操作。这在开发测试环境也许没问题但在生产环境中是不可接受的。1.1 免费安全特性7.1从Elasticsearch 7.1版本开始X-Pack Security的基础功能免费开放Basic许可证主要包括功能说明是否免费TLS/SSL加密Transport层和HTTP层通信加密免费7.1基于角色的访问控制RBAC用户、角色、权限管理免费7.1内置用户管理elastic、kibana_system等预设账户免费7.1文档和字段级安全控制用户可访问的文档和字段免费7.1审计日志记录安全相关事件PlatinumIP过滤基于IP地址的访问控制Platinum关键提示在Elasticsearch 8.x中安全功能默认启用。首次启动时会自动生成证书和密码。而在7.x中需要手动配置。1.2 安全配置的两个层面Elasticsearch的安全通信涉及两个层面Transport层节点间通信集群内部节点之间的通信使用9300端口。配置xpack.security.transport.ssl.enabled。HTTP层客户端通信客户端与ES集群之间的通信使用9200端口。配置xpack.security.http.ssl.enabled。两者可以独立启用但建议在生产环境中同时启用。二、密钥库Keystore管理Elasticsearch提供了一个密钥库机制用于安全地存储敏感配置信息。与直接写在elasticsearch.yml中不同密钥库中的设置会经过模糊处理obfuscation避免明文暴露。2.1 密钥库基本操作密钥库文件elasticsearch.keystore位于config目录下与elasticsearch.yml同级。创建密钥库bin/elasticsearch-keystore create查看密钥库中的设置项bin/elasticsearch-keystore list添加字符串设置# 交互式输入会提示输入值bin/elasticsearch-keystoreaddthe.setting.name.to.set# 通过管道传入值cat/file/containing/setting/value|bin/elasticsearch-keystoreadd--stdinthe.setting.name.to.set添加文件设置适用于密钥文件等bin/elasticsearch-keystore add-file the.setting.name.to.set /path/example-file.json删除设置项bin/elasticsearch-keystore remove the.setting.name.to.remove2.2 密钥库使用注意事项所有命令都需要以运行Elasticsearch的用户身份执行并非所有设置都支持从密钥库读取需查阅具体文档确认密钥库的修改在重启Elasticsearch后才生效安全设置必须在集群所有节点上配置且保持一致目前密钥库只提供模糊处理未来会增加密码保护2.3 可重载的安全设置部分安全设置支持运行时重载无需重启节点POST_nodes/reload_secure_settings最佳实践当需要修改多个可重载的安全设置时应该在每个节点上修改完所有设置后再执行一次reload_secure_settings而不是每次修改后都重载。三、生成CA和节点证书Elasticsearch提供了elasticsearch-certutil工具来生成证书。我们需要先生成一个CA证书颁发机构然后基于CA为每个节点签发证书。3.1 生成CA证书bin/elasticsearch-certutil ca执行后会在当前目录生成一个elastic-stack-ca.p12文件这就是我们的CA证书。系统会提示你设置CA的密码请务必记住。3.2 为节点签发证书# 基于CA生成节点证书会提示输入CA密码bin/elasticsearch-certutil cert--caelastic-stack-ca.p12执行后生成elastic-certificates.p12文件这就是节点的证书文件。也可以在生成时指定参数避免交互式输入bin/elasticsearch-certutil cert\--caelastic-stack-ca.p12\--ca-pass your_ca_password\--passyour_cert_password3.3 为不同节点生成独立证书进阶在生产环境中推荐为每个节点生成独立的证书并在证书中指定节点名称作为SANSubject Alternative Name# 先创建一个instances.yml文件instances:-name:es-node1dns:-es-node1.example.com-localhostip:-192.168.1.101-127.0.0.1-name:es-node2dns:-es-node2.example.com-localhostip:-192.168.1.102-127.0.0.1-name:es-node3dns:-es-node3.example.com-localhostip:-192.168.1.103-127.0.0.1bin/elasticsearch-certutil cert\--caelastic-stack-ca.p12\--ca-pass your_ca_password\--ininstances.yml\--outcerts.zip解压certs.zip后将对应节点的证书文件分发到各节点的config目录中。3.4 证书生成工具对比工具用途输出格式elasticsearch-certutil ca生成CA证书PKCS#12 (.p12)elasticsearch-certutil cert生成节点证书PKCS#12 (.p12)elasticsearch-certutil http生成HTTP层证书PEM (.crt/.key)openssl第三方灵活生成各类证书PEM/DER等注意Transport层默认使用PKCS#12格式证书HTTP层使用PEM格式。elasticsearch-certutil http可以方便地生成HTTP层所需的PEM格式证书。四、TLS/SSL配置详解4.1 分发证书文件将生成的证书文件复制到每个节点的config目录下# 在每个节点上执行cpelastic-certificates.p12 config/4.2 配置Transport层加密编辑elasticsearch.ymlxpack.security.enabled:truexpack.security.transport.ssl.enabled:truexpack.security.transport.ssl.verification_mode:certificatexpack.security.transport.ssl.keystore.path:elastic-certificates.p12xpack.security.transport.ssl.truststore.path:elastic-certificates.p12如果证书设置了密码需要将密码存入密钥库bin/elasticsearch-keystoreaddxpack.security.transport.ssl.keystore.secure_password bin/elasticsearch-keystoreaddxpack.security.transport.ssl.truststore.secure_passwordverification_mode选项说明模式说明full验证证书链和主机名最严格certificate验证证书链不验证主机名peer验证对端证书不验证自己none不验证最不安全仅测试用4.3 配置HTTP层加密首先生成PEM格式证书bin/elasticsearch-certutil http然后配置elasticsearch.ymlxpack.security.http.ssl.enabled:truexpack.security.http.ssl.keystore.path:http.p12配置完成后客户端需要通过HTTPS访问curl-khttps://localhost:92004.4 完整的安全配置示例以下是一个三节点集群的完整安全配置elasticsearch.ymlcluster.name:es-productionnode.name:es-node1# 节点发现配置 discovery.seed_hosts:[192.168.1.101,192.168.1.102,192.168.1.103]cluster.initial_master_nodes:[es-node1,es-node2,es-node3]# 安全配置 xpack.security.enabled:true# Transport层TLSxpack.security.transport.ssl.enabled:truexpack.security.transport.ssl.verification_mode:certificatexpack.security.transport.ssl.keystore.path:elastic-certificates.p12xpack.security.transport.ssl.truststore.path:elastic-certificates.p12# HTTP层TLSxpack.security.http.ssl.enabled:truexpack.security.http.ssl.keystore.path:elastic-certificates.p12注意每个节点的node.name不同但安全配置保持一致。五、启用Basic Auth认证启用TLS后还需要配置身份认证。Elasticsearch内置了多个系统账户最常用的是elastic超级用户。5.1 内置用户列表用户名角色用途elasticsuperuser内置超级管理员kibana_systemkibana_systemKibana连接ES使用logstash_systemlogstash_systemLogstash连接ES使用beats_systembeats_systemBeats连接ES使用apm_systemapm_systemAPM连接ES使用remote_monitoring_userremote_monitoring_collector跨集群监控5.2 设置内置用户密码启动节点后使用elasticsearch-setup-passwords工具设置密码# 交互式设置推荐可以为每个用户设不同密码bin/elasticsearch-setup-passwords interactive# 自动生成随机密码bin/elasticsearch-setup-passwords auto交互式设置输出示例Initiating the setup of passwordsforreserveduserselastic,apm_system,kibana_system,logstash_system,beats_system,remote_monitoring_user. You will be prompted to enter passwords as the process progresses. Please confirm that you would like tocontinue[y/N]y Enter passwordfor[elastic]: Reenter passwordfor[elastic]: Enter passwordfor[apm_system]: Reenter passwordfor[apm_system]:...重要请务必妥善保存密码建议使用密码管理器统一管理。5.3 使用认证访问集群设置密码后所有请求都需要认证# 带认证的请求curl-uelastic:your_password-khttps://localhost:9200# 查看集群健康状态curl-uelastic:your_password-khttps://localhost:9200/_cluster/health?pretty响应示例{name:es-node1,cluster_name:es-production,cluster_uuid:abc123...,version:{number:7.17.0,...},tagline:You Know, for Search}5.4 创建自定义用户和角色通过API创建角色和用户// 创建角色POST_security/role/my_readonly_role{indices:[{names:[logs-*],privileges:[read]}]}// 创建用户并分配角色POST_security/user/app_user{password:app_user_password,roles:[my_readonly_role],full_name:Application Read User,email:appexample.com}验证用户权限curl-uapp_user:app_user_password-khttps://localhost:9200/logs-2024.01/_search六、跨集群复制安全设置如果你的ES集群之间需要配置跨集群搜索Cross-Cluster Search或跨集群复制Cross-Cluster Replication需要额外配置安全设置。6.1 远程集群连接配置在远程集群上需要配置remote_cluster_client角色# elasticsearch.yml - 远程集群节点配置node.roles:[remote_cluster_client]6.2 建立跨集群信任关系本地集群需要信任远程集群的CA证书。有两种方式方式一共享CA证书将远程集群的CA证书添加到本地集群的信任库中# 将远程集群CA证书导入本地集群的密钥库bin/elasticsearch-keystoreadd\xpack.security.remote_cluster.ssl.truststore.path方式二使用API添加远程集群POST_cluster/settings{persistent:{cluster:{remote:{cluster_two:{seeds:[192.168.2.101:9300,192.168.2.102:9300],skip_unavailable:true}}}}}6.3 验证跨集群连接// 跨集群搜索GETcluster_two:logs-*/_search{query:{match_all:{}}}七、总结与最佳实践核心要点回顾配置项关键参数说明安全总开关xpack.security.enabled设为true启用安全功能Transport加密xpack.security.transport.ssl.enabled节点间通信加密HTTP加密xpack.security.http.ssl.enabled客户端通信加密证书格式PKCS#12 / PEMTransport用p12HTTP可选pem认证方式Basic Auth通过内置或自定义用户认证敏感配置Keystore使用密钥库存储敏感信息安全配置最佳实践尽早启用安全不要等到生产环境上线后再加安全配置尽早启用可以避免后期改造的麻烦。如果是Elasticsearch 8.x默认已开启安全功能。证书密码管理将证书密码存入Keystore不要明文写在配置文件中。建议使用统一的密码管理工具。定期轮换证书建议每年轮换一次CA和节点证书可以通过elasticsearch-certutil重新生成并替换。最小权限原则为不同应用创建专用用户和角色避免所有服务共用elastic超级用户。网络隔离除了TLS加密外还应通过防火墙限制9200和9300端口的访问来源Transport层端口9300只对集群内部节点开放。审计日志如果是Platinum许可启用审计日志记录关键操作便于事后追溯。密钥库备份妥善备份elasticsearch.keystore文件和CA证书丢失后无法恢复已加密的配置。上一篇【第06篇】Elasticsearch索引生命周期管理与数据流下一篇【第08篇】Elasticsearch集群扩展与运维——水平扩展与节点管理