Elasticsearch7.x配置xpack实战

本文介绍ElasticStack从6.8.0和7.1.0版本开始提供免费的核心安全功能,包括TLS加密、用户管理和基于角色的访问控制等。详细讲解了Elasticsearch、Kibana和Logstash的安全配置步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2019年5月21日,Elastic官方发布消息: Elastic Stack 新版本6.8.0 和7.1.0的核心安全功能现免费提供。
这意味着用户现在能够对网络流量进行加密、创建和管理用户、定义能够保护索引和集群级别访问权限的角色,并且使用 Spaces 为 Kibana
提供全面保护。 免费提供的核心安全功能如下:
1)TLS 功能。 可对通信进行加密;
2)文件和原生 Realm。 可用于创建和管理用户;
3)基于角色的访问控制。 可用于控制用户对集群 API 和索引的访问权限;
通过针对 Kibana Spaces 的安全功能,还可允许在Kibana 中实现多租户。

目录

0.xpack演变:

安全部分免费之前,大家怎么保证基础安全?

1.ES集群配置(非集群可以跳过1.1生成证书步骤)

1.1生成证书

1.2修改elasticsearch.yml(位于安装目录config下)

1.3重启ES服务器

1.4设置ES账号密码

2.Kibana配置

2.1修改kibana.yml

2.2设置账户密码(密文配置)

2.3重启Kibana

3.Logstash配置

3.1修改logstash.yml

3.2设置账户密码

3.3修改conf文件

3.4重启Logstash

4.验证集群状态

5.Java代码修改配置

5.1RestHighClient配置

5.2springboot自带的ES连接客户端


0.xpack演变:

  1. 5.X版本之前:没有x-pack,是独立的:security安全,watch查看,alert警告等独立单元。
  2. 5.X版本:对原本的安全,警告,监视,图形和报告做了一个封装,形成了x-pack。
  3. 6.3 版本之前:需要额外安装。
  4. 6.3版本及之后:已经集成在一起发布,无需额外安装,基础安全属于付费黄金版内容。 7 .1版本:基础安全免费。

安全部分免费之前,大家怎么保证基础安全?

场景一:全部“裸奔”,相信这在国内占据了非常大的比重。
内网部署,不对外提供服务。或者ES作为业务基础支撑,不公网开放9200等常用端口,开放的是业务的服务端口。
可能暴露问题:公司或团队内部开放9200、5601端口,基本head插件、kibana都能连接,极易导致线上索引或数据可能被误删。

场景二:加了简单防护。
一般使用Nginx身份认证+防火墙策略控制。

场景三:整合使用了第三方安全认证方案。
比如:SearchGuard、ReadonlyREST。

场景四:付费购买了Elastic-Xpack黄金版或白金版服务。
一般是银行等土豪大客户,对安全、预警、机器学习等付费功能需求迫切,如:宁波银行付费购买白金服务。

以上内容摘自:https://blog.youkuaiyun.com/laoyang360/article/details/90554761

1.ES集群配置(非集群可以跳过1.1生成证书步骤)

1.1生成证书

        以3台服务器的集群为例。在服务器1(任选一台服务器生成证书就行)bin目录下执行以下命令生成两个证书:

./elasticsearch-certutil ca
./elasticsearch-certutil cert --ca elastic-stack-ca.p12

两条命令一路回车即可,不需要给秘钥再添加密码。执行完以后会生成两个证书,证书在安装目录bin目录的上一级;

将两个证书移动到安装目录的config目录下(非config目录会报错);

将服务器1上的两个证书复制到另外两个ES服务器的config目录下;

其实生成证书这个步骤很好理解,ES集群之间需要进行数据同步,当给ES集群设置密码以后,ES集群的各服务器之间互相认可对方,证书就是这个作用。

1.2修改elasticsearch.yml(位于安装目录config下)

在elasticsearch.yml中新增如下配置:

xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true
# 非集群不用增加下面三行
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /xxxx/xxxx/config/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /xxxx/xxxx/elasticsearch-7.6.2/config/elastic-certificates.p12

1.3重启ES服务器

依次重启3台服务器,生产环境ES集群不能停止服务,所以我们采用每次重启一台,切不可全部停止。

