集群身份认证需要跟集群内部安全通信一起配置不然会报错 一、集群身份认证 在elasticsearch.yml配置文件中加入 xpack.security.enabled: true 二、集群内部安全通信 1.生成证书 为Elasticsearch集群创建一个证书颁发机构。 bin/elasticsearch-certutil ca 2.为集群中的每个节点生成证书和私钥 bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 可以在创建过程中加入密码 3.将证书拷贝到elasticsearch的每个节点下面config/certs目录下 elastic-certificates.p12 4.配置elasticsearch.yml文件 xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
5.如果在创建证书的过程中加了密码,需要将你的密码加入到你的Elasticsearch keystore中去。每个节点都需要 bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_passwo
三、给认证的集群创建用户密码所有机器 bin/elasticsearch-setup-passwords interactive
通过第三步,可以给ES中许多内置的用户创建密码 • elastic 账号:拥有 superuser 角色,是内置的超级用户。 • kibana 账号:拥有 kibana_system 角色,用户 kibana 用来连接 elasticsearch 并与之通信。Kibana 服务器以该用户身份提交请求以访问集群监视 API 和 .kibana 索引。不能访问 index。 • logstash_system 账号:拥有 logstash_system 角色。用户 Logstash 在 Elasticsearch 中存储监控信息时使用。 • beats_system账号:拥有 beats_system 角色。用户 Beats 在 Elasticsearch 中存储监控信息时使用。 elastic是超级用户,它可以做任何事情 四、在Kibana中设置登录ES的用户 我们可以首先给Kibana配置上超级用户elastic,这样可以使用Kibana给ES集群配置不同的用户与角色。 • 角色:我们可以给ES中的角色,赋予对不同索引的不同的读写权限。 • 用户:我们可以将不同角色,赋予用户。 有两种方式使kibana访问ES集群。 • 在Kibana.yml中配置 elasticsearch.username: “xxx” elasticsearch.password: “xxx” • 使用Kibana.keystore bin/kibana-keystore create bin/kibana-keystore add elasticsearch.name bin/kibana-keystore add elasticsearch.password #删除 bin/kibana-keystore remove xxxx 登录Kibana设置角色跟用户
我们可以看到security下一个为设置用户一个为设置角色。 更多可查看 https://www.elastic.co/cn/blog/getting-started-with-elasticsearch-security 5.使用python连接设置好用户验证的ES集群 使用elasticsearch库 class ElasticSearchClient(object): # TODO:实例和事务化单个node,若需要多个node,需要重构代码 def init(self): self.es_servers = [{ “host”: ‘xx.xx.141.141’, “port”: ‘9200’ }] self.es_client = elasticsearch.Elasticsearch(hosts=self.es_servers,http_auth=(“xxxx”, “xxxx”))#加入http_auth=(“用户名”,“密码”) # TODO:进行创建一个数据库,即index def create_es_index(self, index_name): self.es_client.indices.create(index=index_name)
# TODO:进行删除一个数据库,即index def delete_es_index(self, index_name): self.es_client.indices.delete(index=index_name)