お金をかけずにサーバーの勉強をしよう

OpenSearchのユーザー追加

2024年10月30日
メニューへ戻る

OpenSearchに一般ユーザーを作ります。

OpenSearchインストール」でデータベースが動くようにし、
OpenSearch Dashboardsインストール」で、ダッシュボードも使えるようになりました。

しかし、OpenSearchをユーザーレベルで使うには道半ばです。

ここでは OpenSearch Dashboardsを使って、OpenSearchに一般ユーザーの追加を行いたいと思います。
プログラミング言語などからの利用には一般ユーザーがないと管理が仕切れませんからね。

OpenSearchのドキュメントの「Users and roles」のページに、

Unless you need to create new reserved or hidden users, we highly recommend using OpenSearch Dashboards or the REST API to create new users, roles, and role mappings. The .yml files are for initial setup, not ongoing use.

と注意があります。

設定用の YAMLファイルでもできますが、OpenSearch Dashborardsを使うことにします。


では、まず OpenSearch Dashboardsに [admin]ユーザーでログインしましょう。
パスワードは、私の環境ではインストール時に設定した「Subro38manager-」です。
OpneSearch Dashboards 1

左上のを開くとメニューが展開されますので、[Management] → [Security] と選択します。
OpneSearch Dashboards 2

新規に一般ユーザー [subro] を作ります。

[Internal users]を選択します。
OpneSearch Dashboards 3

Create internal userを押します。
OpneSearch Dashboards 4

新規ユーザー名とパスワードを入力します。
OpneSearch Dashboards 5

一番下にあるCreateを押します。
OpneSearch Dashboards 6

[subro]ユーザーができました。
OpneSearch Dashboards 7

[subro]ユーザーにはまだ何の権限も付けてないので、何もできません。
「ロール」という複数の権限の入れ物を付与することで、作業ができるようになります。

ロールを 1から作るのも可能ですが、デフォルトで存在しているロールを利用するのが一般的でしょう。
既にあるロールをコピーして、独自ロールを作のが良いです。

[Roles]を選択します。
OpneSearch Dashboards 8

デフォルトで組み込まれている [own_index]ロールはユーザー自身が作った Indexに対してのフル権限です。
OpneSearch Dashboards 9

この [own_index]ロールを使いたいのですが、[Index permissions]列(どういう名前のインデックス(テーブル)に対しての権限なのか)に、[${user_name}] と定義されています。
[${user_name}]はユーザー名に変換される変数ですので、私の場合は [subro] になります。
つまり [subro]という名前のインデックスだけのフル権限になってしまいます。

インデックスは一杯作りたいのであって、これでは使えたものではありません。
これをベースにどんな名前のインデックスでも OKなロールを作ります。

[own_index]ロールにチェックを入れ、右上にあるActionsを押すとメニューが出ますので、[Duplicate]を選択すると複製を作れます。
OpneSearch Dashboards 10

ロール名は「own_index_full」にしました。
OpneSearch Dashboards 11

${user_name}は×で消して、
OpneSearch Dashboards 12

空になったら「*」と入れてからEnterでこうなります。
OpneSearch Dashboards 13

一番下にあるCreateを押します。
OpneSearch Dashboards 14

[own_index_full]ロールができました。
[subro]ユーザーをこのロールに紐付けるため、マップという作業を行います。
[Mapped users]タブを選択します。
OpneSearch Dashboards 15

Manage mappingを押します。
OpneSearch Dashboards 16

[Users]行が空になっていてそこをフォーカスすると、ユーザー一覧からユーザーを選べるようになります。
[subro]ユーザーを選びます。
OpneSearch Dashboards 17

[subro]ユーザーが選ばれた状態です。
OpneSearch Dashboards 18

一番下にあるMapを押します。
OpneSearch Dashboards 19

こんな風になりまして完了です。
OpneSearch Dashboards 20

これで OpenSearchサーバー側のパーミッションの設定は良いはずです。


[subro]ユーザーを使ってインデックスを作ってみます。

curlが使えるならどこからでも構いません。
外部からのアクセスが可能かどうかの確認も含めて、私のクライアントPCの Lubuntu 24.04からやってみました。

[test_index]インデックスを作成して、1件だけデータを投入します。
(私の好みで結果のパースに jqコマンドを使っています。)

subro@Lubuntu2404:~$ curl -s -u 'subro:パスワード' -k -X POST https://UbuntuServer2404-1:9200/test_index/_doc -H 'Content-Type: application/json' -d '{ "name":"Jotaro" }' | jq
{
  "_index": "test_index",
  "_id": "N9ec3ZIBlxjDMK0GZTbL",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}

データの投入ができました。

逆にデータを取得してみます。

subro@Ubuntu2404:~$ curl -s -u 'subro:パスワード' -k -X GET https://UbuntuServer2404-1:9200/test_index/_search | jq
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [
      {
        "_index": "test_index",
        "_id": "N9ec3ZIBlxjDMK0GZTbL",
        "_score": 1.0,
        "_source": {
          "name": "Jotaro"
        }
      }
    ]
  }
}

取れています。どうやら良さげです。


==========
OpenSearchのユーザー管理・権限管理は、もしかすると Elasticsearchとは違うのかも知れません。

権限設定をまとめますと、以下のような作業順序になるみたいです。

  1. ロール(という権限の入れ物)を作る
  2. 一番細かい権限(これは既定のものしかないかも)を必要な分だけロールに登録する
  3. ロールにユーザーを紐付ける(マッピング)

かなり細かい権限設定ができますので徹底的に作り込めますけど、ちょっとやってられない気もします。

ドキュメントには「まずクエリしてみて、パーミッションで弾かれたら、その都度ロールに権限を加えていくのが良い。」という旨が書いてありましたが、ここでやったように雛形を改造する方が却って漏れがないような気がします。


これでやっとこデータ投入が可能になりました。

そういえばまだ日本語検索の対応をしていなかった…。


次回「OpenSearchのインデックスに Pythonでデータを突っ込む」にて、データを入れていきます。