步骤1.3重启服务器一定要在步骤1.4设置ES账号密码之前。要不然1.4设置密码会失败。

1.4设置ES账号密码

在服务器1(挑一台服务器执行即可,不需要每台服务器都执行)上ES的bin目录下执行如下命令设置密码:

ES内置elastic、apm_system、logstash_system、kibana等内置用户,需要分别为这些账户设置密码,密码中不要包含@符号,有坑。需要记住自己设置的密码,后续过程需要使用。

# interactiv手动设置密码
./elasticsearch-setup-passwords interactive

也可使用:

# 自动生成密码
./elasticsearch-setup-passwords auto

如果在设置密码的过程中报错,重新执行此命令再设置一次即可,不可跳过报错。

设置完账号密码以后,在命令行中执行如下命令验证一下账号密码是否设置成功:

curl -XGET -u elastic ‘http://${ip}:9200/_xpack/security/user?pretty’

若出现提示输入elastic账户的密码,则账号密码设置成功。

2.Kibana配置

2.1修改kibana.yml

在kibana.yml文件中新增配置:

xpack.reporting.encryptionKey: "a_random_string"
xpack.security.encryptionKey: "something_at_least_32_characters"
# 明文配置,则加上以下两行。推荐密文配置,参考步骤2.2
elasticsearch.username: "kibana"
elasticseacr.password: "kibana_passwd"

2.2设置账户密码(密文配置)

在bin目录下执行:

   ./kibana-keystore create
   ./kibana-keystore add elasticsearch.username
   # 输入1.4中设置的账户:elastic
   ./kibana-keystore add elasticsearch.password
   # 输入1.4中设置的elastic账户的密码

2.3重启Kibana

kibana进程查找命令:netstat -tunlp|grep 5601

启动命令: nohup ./kibana &

3.Logstash配置

3.1修改logstash.yml

logstash.yml(位于安装目录config下)文件中新增如下配置:

logstash_system为ES的内置账户,只有监控权限,用于心跳检测ES服务器的状态。此账户权限非常小,所以这里密码采用明文写在配置文件也不要紧。

xpack.monitoring.enabled: true
# 步骤1.4中设置的账户logstash_system为ES的内置账户
xpack.monitoring.elasticsearch.username: logstash_system
# 设置的密码
xpack.monitoring.elasticsearch.password: yourPassword

3.2设置账户密码

在bin目录下执行:

./logstash-keystore create
# 执行后 选Y
./logstash-keystore add ES_USER 
# 输入1.4中设置的账户:elastic,这里不要使用logstash_system这个账号,这个账号没有增删改索引的权限
./logstash-keystore add ES_PWD
# 输入1.4中设置的elastic账户的密码

3.3修改conf文件

修改logstash的配置文件,一般是自己新增的配置文件,位于config文件夹下。

在output模块中新增账号,密码

output {
    elasticsearch {
      action => "%{[@metadata][action]}"
      hosts => ["ip1:9200", "ip2:9200", "ip3:9200"]
      index => "demo_index"
      document_id => "%{id}"
      # 新增如下两行:采用密文配置,要使用明文可自行查看官方文档
      user => ${ES_USER}
      password => ${ES_PWD}
    }
}

3.4重启Logstash

重启后观察启动日志,有无ERROR报错,无ERROR即正常。或者验证数据有没有通过Logstash同步到ES上面。到这里ELK就全部配置完成~

4.验证集群状态

在服务器中执行如下命令,验证ES集群状态:

 curl -XGET -u ${username}:${pwd} http://${ip}:9200/_cluster/health?pretty

集群状态为green就大功告成。如果为yellow就稍等一会,说明有副本分片还未恢复。如果集群状态为red,说明有主分片未恢复,需要去查看是否有ES服务器还未重启成功。

5.Java代码修改配置

5.1RestHighClient配置

final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
/*设置账号密码*/
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("username","password"));
/*创建rest client对象*/
RestClientBuilder builder = RestClient.builder(new HttpHost(127.0.0.1, 9200))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
                        return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                });
        client = new RestHighLevelClient(builder);

5.2springboot自带的ES连接客户端

