【Elasticsearch】ロールを追加してみる

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

## ロールについて
ユーザーに対して適切な権限を割り当てて、ユーザーが必要なリソースのみにアクセスできるようにする。
簡単に言うと、できることをリストに纏めたもののようなイメージ。
リストはいろんなパターンでいくつも作る事ができる。
そのリストをユーザーに割り当てて、リストに書かれている操作のみが実行できるようになる。
![スクリーンショット 2023-05-10 18.28.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572072/b4e3d0dd-d8b9-d75b-2bea-5ff974b4cd79.png)

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

## curlでのロール追加
下記のコマンドを利用して`readwrite`という名前のロールを作成します。
``` bash
curl -u 'user:password' POST 'localhost:9200/_security/role/readwrite' -H 'Content-Type: application/json' -d'
{
  "indices" : [
    {
      "names" : [ "index1", "index2" ],
      "privileges" : [ "read", "write" ]
    }
  ]
}'
curl: (6) Could not resolve host: POST
{"role":{"created":true}}%          
```
`indices`
indices権限リスト。
`names`
適用されるインデックス（またはインデックス名のパターン）のリスト。
`privileges`
ロールの所有者が指定されたインデックスに対して持つインデックスレベルの権限。
指定できる値は[Indices privileges](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-privileges.html#privileges-list-indices)で確認できる。

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

``` bash
curl -u 'user:password' GET 'localhost:9200/_security/role/readwrite?pretty'
curl: (6) Could not resolve host: GET
{
  "readwrite" : {
    "cluster" : [ ],
    "indices" : [
      {
        "names" : [
          "index1",
          "index2"
        ],
        "privileges" : [
          "read",
          "write"
        ],
        "allow_restricted_indices" : false
      }
    ],
    "applications" : [ ],
    "run_as" : [ ],
    "metadata" : { },
    "transient_metadata" : {
      "enabled" : true
    }
  }
}
```

## Kibanaでのロール追加（Kibana→Dev Tools→Console）
KibanaのConsoleにて下記を実行する。
``` bash
POST /_security/role/readwrite
{
  "indices" : [
    {
      "names" : [ "index1", "index2" ],
      "privileges" : [ "read", "write" ]
    }
  ]
}
```
実行して問題なければ下記のようなレスポンスが返ってくる
``` bash
{
  "role": {
    "created": true 
  }
}
```

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

下記のようなレスポンスが返ってくる
``` bash
{
  "readwrite": {
    "cluster": [],
    "indices": [
      {
        "names": [
          "index1",
          "index2"
        ],
        "privileges": [
          "read",
          "write"
        ],
        "allow_restricted_indices": false
      }
    ],
    "applications": [],
    "run_as": [],
    "metadata": {},
    "transient_metadata": {
      "enabled": true
    }
  }
}
```
## 【おまけ】更新する場合
curl、Consoleどちらも同じ対応となります。
具体的には、同じコマンドで更新箇所だけを変更して叩きます。
例えば下記のロールを作ります。
``` bash
POST /_security/role/readwrite
{
  "indices" : [
    {
      "names" : [ "index1", "index2" ],
      "privileges" : [ "read", "write" ]
    }
  ]
}
```
やっぱり`index2`の権限は不要だとなった場合には下記を実行する
``` bash
POST /_security/role/readwrite
{
  "indices" : [
    {
      "names" : [ "index1" ], # index2を削除
      "privileges" : [ "read", "write" ]
    }
  ]
}
```
レスポンスに`index2`が無いことを確認
``` bash
{
  "readwrite": {
    "cluster": [],
    "indices": [
      {
        "names": [
          "index1"
        ],
        "privileges": [
          "read",
          "write"
        ],
        "allow_restricted_indices": false
      }
    ],
    "applications": [],
    "run_as": [],
    "metadata": {},
    "transient_metadata": {
      "enabled": true
    }
  }
}
```

## 参考
- [Built-in roles](https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-roles.html)
- [Create or update roes API](https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-put-role.html)