LDAP サーバーに関する問題のトラブルシューティング

このドキュメントでは、GKE Identity Service の LDAP サーバーに関する問題のトラブルシューティングについて説明します。

接続の問題

GKE Identity Service の構成時に、LDAP サーバーに接続を試みると接続の問題が発生することがあります。また、LDAP サーバーを識別するために使用される証明書が ClientConfig に記述されている証明書と一致しない場合にも、接続の問題が発生する可能性があります。

エラー メッセージ

次のメッセージは、gcloud anthos auth login コマンドの実行時に発生するエラーに適用されます。

  • ERROR: LDAP login failed: could not obtain an STS token: Post "https://127.0.0.1:15001/sts/v1beta/token": failed to obtain an endpoint for deployment anthos-identity-service/ais: Unauthorized
  • ERROR: Configuring Anthos authentication failed

解決策

問題は、次のいずれかの方法で解決できます。

  • GKE Identity Service が LDAP サーバーに接続できない場合は、次の操作を行います。
    • ネットワーク トラフィックがクラスタから LDAP サーバー(ID プロバイダ)に到達できるかを確認するには、telnetnc または同様のコマンドを使用して LDAP サーバーに接続します。LDAP サーバーに接続するには、GKE Identity Service が実行されているノードまたは Pod でコマンドを実行する必要があります。
    • コマンドが成功すると、GKE Identity Service Pod が LDAP サーバーに接続します。
    • コマンドが失敗する場合は、ネットワーク接続に問題があることを示しています。接続の問題を解決するには、ネットワーク設定を確認するか、ネットワーク管理者にお問い合わせください。
  • 構成内の公開証明書が正しい形式であり、次の場合に LDAP サーバーと一致していることを確認します。
    • TLS で LDAP を使用します。
    • サービス アカウントを使用して LDAP の認証を行います。証明書を使用して、LDAP サーバーでサービス アカウントを識別します。

認証の問題

認証の問題は、次のいずれかの場合に発生します。

  • GKE Identity Service の ClientConfig で LDAP プロバイダの設定が正しく構成されていない
  • 指定したユーザー認証情報が LDAP サーバーに存在しない。
  • LDAP サーバーがダウンしている。

エラー メッセージ

次のメッセージは、gcloud anthos auth login コマンドの実行時に発生するエラーに適用されます。

  • ERROR: LDAP login failed: could not obtain an STS token: Post "https://127.0.0.1:15001/sts/v1beta/token": failed to obtain an endpoint for deployment anthos-identity-service/ais: Unauthorized
  • ERROR: Configuring Anthos authentication failed

解決策

クラスタ管理者は、GKE Identity Service のログを確認し、次の方法で認証の問題を解決します。

  • Can't contact LDAP server: この問題の解決方法について詳しくは、接続に関する問題をご覧ください。
  • Attempting to bind as the LDAP service account: GKE Identity Service は、ClientConfig で指定されたサービス アカウントの認証情報を使用して LDAP サーバーに接続しようとしています。このログ メッセージがない場合、接続の問題があることを示します。
  • Successfully completed BIND as LDAP service account: GKE Identity Service は LDAP サーバーに正常に接続し、そのサービス アカウントをユーザー認証に使用できます。このログ メッセージがない場合、構成上の問題があることを示します。
  • Successfully found an entry for the user in the database: LDAP サーバーにユーザー エントリが存在します。これは、baseDNfilterloginAttribute の各フィールドが、ユーザーを取得するために正しく構成されていることを意味します。このメッセージは、ロギングの詳細度がデフォルト レベルを超えている場合にのみ表示されます。ログの有効化の詳細については、デバッグログを有効にするをご覧ください。
  • Attempting to BIND as the user to verify their credentials: GKE Identity Service がユーザーの認証情報を検証しようとしています。
  • Successfully completed LDAP authentication: ユーザー認証が成功しました。このログ メッセージがない場合、無効な認証情報が存在しています。

認証トークンの有効期限が切れている

ログインが成功しても、認証トークンの有効期限が切れていると問題が発生する場合があります。

