一、问题场景:Kibana权限混乱的实际泄露案例

初创公司的小A他们当时图省事,装完ELK全套后,就把Kibana的访问地址直接贴到了公司的大群里,连默认账号密码都没改,还把Kibana端口直接开在了公网。结果过了一周,负责用户运营的小美突然发现,自己上周采集到的一批用户手机号,竟然被一个陌生的外部IP下载了——查了日志才知道,有人用Elasticsearch默认的超级账号elastic和密码changeme,直接登录Kibana,把所有用户相关的日志索引全导出了。后来复盘才发现,整个ELK环境里,没人管过权限:所有团队成员都用同一个管理员账号,Kibana没开身份认证,甚至连索引的权限都没细分,只要能访问Kibana端口的人,就能查看、下载所有业务的敏感日志,整个权限配置乱得像没装锁的房门。

二、核心原因拆解:为什么Kibana权限会乱

2.1 初始配置的“懒”:直接用默认设置

很多人装Kibana的时候,就像小A那样,为了快速启动,连最基础的身份认证都没开。Elasticsearch和Kibana的默认配置里,身份认证是关闭的,默认超级账号密码还写在了官方文档的示例里——只要有人能猜到端口,就能随便进。加上很多人会忽略kibana.yml里的安全配置项,直接把Kibana端口暴露,相当于把系统的日志大门直接敞开。

2.2 索引权限的“一刀切”

小A他们还犯了个错:把所有业务日志的索引全归给了开发团队,没做细分。比如日志是按服务分索引的,order-service-*存订单日志,user-service-*存用户数据,pay-service-*存支付日志,但他们给所有人的权限都是看所有索引,结果只要有一个开发人员的账号泄露,整个敏感日志就全暴露了,而且离职员工的账号没及时删除,也是潜在隐患。

三、优化方案:ELK场景下的Kibana访问控制

我们用Elasticsearch原生的安全功能(不用额外装插件,适合中小型团队)做三层防护,从认证到角色再到审计,逐步加固。

3.1 第一步:给Kibana加身份认证(基础但关键)

先把默认的身份认证打开,换掉默认密码,别让任何人用elastic/changeme就能进。只需要修改Kibana的配置文件kibana.yml,示例如下:

# kibana.yml 配置,生产环境必须修改这些项
elasticsearch.username: "kibana_system" # Kibana内部交互用的账号,别用超级账号
elasticsearch.password: "your_strong_kibana_system_p@ssw0rd" # 强密码,至少12位,包含大小写、数字、特殊字符
# 启用X-Pack安全功能,这是Kibana权限的基础
xpack.security.enabled: true
xpack.security.enrollment.enabled: false # 生产环境关闭自动注册,防止陌生节点接入
# 只启用basic身份认证,不用其他复杂的
xpack.security.authc.providers:
  basic:
    order: 0
    enabled: true

改完配置后,重启Kibana,这时候再访问Kibana,就必须输入账号密码了,哪怕有人拿到了端口,也进不去。

3.2 第二步:细分Kibana角色,按职责权限分配

接下来要做的是把权限拆得越细越好,比如给运维团队只开放订单日志的只读权限,给开发团队开放对应服务日志的权限,管理员只给配置权限。我们通过Elasticsearch的API创建角色,示例如下(用bash命令,操作ES的bin目录执行):

# 1. 先创建订单日志只读角色,只能看order-service开头的索引
curl -X POST -u elastic:your_es_super_password "http://localhost:9200/_security/role/order_readonly" -H "Content-Type: application/json" -d '{
  "indices": [
    {
      "names": ["order-service-*"], # 匹配所有订单服务的索引,用通配符避免硬编码
      "privileges": ["read", "view_index_metadata"] # 只读权限,不能修改或删除索引
    }
  ],
  "cluster": [], # 不给集群级别的权限,比如修改集群配置
  "run_as": [] # 不能冒充其他用户
}'
# 2. 创建运维账号,绑定刚才的角色
curl -X POST -u elastic:your_es_super_password "http://localhost:9200/_security/user/dev_ops_01" -H "Content-Type: application/json" -d '{
  "password": "DevOps@2024_Strong", # 强密码,定期更换
  "roles": ["order_readonly", "kibana_user"], # 关联Kibana的基础用户角色,能登录Kibana
  "full_name": "DevOps Team Member",
  "email": "devops@example.com"
}'

这样运维账号就只能看订单日志,看不到用户的手机号,就算账号泄露,也不会有大问题。

3.3 第三步:开启Kibana的审计日志,追溯访问行为

最后要加审计,谁什么时候访问了Kibana,看了哪些索引,都要记下来,出问题能快速溯源。修改kibana.yml的审计配置:

# kibana.yml 审计配置,生产环境必须开启
xpack.security.audit.enabled: true
# 审计日志存到本地文件,权限设为只有Kibana进程能读,防止被篡改
xpack.security.audit.appender.type: file
xpack.security.audit.appender.file.path: /var/log/kibana/audit.log
# 记录所有登录操作,包括成功的,方便排查异常
xpack.security.audit.ignore_successful_logins: false
# 记录所有索引访问操作,比如查看、下载
xpack.security.audit.events:
  - access_denied
  - access_granted
  - login_failure
  - login_success

配置完后,审计日志会自动记录所有操作,比如哪天有陌生IP尝试登录,都能查到。

四、优化后的场景优势和注意事项

优化后的ELK环境,优势很明显:第一,权限细分,每个团队只能看自己职责内的日志,就算有账号泄露,也影响不到敏感数据;第二,有审计日志,能快速排查异常访问;第三,基础认证开启,把外部陌生人挡在门外。 但还有几个注意事项要牢记:一是永远不要把Kibana端口直接暴露到公网,要用VPN或者跳板机访问,或者加一层Nginx的Basic Auth;二是超级账号elastic别随便给人,只有管理员能用来做权限配置;三是定期清理离职员工的账号,删除不用的角色;四是审计日志要定期备份,不能随便删除,至少存6个月以上,满足合规要求。

五、总结

Kibana权限混乱导致敏感日志泄露,本质上是忽略了“最小权限原则”——给每个人的权限超过了实际需要,而且没做任何防护。通过基础认证、角色细分、审计日志这三步,就能把ELK环境的日志安全加固好,哪怕是中小型团队,不用复杂的架构,也能避免这类泄露事件。