ELK从7.x开始就内置了x-pack的安全鉴权机制,不用单独付费购买了。因此,可以直接在es中配置登录用户名和密码,以增强系统安全性。

需要说明的是,kibana实际使用的是es的内置账户,所以配置kibana账号其实就是配置es的账号。

一、运行环境

es和kibana都采用docker安装,docker-compose.yml如下:

version: '3'
services:
  es-data-node:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.11.1
    container_name: es-data-node
    hostname: data-node1
    environment:
      - cluster.name=escluster
      - node.name=data-node1
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms5g -Xmx5g"
      - network.publish_host=172.30.0.9
      - discovery.seed_hosts=172.30.0.9:9300
      - cluster.initial_master_nodes=172.30.0.9
      - http.port=9200
      - transport.tcp.port=9300
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - /data/es/data/datanode:/usr/share/elasticsearch/data:rw
    user: "1001"
    privileged: true
    network_mode: "host"
 
  kibana:
    image: docker.elastic.co/kibana/kibana:7.11.1
    container_name: kibana
    network_mode: "host"
    user: "1001"
    privileged: true
    volumes:
      - /data/es/data/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml

安装过程略。

二、配置elasticsearch

1.启用安全设置

进入docker容器,修改elasticsearch.yml:

[root@server]# docker exec -it es-data-node bash
bash-4.4$ cd config
bash-4.4$ vi elasticsearch.yml

 新增如下内容并保存退出:

http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

 2.重启es

docker-compose restart es-data-node

3.设置es密码

按步骤1的方式进入容器,并执行以下命令:

bash-4.4$ cd bin
bash-4.4$ ./elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y

Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana]:
Reenter password for [kibana]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

bash-4.4$ 

在交互命令行依次输入各内置账号的密码,切记找地方记录好!!!

elastic:是es的管理账号,从kibana的登录界面登录就用这个账号

kibana:是es授权kibana进行接口调用的账号,需要配置在后面的kibana.yml中


三、配置kibana

从docker-compose.yml可看出,我们是将kibana的配置文件映射到宿主机的,因此可直接打开对应的文件/data/es/data/kibana/kibana.yml进行编辑,追加用户名和密码的内容:

server.name: kibana
server.host: "0"
server.basePath: "/kibana"
elasticsearch.hosts: [ "http://172.30.0.9:9200" ]
#xpack.monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"

elasticsearch.username: "kibana"
elasticsearch.password: "123456"

题外话:这里的kibana部署在内网,通过ng代理,增加了访问路径上下文kibana,因此这里有个server.basePath: "/kibana"路径,与ng的location一致

重启kibana:

docker-compose restart kibana

此时,访问kibana首页,就会给出类似以下登录界面了:

 

四、nginx代理内网kibana,并免密登录

kibana的dashboard功能非常丰富,在一些场景下我们需要直接将其分享的仪表盘以iframe方式嵌入到业务系统中,但业务系统已经登录了一次了,再嵌入的dashboard又需要登录一次,用户体验不太好,因此需要进行“免密”代理

这里提供一个nginx代理授权header头的方式,配置如下:

   	location ^~ /kibana  {
        proxy_pass   http://localhost:5601/;
		proxy_set_header  Host $host;
		proxy_set_header  X-Real-IP $remote_addr;
		proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header  Authorization "Basic base64(username:password)";
		rewrite ^/kibana/(.*)$ /$1 break;
	}

其中的base64(username:password)是   用户名:密码  的base64格式,可在系统下直接输入命令获得:

echo -n kibana:123456 | base64

重启ng后就可直接内嵌到业务系统了

 

五、新的问题

爱动脑筋的小朋友又会问了,既然通过ng代理后可免密进入kibana,那和之前没有设置密码不又一样了吗?

是的,这样的配置相当于还是把kibana直接暴露出去啦~

怎么解决呢?且听下回分解~

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