前言

在es的早期版本中,没有免费提供安全认证的相关功能。
为了防止数据安全问题,一般的措施都是采用IP黑白名单,网络防火墙,
Nginx代理权限控制。
而从es6.8和7.1版本开始,es给我们免费提供了安全功能,也就是今天要介绍的X-Pack功能。


一、ES版本的安全性

各版本支持的特性:
https://www.elastic.co/cn/subscriptions

安全性配置的官方文档:
https://www.elastic.co/guide/en/elasticsearch/reference/7.13/security-minimal-setup.html

二、ES的安全层级


说明:
目前ES的安全层级可以分为4层:
1、Minimal security (Elasticsearch Development)
最低安全方案,主要是开发环境使用。此配置通过为内置用户设置密码来防止对本地集群的未授权访问。
对于生产模式集群,最低安全方案是不够的。 如果您的集群有多个节点,您必须启用最低安全性,然后在节点之间配置传输层安全性 (TLS)。

2、basic security(Elasticsearch Production)
此方案通过添加传输层安全性 (TLS) 用于节点之间的通信,以最低安全要求为基础。 适用于生产环境的ES使用。
这一附加层要求节点验证安全证书,以防止未经授权的节点加入您的 Elasticsearch 集群。
Elasticsearch 和 Kibana 之间的外部 HTTP 流量不会被加密,但节点间通信将受到保护。

ES节点直接会验证安装证书,但是Elasticsearch 和 Kibana 之间的外部 HTTP 流量没有用证书保护。

3、basic security + TLS for REST
此方案建立在基本安全方案的基础上,并使用 TLS 保护所有 HTTP 流量。 除了在 Elasticsearch 集群的传输接口上配置 TLS 之外,您还可以在 HTTP 接口上为 Elasticsearch 和 Kibana 配置 TLS。

如果您需要在 HTTP 层上使用双向(双向)TLS,那么您需要配置双向认证加密。

然后,您将 Kibana 和 Beats 配置为使用 TLS 与 Elasticsearch 通信,以便对所有通信进行加密。 此级别的安全性很强,可确保进出集群的任何通信都是安全的。

总结:
ES的安全认证主要有3个级别的配置方案,高级的安全方案都是以低一级的安全方案为基础。

  • 最低方案:基于用户名和密码认证。
  • basic方案:ES节点间添加传输层安全性 (TLS) ,也就是节点采用证书认证
  • 更高的方案:TLS for REST,即http请求也都添加证书认证。

三、X-Pack开启步骤

1.Minimal security配置

在elasticsearch.yml配置文件中添加如下配置:

xpack.security.enabled: true

如果你只有es只有单个节点,还可以添加如下配置:

discovery.type: single-node

重启elasticsearch:

启动日志中发现,安全认证已经启动。

执行curl localhost:9200,提示权限不够

{"error": {"root_cause": [{"type": "security_exception","reason": "missing authentication credentials for REST request [/]","header": {"WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\""}}],"type": "security_exception","reason": "missing authentication credentials for REST request [/]","header": {"WWW-Authenticate": "Basic realm=\"security\" charset=\"UTF-8\""}},"status": 401
}

内置用户配置密码:
在es进程启动的情况下,执行elasticsearch-setup-passwords工具类,为内置用户配置密码。

如果你希望手动设置密码,可以执行如下命令:

./bin/elasticsearch-setup-passwords interactive

如果你希望自动生产密码,可以执行如下命令:

./bin/elasticsearch-setup-passwords auto

执行结果如下:

Changed password for user apm_system
PASSWORD apm_system = GAkyp0bLv60B1VTqE8KHChanged password for user kibana_system
PASSWORD kibana_system = u021T4dZgwBNTeAGg4k8Changed password for user kibana
PASSWORD kibana = u021T4dZgwBNTeAGg4k8Changed password for user logstash_system
PASSWORD logstash_system = 1xSET6NRTMwuts8ey2pDChanged password for user beats_system
PASSWORD beats_system = ZgumYOBDA0RiYnv8L5WHChanged password for user remote_monitoring_user
PASSWORD remote_monitoring_user = z1joG8rlS7ZwNvB2JacjChanged password for user elastic
PASSWORD elastic = AndTGV1WmKblRS9oSILp