在项目配置文件中ES直接配置上username,password即可。

{"type":"log","@timestamp":"2025-06-24T14:50:24+08:00","tags":["info","plugins-system","standard"],"pid":479830,"message":"Stopping all plugins."} {"type":"log","@timestamp":"2025-06-24T14:50:36+08:00","tags":["info","plugins-service"],"pid":482777,"message":"Plugin \"metricsEntities\" is disabled."} {"type":"log","@timestamp":"2025-06-24T14:50:36+08:00","tags":["info","http","server","Preboot"],"pid":482777,"message":"http server running at http://0.0.0.0:5601"} {"type":"log","@timestamp":"2025-06-24T14:50:36+08:00","tags":["warning","config","deprecation"],"pid":482777,"message":"“logging.dest”已过时,将在 8.0 中移除。要设置目标前移,可以在日志记录配置中使用“console”追加器,或定义定制追加器。"} {"type":"log","@timestamp":"2025-06-24T14:50:36+08:00","tags":["warning","config","deprecation"],"pid":482777,"message":"Starting in 8.0, the Kibana logging format will be changing. This may affect you if you are doing any special handling of your Kibana logs, such as ingesting logs into Elasticsearch for further analysis. If you are using the new logging configuration, you are already receiving logs in both old and new formats, and the old format will simply be going away. If you are not yet using the new logging configuration, the log format will change upon upgrade to 8.0. Beginning in 8.0, the format of JSON logs will be ECS-compatible JSON, and the default pattern log format will be configurable with our new logging system. Please refer to the documentation for more information about the new logging format."} {"type":"log","@timestamp":"2025-06-24T14:50:36+08:00","tags":["warning","config","deprecation"],"pid":482777,"message":"The default mechanism for Reporting privileges will work differently in future versions, which will affect the behavior of this cluster. Set \"xpack.reporting.roles.enabled\" to \"false\" to adopt the future behavior before upgrading."} {"type":"log","@timestamp":"2025-06-24T14:50:36+08:00","tags":["warning","config","deprecation"],"pid":482777,"message":"从 8.0 开始,用户会话将在处于非活动状态 8 小时后自动超时。覆盖此值以更改超时。"} {"type":"log","@timestamp":"2025-06-24T14:50:36+08:00","tags":["warning","config","deprecation"],"pid":482777,"message":"从 8.0 开始,将在 30 天后自动要求用户重新登录。覆盖此值以更改超时。"} {"type":"log","@timestamp":"2025-06-24T14:50:37+08:00","tags":["info","plugins-system","standard"],"pid":482777,"message":"Setting up [113] plugins: [translations,licensing,globalSearch,globalSearchProviders,features,licenseApiGuard,code,usageCollection,xpackLegacy,taskManager,telemetryCollectionManager,telemetryCollectionXpack,kibanaUsageCollection,share,embeddable,uiActionsEnhanced,screenshotMode,banners,telemetry,newsfeed,mapsEms,mapsLegacy,kibanaLegacy,fieldFormats,expressions,dataViews,charts,esUiShared,bfetch,data,savedObjects,presentationUtil,expressionShape,expressionRevealImage,expressionRepeatImage,expressionMetric,expressionImage,customIntegrations,home,searchprofiler,painlessLab,grokdebugger,management,watcher,licenseManagement,advancedSettings,spaces,security,savedObjectsTagging,reporting,canvas,lists,ingestPipelines,fileUpload,encryptedSavedObjects,dataEnhanced,cloud,snapshotRestore,eventLog,actions,alerting,triggersActionsUi,transform,stackAlerts,ruleRegistry,visualizations,visTypeXy,visTypeVislib,visTypeVega,visTypeTimelion,visTypeTagcloud,visTypeTable,visTypePie,visTypeMetric,visTypeMarkdown,tileMap,regionMap,expressionTagcloud,expressionMetricVis,console,graph,fleet,indexManagement,remoteClusters,crossClusterReplication,indexLifecycleManagement,dashboard,maps,dashboardMode,dashboardEnhanced,visualize,visTypeTimeseries,rollup,indexPatternFieldEditor,lens,cases,timelines,discover,osquery,observability,discoverEnhanced,dataVisualizer,ml,uptime,securitySolution,infra,upgradeAssistant,monitoring,logstash,enterpriseSearch,apm,savedObjectsManagement,indexPatternManagement]"} {"type":"log","@timestamp":"2025-06-24T14:50:37+08:00","tags":["info","plugins","taskManager"],"pid":482777,"message":"TaskManager is identified by the Kibana UUID: 77d9d0a0-6e2c-40b8-88ac-fc11ac026f06"} {"type":"log","@timestamp":"2025-06-24T14:50:37+08:00","tags":["warning","plugins","security","config"],"pid":482777,"message":"Generating a random key for xpack.security.encryptionKey. To prevent sessions from being invalidated on restart, please set xpack.security.encryptionKey in the kibana.yml or use the bin/kibana-encryption-keys command."} {"type":"log","@timestamp":"2025-06-24T14:50:37+08:00","tags":["warning","plugins","security","config"],"pid":482777,"message":"Session cookies will be transmitted over insecure connections. This is not recommended."} {"type":"log","@timestamp":"2025-06-24T14:50:37+08:00","tags":["warning","plugins","security","config"],"pid":482777,"message":"Generating a random key for xpack.security.encryptionKey. To prevent sessions from being invalidated on restart, please set xpack.security.encryptionKey in the kibana.yml or use the bin/kibana-encryption-keys command."} {"type":"log","@timestamp":"2025-06-24T14:50:37+08:00","tags":["warning","plugins","security","config"],"pid":482777,"message":"Session cookies will be transmitted over insecure connections. This is not recommended."} {"type":"log","@timestamp":"2025-06-24T14:50:37+08:00","tags":["warning","plugins","reporting","config"],"pid":482777,"message":"为 xpack.reporting.encryptionKey 生成随机密钥。为防止会话在重启时失效,请在 kibana.yml 中设置 xpack.reporting.encryptionKey 或使用 bin/kibana-encryption-keys 命令。"} {"type":"log","@timestamp":"2025-06-24T14:50:37+08:00","tags":["info","plugins","encryptedSavedObjects"],"pid":482777,"message":"Hashed 'xpack.encryptedSavedObjects.encryptionKey' for this instance: BQrB8dUsBGlAaZ1eq5SwFcYUCjFJrtTroWs/ofYlvTs="} {"type":"log","@timestamp":"2025-06-24T14:50:37+08:00","tags":["info","plugins","ruleRegistry"],"pid":482777,"message":"Installing common resources shared between all indices"} {"type":"log","@timestamp":"2025-06-24T14:50:38+08:00","tags":["info","plugins","reporting","config"],"pid":482777,"message":"Chromium 沙盒提供附加保护层,受 Linux Ubuntu OS 支持。自动启用 Chromium 沙盒。"} {"type":"log","@timestamp":"2025-06-24T14:50:38+08:00","tags":["warning","process"],"pid":482777,"message":"Error [ProductNotSupportedSecurityError]: The client is unable to verify that the server is Elasticsearch due to security privileges on the server side. Some functionality may not be compatible if the server is running an unsupported product.\n at /hatech/kibana-7.17.9-linux-aarch64/node_modules/@elastic/elasticsearch/lib/Transport.js:576:19\n at onBody (/hatech/kibana-7.17.9-linux-aarch64/node_modules/@elastic/elasticsearch/lib/Transport.js:369:9)\n at IncomingMessage.onEnd (/hatech/kibana-7.17.9-linux-aarch64/node_modules/@elastic/elasticsearch/lib/Transport.js:291:11)\n at IncomingMessage.emit (node:events:525:35)\n at endReadableNT (node:internal/streams/readable:1358:12)\n at processTicksAndRejections (node:internal/process/task_queues:83:21)"} {"type":"log","@timestamp":"2025-06-24T14:50:38+08:00","tags":["error","elasticsearch-service"],"pid":482777,"message":"Unable to retrieve version information from Elasticsearch nodes. security_exception: [security_exception] Reason: unable to authenticate user [efk] for REST request [/_nodes?filter_path=nodes.*.version%2Cnodes.*.http.publish_address%2Cnodes.*.ip]"} 解决此问题
最新发布
06-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值