目次
各認証方式の特徴や設定方法、エラー発生時の対処法を紹介
Kubernetes は不特定多数がクラスターにアクセスできる前提であり、デフォルトの API アクセスに一般的用途としては過度な許可が与えられています。そのため、セキュリティを保つための認証設定が重要となります。
本記事では Kubernetes 認証の仕組みや各認証方式の特徴といった基礎知識に加え、認証方式の選択と設定のベストプラクティス、エラー発生時のトラブルシューティングを紹介します。
1. Kubernetes認証の基礎知識
Kubernetes における認証の仕組み、認証と認可の違いについて解説します。
Kubernetesにおける認証対象
認証の対象となるのは、「通常のユーザー」と「サービスアカウント」の 2 種類です。
- 通常のユーザー:いわゆる人間のユーザー
- サービスアカウント:アプリケーションからのリクエスト時に使用されるもので、 Kubernetes API によって管理されるユーザー
認証対象ではない「匿名ユーザー」もあり、これは認証なしでリクエストを実行できるユーザーです。
認証の仕組み
認証は Kubernetes API へのアクセス時に行われます。API サーバーには暗号化された接続用のポート(デフォルトは 6443 番ポート)と、暗号化されていない接続用のポート(デフォルトは 8080 番ポート)があります。暗号化されていない接続を受け付けるポートは Kubernetes の各種コンポーネント通信用で、このポートに送信されたリクエストには認証処理は行われません。
Kubernetes では認証を行う部分をモジュール化し、複数の認証方式から目的やユースケースに応じて選択できるよう作られています。認証モジュールは独自に制作したものも使用可能です。
認証と認可の違い、処理の流れ
認証はリクエストを送信したユーザーが正当なユーザーであるかを確認する処理で、認可はリクエストを実行する権限がユーザーにあるかを確認する処理です。
API サーバーはリクエストを受けると、まず認証を行い、正当なユーザーであった場合に認可を行います。認証、認可共にパスした場合、リクエストの内容をチェックする「 admission control (入力制御)」処理を経てリクエストが実行されます。

図版出典:Kubernetes公式サイト
2. Kubernetesの主な認証方式
Kubernetes に標準で提供されている各認証方式の特徴を紹介します。複数の認証方式を同時に有効にすることも可能です。その場合、1 つの認証モジュールが成功するまで順番に試行が行われます。
X509 クライアント証明書 | SSL/TLS 等で使われる X.509 公開鍵認証を使ってユーザーの認証を行います。 API サーバーは受け取った証明書を CA ファイル(認証局情報ファイル)を使用してユーザーの正当性を検証します。 |
---|---|
静的なトークンファイル | ユーザー名やトークンを列挙した csv ファイルでユーザーを管理する認証方式です。 トークンの有効期限は無く、csv ファイルの変更には API サーバーの再起動が必要です。 |
サービスアカウントトークン | リクエスト時にサービスアカウント毎に用意されたトークンを送信し、登録されているトークンと一致するかで認証を行います。 自動的に有効化される認証機能です。 |
OpenID Connect トークン | OAuth2 を用いる認証方式です。 Google や Microsoft などの OpenID Connect プロバイダーに接続して認証を行います。 |
Webhook トークン認証 | 送信されたトークンを外部サービスに問い合わせて認証を行う方式です。 |
ブートストラップトークン | クラスタ構築時、まだ認証設定が行われていない段階で使われる認証方式です。 有効期限付きで、ユーザーは一定期間で削除されます。 |
認証プロキシ | 認証プロキシを介して外部認証システムで認証を実施する方式です。 認証プロキシと API サーバー間では安全に設定された TLS 暗号化通信を使用する必要があります。 |
3. Kubernetes認証の選択と設定のベストプラクティス
Kubernetes の全ての操作とコンポーネント間の通信は、 API リクエストを API サーバーが処理することで実現されます。不正なユーザーや侵害されたコンテナによって Kubernetes API が操作されると、重要情報の漏洩や悪意あるコンテナ埋め込みなど、クラスタ内で不正行為が実行される恐れがあります。

