Container Service for Kubernetes (ACK) のネットワークセキュリティは、通信可能なサービスを制限することと、交換されるデータを暗号化すること、という 2 つの課題に対応します。ACK は、Kubernetes ネットワークポリシー、Virtual Private Cloud (VPC) セキュリティグループ、および Service Mesh (ASM) と TLS によるトラフィック暗号化を提供し、これらの両方に対応します。
このページでは、以下の内容について説明します。
トラフィック制御
ネットワークポリシー — Pod 間および Pod と外部間のトラフィックを制限
セキュリティグループ — クラスターノードと他の VPC リソース間のトラフィックを管理
トラフィックの監視と分析 — VPC フローログを使用して異常なトラフィックを特定
トラフィックの暗号化
Service Mesh (ASM) — サービス間の mTLS (相互 TLS)
Ingress の TLS — 外部に公開されるサービスの HTTPS
ネットワークポリシー
デフォルトでは、Kubernetes クラスター内のすべての Pod は相互に通信できます。本番環境のワークロードでは、ネットワークポリシーを定義して、名前空間内および名前空間をまたがる Pod 間のトラフィックである東西トラフィックを制御します。
Terway ネットワークプラグインを使用しているクラスターのみが Kubernetes ネットワークポリシーをサポートします。クラスターに 100 を超えるノードがある場合、ネットワークポリシープロキシによって Kubernetes コントロールプレーンの負荷が増加する可能性があります。詳細については、「Terway モードの大規模な ACK クラスターにおける NetworkPolicy 機能のパフォーマンス向上」をご参照ください。
ネットワークポリシーは、Pod セレクターとラベルを使用して、送信元と送信先の Pod を識別します。ルールは、IP アドレス、ポート、プロトコルによってスコープを定義することもできます。
参考資料と視覚化ツールは、以下をご参照ください。
Network Policy Editor — ネットワークポリシーをインタラクティブに作成、視覚化、理解
デフォルトの deny-all ポリシーの作成
ロールベースのアクセス制御 (RBAC) と同様に、ネットワークポリシーにも最小権限の原則を適用します。まず、名前空間からのすべてのインバウンドおよびアウトバウンドトラフィックを拒否し、その後、必要なトラフィックのみを許可する明示的なルールを追加します。
以下のポリシーは、default 名前空間のすべての Ingress および Egress トラフィックを拒否します。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
- Egressすべての名前空間にわたるグローバルな拒否ポリシーを作成するには、Kubernetes ネイティブの NetworkPolicy の代わりに Calico を使用します。
DNS クエリの許可
deny-all ポリシーをデプロイすると、Pod は DNS を解決できなくなります。Pod が UDP ポート 53 で CoreDNS に到達できるようにする Egress ルールを追加します。
ポリシーがセレクターで参照できるように、
kube-system名前空間にラベルを付けます。kubectl label namespace kube-system name=kube-system以下のネットワークポリシーを適用します。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-dns-access namespace: default spec: podSelector: matchLabels: {} policyTypes: - Egress egress: - to: - namespaceSelector: matchLabels: name: kube-system ports: - protocol: UDP port: 53重要Kubernetes ネットワークポリシーの完全な仕様については、「Network Policies」をご参照ください。
特定の Pod からのトラフィックの許可
Pod セレクターを使用して、特定のサービスに到達できる Pod を制限します。一般的なユースケースは以下の通りです。
特定のマイクロサービスのみがアプリケーションにアクセスできるようにする
特定のアプリケーションのみがデータベースにアクセスできるようにする
以下の例では、API サーバー Pod と、app=bookstore ラベルを持つ Pod にアクセスを制限するネットワークポリシーを作成します。
app=bookstoreとrole=apiラベルを持つ Pod を作成します。kubectl run apiserver --image=nginx --labels="app=bookstore,role=api" --expose --port=80以下のネットワークポリシーを適用します。
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: api-allow spec: podSelector: matchLabels: app: bookstore role: api ingress: - from: - podSelector: matchLabels: app: bookstoreapp=bookstoreラベルを持たない Pod がブロックされることを確認します。kubectl run test-$RANDOM --rm -i -t --image=alpine -- sh期待される出力:
/ # wget -qO- --timeout=2 http://apiserver wget: download timed outapp=bookstoreラベルを持つ Pod が接続できることを確認します。kubectl run test-$RANDOM --rm -i -t --image=alpine --labels="app=bookstore,role=frontend" -- sh期待される出力:
/ # wget -qO- --timeout=2 http://apiserver <!DOCTYPE html> <html><head>
カスタムの名前空間内ルールの追加
名前空間内の Pod 間の通信を許可した後、その名前空間内の特定の Pod 間のアクセスを制限するためのターゲットルールを追加します。例とテンプレートについては、「Kubernetes Network Policy Recipes」をご参照ください。
トラフィックの監視と分析
Alibaba Cloud Virtual Private Cloud (VPC) のフローログは、Elastic Network Interface (ENI) のインバウンドおよびアウトバウンドトラフィックを記録します。フローログは、以下の目的で使用します。
アクセス制御リスト (ACL) ルールの検証
Pod を含むリソース間のネットワークトラフィックの監視
ネットワーク接続問題のトラブルシューティング
設定の詳細については、「フローログの概要」をご参照ください。
セキュリティグループ
ACK クラスターを作成すると、クラスター内のすべてのノード間の通信を許可するセキュリティグループが自動的に作成されます。セキュリティグループは、マスターノードとワーカーノード間、ワーカーノードと他の VPC リソース間、およびワーカーノードと外部 IP アドレス間のトラフィックをノードレベルで制御します。
最小権限の原則に従うために、インバウンドおよびアウトバウンドルールを追加して、デフォルトのセキュリティグループを強化します。詳細については、「クラスターセキュリティグループに推奨されるインバウンドおよびアウトバウンドルール」をご参照ください。
設定ガイダンスについては、「さまざまなシナリオでのセキュリティグループの設定」および「セキュリティグループの設定」をご参照ください。
ネットワークポリシーとセキュリティグループの使い分け
| ネットワークポリシー | セキュリティグループ | |
|---|---|---|
| 制御対象 | Pod 間および Pod と外部間のトラフィック (レイヤー 3/4) | ノード間およびノードと VPC リソース間のトラフィック |
| 範囲 | 名前空間および Pod レベル | クラスターノードレベル |
| 要件 | Terway ネットワークプラグイン | すべての ACK クラスター |
| 使用条件 | 特定のワークロード間の東西トラフィックを制限する場合 | ノードと他のクラウドリソース (データベース、他の VPC インスタンス) 間のアクセスを制御する場合 |
階層的なセキュリティを実現するために、両方を使用します。ネットワークポリシーでワークロードを相互に分離し、セキュリティグループでノードがクラスター外に到達できる範囲を制御します。
データ転送の暗号化
Service Mesh (ASM)
Service Mesh (ASM) は、mTLS (相互 Transport Layer Security) を使用してサービス間のトラフィックを暗号化します。認証に加えて、ASM は以下もサポートしています。
Envoy Secret Discovery Service (SDS) による動的な証明書読み込みにより、サービスゲートウェイが HTTPS をサポート
Application High Availability Service (AHAS) との統合によるトラフィック管理
トレーシング分析との統合による分散トレーシング。トレースマッピング、サービス呼び出しのカウント、トレーストポロジー、アプリケーション依存関係分析を提供し、開発者が分散アプリケーションアーキテクチャのパフォーマンスボトルネックを特定・診断できるようにします。
ASM の概要については、「ASM とは?」をご参照ください。ゲートウェイレベルで HTTPS を設定するには、「イングレスゲートウェイを使用して HTTPS を有効化する」をご参照ください。
ASM の境界を越えてアプリケーションをトレースするには、「OpenTelemetry 向けマネージドサービスを使用して ASM インスタンス内外のアプリケーションをトレースする」をご参照ください。
Ingress の TLS
Kubernetes Ingress を介して公開されるすべてのサービスで HTTPS を有効にします。Kubernetes Secret を使用して TLS 証明書を保存し、Ingress リソースでそれを参照します。詳細については、「Secret を使用して TLS を構成し HTTPS アクセスを有効にする」をご参照ください。