ネットワークポリシーで Pod のトラフィックを制限し、転送中のデータを暗号化することで、ACK クラスターを保護します。
ネットワークポリシーとセキュリティグループ
ネットワークポリシーとセキュリティグループは、異なるレベルで動作します。これらを組み合わせて使用することで、多層防御を実現します。
| メカニズム | スコープ | 最適な用途 |
|---|---|---|
| ネットワークポリシー | Pod 間トラフィック (East-West トラフィック) および Pod と外部サービス間のトラフィック | マイクロサービス、名前空間、または特定の Pod 間の通信の制限 |
| セキュリティグループ | ノードレベルおよび Virtual Private Cloud (VPC) レベルでの、ノード間、他の VPC リソース、外部 IP アドレス間のトラフィック | インフラストラクチャレイヤーでの、クラスターへのアクセスとクラスターからのアクセスの制御 |
セキュリティグループを使用してインフラストラクチャレベルのアクセスを制限し、ネットワークポリシーを使用してクラスター内で Pod レベルのきめ細かい分離を適用します。
ネットワークポリシーによる Pod 間トラフィックの制限
デフォルトでは、Kubernetes クラスター内のすべての Pod は自由に通信できるため、セキュリティ上のリスクが生じます。ネットワークポリシーは、Pod 間のトラフィック (East-West トラフィック) と、Pod と外部サービス間のトラフィックを制限します。
ネットワークポリシーは、Pod セレクターとラベルを使用して送信元と宛先の Pod を識別します。各ポリシーは、IP アドレス、ポート、プロトコル、またはそれらの任意の組み合わせでフィルタリングできます。
Terway ネットワークプラグインを使用すると、ネットワークポリシーを使用して IP アドレスまたはポートレベルでトラフィックを制御できます。「Kubernetes Network Policy Recipes」もご参照ください。
Kubernetes のネットワークポリシーをサポートしているのは、Terway クラスターのみです。100 ノードを超えるクラスターの場合、ポリシープロキシによってコントロールプレーンの負荷が増加する可能性があります。詳細については、「Terwayモードの大規模ACKクラスターにおけるNetworkPolicy機能のパフォーマンス改善」をご参照ください。
推奨アプローチ:デフォルトでの拒否、その後の許可
最小権限を適用します:デフォルトですべてのトラフィックを拒否し、各ワークロードが必要とするものだけを許可するルールを追加します。
-
デフォルト拒否ポリシーの作成 -- 名前空間内のすべてのインバウンドおよびアウトバウンドトラフィックをブロックします。
-
DNS クエリの許可 -- Pod が機能するためには DNS 名前解決が必要です。
-
特定トラフィックの許可 -- 各ワークロードが必要とする通信のみを許可します。
ステップ1:デフォルト拒否ポリシーの作成
ネットワークポリシーを作成して名前空間内のすべてのインバウンドおよびアウトバウンドトラフィックを拒否するか、Calico を使用してグローバルポリシーを適用します。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ステップ2:DNS クエリの許可
デフォルトの拒否ポリシーでは、Pod は DNS 名を解決できません。CoreDNS への DNS クエリを許可するポリシーを作成します。
-
kube-system名前空間にラベルを追加します:kubectl label namespace kube-system name=kube-system -
UDP ポート 53 での CoreDNS へのエグレスを許可するネットワークポリシーを作成します:
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
詳細については、「ネットワークポリシー」をご参照ください。
ステップ3:特定の Pod からのトラフィックの許可
拒否ポリシーと DNS ポリシーを適用したら、許可された Pod からのトラフィックのみを許可します。一般的なユースケースは次のとおりです:
-
特定のマイクロサービスのみがアプリケーションにアクセスできるようにします。
-
特定のアプリケーションのみがデータベースにアクセスできるようにします。
この例では、Pod を作成し、app: bookstore ラベルを持つ Pod へのイングレスを制限します。
-
app=bookstoreとrole=apiのラベルを持つ Pod を作成します:kubectl run apiserver --image=nginx --labels="app=bookstore,role=api" --expose --port=80 -
app: bookstoreラベルを持つ Pod からのイングレスのみを許可するネットワークポリシーを適用します:kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: api-allow spec: podSelector: matchLabels: app: bookstore role: api ingress: - from: - podSelector: matchLabels: app: bookstore -
app=bookstoreラベルを持たない Pod からのアクセスが拒否されることを確認します:kubectl run test-$RANDOM --rm -i -t --image=alpine -- sh/ # wget -qO- --timeout=2 http://apiserver wget: download timed out -
app=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」を使用してカスタムルールを追加し、よりきめ細かな制御を行います。
セキュリティグループによるノードレベルのトラフィック制御
ACK は、セキュリティグループを使用して、マスターノードとワーカーノード間、およびワーカーノード、他の VPC リソース、外部 IP アドレス間のトラフィックを管理します。
クラスターを作成すると、ACK はノード通信用のセキュリティグループを自動的に作成します。最小権限を適用するには、「推奨されるインバウンドおよびアウトバウンドルール」を追加します。
「さまざまなシナリオでのセキュリティグループの設定」および「セキュリティグループの設定」をご参照ください。
フローログによるトラフィックの監視と分析
VPC フローログは、Elastic Network Interface (ENI) のインバウンドおよびアウトバウンドトラフィックを記録します。フローログを使用すると、次のことが可能です:
-
アクセス制御リスト (ACL) ルールの検証
-
ネットワークトラフィックの監視
-
ネットワーク問題のトラブルシューティング
-
VPC 内のリソース (Pod を含む) 間の異常なトラフィックの特定
詳細については、「フローログの概要」をご参照ください。
転送中のデータの暗号化
-
[]Service Mesh (ASM)
Service Mesh (ASM) は、サービス間のデータを暗号化します。ASM は以下をサポートします:
-
サービス間の相互トランスポート層セキュリティ (mTLS) 認証
-
HTTPS およびサービスゲートウェイでの動的な証明書読み込みのための Envoy Secret Discovery Service (SDS)
-
Application High Availability Service (AHAS) と統合された、ASM インスタンス内のアプリケーションのトラフィック管理
-
トレーシング分析と統合された分散トレーシング (トレースマッピング、コールカウント、トポロジー、依存関係分析用)
-
-
[Ingress の TLS]
Ingress で公開されるサービスに対して HTTPS を有効にします。Secret を使用して TLS を設定します。