不正行為を防ぐためにはセキュリティ的に高い強度を持った認証を構築する必要があります。
以下に、そのような認証方式の設定と管理のポイントを紹介します。
x509クライアント証明書を活用する
以下のメリットを持つ「 x509 クライアント証明書」を使用します。
- 秘密鍵を持っているユーザーだけがアクセスできる。
- 証明書を発行・失効することでアクセス管理が可能。
- パスワード漏洩のリスクがない。
トークンや証明書には有効期限を設定
認証トークンや証明書に期限を設けて定期的に更新します。
匿名リクエストは必ず無効化する
Kubernetesはデフォルトで匿名リクエストを許可している場合があるため、すべてのリクエストに認証を要求するように匿名リクエストは無効にします。
「system:masters」グループは制限
「system:masters」グループには必要最低限のユーザーのみを割り当てるようにしましょう。
ユーザー・グループは用途ごとに分ける
用途に応じてユーザーやグループを分け、使い回しによる不要な権限付与を避けましょう。
kubeletとの通信はTLSで暗号化
ノード上で動作するkubelet と API サーバー間では TLS 暗号化通信を使用します。
監査ログを有効化し、不審なAPI操作を可視化
監査ログを有効にし、すべてのリクエストの履歴を記録します。
4. Kubernetes認証の設定方法とトラブルシューティングのガイド
認証にX509 クライアント証明書を利用した設定方法と、起こりがちな認証エラーの原因と対処法を解説します。
Kubernetes認証の設定方法
KubernetesでX.509クライアント証明書を使ったユーザー認証を行うには、秘密鍵と証明書を作成し、Kubernetesクラスタに認識させる必要があります。以下は一般的な手順です。
秘密鍵を作成する

証明書署名リクエストを作成する
例ではユーザー名( CN )を user01 と指定しています。

CSR マニュフェストファイル( csr.yaml )を作成します。
例では有効期限( expirationSeconds )を 30日間としています。

CSR マニュフェストファイルの request: の内容を以下コマンドの出力結果に書き換えます。

クラスタに CSR マニュフェストファイルを登録します。

証明書署名リクエストを承認する

証明書を取得する
証明書ファイル( mycrt.crt )を作成します。

ロールとロールバインディングを作成する
ユーザーがKubernetesリソースへアクセスできるよう、RBACの設定(ロールとバインディング)を行います。
kubeconfig の設定
秘密鍵と証明書をもとにユーザーを設定します。

コンテキストを設定します。

テスト
以下を実行し Pod 情報が表示されれば設定完了です。

認証エラー発生時の原因と対処法
認証エラーが発生した場合は、以下の原因と対処法を確認してください。
認証エラー | 原因 | 対処法 |
---|---|---|
401 Unauthorizedエラー | 無効な認証情報(ユーザー、トークン)を用いている。 | 正しい認証情報を用いる。 |
-subj フィールドを指定せずに証明書を作成した等で、作成した証明書中の名前フィールドが認証に用いるユーザー名になっていない。 | 証明書中の名前フィールドが正しいユーザー名であることを確認する。 | |
認証プラグインが正しくインストールされていないか、構成されていない。 | kubeconfig で認証プラグインを正しく構成する。 | |
Unable to connect to the serverエラー | 認証サーバーのアドレスに誤りがある、あるいは証明書の有効期限が切れている。 | 認証サーバーのアドレスが正しく設定されていることを確認する。同時に x509 に関するメッセージが表示されている場合は、 x509 クライアント証明書の有効期限を確認する。 |
5. まとめ
Kubernetes 認証の仕組みや各認証方式の特徴、認証方式の選択と設定のベストプラクティス、エラー発生時のトラブルシューティングを解説しました。上記の説明をもとに、ぜひセキュリティ的に強固な Kubernetes 認証環境を構築してください。
また、自社での導入に不安がある場合、Kubernetes の運用に精通した外部パートナーを活用するのも手です。弊社では、Kubernetes の導入支援を行っていますので、認証方式の選定から設定、運用まで、セキュリティを重視した最適な環境構築をサポートいたします。お気軽にご相談ください。
Kubernetes の運用を相談したい

Contactお問い合わせ
お見積もり・ご相談など、お気軽にお問い合わせください。