2018年1月11日木曜日

VMware Admiral にユーザ認証機能を追加してみる

概要

Admiral はデフォルトでは認証機能がありません
ユーザ認証を追加したい場合は別途自分でユーザを追加する必要があります
今回はその方法を紹介したいと思います

環境

  • macOS 10.13.2
  • docker 17.12.0-ce
  • Admiral v1.3.0

※ Ubunt 16.04.3 + docker 17.05.0-ce だとうまく動作しない機能がありました

local-users.json を作成する

  • cd /root/work/admiral
  • vim local-users.json
{
 "users": [{
   "email": "admin@admiral.local",
   "password": "Password1!"
 }, {
   "email": "user1@admiral.local",
   "password": "secret1"
 }, {
   "email": "user2@admiral.local",
   "password": "secret2"
 }]
}

users プロパティに email と password プロパティを持つオブジェクトを配列で追加していきます

ファイルを指定して admiral を起動する

  • docker run -d -p 8282:8282 --name admiral -e XENON_OPTS="--localUsers=/tmp/local-users.json" -v /root/work/admiral/local-users.json:/tmp/local-users.json vmware/admiral

作成した JSON ファイルをコンテナにマウントします
そして XENON_OPTS の --localUsers オプショションでコンテナ上に配置した JSON ファイルを指定することで認証を有効にすることができます

ログインする

http://localhost:8282 にアクセスするとログイン画面が表示されるようになるので local-users.json に記載されたユーザ情報でログインできるか確認してみましょう
admiral_enable_auth1.jpg

ユーザの管理者権限を制御する

デフォルトだと JSON に定義されたユーザはみな管理者権限を持っています
このままだと全員がすべてのプロジェクトにアクセスすることができ、かつプロジェクトの追加やユーザコントロールができてしまいます

なのでまずは管理者権限が不要なユーザから権限を削除しましょう

管理 -> ID 管理 -> ユーザおよびグループ

で検索ボックスで何でもいいので検索するとユーザが出てきます
ユーザが表示されたらチェックボックスをチェックし「管理者ロールの割り当てを解除」を選択することで権限を削除できます
admiral_enable_auth2.png

こんな感じで他のユーザにも権限の解除 or 付与を行います

プロジェクトにユーザ情報を紐付ける

では、実際に ACL が効いているか確認してみましょう
default-project に触れるユーザを設定します

管理 -> プロジェクト -> default-project -> メンバー -> 追加

でユーザを追加しましょう
追加する際にロールを決められるので必要なロールを設定してください
コンテナやテンプレートの作成ができるようにするには「開発者」ロールを選択しましょう
admiral_enable_auth3.png

プロジェクトの内容だけ確認させたい場合は「閲覧者」ロールを選択すると Read only なユーザを作成することができます

ACL の動作確認

admin, user1, user2 でそれぞれログインしてみましょう

admin の場合は default-project も見え管理のタブも表示されていると思います
user1 の場合は default-project が見えテンプレートの追加やコンテナの操作はできるものの管理のタグが非表示になっています
user2 の場合はそもそもログインがうまくいかずに何もできないと思います
admiral_enable_auth4.png

こんな感じでプロジェクトに対して ACL を設定することができます

おまけ 認証を有効にした場合の API を実行する方法

POST /core/authn/basic に JSON に記載したメールアドレスとパスワードをベーシック認証として送信します
その際に Body に requestType を付与します

  • curl -u 'admin@admiral.local:Password1!' -v -X POST -d'{"requestType":"LOGIN"}' http://localhost:8282/core/authn/basic -H "Content-Type: application/json"

そしてレスポンスに含まれる x-xenon-auth-token を付与して API をコールすることで各種 API をコールすることができるようになります
以下はログインしたユーザでプロジェクトの一覧を取得する方法です

  • curl -v -H "x-xenon-auth-token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ4biIsInN1YiI6Ii9jb3JlL2F1dGh6L3VzZXJzL1lXUnRhVzVBWVdSdGFYSmhiQzVzYjJOaGJBXHUwMDNkXHUwMDNkIiwiZXhwIjoxNTE1NTkxNjg1fQ.xb0X5SLb-pYplnYOXFjdKUscFt4mQT8-E8XXCZcW5Dw" -X GET http://localhost:8282/projects

最後に

VMware Admiral でユーザ認証を使ってみました
平文の JSON ファイルベースの認証なので少し不安な感じはします
またユーザを追加する場合はファイルを更新してコンテナを再起動する必要があるので少し面倒です (コンテナを削除する必要はありませんが、認証なしからありにする場合は削除しないとダメです)
デフォルトでは管理者権限が付与されてしまっているのでユーザの登録や更新をしたら必ず ID 管理から権限のコントロールをするようにしましょう

一応これを使えばプロジェクトベースの ACL 的なことはできるようになります
個人的にはファイル管理も良いですが LDAP 連携など外部のユーザ管理システムと連携してほしいかなと思います
また JSON ファイルで管理者権限の設定もできると嬉しいかなと思います

参考サイト

0 件のコメント:

コメントを投稿