注意⚠️:
为elastic用户设置密码后,不能再次运行elasticsearch-setup-passwords命令。

尝试使用内置用户elastic访问:

[root@Mobile ~]# curl -X GET -u "elastic:AndTGV1WmKblRS9oSILp"  "localhost:9200/?pretty"
{"name" : "node-1","cluster_name" : "my-test","cluster_uuid" : "M5EGtEmzRQG5ri3Yy_Wpxg","version" : {"number" : "7.10.2","build_flavor" : "default","build_type" : "tar","build_hash" : "747e1cc71def077253878a59143c1f785afa92b9","build_date" : "2021-01-13T00:42:12.435326Z","build_snapshot" : false,"lucene_version" : "8.7.0","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0-beta1"},"tagline" : "You Know, for Search"
}

请求成功,说明我们的认证配置正确。

2.配置kibana

tar -zxvf kibana-7.10.2-linux-x86_64.tar.gz
##kibana进程需要和es进程通信,都采用esuser用户启动
chown -R esuser:esuser kibana-7.10.2-linux-x86_64
cd kibana-7.10.2-linux-x86_64/config
vi kibana.yml

采用cat命名查看启动的配置项:

cat kibana.yml  | egrep -v "^$|#"
server.port: 5601
server.host: "0.0.0.0"
server.name: "my-kibana"
elasticsearch.hosts: ["http://localhost:9200"]
kibana.index: ".kibana"
elasticsearch.username: "kibana_system"
elasticsearch.password: "u021T4dZgwBNTeAGg4k8"
#kibana的界面使用中文显示
i18n.locale: "zh-CN"

注意⚠️:
启用 Elasticsearch 安全功能后,用户必须使用有效的用户名和密码登录 Kibana。
您将配置 Kibana 以使用内置的 kibana_system 用户和您之前创建的密码。 Kibana 执行一些需要使用 kibana_system 用户的后台任务。
此帐户不适用于个人用户,并且无权从浏览器登录 Kibana。 相反,您将以elastic超级用户身份登录 Kibana,使用此超级用户帐户来管理空间、创建新用户和分配角色。

采用kibana-keystore存储用户密码:
1、执行create创建kibana-keystore
2、执行add命令添加elasticsearch.password密钥到kibana-keystore中
3、修改kibana.yml 配置文件,去除elasticsearch.password配置。

[esuser@Mobile bin]$ ./kibana-keystore create
Created Kibana keystore in /usr/local/test/kibana-7.10.2-linux-x86_64/config/kibana.keystore
[esuser@Mobile bin]$ ./kibana-keystore add elasticsearch.password
Enter value for elasticsearch.password: ********************
[esuser@Mobile bin]$ cd ../config/
[esuser@Mobile config]$ vi kibana.yml

切换成esuser用户,启动kibana

su esuser
./bin/kibana

后台启动,可以执行如下命令:

nohup ./bin/kibana  >>/dev/null 2>&1 &

访问服务器上kibana地址:http://192.168.100.240:5601/
使用内置用户elastic登录

登录成功:

在Management中打开开发工具界面:

GET _search
{"query": {"match_all": {}}
}



能正常进行请求操作。

3.basic security配置

在最低安全配置中添加密码保护后,您需要配置传输层安全 (TLS)。 传输层处理集群中节点之间的所有内部通信。

如果您的集群有多个节点,那么您必须在节点之间配置 TLS。 如果您不启用 TLS,生产模式集群将不会启动。

配置证书认证:
1、生成certificate authority (CA)

./bin/elasticsearch-certutil ca

说明:
可以选择输入一个ca的密码,在使用ca生成证书和私钥的时候需要用到。
集群必须验证这些证书的真实性。 推荐的方法是信任特定的证书颁发机构 (CA)。 当节点添加到您的集群时,它们必须使用由同一 CA 签署的证书。

2、生成证书和私钥
执行命令:

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

需要输入CA的密码,证书的输出位置,证书的密码

Enter password for CA (elastic-stack-ca.p12) :
Please enter the desired output file [elastic-certificates.p12]:
Enter password for elastic-certificates.p12 :


3、拷贝证书elastic-certificates.p12到集群每个节点下的ES下的config/目录中

4、集群中每个节点上配置TLS
也就是配置SSL证书

修改elasticsearch.yml配置文件,新增如下配置:

