0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Concourse CI にGoogleアカウントを使ってSSOする

Last updated at Posted at 2020-07-25

はじめに

今まで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」から、引き続きパスワード認証もできますね)
login.png

チーム設定

クライアント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

  1. oAuthでもできるのかな? 未確認です。

  2. ここに何を設定するのかがなかなかわからなかったのですが、普通はこの値をどうやって入手するんでしょう?

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?