デモ: Keycloak や Google SSO による認証

このページはプラットフォーム管理者を対象としています。

Keycloak や Google のシングル サインオン(SSO)による認証は、デモやテスト目的でのみ試すことができます。

Keycloak で認証する

Keycloak は、オープンソースの Identity and Access Management ソフトウェア プロダクトで、クイックデモで OIDC プロバイダとして設定できます。

始める前に

Keycloak をインストールして有効にするには、切断モードのデプロイで実行されている Anthos からアクセス可能な Ingress アドレスを持つ Kubernetes クラスタが必要です。このページの例では、切断モードの管理クラスタで実行されている Anthos を使用します。

また、切断モードの Management Center で実行する Anthos のカスタム ドメイン名も作成しておく必要があります。ドメイン名を構成して Management Center にアクセスするをご覧ください。

  1. Management Center のドメイン名を変数としてエクスポートします。次に例を示します。

    export ANTHOS_MANAGEMENT_CENTER=anthos.example.com
    
  2. 次のように、限定公開レジストリを変数としてエクスポートします。

    export PRIVATE_REGISTRY=10.200.0.2/library
    

Keycloak イメージをダウンロードして限定公開レジストリに push する

  1. dockerhub から Keycloak イメージをダウンロードします。

    actl images save \
      --output keycloak-image \
      jboss/keycloak:12.0.2
    
  2. Keycloak イメージをプライベート レジストリに push します。

    actl images push \
      --images keycloak-image \
      --private-registry=${PRIVATE_REGISTRY}
    

Keycloak をデプロイする

