アプリケーションで利用する機密情報(APIキー、データベースパスワードなど)は、Kubernetesのシークレット管理機能を使用して安全に管理します。EKSでは、シークレットのetcd暗号化が自動的に有効になっており、クラスタレベルでの暗号化が提供されます。
さらなるセキュリティ向上のため、K8sマニフェスト(Secret)も暗号化し、Gitリポジトリに保存します。SOPSなどのツールを使い AWS KMS で管理された暗号化キーを使い暗号化されたマニフェストをリポジトリに保管します。
NetworkPolicyリソースを使用して、Pod間の通信を制御し、セキュリティを向上させます。デフォルトでは、Kubernetes内のすべてのPodは相互に通信可能ですが、NetworkPolicyを適用することで、必要最小限の通信のみを許可する原則(最小権限の原則)を実装できます。EKS Automode のVPC CNIプラグインはNetworkPolicyをサポートしています。
Kubernetes RBACを使用して、ユーザーやサービスアカウントに対するクラスタリソースへのアクセスを制御します。RoleとClusterRoleでアクセス許可を定義し、RoleBindingとClusterRoleBindingで特定のユーザーやサービスアカウントにこれらの権限を付与します。
最小権限の原則に従い、各ユーザーやサービスに必要最小限の権限のみを付与することが重要です。
EKS Pod Identityを使用して、KubernetesのサービスアカウントにAWS IAMロールを関連付けます。これにより、Podが必要なAWSリソースにアクセスするための一時的な認証情報を自動的に取得できます。
Pod Identityは、従来のIAM Roles for Service Accounts(IRSA)の後継となる新しいアプローチで、設定が簡素化され、より一貫した動作を提供します。
Amazon GuardDutyのEKS保護機能を有効にして、クラスタの異常なアクティビティや潜在的なセキュリティ脅威を検出します。GuardDutyは機械学習を使用して、悪意のあるアクティビティや異常な動作パターンを自動的に識別し、アラートを生成します。
EKS Audit Logの分析により、不正なAPIアクセスや権限昇格の試みなどを検出できます。
CI/CDパイプラインに静的コード解析とセキュリティスキャンを統合して、コードの脆弱性を早期に発見します。trivyなどのツールを使用して、セキュリティ上の問題を自動的に検出し、修正を促します。
コンテナイメージのビルド時にも脆弱性スキャンを実行し、既知のセキュリティ問題を含むイメージのデプロイを防ぎます。
Amazon ECRの脆弱性スキャン機能を有効にして、コンテナイメージ内の既知の脆弱性を検出します。ECRは、プッシュされたイメージに対して自動的にスキャンを実行し、CVE(Common Vulnerabilities and Exposures)データベースに基づいて脆弱性を報告します。
スキャン結果に基づいて、脆弱性を含むイメージのデプロイを防ぐポリシーを設定することも可能です。
EKSクラスタのAPIサーバーエンドポイントへのアクセスを制限して、セキュリティを向上させます。プライベートエンドポイントのみを有効にするか、パブリックエンドポイントを有効にする場合は、特定のIPアドレス範囲からのアクセスのみを許可するように設定します。
VPNやAWS Direct Connectを通じてプライベート接続を確保することで、インターネット経由のアクセスを回避できます。
EKSクラスタの監査ログを有効にして、APIサーバーへのすべてのリクエストをログに記録します。これにより、不正なアクセスや異常な動作を追跡し、セキュリティインシデントの調査が可能になります。
監査ログはCloudWatch Logsに送信され、長期保存やアラート設定が可能です。
EKS Automode でない従来のEKSクラスタの場合、Security Groups for Podsを使用して個々のPodレベルでネットワークセキュリティを制御します。従来のVPC CNIの制限を超えて、特定のPodに直接Security Groupsを適用することで、より細かい粒度でのネットワーク制御が可能になります。
この機能により、マイクロサービス間の通信をより精密に制御し、セキュリティを向上させることができます。ただし、EKS Automode ではこの機能はサポートされていません。代わりにNetworkPolicyを使用して通信制御を行います。
Podのルートファイルシステムを読み取り専用に設定して、実行時の改ざんを防ぎます。アプリケーションが書き込みアクセスを必要とする場合は、emptyDirやtempfsボリュームを使用します。
Podを非rootユーザーとして実行して、潜在的なセキュリティリスクを軽減します。runAsUserおよびrunAsGroupセキュリティコンテキストを設定して、適切な権限で実行されるようにします。
allowPrivilegeEscalationをfalseに設定して、コンテナ内のプロセスが実行時により高い権限を取得することを防ぎます。これにより、権限昇格攻撃のリスクを軽減できます。
Linuxケーパビリティを適切に設定して、コンテナに必要最小限の権限のみを付与します。不要なケーパビリティを削除し(drop)、必要なもののみを追加(add)することで、攻撃対象領域を最小化します。
seccomp(secure computing mode)プロファイルを適用して、コンテナが使用できるシステムコールを制限します。Kubernetesのデフォルトseccompプロファイルを使用するか、アプリケーション固有のカスタムプロファイルを作成して、より厳密な制御を実装します。
SELinux(Security-Enhanced Linux)を有効にして、強制アクセス制御(MAC)を実装します。SELinuxコンテキストを適切に設定することで、コンテナとホストシステム間の分離を強化し、セキュリティを向上させます。
EKS Automode のEC2はデフォルトでSELinuxが有効になっています。
Amazon ECRリポジトリへのアクセスをIAMポリシーとリソースベースのポリシーで制限します。特定のユーザーやロールのみがイメージをプッシュ・プルできるように設定し、不正なイメージの配布を防ぎます。
VPCエンドポイントを使用してECRへのプライベート接続を確保し、インターネット経由のアクセスを回避することも重要です。
Istio、Linkerd、AWS App Meshなどのサービスメッシュを使用して、マイクロサービス間の通信にmTLS(mutual TLS)を実装します。これにより、サービス間の通信が暗号化され、相互認証が自動的に実行されます。
サービスメッシュは、アプリケーションコードを変更することなく、トランスペアレントなセキュリティレイヤーを提供します。
Falcoを使用して、Kubernetesクラスタ内のランタイムセキュリティ監視を実装します。Falcoは、システムコールを監視して異常な動作や潜在的なセキュリティ脅威をリアルタイムで検出し、アラートを生成します。
カスタムルールを作成して、組織固有のセキュリティポリシーを実装し、コンプライアンス要求に対応することも可能です。