【Elasticsearch】ユーザーを追加してみる

## 環境
以下を参考に環境構築を行う。
[【Elasticsearch】DockerでElasticsearchを使えるようにする](https://qiita.com/dai_chi/items/90497e17b387626be466)

## ユーザーについて

自身で作成するユーザーの他に、ElasticStackではデプロイメント作成時にデフォルトで（既存で作成されている）ユーザーがいくつか存在します。
[Built-in users](https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-users.html#built-in-users)に詳細は纏められています。
それぞれの用途について別の機会に纏めます。

## curlでのユーザー追加
下記のコマンドを利用して`jacknich`という名前のユーザーを作成します。
``` bash
curl -u 'user:password' -X POST "localhost:9200/_security/user/jacknich?pretty" -H 'Content-Type: application/json' -d'
{
  "password" : "l0ng-r4nd0m-p@ssw0rd",
  "roles" : [ "admin", "other_role1" ],
  "full_name" : "Jack Nicholson",
  "email" : "jacknich@example.com",
  "metadata" : {
    "intelligence" : 7
  }
}
'
{
  "created" : true
}
```

確認方法は下記のコマンドを実行します。
`?pretty`はレスポンスを見やすく整形するためにつけてます。

``` bash
curl -u 'user:password' GET 'localhost:9200/_security/user/jacknich?pretty'
curl: (6) Could not resolve host: GET
{
  "jacknich" : {
    "username" : "jacknich",
    "roles" : [
      "admin",
      "other_role1"
    ],
    "full_name" : "Jack Nicholson",
    "email" : "jacknich@example.com",
    "metadata" : {
      "intelligence" : 7
    },
    "enabled" : true
  }
}
```

## Kibanaでのユーザー追加（Kibana→Dev Tools→Console）
KibanaのConsoleにて下記を実行する。
``` bash
POST /_security/user/jacknich
{
  "password" : "l0ng-r4nd0m-p@ssw0rd",
  "roles" : [ "admin", "other_role1" ],
  "full_name" : "Jack Nicholson",
  "email" : "jacknich@example.com",
  "metadata" : {
    "intelligence" : 7
  }
}
```

実行して問題なければ下記のようなレスポンスが返ってくる
``` bash
{
  "created": true
}
```

確認方法は下記を実行する
``` bash
GET /_security/user/jacknich
```

下記のようなレスポンスが返ってくる
``` bash
{
  "jacknich": {
    "username": "jacknich",
    "roles": [
      "admin",
      "other_role1"
    ],
    "full_name": "Jack Nicholson",
    "email": "jacknich@example.com",
    "metadata": {
      "intelligence": 7
    },
    "enabled": true
  }
}
```

## 【おまけ】更新する場合
curl、Consoleどちらも同じ対応となります。
具体的には、同じコマンドで更新箇所だけを変更して叩きます。
例えば下記のユーザーを作ります。
``` bash
POST /_security/user/jacknich
{
  "password" : "l0ng-r4nd0m-p@ssw0rd",
  "roles" : [ "admin", "other_role1" ],
  "full_name" : "Jack Nicholson",
  "email" : "jacknich@example.com",
  "metadata" : {
    "intelligence" : 7
  }
}
```

やっぱり`other_role1`の権限は不要だとなった場合には下記を実行する
``` bash
POST /_security/user/jacknich
{
  "password" : "l0ng-r4nd0m-p@ssw0rd",
  "roles" : [ "admin" ],
  "full_name" : "Jack Nicholson",
  "email" : "jacknich@example.com",
  "metadata" : {
    "intelligence" : 7
  }
}
```

レスポンスに`other_role1`が無いことを確認
``` bash
{
  "jacknich": {
    "username": "jacknich",
    "roles": [
      "admin"
    ],
    "full_name": "Jack Nicholson",
    "email": "jacknich@example.com",
    "metadata": {
      "intelligence": 7
    },
    "enabled": true
  }
}
```

## 参考
[Create or update users API](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-put-user.html)
[Get users API](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-get-user.html)
[Enable users API](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-enable-user.html)
[Disable users API](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-disable-user.html)