--- title: Elasticsearch 結合realm + LDAP tags: Elasticsearch description: View the slide with "Slide Mode". --- # Elasticsearch 結合realm + LDAP 出處:[User Impersonation with X-Pack: Integrating Third Party Auth with Kibana](https://www.elastic.co/blog/user-impersonation-with-x-pack-integrating-third-party-auth-with-kibana) ## 簡介 - X-Pack Security 提供 authentication and authorization via RBAC - authentication:認證,透過Elasticsearch原生的realm來做管理 - authorization:有哪些權限 ## 架構流程 To do so, I’ll be using Bitly’s [oauth2_proxy](https://github.com/bitly/oauth2_proxy) to handle the Google authentication layer and [Nginx](https://www.nginx.com/resources/wiki/) to pass the necessary* headers to Kibana. My overall architecture will look something like this: ![](https://i.imgur.com/u3DnX7A.png) :::success The above configuration will only work in Kibana 5.x or later. This is because we’ve implemented an additional way to trigger a login event by passing basic auth headers (<font color=red>rather than entering credentials in the Security UI login screen</font>). K 5.x also allows you to <font color=red>whitelist headers</font>, which allows us to pass our special “run as” header. ::: ## 實作拉 ### 1. `kibana.yml` ```yaml= elasticsearch.requestHeadersWhitelist: [ es-security-runas-user, authorization ] xpack.monitoring.elasticsearch.requestHeadersWhitelist: [ es-security-runas-user, authorization ] ``` - [Submitting requests on behalf of other users](https://www.elastic.co/guide/en/elasticsearch/reference/current/run-as-privilege.html#run-as-privilege) >[name=昱齊]等於說,其實沒有靠user的account和password登入,只要user通過第一層LDAP的認證,就直接允許以`es-security-runas-user`進去 ### 2. 建立`nginx` role來控管 - role底下,要用`run_as`來涵蓋所有以`LDAP`登入的user - 再建立一個nginx user,來給Nginx proxy 用的 - 透過`run_as`來模仿 users ```htmlmixed= curl -u elastic:changeme -XPOST "http://localhost:9200/_xpack/security/role/nginx" -H 'Content-Type: application/json' -d' { "run_as": ["user1"] }' curl -u elastic:changeme -XPOST "http://localhost:9200/_xpack/security/user/nginx" -H 'Content-Type: application/json' -d' { "password" : "secretpassword", "roles" : ["nginx"], "full_name" : "Service Account" }' ``` - 如果有更多user要登入,就要透過API去調整擴充`nginx`的`run_as`權限 >[name=昱齊]能不能不要用nginx,直接傳遞user >[name=昱齊]這樣必須要新增user,以及調整nginx的權限 ### 3. oauth套件使用 ```bash= $ ./oauth2_proxy \ --email-domain="elastic.co" \ --upstream="http://127.0.0.1:8080/" \ --approval-prompt="auto" \ --redirect-url="http://localhost:4180/oauth2/callback" \ --cookie-secret=secretsecret \ --cookie-name="_oauth2_proxy" \ --cookie-secure=false \ --provider=google \ --client-id="<your client id from your google project>" \ --client-secret="<your client secret from your google project>" ``` >[name=昱齊] 與nginx對接的參數是哪一個 -> upstream="http://127.0.0.1:8080/" ### 4. 調整`nginx.conf` ```json= server { listen 8080; server_name localhost; location / { # The location of our Kibana server (this is default) proxy_pass http: //localhost:5601/; # Send a Basic auth header to Kibana on every request to get past the log - in UI. # "bmdpbng6c2VjcmV0cGFzc3dvcmQ="is a base64 encoded string of my service account 's credentials "nginx:secretpassword" proxy_set_header Authorization "Basic bmdpbng6c2VjcmV0cGFzc3dvcmQ="; # Also submit the 'es-security-runas-user'header on every request with a value of X - Forwarded - User sent from the downstream oauth2_proxy. # X-Forwarded-User would be 'user1' if the Google account was user1 @elastic.co proxy_set_header es-security-runas-user $http_x_forwarded_user; # Simple rewrite to get us back to oauth2_proxy 's login page if someone uses Kibana's Logout button. rewrite /login http: //localhost:4180/oauth2/sign_in redirect; } } ``` - `proxy_set_header` es-security-runas-user $http_x_forwarded_user; ### 缺點 - 登入的kibana 介面,user顯示上會是nginx,不過在audit log上會是`userXXX` - 這邊介紹的登入方式是使用oauth,要找到LDAP的UI login介面,然後要使後面的`nginx`對接 ![Uploading file..._cweza2rwj]() >[name=昱齊]假設nginx role裡面的`run_as`已經有user1和user2,在哪裡決定是以user1進行操作呢,會不會看得到user2的index >[name=昱齊] 在nginx裡面的 `proxy_set_header es-security-runas-user $http_x_forwarded_user; ` 傳遞user account ### 調整 - 將create User這件事,以batch腳本執行,定期去與LDAP user資料庫同步 - 也提供手動create User API - 找到LDAP的UI - 如何讓LDAP把資料拋給後面的nginx ## [LDAP版本](https://mapr.com/blog/how-secure-elasticsearch-and-kibana/)