LDAP で GKE Identity Service を設定する

このドキュメントは、クラスタで GKE Identity Service を設定するクラスタ管理者またはアプリケーション オペレータを対象としています。Microsoft Active Directory などの任意の Lightweight Directory Access Protocol(LDAP)プロバイダを使用してクラスタで GKE Identity Service を設定する方法について説明します。ユーザーまたはプラットフォーム管理者が、GKE Identity Service 用の LDAP プロバイダを設定するの手順で LDAP プロバイダのログイン情報をすでに取得していることを前提としています。

GKE Identity Service の仕組みと、ほかの設定手段については、概要をご覧ください。デベロッパーや他のクラスタ ユーザーとしてこのサービスを使用してクラスタにアクセスする方法については、GKE Identity Service を使用してクラスタにアクセスするをご覧ください。

現在、LDAP を使用する GKE Identity Service は、GKE on VMware(ユーザー クラスタ)と GKE on Bare Metal でのみ使用できます。

準備

  1. 次のコマンドライン ツールがインストールされていることを確認します。

    • 最新バージョンの Google Cloud CLI、Google Cloud とやり取りするためのコマンドライン ツールである gcloud が含まれています。Google Cloud CLI をインストールする必要がある場合は、インストール ガイドをご覧ください。
    • Kubernetes クラスタに対してコマンドを実行するために使用する kubectlkubectl をインストールする必要がある場合は、インストール ガイドをご覧ください。

    Google Cloud を操作するシェル環境として Cloud Shell を使用する場合は、これらのツールがインストールされます。

  2. プロジェクトで使用する gcloud CLI が初期化されていることを確認します。

この設定では、さまざまな場面で LDAP サーバーのドキュメントを参照する必要があります。広く使用されているいくつかの LDAP プロバイダの構成については、次の管理者ガイドに説明が記載されています。これには、LDAP サーバーへログインしてクラスタを構成するために必要な情報を得る方法などが含まれます。

LDAP サービス アカウントの Secret を登録する

GKE Identity Service が LDAP サーバーを認証し、ユーザーの詳細情報を取得するには、サービス アカウントの Secret が必要です。LDAP 認証で許可されるサービス アカウントの種類には、基本認証(ユーザー名とパスワードを使用してサーバーを認証)とクライアント証明書(クライアントの秘密鍵とクライアント証明書を使用)の 2 種類があります。お客様またはプラットフォーム管理者は、GKE Identity Service 用の LDAP プロバイダを設定するの手順に沿って、プロバイダに関するこの情報を把握している必要があります。

GKE Identity Service で LDAP サーバーのログイン情報を使用できるようにするには、GKE Identity Service 用の LDAP プロバイダを設定するのログインの詳細を使用して、Kubernetes Secret リソースを作成する必要があります。

以下の例では、両種類のサービス アカウントの Secret を構成する方法を示します。上記の例は、anthos-identity-service Namespace に適用される Secret を示しています。

基本認証の Secret 構成は、次のようになります。

apiVersion: v1
kind: Secret
metadata:
  name: SERVICE_ACCOUNT_SECRET_NAME
  namespace: "anthos-identity-service"
type: kubernetes.io/basic-auth     # Make sure the type is correct
data:
  username: USERNAME  # Use a base64-encoded username
  password: PASSWORD  # Use a base64-encoded password

ここで、SERVICE_ACCOUNT_SECRET_NAME は、この Secret に付けた名前です。username と password の値は、前のステップで取得したユーザー名とパスワードに置き換えます。 USERNAME は base64 でエンコードされたユーザー名です。PASSWORD は base64 でエンコードされたパスワードです。

クライアント証明書の Secret 構成は、次のようになります。

apiVersion: v1
kind: Secret
metadata:
  name: SERVICE_ACCOUNT_SECRET_NAME
  namespace: anthos-identity-service
type: kubernetes.io/tls            # Make sure the type is correct
data:
  # the data is abbreviated in this example
  tls.crt: |
       MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
  tls.key: |
       MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...

ここで、SERVICE_ACCOUNT_SECRET_NAME は、この Secret に付けた名前です。TLS 証明書と鍵の値は、前のステップで取得しエンコードした証明書と鍵の値で置き換えます。

上記の例では、Secret を anthos-identity-service Namespace に適用しています。この方法をおすすめします。GKE Identity Service は、デフォルトで anthos-identity-service の Secret を読み取る権限を持っていることがおすすめする理由です。別の名前空間を使用する場合は、Secret のメタデータを変更してから、下のように、新しい RBAC ポリシーを追加して、その名前空間の Secret を読み取る権限を GKE Identity Service に付与します。

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: NAMESPACE
  name: ais-secret-reader-role
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get","list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: ais-secret-reader-role-binding
  namespace: NAMESPACE
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: ais-secret-reader-role
subjects:
- kind: ServiceAccount
  name: default
  namespace: anthos-identity-service
---

クラスタを構成する