#1、配置集群名称
cluster.name: my-test
#2、配置节点名称,注意唯一性
node.name: node-1
#3、配置证书
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.client_authentication: required
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

说明:
transport的安全认证只对节点间通信有效,采用rest风格的http请求时,只受用户名、密码认证控制。

5、设置密钥库密码
如果生成证书的时候使用了密码,那么一定要执行以下命令。

./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

4.配置HTTPS

经过之前的步骤,我们实现了http请求的用户名、密码认证,
es集群节点间的ssl证书认证通信,基本能满足我们的生产环境安全要求。
如果希望加强外部http请求的网络安全,可以配置ES的HTTPS访问。

4.1 生成http证书

./bin/elasticsearch-certutil http

1、是否生成CSR,输入n
2、是否使用已经存在的CA,输入y
3、输入CA的路径,这里注意要使用绝对路径
4、输入CA的密码
5、输入证书过期时间,默认是5年
6、是给每个节点生成一个证书,还是所有节点公用一个证书。这里由于是本地测试,我选择公用一个证书,输入n
如果输入y,则会每个节点生成一个证书,每个证书拥有自己的私钥,对应自己的hostname和IP。
7、输入节点名称
8、输入hostname和IP
9、确认是否选项是否正确,输入y
10、是否开始生成证书,输入y
11、是否希望给证书设置密码,输入密码
12、生成zip文件保存的位置,默认就好
13、重复在每个节点上执行如上步骤

最后会在es的根目录,生成一个elasticsearch-ssl-http.zip文件,使用unzip命令解压后,是如下结构:

/elasticsearch
|_ README.txt
|_ http.p12
|_ sample-elasticsearch.yml
/kibana
|_ README.txt
|_ elasticsearch-ca.pem
|_ sample-kibana.yml

4.2 配置ES的https

拷贝http.p12文件到ES每个节点上的config目录中

修改elasticsearch.yml配置文件,新增如下配置:

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: http.p12

如果在生成http证书的时候设置了密码,一定要执行下面的命令保存密码到elasticsearch-keystore中。

./bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password

重启ES后,会发现原来的curl命令不可用

curl -X GET -u "elastic:AndTGV1WmKblRS9oSILp"  "http://localhost:9200/?pretty"
curl: (52) Empty reply from server

改为https还是请求失败,原因是curl命令默认不支持https请求。

 curl -X GET -u "elastic:AndTGV1WmKblRS9oSILp"  "https://localhost:9200/?pretty"
curl: (60) Peer's certificate issuer has been marked as not trusted by the user.
More details here: http://curl.haxx.se/docs/sslcerts.htmlcurl performs SSL certificate verification by default, using a "bundle"of Certificate Authority (CA) public keys (CA certs). If the defaultbundle file isn't adequate, you can specify an alternate fileusing the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented inthe bundle, the certificate verification probably failed due to aproblem with the certificate (it might be expired, or the name mightnot match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, usethe -k (or --insecure) option.

更加提示,可以通过在curl请求中添加-k的参数,关闭证书认证。

curl -X GET -k -u "elastic:AndTGV1WmKblRS9oSILp"  "https://localhost:9200/?pretty"
{"name" : "node-1","cluster_name" : "my-test","cluster_uuid" : "M5EGtEmzRQG5ri3Yy_Wpxg","version" : {"number" : "7.10.2","build_flavor" : "default","build_type" : "tar","build_hash" : "747e1cc71def077253878a59143c1f785afa92b9","build_date" : "2021-01-13T00:42:12.435326Z","build_snapshot" : false,"lucene_version" : "8.7.0","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0-beta1"},"tagline" : "You Know, for Search"
}

也可以浏览器上访问https://192.168.100.240:9200/

成功访问,说明ES的https配置成功。

4.3 配置Kibana到ES的https

1、将kibanaelasticsearch-ca.pem拷贝到kibana安装根目录下的config目录中

2、修改kibana.yml配置文件

#注意这里要使用绝对目录
elasticsearch.ssl.certificateAuthorities: /usr/local/test/kibana-7.10.2-linux-x86_64/config/elasticsearch-ca.pem
#这里改为https
elasticsearch.hosts: ["https://localhost:9200"]

3、重启kibana

lsof -i:5601
kill -9 pid
/kibana

