この記事は公開されてから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"]
}
]
op
にreplace
が指定されていますが、他のサンプルで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":[]}}
今度はうまくいきました!
まとめ
ドキュメントを読んでいろいろと試してみましたが、うまくいきませんでした。最終的には同じ問題にぶつかっている質問への回答を発見するという形で解決できました。このエントリが役に立てば幸いです。