GKE Identity Service は、特別な Kubernetes のカスタム リソース タイプ(CRD)を使用して、ClientConfig と呼ばれるクラスタを構成します。この CRD には、ID プロバイダに関する情報のフィールドと、ユーザー情報を返すために必要なパラメータがあります。ClientConfig 構成には、前のセクションで作成して適用した Secret のシークレット名と名前空間も含まれており、これにより GKE Identity Service で LDAP サーバーに対する認証を行えるようになります。

この構成をクラスタに適用するには、kube-public 名前空間内の clientconfig タイプの KRM デフォルト オブジェクトを編集します。

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n kube-public edit clientconfig default

ここで、USER_CLUSTER_KUBECONFIG はクラスタの kubeconfig ファイルのパスです。kubeconfig に複数のコンテキストがある場合は、現行のコンテキストが使用されます。コマンドを実行する前に、現在のコンテキストを正しいクラスタにリセットする必要が生じる場合があります。

ClientConfig 構成の形式は次のとおりです。

authentication:
  - name: NAME_STRING
    ldap:
      host: HOST_NAME
      certificateAuthorityData: CERTIFICATE_AUTHORITY_DATA
      connectionType: CONNECTION_TYPE
      serviceAccountSecret:
        name: SERVICE_ACCOUNT_SECRET_NAME
        namespace: NAMESPACE
        type: SECRET_FORMAT
      user:
        baseDN: BASE_DN
        filter: FILTER
        identifierAttribute: IDENTIFIER_ATTRIBUTE
        loginAttribute: LOGIN_ATTRIBUTE
      group:
        baseDN: BASE_DN
        filter: FILTER
        identifierAttribute: IDENTIFIER_ATTRIBUTE

ClientConfig CRD の各フィールドの説明を、次の表に示します。

項目 必須 説明 形式
名前 この LDAP 構成を識別する名前 文字列
host LDAP サーバーのホスト名または IP アドレス。ポートは省略可能であり、指定しない場合のデフォルトは 389 です。たとえば、ldap.server.example.com10.10.10.10:389 などです。 文字列
certificateAuthorityData 特定の LDAP 接続タイプで必須 LDAP サーバー用の Base64 エンコードされた PEM 形式の認証局証明書が含まれます。これは、ldaps 接続と startTLS 接続に対してのみ指定する必要があります。 文字列
connectionType LDAP サーバーへの接続時に使用する LDAP 接続タイプ。デフォルトは startTLS です。insecure モードはサーバーへのすべての通信が平文であるため、開発にのみ使用してください。 文字列
serviceAccountSecret
名前 LDAP サービス アカウントの認証情報を格納する Kubernetes Secret の名前。 文字列
名前空間 LDAP サービス アカウントの認証情報を格納する Kubernetes Secret の Namespace。 文字列
type さまざまな種類のシークレットをサポートするために、サービス アカウント シークレットの形式を定義します。Secret 構成で basic-auth を指定した場合は、これを basic にする必要があります。それ以外の場合は、tls にする必要があります。指定しない場合は、デフォルトで basic になります。 文字列
ユーザー
baseDN ユーザー エントリを検索する LDAP ディレクトリ内のサブツリーの場所。 文字列
フィルタ × ユーザーの検索に適用するオプションのフィルタ。これは、ログインを許可するユーザー アカウントをさらに制限するために使用できます。指定しない場合は、デフォルトで (objectClass=User) になります。 文字列
identifierAttribute × 認証後にユーザーの ID として使用する属性を指定します。これは、ユーザーがユーザー名を使用してログインできるようにする loginAttribute フィールドとは別のものですが、実際の ID がメールアドレスか完全な識別名(DN)になります。たとえば、loginAttribute を sAMAccountName、identifierAttribute を userPrincipleName に設定すると、ユーザーは bsmith としてログインできるようになりますが、ユーザーの実際の RBAC ポリシーは bsmith@example.com として記述されます。ユーザーごとに一意になることから、userPrincipleName の使用をおすすめします。指定しない場合は、デフォルトで userPrincipleName になります。 文字列
loginAttribute × 入力ユーザー名と照合する属性の名前。LDAP データベースでユーザーを検索するために使用され(例: (<LoginAttribute>=<username>))ます。また、オプションのフィルタ フィールドと組み合わせて使用されます。デフォルトは userPrincipleName です。 文字列
group(省略可能な項目)
baseDN グループ エントリを検索する LDAP ディレクトリ内のサブツリーの場所。 文字列
フィルタ × ユーザーが所属するグループを検索するときに使用するフィルタ(省略可)。これを使用することで、特定のグループのみを明示的に照合して、各ユーザーから返されるグループの数を減らすことができます。デフォルトは (objectClass=Group) です。 文字列
identifierAttribute × ユーザーが所属する各グループの識別名。たとえば、distinguishedName に設定すると、RBAC とその他のグループへの想定は、完全な DN として記述する必要があります。指定しない場合は、デフォルトで distinguishedName になります。 文字列

次のステップ

構成が適用されたら、GKE Identity Service を使用してクラスタにユーザー アクセスを設定するに進む。