DNS 構成を更新して証明書を生成し、Keycloak をデプロイします。

  1. Keycloak の IP を公開する Keycloak サービスを作成します。

    kubectl create -f - <<EOF
    apiVersion: v1
    kind: Namespace
    metadata:
      name: keycloak
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: keycloak-svc
      namespace: keycloak
      labels:
        app: keycloak
    spec:
      ports:
      - name: http
        port: 80
        targetPort: 8080
      - name: https
        port: 443
        targetPort: 8443
      selector:
        app: keycloak
      type: LoadBalancer
    EOF
    
  2. LoadBalancer で IP を割り当てた後、次のように IP を変数にエクスポートします。

    export KEYCLOAK_SVC_IP=$(kubectl get services -n keycloak \
        -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')
    
  3. DNS ドメイン構成に「A record」を追加し、${KEYCLOAK_SVC_IP} に設定します。

    export KEYCLOAK_SVC=keycloak.example.com
    
  4. TLS に使用する Keycloak の自己署名証明書を生成します。

    openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -subj \
        "/CN=${KEYCLOAK_SVC}" \
        -addext "subjectAltName = DNS:localhost,DNS:${KEYCLOAK_SVC},IP:${KEYCLOAK_SVC_IP}" \
        -out "tls.crt" -keyout "tls.key"
    
  5. 証明書と秘密鍵をクラスタにアップロードします。

    kubectl create secret tls tls-config -n keycloak --cert=tls.crt \
        --key=tls.key
    
  6. 次のコマンドを実行して Keycloak をデプロイします。

    kubectl create -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: keycloak
      namespace: keycloak
      labels:
        app: keycloak
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: keycloak
      template:
        metadata:
          labels:
            app: keycloak
        spec:
          volumes:
          - name: tls-config-volume
            secret:
              secretName: tls-config
              items:
              - key: tls.crt
                path: tls.crt
              - key: tls.key
                path: tls.key
          containers:
          - name: keycloak
            # Set the image as original path but the actual image will be pulled from the registry mirror,
            # which was configured by 'actl push' command.
            image: jboss/keycloak:12.0.2
            # Keycloak uses certificates stored in /etc/x509/https to set up TLS.
            # https://github.com/keycloak/keycloak-containers/blob/master/server/README.md#setting-up-tlsssl
            volumeMounts:
            - name: tls-config-volume
              mountPath: "/etc/x509/https"
            env:
            - name: KEYCLOAK_USER
              value: "admin"
            - name: KEYCLOAK_PASSWORD
              value: "admin"
            - name: PROXY_ADDRESS_FORWARDING
              value: "true"
            ports:
            - name: http
              containerPort: 8080
            - name: https
              containerPort: 8443
            readinessProbe:
              httpGet:
                path: /auth/realms/master
                port: 8080
    EOF
    

Keycloak のユーザーとクライアントを設定する

管理ワークステーションで Keycloak コンソールを開き、keycloak.yaml ファイルで KEYCLOAK_USERKEYCLOAK_PASSWORD を使用してログインします。デフォルトでは、これらの値は KEYCLOAK_USER=adminKEYCLOAK_PASSWORD=admin です。必要に応じて、ブラウザで自己署名証明書を受け入れます。Chrome で信頼できない証明書に関する警告が表示された場合は、そのダイアログで「thisisunsafe」と入力します。

echo "Keycloak console: https://${KEYCLOAK_SVC}"

レルムを作成する

  1. 左上の [マスター] にカーソルを合わせ、[レルムを追加] をクリックします。
  2. 新しいレルムの名前として「anthos」を入力し、[作成] をクリックします。
  3. [レルムの設定] > [トークン] で、[アクセス トークンの有効期間] を 1 Hour に変更し、トークンが早く期限切れにならないようにします。その後 [保存] をクリックします。

ユーザーを作成する

  1. 左側のナビゲーション バーで [ユーザー]、[ユーザーを追加] の順にクリックします。
  2. ユーザーの次の設定を行い、[保存] をクリックします。
    1. ユーザー名: anthos-platform-admin
    2. メールアドレス: anthos-platform-admin@example.com
    3. ユーザーの有効化: ON
    4. メールアドレス確認済み: ON
  3. [Credentials] タブで、[Password] フィールドと [Password Confirmation] フィールドに入力します。[Set Password] をクリックし、プロンプトが表示されたら検証します。

クライアントの作成

  1. 左側のナビゲーション バーで [クライアント] をクリックし、[作成] をクリックします。
  2. クライアントの次の設定を行い、[保存] をクリックします。ANTHOS_MANAGEMENT_CENTER は、Management Center で使用するカスタム ドメイン名です。
    1. クライアント ID: anthos
    2. クライアント プロトコル: openid-connect
    3. ルート URL: https://ANTHOS_MANAGEMENT_CENTER
  3. 新しく作成したクライアントの管理ページに移動します。
  4. クライアント管理ページの [設定] タブで、次の手順を行います。
    1. [Access Type] を confidential に設定します。
    2. 次の URI を [有効なリダイレクト URI] に追加します。
      • http://localhost:9879/callback
      • https://ANTHOS_MANAGEMENT_CENTER/_gcp_anthos_oidc_callback
    3. [保存] をクリックします。
  5. クライアント管理ページの [認証情報] タブで、クライアント認証システムとして [クライアント ID とシークレット] を選択します。
  6. シークレットをどこかに記録します。
    1. 左側のナビゲーション バーで [グループ] をクリックし、つづいて [新規] をクリックします。
    2. グループの名前を入力します: anthos-platform-admin-group
    3. 左側の [ユーザー] タブに戻り、[すべてのユーザーを表示] をクリックします。
    4. 作成したユーザー(anthos-platform-admin)をクリックし、[グループ] タブをクリックします。
    5. [使用可能なグループ] で、作成したグループ anthos-platform-admin-group を選択し、[参加] をクリックします。
    6. anthos クライアント管理ページに戻ります。
    7. [マッパー] タブをクリックし、[作成] をクリックします。
      1. このマッパーの名前を入力します: anthos-platform-admin-group-mapper
      2. [マッパータイプ] プルダウン リストから [グループ メンバーシップ] を選択します。
      3. Token Claim Name は、認証トークンに表示される属性値です。切断モードで実行される Anthos のデフォルト値は「groups」であるため、このフィールドで groups を使用できます。Token Claim Name 名が groups でない場合、OIDC 構成の GroupsClaim フィールドは、この値で変更する必要があります。
      4. [Full group path] が無効になっていることを確認します。
      5. [Add to ID Token]、[Add to access token]、[Add to userinfo] がすべて有効になっていることを確認します。
      6. [保存] をクリックします。

OIDC 認証を有効にする

次のステップで使用する OIDC プロバイダの URL を取得します。

  1. 次のコマンドを実行します。

    export ISSUER_URL=https://${KEYCLOAK_SVC}/auth/realms/anthos
    echo "Issuer URL: ${ISSUER_URL}"
    
  2. 前の tls.crt を使用して、Base64 でエンコードされた証明書を生成します。

    export BASE64_CERT=$(openssl base64 -A -in tls.crt)
    echo "Use the following string as the base64-encoded certificate for the OIDC provider: ${BASE64_CERT}"
    
  1. Management Center Console で、[ID とアクセス] メニューを開きます。
  2. [ID] タブで、[Anthos Identity Service(OIDC)を設定] をクリックします。
  3. 次のフィールドに入力して Keycloak のプロファイルを作成し、[Submit] をクリックします。

    1. プロファイルの名前: keycloak
    2. OIDC プロバイダ URL: OIDC 認証を有効にするセクションの発行者 URL。
    3. OIDC クライアント ID: anthos
    4. OIDC クライアント シークレット: クライアントの作成セクションのクライアント シークレット
    5. ユーザー名のクレーム: email
    6. ユーザー名の接頭辞: keycloak-
    7. グループのクレーム: グループ メンバーシップの設定セクションのグループのクレーム。このフィールドを空のままにすると、値は groups になります。
    8. グループの接頭辞: keycloak-
    9. スコープ: email openid
    10. 追加パラメータ: access_type=offline
    11. 認証局データ: OIDC 認証を有効にするのセクションで取得した、Base64 でエンコードされた証明書を使用します。
  4. [クラスタにプロファイルを適用] をクリックし、[管理クラスタ] タブをクリックします。

  5. [プロファイル] に、先ほど作成した「keycloak」プロファイルを選択します。

  6. [Domain name] に「ANTHOS_MANAGEMENT_CENTER」と入力します。

  7. [Initial Platform Admin] では、ユーザー名の前にユーザー接頭辞を必ず追加してください。たとえば、anthos-platform-admin@example.com を追加する場合は、「keycloak-anthos-platform-admin@example.com」と入力します。

  8. [送信] をクリックし、さまざまなシステム コンポーネントが再構成されるまで少しの間待機します。

  9. シークレット ウィンドウで https://ANTHOS_MANAGEMENT_CENTER に移動します。Keycloak のログインページにリダイレクトされます。(永続的なパスワードを設定した後)anthos-platform-admin としてログインできるようになります。

別の方法(YAML ファイルを適用する)

  1. ドメインの IDP プロバイダを設定します。ドメインに DomainConfig がすでに作成されている場合は、オブジェクトにパッチを適用して、次のコマンドを使用してドメインに使用する認証方法名を設定します。

    kubectl patch domainconfig anthos.example.com --type=json -p='[{"op": "replace", "path":
    "/spec/authMethodName", "value":"keycloak"}]'
    

    ドメインに DomainConfig が作成されていない場合は、次のコマンドを使用して作成します。

    kubectl create -f - <<EOF
    apiVersion: managementcenter.anthos.cloud.google.com/v1
    kind: DomainConfig
    metadata:
      name: anthos.example.com
    spec:
      authMethodName: keycloak
    EOF
    
  2. 次の内容で clientconfig-patch.yaml を作成します。

    # Use this to set the OIDC configuration of Keycloak:
    # kubectl patch ClientConfig default -n kube-public --type=merge --patch $(cat clientconfig-patch.yaml)
    spec:
      authentication:
      # The name of the OIDC configuration to create.
      - name: keycloak
        oidc:
          # ID for the client application that makes authentication requests to the OpenID provider.
          clientID: anthos
          # ID for the client application that makes authentication requests to the OpenID provider.
          clientSecret: YOUR_CLIENT_SECRET
          # The URI to redirect users going through the OAuth flow using cloud console.
          # This is not supported by Anthos running in disconnected mode.
          cloudConsoleRedirectURI: http://cloud.console.not.enabled
          # Additional key-value parameters (comma-separated) to send to the OpenID provider.
          extraParams: access_type=offline
          # URL where authorization requests are sent to your OpenID.
          issuerURI: YOUR_ISSUER_URI
          # The redirect URL that kubectl uses for authorization.
          kubectlRedirectURI: http://localhost:9879/callback
          # Additional scopes to send to the OpenID provider.
          scopes: openid email
          # JWT claim to use as the username. You can choose other claims, such as email or name,
          # depending on the OpenID provider. However, claims other than email are prefixed
          # with the issuer URL to prevent naming clashes.
          userClaim: email
          # A base64-encoded PEM-encoded certificate for the OIDC provider. To create the string,
          # encode the certificate, including headers, into base64. Include the resulting string
          # in certificateAuthorityData as a single line.
          certificateAuthorityData: YOUR_CERTIFICATE
    
  3. Keycloak の設定を使用して clientconfig-patch.yaml を編集します。

    sed -i "s|YOUR_ISSUER_URI|${ISSUER_URL}|g" clientconfig-patch.yaml
    sed -i "s|YOUR_CERTIFICATE|${BASE64_CERT}|g" clientconfig-patch.yaml
    
  4. YOUR_CLIENT_SECRET は、Keycloak の [Credentials] タブから取得したクライアント シークレットに置き換えます。

  5. OIDC を構成するには、次のコマンドを実行します。

    kubectl patch ClientConfig default -n kube-public --type=merge \
        --patch "$(cat clientconfig-patch.yaml)"
    
  6. さまざまなシステム コンポーネントが再構成されるまで少しの間待機します。

  7. 承認のロールの構成の手順に沿って、初期のプラットフォーム管理者アカウントを設定します。

  8. シークレット ウィンドウで https://ANTHOS_MANAGEMENT_CENTER に移動します。Keycloak のログインページにリダイレクトされます。(永続的なパスワードを設定した後)anthos-platform-admin としてログインできるようになります。

