はじめに
今までadminユーザーを共有して全てのパイプラインを管理するという運用で済ませてきましたが、
チームの成長に伴って、各自のアカウント使ってもらってログインできるようにしたいと思うようになりました。
チームでは全員Googleアカウントを使っているので、GoogleアカウントからSSOできればいいなと思い設定しました。
意外と手こずったので、再設定時などを想定して方法を書いておきます。
OIDC を使う
Generic OIDC authの仕組みを使って、GoogleアカウントからSSOすることにします。1
クライアントIDとクライアントシークレットの発行
GoogleDeveloperConsoleから、クライアントIDとクライアントシークレットを発行します。
こちらの記事などを参考にしました。
GoogleのOpenID Connectorを使ってみた
サーバー設定
発行したクライアントIDとクライアントシークレットを含め、Concourse serverにOIDCの設定をします。
環境変数から、以下の4つを設定しました。
# 表示名
# ログイン画面に表示されるのでわかりやすいものに
CONCOURSE_OIDC_DISPLAY_NAME: Google
# 先ほど発行したクライアントIDとクライアントシークレット
CONCOURSE_OIDC_CLIENT_ID: 000000000000-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com
CONCOURSE_OIDC_CLIENT_SECRET: yyyyyyyyyyyyyyyyyyyyyyyy
# GoogleのOIDCの場合はこのURLとなる
CONCOURSE_OIDC_ISSUER: https://accounts.google.com
Concourseに読み込ませると、ログイン画面にSSO用のボタンが表示されるようになります。
(「Username/Password」から、引き続きパスワード認証もできますね)
チーム設定
クライアントID・シークレットでログインできるユーザーを絞っていない場合、誰でもログインできてしまいます。
ログインしたところで権限がないので、何も見れないし何もできないですが。
正式なユーザーには権限を与えて、パイプラインを作成したりタスクを実行させたりするための権限を与えます。
flyで、以下のようなコマンドを使って設定しました。
# adminユーザーで、target:testにログイン
fly -t test login -c https://concourse.example.com
# googleというチームを作成し、ユーザーを1名を設定
fly -t test set-team -n google \
--oidc-user 000000000000000000000 \
# googleチームのユーザーを増やす場合はこうする
# 設定済みのユーザーも含めて設定しなおすこと
fly -t test set-team -n google \
--oidc-user 000000000000000000000 \
--oidc-user 111111111111111111111 \
--oidc-user
で指定するのは、OpenID Connectのペイロードにあるsubの値のようです。
参考: https://developers.google.com/identity/protocols/oauth2/openid-connect#an-id-tokens-payload
私は自作のツールを経由して値を確認しました2。
デフォルト権限
この方法で設定すると、各ユーザーはチーム内でowner権限をもちます。
弱めな権限に変更したい場合は、ymlを書いて--config
か-c
で読み込ませる必要があるようです。
参考: https://concourse-ci.org/managing-teams.html#setting-roles
ちょっと面倒に思う点
ユーザーが増えるたびに、flyからset-teamをするというのが面倒に思います。
特定のドメインのGoogleアカウントしかログインできないようにして、ログインさえすればパイプラインが見られるようにするのは、--oidc-group
とかでできるのかな?
しかし、力尽きたのでここまでで投稿しちゃいます。
追記: missing "username" claim
どのバージョンのConcourseからか、今までOIDCでログインできていたのにできなくなるという現象が発生しました。
エラーメッセージは以下でした。
Failed to authenticate: missing "username" claim
これは、CONCOURSE_OIDC_USER_NAME_KEYの値のデフォルト値が"username"なのですが、GoogleのOIDCのclaimには含まれていないということのようです。
"email"を指定するようにすると、再度Googleでログインできるようになりました。
参考: https://concourse-ci.org/generic-oidc-auth.html#a-note-about-user-lookup