こんにちは!前回の投稿では、Kubernetesの「認可(Authorization)」方式について見ていき、クラスターセキュリティの重要性を強調しました。今日は、その最初のステップである「認証(Authentication)」について深く掘り下げていく時間です!🔑
「あなたは誰ですか?」🤔 Kubernetes APIサーバーは、クラスターにアクセスしようとするすべてのユーザーとプロセスにこの質問を投げかけます。そして、その質問への答え、つまり身元を証明するさまざまな「鍵」が存在します。
それでは、Kubernetesクラスターの扉を開く多彩な認証方法を一緒に見ていきましょう!🚀

📜 1. X.509 クライアント証明書 (X.509 Client Certs)
「私は発行された身分証明書を持っているので、信じてください!」
最も一般的で強力な認証方式の一つです。皆様の住民登録証や運転免許証のように、固有のデジタル身分証明書を通じて身元を証明する方式です。
Kubernetesクラスターは、独自の認証局(Certificate Authority, CA)を持っています。このCAがユーザーの要求に応じてX.509形式のクライアント証明書を発行します。この証明書には、ユーザーの情報(例:ID、グループ)が含まれています。
クライアント(ユーザーまたはkubectlのようなツール)がAPIサーバーにリクエストを送信する際、この発行されたクライアント証明書を一緒に提示します。APIサーバーは自身のCAでこの証明書が有効であるか、誰が発行したかなどを確認し、身元を認証します。✅
利点:
- 非常に強力なセキュリティ 💪
- 自動化されたシステムでの使用が容易 ⚙️
- 一度設定すれば便利に利用可能
欠点:
- 証明書の発行および管理がやや複雑になる場合がある 📝
- 証明書の有効期限切れ時に更新が必要 ⏳
ほとんどのKubernetesクラスターは、デフォルトでこの方式を使用しており、kubeconfigファイルにこの証明書情報が格納されているため、kubectlがAPIサーバーと通信する際に活用されます。
📄 2. 静的トークンファイル (Static Token File)
「ここにファイルに書かれたパスワードを見せるよ!」
名前の通り、事前に定義されたユーザー名とトークン(パスワードのような文字列)が格納されたファイルを使用して認証する方式です。
クラスターを起動する際、APIサーバーに–token-auth-fileオプションを通じて特定のファイルのパスを伝えます。このファイル内には、各ユーザー(またはサービス)のID、UID、グループ、そしてトークンが1行ずつ記録されています。
<token>,<user-name>,<user-id>,<group1>,<group2>...
ユーザーがAPIサーバーにリクエストを送信する際、HTTPヘッダーにAuthorization: Bearer
利点:
- 設定が簡単で実装しやすい 👶
- 小規模なクラスターやテスト環境に適している
欠点:
- セキュリティに脆弱な場合がある(トークンがファイルに平文で保存されるリスク)⚠️
- トークンの変更や管理が難しい 😵💫
- 大規模環境では非効率的
💡 参考: 最近ではあまり使用されないレガシー(legacy)方式と見なされています。
📨 3. リクエストにBearerトークンを含める (Putting a Bearer Token in a Request)
「私がこのトークンを持っているので、私を『所有者』として認めてください!」
これは特定の認証方式というよりも、トークンをAPIサーバーに渡す一般的な方法です。「Bearer」という単語は、「このトークンを所有している人が、まさにそのユーザーであることを証明する」という意味を含んでいます。🤝
前述の「静的トークンファイル」や、後述する「ブートストラップトークン」、「サービスアカウントトークン」、「OpenID Connectトークン」、「Webhookトークン」など、さまざまな種類のトークンが、この「Bearerトークン」の形でHTTPリクエストヘッダーに含められて送信されます。
リクエスト例:
GET /api/v1/pods
Authorization: Bearer <여기_에_인증_토큰_입력>
APIサーバーは、このAuthorizationヘッダーからトークンを抽出し、設定された複数の認証モジュール(静的トークンファイル、OIDCなど)のいずれかを介してトークンの有効性を検証します。
🚀 4. ブートストラップトークン (Bootstrap Tokens)
「新しくクラスターに参加するノードよ、この使い捨てパスワードでとりあえず入って基本的な設定をして!」
Kubernetesクラスターを初めて構築する際や、新しいノードをクラスターに合流させる際に一時的に使用されるトークンです。🏗️
新しいノード(kubelet)がクラスターに参加するにはAPIサーバーと通信する必要がありますが、その際、Node Authorizationのような認可方式が適用される前までは認証する方法が必要です。ブートストラップトークンは、まさにこの初期設定(bootstrap)段階でkubeletがAPIサーバーに自身の身元を一時的に証明し、必要な証明書(X.509)を発行してもらえるように支援します。
特徴:
- 短い有効期間 ⏰(通常24時間)
- 使い捨てまたは限定的な用途で使用
- kubeadmのようなクラスター構築ツールで主に活用
クラスターにノードが正常に合流すると、ブートストラップトークンはそれ以上使用されなくなるか、期限切れになります。セキュリティのために最小限の権限のみが付与され、主にkube-systemネームスペースにSecretの形で保存されます。
🤖 5. サービスアカウントトークン (Service Account Tokens)
「私は『データベース接続』サービスです。このトークンでデータベースにアクセスできるようにしてください!」
名前が示す通り、人間ではなく「サービス」や「Pod」がAPIサーバーと通信する際に使用される認証トークンです。⚙️
Kubernetesクラスター内で実行されるアプリケーション(Pod)が、クラスターAPIにアクセスして情報を照会したり、リソースを作成、変更、削除したりする必要があることがよくあります。例えば、モニタリングPodがクラスターの状態を確認したり、デプロイ自動化Podが新しいサービスをデプロイする場合などです。
このとき、各Podは基本的に特定のサービスアカウント(Service Account)と関連付けられます。そして、このサービスアカウントには、当該PodがAPIサーバーに認証できるサービスアカウントトークンが自動的に生成され、Pod内部にシークレット(Secret)の形でマウントされます。
Pod内のアプリケーションは、このトークンを使用してAPIサーバーにリクエストを送信できるようになります。
利点:
- クラスター内部のワークロード(Pod)からの安全なAPIアクセスが可能 👍
- RBACと連携してきめ細やかな権限制御が可能(サービスアカウントにRoleBindingを適用)
- トークン管理がKubernetes内部で行われるため便利
🌐 6. OpenID Connect トークン (OpenID Connect Tokens)
「私、Google/Azure/Salesforceで認証されたユーザーです!信じてください!」
最近のWebサービスでよく使用される外部のアイデンティティプロバイダー(Identity Provider, IdP)を通じてユーザーを認証する方式です。🆔
皆様はすでに毎日この方式を使用しているかもしれません。例えば、あるウェブサイトに登録する際に「Googleアカウントでログイン」、「Naverアカウントでログイン」のようなボタンを押したことがあるでしょう。OpenID Connect(OIDC)は、まさにこのような方式の標準プロトコルです。
Kubernetes APIサーバーは、Azure Active Directory、Google、Salesforceのような外部OIDCプロバイダーと連携してユーザー認証を実行できます。
動作方式:
- ユーザーがkubectlなどでKubernetes APIへのアクセスを試みます。
- APIサーバーはユーザーをOIDC IdPにリダイレクトし、ログインを促します。
- ユーザーはIdPでログインプロセスを完了します。
- IdPはログイン成功時にユーザーにIDトークン(JWT)を発行し、Kubernetes APIサーバーに再度リダイレクトします。
- APIサーバーはこのIDトークンを受け取って検証し、トークン内の情報(ユーザーID、グループなど)を抽出して認証を完了します。✅
利点:
- 既存の中央集権型IdP(会社のSSOシステムなど)と連携して便利に認証可能 💼
- ユーザーアカウント管理を一箇所で行えるため効率的
- セキュリティが高い(トークンの有効性検証および期限切れ処理)
🪝 7. Webhook トークン (Webhook Token)
「このトークンが有効かどうか、外部システムに聞いてくるね!」
この方式は、トークンの有効性をKubernetes APIサーバー自体で判断せず、外部のWebhookサービスに判断を委任する方式です。📞
APIサーバーは、特定のトークンを含むリクエストを受け取ると、事前に設定された外部Webhook認証サービスのURLに、当該トークンを含むリクエストを送信します。外部サービスは、独自のロジックとバックエンドシステム(例:LDAP、社内認証DB)を通じてこのトークンが有効であるかを検証した後、認証結果をAPIサーバーに再度通知します。
利点:
- Kubernetesがサポートしない複雑な、またはカスタムの認証ロジックを適用可能 🧩
- 既存の複雑な認証インフラをそのまま活用できる
- 柔軟性が非常に高い
欠点:
- 外部Webhookサービスの実装および管理が必要 🛠️
- ネットワーク遅延や外部サービスの障害が発生した場合、認証に影響を与える可能性がある
✨ まとめ
今日は、Kubernetesクラスターへのさまざまな「認証(Authentication)」方法について学びました。
- X.509 クライアント証明書: 強力なデジタル身分証明書方式
- 静的トークンファイル: シンプルだがセキュリティに脆弱なレガシー方式
- Bearerトークン: トークンを伝達する一般的な形式
- ブートストラップトークン: クラスター初期構成時に一時的に使用
- サービスアカウントトークン: Pod(アプリケーション)がAPIサーバーと通信する際に使用
- OpenID Connectトークン: 外部IdPを通じた集中型認証
- Webhookトークン: 外部サービスに認証決定を委任する柔軟な方式
このように、Kubernetesは多様な認証メカニズムを提供し、皆様のクラスター環境とセキュリティ要件に合わせて最適な方法を選択できるよう支援します。どの方式を選択するにしても、最も重要なのは「最小権限の原則」を守り、使用しないトークンは必ず破棄することを忘れないでください!🔒
次回の投稿では、この認証されたユーザーが「何ができるのか」を決定する「認可(Authorization)」について、さらに詳しく掘り下げていきます。😉
タグ: Kubernetes, 認証, Authentication, セキュリティ, X509, トークン, BearerToken, BootstrapToken, ServiceAccount, OpenIDConnect, OIDC, Webhook, K8s, DevOps
コメントを残す