4、尝试重新使用elastic用户登录kibana,访问正常,说明kibana到es的https请求配置成功。

4.4 配置HTTPS访问Kibana

1、生成p12证书
采用如下命令,生成p12证书

./bin/elasticsearch-certutil cert -name kibana-server -dns kibana.com,localhost,192.168.100.241

根据提示输入证书密码,这里需要注意⚠️,不能输入完全是数字的密码,一定要带有字符。

将生成的证书kibana-server.p12拷贝到kibana的config目录下

2、保存证书密码

./bin/kibana-keystore add server.ssl.keystore.password

3、修改kibana.yml配置文件
server.ssl.keystore.path: “/usr/local/test/kibana-7.10.2-linux-x86_64/config/kibana-server.p12”
server.ssl.enabled: true

4、重启kibana,使用https访问成功。

官网还有一种证书配置方式,根据csr生成crt证书。但是由于具体生成命令不清楚,没有成功。

./bin/elasticsearch-certutil csr -name kibana-server -dns kibana.com

生成csr-bundle.zip

解压 unzip csr-bundle.zip

Archive:  csr-bundle.zipcreating: kibana-server/inflating: kibana-server/kibana-server.csr  inflating: kibana-server/kibana-server.key

这里需要根据csr和key值从CA获取crt证书文件。?????

server.ssl.enabled: true
server.ssl.certificate: KBN_PATH_CONF/kibana-server.crt
server.ssl.key: KBN_PATH_CONF/kibana-server.key

四、异常记录:

问题一
keystore password was incorrect
原因:密码库密码不正确
解决:

./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

