適切な認証メカニズムの選択はクラスターのセキュリティ確保において重要です。 Kubernetesはいくつかの組み込みのメカニズムを提供しており、それぞれに長所と短所があります。 クラスターに最適な認証メカニズムを選択する際は、これらを慎重に検討する必要があります。
一般的に、有効にする認証メカニズムをできるだけ少なくすることが推奨されています。 これはユーザー管理を単純化し、不要となったクラスターへのアクセス権をユーザーが保持し続けることを防ぐためです。
重要な注意点として、Kubernetesはクラスター内に組み込みのユーザーデータベースを持っていません。 代わりに、設定された認証システムからユーザー情報を取得し、それを使用して認可の判断を行います。 そのため、ユーザーアクセスを監査するには、設定されているすべての認証ソースの認証情報を確認する必要があります。
複数のユーザーが直接Kubernetes APIにアクセスする本番環境のクラスターでは、OIDCなどの外部認証ソースを使用することが推奨されています。 以下で説明するクライアント証明書やサービスアカウントトークンなどの内部認証メカニズムは、このユースケースには適していません。
Kubernetesは、kubeletがAPIサーバーに対して認証を行う場合など、システムコンポーネントにX509クライアント証明書認証を活用します。 このメカニズムはユーザー認証にも使用できますが、以下の制限により本番環境での使用には適さない可能性があります:
O値に埋め込まれているため、証明書の有効期間中はユーザーのグループメンバーシップを変更することができません。Kubernetesではコントロールプレーンノードのディスクにある静的なトークンファイルから認証情報を読み込むことができますが、以下の理由により本番環境のサーバーではこの方法は推奨されません:
ブートストラップトークンはノードをクラスターに参加させるために使用されます。 以下の理由により、ユーザー認証には推奨されません:
サービスアカウントシークレットは、クラスター内で実行されるワークロードがAPIサーバーに対して認証を行うためのオプションとして利用できます。 Kubernetes 1.23より前のバージョンではデフォルトのオプションでしたが、現在はTokenRequest APIトークンに置き換えられています。 これらのSecretはユーザー認証に使用できますが、以下の理由により一般的に不適切です:
TokenRequest APIは、APIサーバーまたはサードパーティシステムへのサービス認証のために有効期間の短い認証情報を生成するために有用なツールです。 ただし、認証情報の失効方法が無いため、一般的にユーザー認証には推奨されず、ユーザーへの認証情報の安全な配布が困難です。
TokenRequestトークンをサービス認証に使用する場合、トークンが漏洩した際の影響を軽減するために、短い有効期間を設定することが推奨されます。
Kubernetesは、OpenID Connect (OIDC)を使用した外部認証サービスとKubernetes APIとの統合をサポートしています。 Kubernetesをアイデンティティプロバイダーと統合するために使用できるソフトウェアは多岐にわたります。 しかし、KubernetesでOIDC認証を使用する際は、以下のセキュリティ強化策を考慮することが重要です:
Webhookトークン認証は、外部認証プロバイダーをKubernetesに統合するもう一つのオプションです。 この認証メカニズムを用いると、クラスター内部または外部で実行される認証サービスに対してWebhookを介して認証の判断を問い合わせることができます。 この認証メカニズムへの適合性は認証サービスに使用されるソフトウェアに依存する可能性が高く、Kubernetes特有の考慮事項があることに注意が必要です。
Webhook認証を設定するには、コントロールプレーンサーバーのファイルシステムへのアクセスが必要です。 そのため、プロバイダーが特別に利用可能にしない限り、マネージドKubernetesでは使用できません。 また、このアクセスをサポートするためにクラスターにインストールされるソフトウェアは高い権限で実行されるため、一般的なワークロードから分離する必要があります。
認証プロキシは、外部認証システムをKubernetesに統合するもう一つのオプションです。 この認証メカニズムでは、Kubernetesは認可のために割り当てるユーザー名とグループメンバーシップを示す特定のヘッダー値が設定されたリクエストをプロキシから受け取ることを想定しています。 この認証メカニズムを使用する際には、特定の考慮事項に注意する必要があります。
まず、トラフィックの傍受やスニッフィング攻撃のリスクを軽減するため、プロキシとKubernetes APIサーバー間では安全に設定されたTLSを使用する必要があります。 これにより、プロキシとKubernetes APIサーバー間の通信の安全性が確保されます。
次に、リクエストヘッダーを改ざんできる攻撃者がKubernetesリソースへの不正アクセスを取得できる可能性があることを認識することが重要です。 そのため、ヘッダーが適切に保護され、改ざんされないようにすることが重要です。