# K06:2022 認証メカニズムの不備

### 概要

Kubernetes の認証は多くの形態を取り、非常に柔軟です。 このように高度に設定可能であることを重視しているため、Kubernetes は多くのさまざまな環境で動作しますが、クラスタやクラウドセキュリティ体勢に関して課題もあります。

![Broken Authentication - Illustration](https://74895396-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqqxFlgHMxmxr9R9qFnFK%2Fuploads%2Fgit-blob-6e1fe46cda9544fdc4be225207f41cf7bb3e89e1%2FK06-2022.gif?alt=media)

### 説明

Kubernetes API にアクセスするために必要なエンティティがいくつかあります。 認証はこれらのリクエストの最初のハードルです。 Kubernetes API への認証は HTTP リクエストを介して行われ、認証方式はクラスタごとに異なります。 リクエストが認証できない場合、HTTP ステータス 401 で拒否されます。

![Kubernetes Authentication](https://74895396-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqqxFlgHMxmxr9R9qFnFK%2Fuploads%2Fgit-blob-65cc64faa1d653adaeef5715620f8ca5c44afd06%2Fkubernetes-auth.png?alt=media)

入手元: <https://kubernetes.io/docs/concepts/security/controlling-access/>

Kubernetes API への認証が必要なさまざまなタイプの subject について詳しく見ていきましょう。

#### 人間の認証

人はさまざまな理由で Kubernetes と対話する必要があります。 ステージングクラスタで実行中のアプリケーションをデバッグする開発者や、新しいインフラを構築しテストするプラットフォームエンジニアなど。 OpenID Connect (OIDC)、証明書、クラウド IAM、さらには ServiceAccount トークンなど、人間としてクラスタに認証するために利用できる方法がいくつかあります。 これらの中にはより堅牢なセキュリティを提供するものもあります。 以下の防止方法のセクションで説明します。

#### サービスアカウントの認証

サービスアカウント (Service account, SA) トークンは RBAC で適切に設定された場合、認証メカニズムとして Kubernetes API に提示できます。 SA はシンプルな認証メカニズムで、一般的にはクラスタの *内部* からのコンテナから API への認証のために予約されています。

### 防止方法

#### エンドユーザー認証に証明書を使用することは避ける

証明書は Kubernetes API への認証に使用すると便利ですが、細心の注意を払って使用すべきです。 現時点では、API には証明書を失効させる方法がないため、秘密鍵マテリアルの侵害や漏洩があった場合、クラスタの鍵を更新するために奔走することになります。 また証明書は設定、署名、配布するのも面倒です。 証明書は "Break Glass" 認証メカニズムとして使用できますが、プライマリ認証には使用してはいけません。

#### 独自の認証を作ってはいけない

暗号と同様に、必要でないときに新しいものを作るべきではありません。 サポートされ広く採用されているものを使用します。

#### 可能な場合は MFA を強制する

選ばれた認証メカニズムに関係なく、人間に二番目の認証方式 (通常は OIDC の一部) を提供するように強制します。

#### クラスタ外からサービスアカウントトークンを使用しない

クラスタ内で使用する場合、Kubernetes Service Account トークンは TokenRequest API を使用して直接取得され、投影ボリュームを使用して Pod にマウントされます。 クラスタ外で使用する場合、これらのトークンは [Kubernetes Secret](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#manually-create-a-long-lived-api-token-for-a-serviceaccount) を介して手動でプロビジョンする必要があり、有効期限はありません。 クラスタ外から有効期間の長い SA トークンを使用すると、クラスタを重大なリスクにさらすことになります。

トークンベースのアプローチが必要な場合は、[TokenRequest API](https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-request-v1/) または [`kubectl create token` を `--duration` フラグとともに](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/) 使用して、有効期間の短いトークンをプロビジョンできます。

#### ユーザーと外部サービスには短期間有効なトークンを使用して認証する

すべての認証トークンは許容範囲内で短期間有効であるべきです。 このようにすれば、認証情報が漏洩した場合でも、アカウントを侵害するために必要な時間内にリプレイできない可能性があります。

![Broken Authentication - Mitigations](https://74895396-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqqxFlgHMxmxr9R9qFnFK%2Fuploads%2Fgit-blob-6b18990b818fbc60726c4addd5d2287a090fdb60%2FK06-2022-mitigation.gif?alt=media)

### 攻撃シナリオの例

***偶発的な Git 流出:*** ある開発者が自分のラップトップから誤って `.kubeconfig` をチェックしてしまいました。 このファイルには稼働中のクラスタの Kubernetes 認証情報が入っていました。 ある人が GitHub をスキャンしてその認証情報を見つけ、ターゲット API (残念ながらインターネット上にあります) にリプレイします。 クラスタは証明書を使用して認証するように設定されているため、流出したファイルにはターゲットクラスタへの認証に成功するために必要なすべての情報が含まれていました。

### 参考資料

Tremlo Blog Post: <https://www.tremolosecurity.com/post/what-the-nsa-and-cisa-left-out-of-their-kubernetes-hardening-guide>

Kubernetes Authentication: <https://kubernetes.io/docs/concepts/security/controlling-access/>