エラー メッセージ

ERROR: You must be logged in to the server (Unauthorized)

解決策

この問題は、サーバーに再度ログインすることで解決できます。

ユーザーまたはグループに対する RBAC ロール バインディングの問題

この問題は、認証は成功したものの、RBAC ロールがユーザーまたはグループにバインドされていないために承認に失敗した場合に発生します。たとえば、kubectl get pods コマンドを実行しようとすると、この問題が引き続き発生します。

エラー メッセージ

Error from server (Forbidden): <SERVICE or PODS> is forbidden: <MORE DETAILS>

解決策

この問題を解決するには、次の操作を行います。

  1. LDAP サーバーにログインし、ターゲット ユーザーのグループを表示します。
  2. Kubernetes のロールとロール バインディングが正しく定義され、LDAP ディレクトリの値と一致しているかどうかを確認します。管理者は、Kubernetes のユーザーの権限借用を使用して、ロール バインディングを確認できます。
  3. ロール バインディングを更新して、ターゲット ユーザーのグループが必要なアクションの実行権限を持つようにします。
  4. baseDN の値を確認します。また、必要に応じてグループの filteridentifierAttribute の値が正しいことを確認します。GKE Identity Service は、これらのフィールドのグループ構成を使用して、ユーザーが属するすべてのグループをクエリします。baseDN が空の場合、Kubernetes API サーバーにグループは提供されません。この場合、ログにメッセージは記録されません。baseDN が空でない場合、GKE Identity Service はユーザーのグループのデータベースをクエリします。
    • クエリが成功すると、グループが Kubernetes API サーバーに提供されます。
    • クエリ失敗した場合、グループは Kubernetes API サーバーに提供されません。この場合、グループの baseDNfilter の構成値を修正する必要があります。

ユーザーが複数のグループに所属している

この問題は、ユーザーが複数のグループに属している場合に発生します。

エラー メッセージ

could not obtain an STS token: STS token exceeds allowed size limit. Possibility of too many groups associated with the credentials provided.

解決策

クラスタ管理者は、ClientConfig の filter フィールドを構成して、LDAP サーバーへのクエリで返されるグループの数を減らす必要があります。

バージョンの互換性に関する問題

この問題は、GKE Identity Service とインストールされている Google Cloud CLI のバージョンの互換性が一致しない場合に発生します。

エラー メッセージ

  • unable to parse STS Token Response
  • could not obtain an STS token: JSON parse error: The request was malformed.
  • could not obtain an STS token: Grant type must confirm that the request is intended for a token exchange.
  • could not obtain an STS token: Requested token type must correspond to an access token.
  • could not obtain an STS token: Subject token type must be a valid token type supported for token exchange.

解決策

gcloud ユーティリティと GKE Identity Service を最新バージョンにアップグレードする必要があります。

401 認証失敗ステータス コード

この問題は、Kubernetes API サーバーがサービスを認証できず、401 エラーコードを返す場合に発生します。

エラー メッセージ

  • ERROR: LDAP login failed: STSToken() failed: could not obtain an STS token: Post "https://127.0.0.1:15001/sts/v1beta/token": DialContext() failed: podEndpoint() failed to obtain an endpoint for deployment anthos-identity-service/ais: Unauthorized

  • ERROR: Configuring Anthos authentication failed

解決策

この問題は、次のいずれかの方法で解決できます。

  • 次のコマンドを使用して、GKE Identity Service Pod が running 状態にあるかどうかを確認します。
    kubectl get pods -l k8s-app=ais -n anthos-identity-service --kubeconfig USER_CLUSTER_KUBECONFIG
    
  • 次のコマンドを使用して、ClientConfig の LDAP 構成を確認します。
    kubectl get clientconfig -n kube-public -o jsonpath='{.items[].spec.authentication[].ldap}' --kubeconfig USER_CLUSTER_KUBECONFIG
    
  • ログでエラーに関する詳細情報を確認します。ロギングの詳細については、システム コンポーネントのロギングとモニタリングの使用をご覧ください。