跳到主内容

ELK

概述​

Kibana 自带的 SSO 选项(OAuth、OIDC、SAML、LDAP)属于 Elastic Stack 的付费订阅。要免费用 Casdoor 保护 Kibana,在它前面放下面其中一个:

elk-auth-casdoorcasdoor-forward-auth
是什么反向代理:浏览器访问它,它再转发给 Kibanaforward auth 服务:你现有的反向代理(Nginx、Traefik、Caddy)对每个请求都会询问它
你需要不需要其他组件Nginx、Traefik 或 Caddy
主机只需要 Kibana 的主机除 Kibana 的主机外,还需要一个认证服务的主机(例如 auth.example.com),两者共用 Cookie 域
适合用最少的组件保护单个 Kibana已经有反向代理的环境,或者多个服务共用一个登录

两者都会把没有会话的用户送到 Casdoor 登录页,校验访问令牌,并通过 X-Forwarded-User 请求头把已登录用户传给 Kibana。

第 1 步:配置 Casdoor 应用​

  1. 在 Casdoor 中创建或编辑一个应用。
  2. 把回调地址加到 Redirect URLs:
    • elk-auth-casdoor:https://kibana.example.com/casdoor-auth/callback
    • casdoor-forward-auth:https://auth.example.com/callback
  3. 记下 Client ID 和 Client secret。

下面的示例中,Kibana 通过 https://kibana.example.com 提供服务,监听 127.0.0.1:5601。

方案 A:elk-auth-casdoor​

第 2 步:配置 elk-auth-casdoor​

把应用所用证书的公钥证书(Casdoor 的 Certs 页面)保存为 conf/token_jwt_key.pem,并创建 conf/config.json:

{
"listenAddr": ":8080",
"pluginEndpoint": "https://kibana.example.com",
"targetEndpoint": "http://127.0.0.1:5601",
"casdoorEndpoint": "https://door.casdoor.com",
"clientId": "<client ID>",
"clientSecret": "<client secret>",
"certificateFile": "conf/token_jwt_key.pem",
"organization": "<organization of the application>",
"application": "<application name>"
}
  • pluginEndpoint 是用户在浏览器中输入的公网地址;targetEndpoint 是 elk-auth-casdoor 访问 Kibana 的地址。
  • 只有 organization 中的用户才能登录。
  • 如果启用了 Elasticsearch 安全功能、Kibana 要求自己的登录,把 upstreamUsername 和 upstreamPassword 设为一个 Kibana 用户;elk-auth-casdoor 会对所有通过 Casdoor 登录的人用 basic auth 把它们发给 Kibana。

全部设置见 elk-auth-casdoor README。

第 3 步:运行 elk-auth-casdoor​

docker run -d --name elk-auth-casdoor --network host \
-v "$PWD/conf:/app/conf" \
-e SESSION_SECRET=<random string of at least 32 characters> \
ghcr.io/casdoor/elk-auth-casdoor:latest

SESSION_SECRET 用于签名会话 Cookie;重启时保持不变,否则所有人都会被登出。在 8080 端口前终结 TLS(或者把 elk-auth-casdoor 放在负载均衡后面),让用户通过 pluginEndpoint 访问。

打开 https://kibana.example.com。你会被跳转到 Casdoor,登录后就能看到 Kibana。 /casdoor-auth/logout 用于退出 elk-auth-casdoor。

方案 B:casdoor-forward-auth 配合 Nginx​

第 2 步:运行 casdoor-forward-auth​

docker run -d --name casdoor-forward-auth -p 9999:9999 \
-e CASDOOR_ENDPOINT=https://door.casdoor.com \
-e CLIENT_ID=<client ID> \
-e CLIENT_SECRET=<client secret> \
-e EXTERNAL_URL=https://auth.example.com \
-e COOKIE_DOMAIN=example.com \
-e COOKIE_SECRET=<random string of at least 32 characters> \
ghcr.io/casdoor/casdoor-forward-auth:latest

COOKIE_DOMAIN 必须同时覆盖 auth.example.com 和 kibana.example.com,这样登录后设置的会话 Cookie 才会发送到 Kibana 的主机。全部设置见 配置。

第 3 步:配置 Nginx​

Nginx 的 auth_request 模块会对每个请求调用 casdoor-forward-auth 的 /verify,返回 401 时跳转到登录:

server {
listen 443 ssl;
server_name auth.example.com;
# ssl_certificate ...

location / {
proxy_pass http://127.0.0.1:9999;
proxy_set_header Host $host;
}
}

server {
listen 443 ssl;
server_name kibana.example.com;
# ssl_certificate ...

location = /_casdoor_verify {
internal;
proxy_pass http://127.0.0.1:9999/verify;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
}

location @casdoor_login {
return 302 https://auth.example.com/login?rd=$scheme://$http_host$request_uri;
}

location / {
auth_request /_casdoor_verify;
error_page 401 = @casdoor_login;

auth_request_set $casdoor_user $upstream_http_x_forwarded_user;
proxy_set_header X-Forwarded-User $casdoor_user;

proxy_pass http://127.0.0.1:5601;
proxy_set_header Host $host;
}
}

重新加载 Nginx,打开 https://kibana.example.com。你会被跳转到 Casdoor,登录后就能看到 Kibana。

使用 Traefik 时,按 Traefik 指南操作,把 Kibana 作为受保护的服务;使用 Caddy 时,见 casdoor-forward-auth README。

禁止直接访问 Kibana​

无论用哪种方案,Kibana 都必须只能通过代理访问。把它绑定到 localhost(kibana.yml 中设置 server.host: "127.0.0.1"),或在防火墙中封掉 5601 端口,否则任何人都能直接连接 Kibana 绕过登录。