问题二:
ERROR: [1] bootstrap checks failed
[1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
原因:discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes三个配置至少要配置一个。
解决:
修改elasticsearch.yml配置文件

discovery.seed_hosts: ["127.0.0.1"]
cluster.initial_master_nodes: ["node-1"]

问题三:
启动xpack.security.enabled=true后,必须设置xpack.security.transport.ssl.enabled=true

ERROR: [1] bootstrap checks failed
[1]: Transport SSL must be enabled if security is enabled on a [basic] license. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security by setting [xpack.security.enabled] to [false]
ERROR: Elasticsearch did not exit normally - check the logs at /usr/local/test/elasticsearch-7.10.2/logs/my-test.log

解决:
修改elasticsearch.yml配置文件

xpack.security.transport.ssl.enabled=true

问题四:
failed to establish trust with server at [127.0.0.1]; the server provided a certificate with subject name [CN=Elastic Certificate Tool Autogenerated CA] and fingerprint [50757f9c9dc63ef848c122261c4ab06a78119430]; the certificate does not have any subject alternative names; the certificate is self-issued; the [CN=Elastic Certificate Tool Autogenerated CA] certificate is not trusted in this ssl context ([(shared)])
说明:
这是一个警告信息,意思是提醒证书是自行签发的; [CN=Elastic Certificate Tool Autogenerated CA] 证书在此 ssl 上下文中不受信任 ([(shared)])。对功能没有影响,可以忽略。

问题五:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
说明:
不能够发现证书路径。检测证书路径配置是否正确。


总结

主要介绍了通过开启X-Pack组件,实现对ES安全控制。
1、最初级的实现是用户名、账号
2、其次配置TLS,提升ES集群节点间的安全通信
3、最后,配置HTTPS的证书,提升所有外部http请求的安全性。

你的ES还在裸奔吗?还不赶紧开启X-Pack权限认证相关推荐

  1. 知识产权小课堂☞因未登记版权,商标被异议掉,论版权的重要性。你的商标还在裸奔吗?

    知识产权小课堂☞因未登记版权,商标被异议掉,论版权的重要性.你的商标还在裸奔吗?

  2. 裸奔的支付X聊天,你还敢用吗?

    " 一直想在社交领域突破的某付宝,却自始至终对社交功能如此的不用心,让用户的数据在网络中裸奔,使用户不寒而栗." 没错,这篇文章要说的就是BAT中A家的支付X,那个千方百计做社交的 ...

  3. 79元限抢Jeep专柜「冰丝速干裤」!穿上它让你“胯下生风”,比裸奔还爽!

    ©程序员严选 丨为您甄选全球好物 男士们的福利来了!!! 夏天穿着不透气的裤子,下半身热得彷佛是在上刑,小弟弟又痒又湿! 想拉开透透气,又怕被人发现的尴尬? 今天就给大家带来了一条冰凉透气,舒服到爆炸 ...

  4. kindle亚马逊个人文档不显示_4.68亿个人信息泄露,大数据时代裸奔?探悉不落地的文档在线预览...

    近日,江苏淮安警方通报,依法打击了7家涉嫌侵犯公民个人信息犯罪的公司,涉嫌非法缓存公民个人信息1亿多条,将公民个人信息称为"流量",将信息用于公司放贷和非法出售牟利,并公开提供收费 ...

  5. 大数据时代,如何让个人信息不再“裸奔”?

    大数据时代,海量的信息为市场走向和企业决策充当了风向标的角色,互联网思维标榜的"用户体验"也成了部分人理直气壮窃取客户信息的理由."杀熟".数据泄露等各种危害用 ...

  6. 裸奔浏览器_【大数据早报】上网=“裸奔”?单凭浏览器历史记录就能锁定身份...

    一单快递只赚2毛5,快递价格战压缩快递员收入 一位快递员在网上吐槽说,今年7月,到手派件费已降至0.4元/件,扣除短信费.电话费后,一单只能赚0.25元.快递行业的竞争愈演愈烈,不断加剧的价格战使得快 ...

  7. 网骗欺诈?网络裸奔?都是因为 HTTP?

    先跟大家讲个故事,我初恋是在初中时谈的,我的后桌的后桌.那个时候没有手机这类的沟通工具,上课交流有三宝,脚踢屁股.笔戳后背以及传纸条,当然我只能是那个屁股和后背,还不是能让初恋踢到的后背. 但是说实话 ...

  8. 0327 ARM 裸奔学习总结

    裸奔学习总结 -------yw---2010.03.27------ 使用ads开发arm ,像使单片机一样来对arm进行操作 1. ads的使用,编译环境的熟悉,以及相关下载软件,工具的使用 2. ...

  9. arm开发tq2440上的c++裸奔程序

    AVR实验做到LCD的时候,就发现proteus上没有现成合适的显示模块,网上找的模块不是按一般方法封装的,想来自己还有一块arm9开发板,大概大三.大四时候买的,已经搁置三年了.毕业这两年已经从51 ...

最新文章

  1. wait notify的使用
  2. 初入R语言,绘制heatmap图
  3. linux make编译卡死,为linux内核编译make文件时出现问题?
  4. GB 18030介绍及其与相关标准的比较-GB13000(附:Unicode规范)
  5. Java ObjectStreamField toString()方法与示例
  6. C++设计模式-代理模式
  7. 学了这几招,社交时人人都对你刮目相看(转载)
  8. 人工生命 2.0.2 更新,模拟体全息存贮的模式识别
  9. 5G的基站覆盖范围300米,今后边远地区的手机通话怎样保证?
  10. Gatech OMSCS的申请和学习之奥妙
  11. 写的将skb copy/clone后转发到源地址的一段代码
  12. vc2017 c语言运行,vc++2017下载|vc++2017运行库 32位64位 官方版 - 软件下载 - 绿茶软件园|33LC.com...
  13. C语言:一种高效、易学的编程语言
  14. Swift之利用API可用性解决App Extension无法编译
  15. 简历中尽量不要出现精通_在个人简历中,熟悉、了解、熟练、精通之间有什么区别?...
  16. runtime Method
  17. 手机话费充值api接口 话费充值功能接入
  18. C语言内存空间分布详解
  19. kvm虚拟机上安装kata
  20. 计算机锁屏之后QQ音乐停止播放了,MAC电脑如何在息屏状态下让QQ音乐能继续播放音乐...

热门文章

  1. window下基于vscode编译下载AT32工程备忘录
  2. matlab学习中遇到的一些语句(记录下来)
  3. C#自定义控件的创建
  4. win10电脑用lp地址连接共享打印机
  5. 设置 easyUi的linkbutton按钮生效 失效
  6. 2021-05-17 C#.NET面试题 PDB是什么东西? 在调试中它应该放在哪里?
  7. WDA学习笔记(二)通过页面跳转理解WDA开发流程
  8. PC端QQ上下载的文件会在哪个文件夹下呢?
  9. schedule()函数详解
  10. 6.2多线程-互斥锁/死锁