0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Open Distro ユーザ自身のパスワード変更

Last updated at Posted at 2019-07-06

Open Distro の REST APIでの変更

REST API権限のないユーザで、Kibana consoleで自身のパスワードを変更しようと

PUT _opendistro/_security/api/internalusers/<ユーザ名>
{
 "password": "パスワード"
}

を実行しても

{
  "status": "FORBIDDEN",
  "message": "No permission to access REST API: User <ユーザ名> with Open Distro Security Roles [<ロール名>, own_index] does not have any role privileged for admin access. No client TLS certificate found in request"
}

権限がないとエラーになります。

  • <ロール名>は、今ログインしているアカウントとマッピングされているロール名が表示されます。

opendistro-for-elasticsearch/security の issueにEnhancementとして登録されてますが、いつ対応されるかはわからないです。
https://github.com/opendistro-for-elasticsearch/security/issues/47

REST APIは、ロール単位にアクセス制御できます。
https://opendistro.github.io/for-elasticsearch-docs/docs/security-access-control/api/#access-control-for-the-api

elasticsearch.yml に以下のような記述があり、all_access, security_rest_api_access ロールに対して許可をしています。

elasticsearch.yml
 :
opendistro_security.restapi.roles_enabled: ["all_access", "security_rest_api_access"]
 :

ここで指定するとすべてのAPIが利用可能になります。
また、endpoint単位に無効化できるメソッドを指定できます。

elasticsearch.yml
 :
opendistro_security.restapi.endpoints_disabled.<role>.<endpoint>: ["<method>", ...]
 :

自身のパスワード変更だけなので、internalusersへのPUTだけ許可すればよさげです。

elasticsearch.yml
 :
opendistro_security.restapi.endpoints_disabled.<role>.ACTIONGROUPS: ["GET", "PUT","POST","DELETE","PATCH"]
opendistro_security.restapi.endpoints_disabled.<role>.ROLES: ["GET", "PUT","POST","DELETE","PATCH"]
opendistro_security.restapi.endpoints_disabled.<role>.ROLESMAPPING: ["GET", "PUT","POST","DELETE","PATCH"]
opendistro_security.restapi.endpoints_disabled.<role>.INTERNALUSERS: ["GET", "POST","DELETE","PATCH"]
opendistro_security.restapi.endpoints_disabled.<role>.CONFIG: ["GET", "PUT","POST","DELETE","PATCH"]
opendistro_security.restapi.endpoints_disabled.<role>.CACHE: ["GET", "PUT","POST","DELETE","PATCH"]
opendistro_security.restapi.endpoints_disabled.<role>.LICENSE: ["GET", "PUT","POST","DELETE","PATCH"]
opendistro_security.restapi.endpoints_disabled.<role>.SYSTEMINFO: ["GET", "PUT","POST","DELETE","PATCH"]
 :

1アカウント1ロールなら問題ないのですが、複数アカウントだと他人のパスワードまで変更できてしまうのは、ちょっとだめかな。
1アカウント1ロールの場合は、ロール増える毎に定義追加とかも面倒。

Pluginの中で、REST APIにアクセスできるアカウントに変身してごまかしてみる

ということでpluginの中で変身すればよくね、ということで作ってみる。

https://www.elastic.co/guide/en/kibana/current/development-elasticsearch.html
ここにあるadminは、Kibanaの状態を管理するアカウント。こいつのロールにPUTだけ追加すればいいと。。

example.js
  const {callWithInternalUser} = server.plugins.elasticsearch.getCluster('admin');
  const {callWithRequest} = server.plugins.elasticsearch.getCluster('data');

   :
//var username = _opendistro/_security/authinfo で、現在のセッションの情報から取得
//var userPassword = クライアントから送られてきたパス。;
   :
        await callWithInternalUser('transport.request', {
            method: "PUT",
            path: "_opendistro/_security/api/internalusers/" + username,
            body: { password : userPassword }
          }
        ).then(function(resp){
           // なんか処理
        });

のような感じでできるのではないかと思われます。

adminのロールはなんだ。。。。このadminはOpen Distroのadminではなく、Kibanaの状態管理アカウントらしい。

kibana.yml
 :
elasticsearch.username: kibanaserver
elasticsearch.password: kibanaserver
 :

とあるので、kibanaserverのロール。
OpenDistroでkibanaserverは、kibana_serverにマッピングされてるからこいつに許可を追加。

elasticsearch.yml
 :
opendistro_security.restapi.roles_enabled: ["all_access", "security_rest_api_access", "kibana_server"]
 :
opendistro_security.restapi.endpoints_disabled.kibana_server.ACTIONGROUPS: ["GET", "PUT","POST","DELETE","PATCH"]
opendistro_security.restapi.endpoints_disabled.kibana_server.ROLES: ["GET", "PUT","POST","DELETE","PATCH"]
opendistro_security.restapi.endpoints_disabled.kibana_server.ROLESMAPPING: ["GET", "PUT","POST","DELETE","PATCH"]
opendistro_security.restapi.endpoints_disabled.kibana_server.INTERNALUSERS: ["GET", "POST","DELETE","PATCH"]
opendistro_security.restapi.endpoints_disabled.kibana_server.CONFIG: ["GET", "PUT","POST","DELETE","PATCH"]
opendistro_security.restapi.endpoints_disabled.kibana_server.CACHE: ["GET", "PUT","POST","DELETE","PATCH"]
opendistro_security.restapi.endpoints_disabled.kibana_server.LICENSE: ["GET", "PUT","POST","DELETE","PATCH"]
opendistro_security.restapi.endpoints_disabled.kibana_server.SYSTEMINFO: ["GET", "PUT","POST","DELETE","PATCH"]
 :

とりあえず、Pluginでパスワード変更はできたので、
動きの理解はあっているようです。
今のところの回避策その1。。。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?