🔐

【PipeCD】Amazon CognitoでPipeCDのSSOを設定してみる

2024/09/12に公開

PipeCDがOIDCによるSSOに対応したので、Amazon CognitoをIdPとしてSSOを設定してみます。

https://github.com/pipe-cd/pipecd/pull/5008

※ この機能は、プレリリース版である v0.49.0-rc0 としてリリースされています。
正式リリースであるv0.49.0は9月下旬の見込みです。

PipeCDのSSOとは

PipeCDでは、Web ConsoleへのログインにおいてSSOを行えます。


ログイン画面(v0.49.0-rc0以前)

先述のPRにより、GitHubだけでなくOIDCによるSSOも可能となりました。

全体像

全体像は下図のとおりです。(今回はIdPとしてAmazon Cognitoを使用します)


SSO全体像

IdPはOIDCに対応していればよく、KeyCloakやAuth0などでも構築可能です。

SSO設定においては、Piped(PipeCDのAgent)は登場しません。

ログイン画面は、この記事ではCognito標準のものを使用します。

設定手順

1. IdP(Cognito)の設定(IdPによってやり方は異なります)

1-1. ユーザプール、ユーザ、グループを作成

ここでは、下記のTerraformファイルをapplyします。

provider "aws" {
  region = "ap-northeast-1"
}

# User Pool, Client, domain の設定 --------------------------------------------
resource "aws_cognito_user_pool" "example-pool" {
  name = "pipecd-example-pool"
}

resource "aws_cognito_user_pool_client" "example-client" {
  name                                 = "example-client"
  user_pool_id                         = aws_cognito_user_pool.example-pool.id
  generate_secret                      = true
  callback_urls                        = ["http://localhost:8080/auth/callback"] # http(s)://<pipecd-control-plane-address>/auth/callback
  allowed_oauth_flows_user_pool_client = true
  allowed_oauth_flows                  = ["code"]
  allowed_oauth_scopes                 = ["openid", "profile"]
  supported_identity_providers         = ["COGNITO"]
}

data "aws_caller_identity" "self" {}

resource "aws_cognito_user_pool_domain" "example-domain" {
  domain       = format("%s-%v", "pipecd-example-pool", data.aws_caller_identity.self.account_id)
  user_pool_id = aws_cognito_user_pool.example-pool.id
}

# User, Groupの設定 --------------------------------------------
resource "aws_cognito_user_group" "editor" {
  name         = "Editor"
  user_pool_id = aws_cognito_user_pool.example-pool.id
}

resource "aws_cognito_user" "example-user" {
  user_pool_id       = aws_cognito_user_pool.example-pool.id
  username           = "example-user"
  temporary_password = "Initial-password0"
  attributes = {
    email = "example-user@example.com"
  }
  lifecycle {
    ignore_changes = [password]
  }
}

resource "aws_cognito_user_in_group" "example-user-in-group" {
  user_pool_id = aws_cognito_user_pool.example-pool.id
  username     = aws_cognito_user.example-user.username
  group_name   = aws_cognito_user_group.editor.name
}

# output --------------------------------------------
output "client-id" {
  description = "ID of the client 'example-client'"
  value       = aws_cognito_user_pool_client.example-client.id
}

output "client-secret" {
  description = "Secret of the client 'example-client'"
  value       = aws_cognito_user_pool_client.example-client.client_secret
  sensitive   = true
}

output "user-pool-id" {
  description = "ID of the user pool 'example-pool'"
  value       = aws_cognito_user_pool.example-pool.id
}


1-2. 作成したユーザプールのID、クライアントID、クライアントシークレットを控える

1-1. のoutputとして出力されるので、それらを控えます。

クライアントシークレットはマスクされているので、下記コマンドで取得します。

terraform output -json

2. PipeCD Control Planeの設定・起動

2-1. Control Planeの設定ファイルの作成

docsを参考に、下記のようなファイルを作成します。stateKeysharedSSOConfigsの項目が必要です。

<CLIENT_ID>,<CLIENT_SECRET>,<USER_POOL_ID>は、1-2.で取得した値に書き換えてください。

apiVersion: "pipecd.dev/v1beta1"
kind: ControlPlane
spec:
  datastore:
    ...
  filestore:
    ...

  # SSO関連の設定 
  stateKey: xxx # 任意の値
  sharedSSOConfigs:
    - name: myoidc
      provider: OIDC
      oidc:
        clientId: <CLIENT_ID>
        clientSecret: <CLIENT_SECRET>
        issuer: https://cognito-idp.ap-northeast-1.amazonaws.com/<USER_POOL_ID>
        redirect_uri: http://localhost:8080/auth/callback # http(s)://<PIPECD_CONTROL_PLANE_ADDRESS>/auth/callback
        scopes:
          - openid
          - profile

2-2. Control Planeの起動

2-1で作成した設定ファイルを用いて、Control Planeを起動します。

ローカルでのControl Plane起動方法の例は こちら を参照してください。

バージョンは v0.49.0-rc0 以上を使用してください。

3. PipeCD ConsoleでProjectの作成

3-1. Ownerページにアクセス

ローカルで起動している場合は、http://localhost:9082/でアクセスできます。


Control Plane Owner ページ

3-2. Add Projectからプロジェクトを追加

値は下記のように入力して、「送信」します。

  • ID: 任意 (以下では"oidc-test"で説明します)
  • Description: 任意
  • Shared SSO: myoidc

3-3. 管理者のユーザ名とパスワードを取得

3-2.の結果、

Static Admin UsernameStatic Admin Passwordが表示されるので、それをメモなどに一時保管します。

4. PipeCD ConsoleでProjectの設定

4-1. ログイン画面に遷移

ローカルに構築している場合は、http://localhost:8080/loginでログイン画面に遷移できます。

Project Nameとして、"oidc-test"を入力し、CONTINUEを押下します。


ログイン画面(Project選択)

4-2. 管理者としてログイン

Username, Passwordは、3-3.で取得した Static Admin UsernameStatic Admin Passwordを使用します。


ログイン(StaticAdmin)

4-3. Projectの設定画面に遷移

http://localhost:8080/settings/project?project=oidc-test
から、Project Settings画面に遷移します。

4-4. User Groupの作成

ページ下部の User Group > +ADD から、User Groupを作成します。

User Groupの追加

値は下記のように指定し、ADDを押下します。

  • Team/Group: Editor
  • Role: Editor


Add User Group

動作確認

1. StaticAdminユーザからログアウト

ヘッダー右上のアイコンをクリックすると、ログアウトボタンが表示されるので、ログアウトします。

ログアウト

2. 再度Consoleにアクセスして、Project名を入力

http://localhost:8080/

Project Name: oidc-test

3. “LOGIN WITH OIDC”をクリック


LOGIN WITH OIDC

4. IdP側の認証画面に遷移するので、ログインする

  • Username: example-user
  • Password: Initial-password0


Cognito標準のログイン画面

5. Consoleにログインできれば成功


ログイン成功時

備考

ログアウト時の挙動について、PipeCDはprompt=consentで設定していますが、IdPによって対応状況が異なります。

関連ドキュメント(PipeCD)

サイバーエージェント Developer Productivity室

Discussion