Open DistroのWeb APIを使用してロールにユーザーを追加する

こんにちは。サービスグループの武田です。Amazon Elasticsearch ServiceがサポートしているWeb APIを使ってロールにユーザーを追加してみました。
2021.08.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。サービスグループの武田です。

Amazon Elasticsearch ServiceはOpen Distro for Elasticsearchというディストリビューションを利用しています。これはさまざまな機能をサポートしていますが、そのうちのひとつとしてユーザーの認証認可をサポートしています。

Open Distroの認証認可は一般的なユーザー/ロールモデルで、ロールに権限を付与し、そのロールにユーザーをマッピングすることで実現できます。

ブラウザでKibanaにアクセスしてぽちぽちするのもよいのですが、作業の自動化を考えるとAPIで操作できると便利です。ロールマッピングのAPIは次のドキュメントを参照してください。

さて、このドキュメントを見てロールにユーザーを追加する方法が分かるでしょうか。なんとなくPatch role mappingが使えそうです。

PATCH _opendistro/_security/api/rolesmapping/<role>
[
  {
    "op": "replace", "path": "/users", "value": ["myuser"]
  },
  {
    "op": "replace", "path": "/backend_roles", "value": ["mybackendrole"]
  }
]

opreplaceが指定されていますが、他のサンプルでaddを指定しているものがあります。なんかできそうな気がするので、さっそく試してみましょう。

$ ES_USER=XXXX
$ ES_PASS=XXXX
$ ES_DOMAIN=XXXX

$ curl -u "$ES_USER:$ES_PASS" -s -H 'Content-Type: application/json' "https://${ES_DOMAIN}/_opendistro/_security/api/roles/test-role" -X PUT -d '{"cluster_permissions":[],"index_permissions":[],"tenant_permissions":[]}'
{"status":"CREATED","message":"'test-role' created."}

$ curl -u "$ES_USER:$ES_PASS" -s -H 'Content-Type: application/json' "https://${ES_DOMAIN}/_opendistro/_security/api/rolesmapping/test-role" -X PATCH -d '[{"op":"add","path":"/users","value":["user1"]}]'
{"status":"OK","message":"'test-role' updated."}

$ curl -u "$ES_USER:$ES_PASS" -s -H 'Content-Type: application/json' "https://${ES_DOMAIN}/_opendistro/_security/api/rolesmapping/test-role"
{"test-role":{"hosts":[],"users":["user1"],"reserved":false,"hidden":false,"backend_roles":[],"and_backend_roles":[]}}

うまくいってそうですね。新しくtest-roleを作成してuser1を追加しました。それでは新しいユーザーを追加してみましょう。

$ curl -u "$ES_USER:$ES_PASS" -s -H 'Content-Type: application/json' "https://${ES_DOMAIN}/_opendistro/_security/api/rolesmapping/test-role" -X PATCH -d '[{"op":"add","path":"/users","value":["user2"]}]'
{"status":"OK","message":"'test-role' updated."}

$ curl -u "$ES_USER:$ES_PASS" -s -H 'Content-Type: application/json' "https://${ES_DOMAIN}/_opendistro/_security/api/rolesmapping/test-role"
{"test-role":{"hosts":[],"users":["user2"],"reserved":false,"hidden":false,"backend_roles":[],"and_backend_roles":[]}}

ん? 追加できていない……user1が消えてuser2だけになっています。この方法では置換になってしまうようです。正しくはパラメーターを次のようにします。pathの部分が重要で、それに伴いvalueも単一の値となっています。

{
  "op": "add",
  "path": "/test-role/-",
  "value": "user2"
}

一度元の状態に戻して、再度実行してみましょう。

$ curl -u "$ES_USER:$ES_PASS" -s -H 'Content-Type: application/json' "https://${ES_DOMAIN}/_opendistro/_security/api/rolesmapping/test-role" -X PATCH -d '[{"op":"add","path":"/users","value":["user1"]}]'
{"status":"OK","message":"'test-role' updated."}

$ curl -u "$ES_USER:$ES_PASS" -s -H 'Content-Type: application/json' "https://${ES_DOMAIN}/_opendistro/_security/api/rolesmapping/test-role"
{"test-role":{"hosts":[],"users":["user1"],"reserved":false,"hidden":false,"backend_roles":[],"and_backend_roles":[]}}

$ curl -u "$ES_USER:$ES_PASS" -s -H 'Content-Type: application/json' "https://${ES_DOMAIN}/_opendistro/_security/api/rolesmapping/test-role" -X PATCH -d '[{"op":"add","path":"/users/-","value":"user2"}]'
{"status":"OK","message":"'test-role' updated."}

$ curl -u "$ES_USER:$ES_PASS" -s -H 'Content-Type: application/json' "https://${ES_DOMAIN}/_opendistro/_security/api/rolesmapping/test-role"
{"test-role":{"hosts":[],"users":["user1","user2"],"reserved":false,"hidden":false,"backend_roles":[],"and_backend_roles":[]}}

今度はうまくいきました!

まとめ

ドキュメントを読んでいろいろと試してみましたが、うまくいきませんでした。最終的には同じ問題にぶつかっている質問への回答を発見するという形で解決できました。このエントリが役に立てば幸いです。

参考リンク