
【K8sセキュリティ】 “とりあえず動く”から堅牢な本番環境へ移行!10のチェックリスト
コンテナ技術、特にKubernetes(クバネティス)の普及により、アプリケーション開発の速度は飛躍的に向上しました。しかし、その一方でセキュリティ対策が後手に回り、「とりあえず動いている」状態の本番環境が増えているのではないでしょうか。
この記事では、日々の運用に追われるインフラエンジニアやSREの皆さんが、自信を持って「堅牢だ」と言える本番環境を構築するために、最低限実施すべき10のセキュリティチェックリストを、公式ドキュメントも参考にしながら、具体的に解説します。
この記事を読み終える頃には、自社の環境に潜むリスクを特定し、具体的な改善アクションを始められるようになっているはずです。
1. Distrolessで、攻撃対象領域を削減
Distrolessとは、Googleが提供する、アプリケーションの実行に必要な最小限の依存関係のみを含んだコンテナイメージです。アプリケーションとその実行時の依存関係のみを含むように設計されるため、非常に軽量なことが特徴です。
コンテナイメージには、アプリケーションの実行に不要なOSコマンドやライブラリが含まれていることが多く、これらが脆弱性の温床となります。Distrolessイメージを利用することで、不要なツール(シェルやパッケージマネージャなど)を排除し、攻撃対象領域を大幅に削減できます。
これにより、脆弱性スキャナのノイズが減り、本当に重要な問題に集中できるようになるという副次的な効果も期待できます。
2. PSAで、Podの振る舞いを制限
Kubernetes v1.25で安定版(Stable)となったPod Security Admission (PSA) は.、Podのセキュリティに関する要求をnamespaceレベルで強制するための組み込みアドミッションコントローラです。
これは、非推奨となったPodSecurityPolicy (PSP) に代わるもので、よりシンプルで柔軟なセキュリティポリシーの適用を可能にします。 (参考記事)
PSAでは、「privileged」「baseline」「restricted」という3つのPodセキュリティ標準が定義されています。
プロファイル | 説明 |
---|---|
privileged | 制限がなく、最も広範な権限を許可するポリシー。 |
baseline | 既知の特権昇格を防ぐ、最小限の制限を持つポリシー。 |
restricted | 現在のPod強化のベストプラクティスに従う、非常に制限の厳しいポリシー。 |
開発段階では「baseline」を適用し、本番環境では可能な限り「restricted」ポリシーを適用することで、コンテナの不要な権限を剥奪し、セキュリティリスクを大幅に低減できます。
3. RBACで、最小権限の原則を徹底
Role-Based Access Control (RBAC) は、誰がどのリソースに対して何を実行できるかを制御する、Kubernetesセキュリティの要です。
ユーザーやサービスアカウントには、業務に必要な最小限の権限のみを付与する「最小権限の原則」を徹底することが重要です。 特に、namespaceレベルでの権限付与(RoleとRoleBinding)を基本とし、クラスタ全体に影響を及ぼすClusterRoleやClusterRoleBindingの使用は慎重に行うべきです。
また、ワイルドカードによる権限付与は、将来追加されるリソースへの意図しないアクセス許可につながる可能性があるため、避けるようにしましょう。
4. Network PolicyでPod間の通信を制御する
デフォルトでは、Kubernetesクラスタ内のすべてのPodは相互に通信できます。Network Policyを使用することで、Pod間の通信を明示的に制御し、不要な通信をブロックできます。
例えば、フロントエンドのPodはバックエンドのPodにのみアクセスを許可し、バックエンドのPodはデータベースのPodにのみアクセスを許可する、といったルールを定義します。
これにより、万が一いずれかのPodが侵害されたとしても、被害の拡大(ラテラルムーブメント)を防ぐことができます。まずはデフォルトで全ての通信を拒否するポリシーを適用し、必要な通信のみを許可していく「デフォルト拒否」のアプローチが推奨されます。
5. Secretの管理を徹底する
データベースの認証情報やAPIキーといった機密情報は、KubernetesのSecretオブジェクトを使用して管理するのが基本です。
しかし、デフォルトではSecretはBase64でエンコードされているだけで、暗号化されていません。 etcdに保存されるSecretデータを暗号化する「Encryption at Rest」を有効にすることが強く推奨されます。
また、Secretへのアクセス権限もRBACで厳格に管理し、不要なコンポーネントやユーザーからのアクセスを制限する必要があります。
6. リソース制限を設定してDoS攻撃を防ぐ
各コンテナに対してCPUやメモリのRequestsとLimitsを設定することは、特定コンテナのリソース独占を防ぎ、ノード全体の安定性を保つ上で不可欠です。これにより、リソースを大量に消費するタイプのDoS(サービス拒否)攻撃のリスクを緩和できます。
7. 読み取り専用のルートファイルシステムを利用する
コンテナのルートファイルシステムを読み取り専用に設定することで、コンテナ内での予期せぬファイルの書き込みや改ざんを防ぎ、セキュリティを強化できます。アプリケーションが一時的な書き込みを必要とする場合は、emptyDirボリュームをマウントして対応します。
8. 定期的な脆弱性スキャンを実施する
使用しているコンテナイメージやライブラリに新たな脆弱性が発見されることは日常茶飯事です。CI/CDパイプラインにコンテナイメージのスキャンを組み込み、定期的に実行することで、既知の脆弱性を持つイメージが本番環境にデプロイされるのを防ぎます。
9. 監査ログを有効化し、監視する
Kubernetesの監査ログは、APIサーバーへのリクエストを時系列で記録したものです。誰が、いつ、何をしようとしたのかを追跡するための重要な情報源となります。監査ログを有効化し、異常なアクティビティやポリシー違反がないか定期的に監視する体制を整えましょう。
10. Kubernetesのバージョンを最新に保つ
Kubernetesコミュニティは、定期的に新しいバージョンをリリースし、セキュリティ上の欠陥を修正しています。サポートされている最新の安定バージョンに追随し、クラスタを定期的にアップグレードすることは、最も基本的かつ効果的なセキュリティ対策の一つです。
まとめ
Kubernetes環境のセキュリティは、一度設定すれば終わりというものではありません。今回紹介した10のチェックリストは、堅牢な本番環境を維持するための第一歩です。
以下は、チェックリストのまとめと参考にした公式ドキュメントのリンクです。(リンクのない記事は、公式で参考記事がありません)
- Distrolessイメージの利用
- Pod Security Admissionの適用
- RBACによる最小権限化
- Network Policyによる通信制御
- Secret管理の徹底
- リソース制限の設定
- 読み取り専用ファイルシステム
- 定期的な脆弱性スキャン
- 監査ログの監視
- Kubernetesバージョンの更新
まずは、自社の環境で最も対応が容易な項目、あるいは最もリスクが高いと思われる項目から手をつけてみてはいかがでしょうか。
例えば、新しいプロジェクトからDistrolessイメージの利用を始めてみる、あるいは特定のnamespaceにPod Security Admissionのaudit
モードを適用して、どのような警告が出るか確認してみるのも良いでしょう。