Keycloak の削除

Keycloak デモの使用が終了したら、Keycloak のインストールを削除します。

kubectl delete ns keycloak

Google SSO で認証する

Google SSO は、Anthos プライベート モードでは利用できません。Google SSO を使用する場合は、クラスタとブラウザの両方が Google の SSO サーバーにアクセスできる必要があります。Google の SSO サーバーでは、ユーザー クラスタへの接続は必要ありません

  1. Google Cloud Console にログインし、有効なプロジェクトを選択します。
  2. [API とサービス] > [OAuth 同意画面] のセクションにアクセスします。
  3. 新しい OAuth 同意画面を作成します。この情報は、ユーザーに表示されます。
    1. [アプリケーションのホームページ] を管理 URL に設定します。
  4. [API とサービス] > [認証情報] で、次の操作を行います。
    1. [認証情報を作成] をクリックします。
    2. 新しい OAuth クライアント ID を作成します。
    3. [アプリケーションの種類] を [ウェブ アプリケーション] に設定します。
    4. 関連する名前を選択します。
    5. JavaScript 生成元に https://anthos.example.com を設定します(https://anthos.example.com は Management Center のドメイン名であることを前提としています)。
    6. [承認済みのリダイレクト URI] には、次のように設定します。
      • https://anthos.example.com/_gcp_anthos_oidc_callback
      • http://localhost:9879/callback
  5. ClientID とクライアント Secret を AdminUI 構成にコピーします。
  6. OIDC プロバイダの URL を https://accounts.google.com に設定します。
  7. Username Claimemail に、Scopesopenid email に設定します。
  8. 追加パラメータを prompt=consent,access_type=offline に設定します。設定しないと、Kubernetes API サーバーでログインできません。
  9. プラットフォーム管理者権限を付与する、最初のメールアドレスのリスト(複数の場合はカンマで区切ります)を追加します。
  10. [Save] をクリックします。

Google SSO

次のステップ