2023年3月16日木曜日

MinIOでOneloginのOpenIDConnectを使って認証する方法

MinIOでOneloginのOpenIDConnectを使って認証する方法

概要

MinIO にはデフォルトでOpenIDConnectに接続するための機能が実装されています
今回は Onelogin を使って OpenIDConnect 認証できるようにしてみました

環境

  • Ubuntu 18.04
  • docker 20.10.7
  • minio RELEASE.2022-10-24T18-35-07Z

注意事項

gateway モードでは使えません

流れ

  1. MinIO 起動
  2. MinIO にグループのポリシーを追加
  3. Onelogin 側の設定
  4. ログイン

MinIO の起動

まずは MinIO を起動します
今回は docker を使います

ポイントは MINIO_IDENTITY_OPENID_ で始まる環境変数でここに Onelogin の認証情報を登録します

MINIO_IDENTITY_OPENID_CLAIM_NAME は groups という値にしています
これは Onelogin から送られてきたトークンに含まれる groups というフィールドをもとに MinIO 内で使用するポリシーを選択するために使用されます
特定のグループに対するポリシー情報の登録は後ほど行います

リダイレクトURLは http://localhost:9100/oauth_callback を設定します
MinIO には oauth_callback というリダイレクト用の URI が用意されいます
Onelogin の場合 localhost 以外のコールバック URL を指定する場合は https 化が必須なので注意しましょう

docker run --rm -p 9100:9100 -p 9000:9000 --name minio-s3 \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=xxx" \
-v ~/minio/data:/data \
-e "MINIO_IDENTITY_OPENID_CLAIM_NAME=groups" \
-e "MINIO_IDENTITY_OPENID_CONFIG_URL=https://xxxxxx.onelogin.com/oidc/2/.well-known/openid-configuration" \
-e "MINIO_IDENTITY_OPENID_CLIENT_ID=xxxx" \
-e "MINIO_IDENTITY_OPENID_CLIENT_SECRET=xxxx" \
-e "MINIO_IDENTITY_OPENID_SCOPES=groups email openid profile" \
-e "MINIO_IDENTITY_OPENID_REDIRECT_URI=http://localhost:9100/oauth_callback" \
quay.io/minio/minio:RELEASE.2022-10-24T18-35-07Z server /data --console-address ":9100"

MinIO にグループのポリシーを追加

MinIO が起動できたらグループに対する MinIO 上で割り当てるポリシーを作成します

ポリシーの割り当てには MinIO 用の mc という CLI ツールを使います

先にポリシー用のファイルを作成します

  • vim allaccess.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    }
  ]
}

あとはこれと mc コマンドを使って起動した MinIO にポリシーを登録します

  • docker run --name mc -it --entrypoint=/bin/sh minio/mc

mc コマンドコール用のコンテナが起動したらファイルを送ります

  • docker cp allaccess.json mc:/

そしてポリシーを登録します

  • mc alias set myminio http://172.17.0.1:9000 admin password
  • mc admin policy add myminio admin allaccess.json

上記の場合 1. 先程起動した MinIO を myminio という名前で登録 2. myminio の admin グループに allaccess.json のポリシーを登録という流れになります

なのでもし Onelogin から送られてくる groups 情報に admin ではなく別のグループ名が含まれている場合は admin の部分を適当なグループ名に変更してポリシー登録してください

Onelogin 側の設定

Onelogin 側ではコールバック用の URL を追加するくらいかなと思います

詳しい設定方法や認証情報の確認方法は過去に紹介しているのでそちらを参照してください

動作確認ログイン

localhost:9100 にアクセスするとログインボタンが表示されます
クリックすると Onelogin のログイン画面に遷移するのでログインしましょう

トラブルシューティング

おそらく一番目にするのは Policy claim missing from the JWT token, credentials will not be generated というエラーかなと思います
これは Onelogin から送られてきたトークン情報に policy というフィールドがないから MinIO 内で使用するポリシー情報を割り当てられませんというエラーになります

この policy という値をコントロールするのが MINIO_IDENTITY_OPENID_CLAIM_NAME になります
Onelogin では policy フィールドはトークンに含まれていません
なので groups フィールドを使うために MINIO_IDENTITY_OPENID_CLAIM_NAME=gropus にしています

IdP から送られてくるトークン情報をデバッグする方法は以下のコマンドで実行することで確認できます

  • mc admin trace -v -a myminio

WebIdentityToken というフィールドがJSONトークン情報になります
トークン情報はエンコードされているのでデコードして確認してください

最後に

MinIO で OpenIDConnect に接続する方法を紹介しました
IdP 側が送信するトークン情報に応じて対応が少し異なるので注意が必要です
IdP 側から直接ポリシー情報を送信することもできるようです

参考サイト

0 件のコメント:

コメントを投稿