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-」です。
左上の三を開くとメニューが展開されますので、[Management] → [Security] と選択します。
新規に一般ユーザー [subro] を作ります。
[Internal users]を選択します。
Create internal userを押します。
新規ユーザー名とパスワードを入力します。
一番下にあるCreateを押します。
[subro]ユーザーができました。
[subro]ユーザーにはまだ何の権限も付けてないので、何もできません。
「ロール」という複数の権限の入れ物を付与することで、作業ができるようになります。
ロールを 1から作るのも可能ですが、デフォルトで存在しているロールを利用するのが一般的でしょう。
既にあるロールをコピーして、独自ロールを作のが良いです。
[Roles]を選択します。
デフォルトで組み込まれている [own_index]ロールはユーザー自身が作った Indexに対してのフル権限です。
この [own_index]ロールを使いたいのですが、[Index permissions]列(どういう名前のインデックス(テーブル)に対しての権限なのか)に、[${user_name}] と定義されています。
[${user_name}]はユーザー名に変換される変数ですので、私の場合は [subro] になります。
つまり [subro]という名前のインデックスだけのフル権限になってしまいます。
インデックスは一杯作りたいのであって、これでは使えたものではありません。
これをベースにどんな名前のインデックスでも OKなロールを作ります。
[own_index]ロールにチェックを入れ、右上にあるActionsを押すとメニューが出ますので、[Duplicate]を選択すると複製を作れます。
ロール名は「own_index_full」にしました。
${user_name}は×で消して、
空になったら「*」と入れてからEnterでこうなります。
一番下にあるCreateを押します。
[own_index_full]ロールができました。
[subro]ユーザーをこのロールに紐付けるため、マップという作業を行います。
[Mapped users]タブを選択します。
Manage mappingを押します。
[Users]行が空になっていてそこをフォーカスすると、ユーザー一覧からユーザーを選べるようになります。
[subro]ユーザーを選びます。
[subro]ユーザーが選ばれた状態です。
一番下にあるMapを押します。
こんな風になりまして完了です。
これで 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とは違うのかも知れません。
権限設定をまとめますと、以下のような作業順序になるみたいです。
- ロール(という権限の入れ物)を作る
- 一番細かい権限(これは既定のものしかないかも)を必要な分だけロールに登録する
- ロールにユーザーを紐付ける(マッピング)
かなり細かい権限設定ができますので徹底的に作り込めますけど、ちょっとやってられない気もします。
ドキュメントには「まずクエリしてみて、パーミッションで弾かれたら、その都度ロールに権限を加えていくのが良い。」という旨が書いてありましたが、ここでやったように雛形を改造する方が却って漏れがないような気がします。
これでやっとこデータ投入が可能になりました。
そういえばまだ日本語検索の対応をしていなかった…。
次回「OpenSearchのインデックスに Pythonでデータを突っ込む」にて、データを入れていきます。