ネットワーク・セキュリティ
Verrazzanoは、Verrazzanoシステム・コンポーネントとデプロイされたアプリケーションの間のネットワーク・トラフィックを管理および保護します。Verrazzanoでは、Kubernetesクラスタ自体、またはクラスタ内で実行中の非Verrazzanoサービスやアプリケーションのトラフィックを管理または保護しません。トラフィックは、ネットワーク・スタックの2つのレベルで保護されます:
- ISOレイヤー3/4: NetworkPoliciesを使用してPodへのIPアクセスを制御します。
- ISOレイヤー6: TLSとmTLSを使用して、クラスタ内の接続および外部接続用の認証、機密性、および整合性を提供します。
NetworkPolicies
デフォルトでは、KubernetesクラスタのすべてのPodは、クラスタ内の他のすべてのPodにネットワーク・アクセスできます。Kubernetesには、Podにネットワーク・レベル3および4のセキュリティを提供するNetworkPolicyリソースがあり、ネームスペース内の一連のPodに対してイングレスとエグレス両方のIPトラフィックを制限します。Verrazzanoは、NetworkPoliciesを使用してすべてのシステム・コンポーネントを構成し、イングレスを制御します。エグレスは制限されていません。
ノート: NetworkPolicyリソースにはポリシーを実装するためにNetworkPolicyコントローラが必要です。そうでない場合、ポリシーは効果がありません。Verrazzanoをインストールする前に、CalicoなどのNetworkPolicyコントローラを提供するKubernetes CNIプラグインをインストールする必要があります。インストールしないと、ポリシーは無視されます。
システム・コンポーネントのNetworkPolicies
Verrazzanoは、システム・コンポーネントに対して一連のNetworkPoliciesをインストールして、Podへのイングレスを制御します。ポリシーはネームスペースにスコープ設定され、セレクタを使用してポリシーが適用されるPodと、イングレス・ルールおよびエグレス・ルールを指定します。たとえば、次のポリシーはverrazzano-system
ネームスペースのVerrazzano API Podに適用されます。このポリシーでは、ポート8775でNGINX Ingress Controllerからのネットワーク・トラフィックが、ポート15090でPrometheusからのネットワーク・トラフィックが許可されます。その他のPodは、これらのポート、またはVerrazzano API Podのその他のポートには到達できません。ネームスペース・セレクタを使用する必要があることに注意してください。NetworkPolicyリソースはネームスペース名の指定をサポートしていません。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
...
spec:
PodSelector:
matchLabels:
app: verrazzano-api
ingress:
- from:
- namespaceSelector:
matchLabels:
verrazzano.io/namespace: ingress-nginx
PodSelector:
matchLabels:
app.kubernetes.io/instance: ingress-controller
ports:
- port: 8775
protocol: TCP
- from:
- namespaceSelector:
matchLabels:
verrazzano.io/namespace: verrazzano-system
PodSelector:
matchLabels:
app: system-prometheus
ports:
- port: 15090
protocol: TCP
次の表に、システム・コンポーネントへのネットワーク・トラフィックを許可するイングレスをすべて示します。示されているポートはPodポートで、NetworkPoliciesが必要とします。
コンポーネント | Podポート | 起点 | 説明 | |
---|---|---|---|---|
Verrazzanoアプリケーション・オペレータ | 9443 | Kubernetes APIサーバー | Webフック・エントリポイント。 | |
Verrazzanoプラットフォーム・オペレータ | 9443 | Kubernetes APIサーバー | Webフック・エントリポイント。 | |
Verrazzanoコンソール | 8000 | NGINXイングレス | 外部クライアントからのアクセス。 | |
Verrazzanoコンソール | 15090 | Prometheus | Prometheusスクレイピング。 | |
Verrazzano認証プロキシ | 8775 | NGINXイングレス | 外部クライアントからのアクセス。 | |
Verrazzano認証プロキシ | 15090 | Prometheus | Prometheusスクレイピング。 | |
cert-manager | 9402 | Prometheus | Prometheusスクレイピング。 | |
Coherenceオペレータ | 9443 | Prometheus | Webフック・エントリポイント。 | |
Elasticsearch | 8775 | NGINXイングレス | 外部クライアントからのアクセス。 | |
Elasticsearch | 8775 | Fluentd | Fluentdからのアクセス。 | |
Elasticsearch | 9200 | Kibana、内部 | Elasticsearchデータ・ポート。 | |
Elasticsearch | 9300 | 内部 | Elasticsearchクラスタ・ポート。 | |
Elasticsearch | 15090 | Prometheus | Envoyメトリック・スクレイピング。 | |
Istioコントロール・プレーン | 15012 | Envoy | istiod へのEnvoyアクセス。 |
|
Istioコントロール・プレーン | 15014 | Prometheus | Prometheusスクレイピング。 | |
Istioコントロール・プレーン | 15017 | Kubernetes APIサーバー | Webフック・エントリポイント。 | |
Istioイングレス・ゲートウェイ | 8443 | 外部 | アプリケーション・イングレス。 | |
Istioイングレス・ゲートウェイ | 15090 | Prometheus | Prometheusスクレイピング。 | |
Istioエグレス・ゲートウェイ | 8443 | メッシュ・サービス | アプリケーション・エグレス。 | |
Istioエグレス・ゲートウェイ | 15090 | Prometheus | Prometheusスクレイピング。 | |
Keycloak | 8080 | NGINXイングレス | 外部クライアントからのアクセス。 | |
Keycloak | 15090 | Prometheus | Prometheusスクレイピング。 | |
MySql | 15090 | Prometheus | Prometheusスクレイピング。 | |
MySql | 3306 | Keycloak | Keycloakデータストア。 | |
ノード・エクスポータ | 9100 | Prometheus | Prometheusスクレイピング。 | |
Rancher | 80 | NGINXイングレス | 外部クライアントからのアクセス。 | |
Rancher | 9443 | Kubernetes APIサーバー | Webフック・エントリポイント。 | |
Prometheus | 8775 | NGINXイングレス | 外部クライアントからのアクセス。 | |
Prometheus | 9090 | Grafana | Grafana UIに対するアクセス。 |
アプリケーションのNetworkPolicies
デフォルトでは、アプリケーションには、アプリケーションへのイングレスやアプリケーションからのエグレスを制限するNetworkPoliciesはありません。アプリケーション・ネームスペースに対して構成するには、VerrazzanoプロジェクトのNetworkPolicyセクションを使用します。
ノート
Verrazzanoでは、アプリケーション・ポッドに対する特定のイングレスとエグレスが必要です。アプリケーション・ネームスペースまたはポッドにNetworkPolicyを追加する場合は、Verrazzanoが必要とするアクセスができるよう追加のポリシーを追加する必要があります。イングレス・ポリシーは、イングレスを制限する場合にのみ必要です。同様に、エグレス・ポリシーは、エグレスを制限する場合にのみ必要です。イングレスおよびエグレスNetworkPoliciesを次に示します:
イングレスNetworkPolicies
ingress:
- from:
- namespaceSelector:
matchLabels:
verrazzano.io/namespace: istio-system
podSelector:
matchLabels:
app: istiod
- from:
- namespaceSelector:
matchLabels:
verrazzano.io/namespace: istio-system
podSelector:
matchLabels:
app: istio-ingressgateway
- from:
- namespaceSelector:
matchLabels:
verrazzano.io/namespace: verrazzano-system
podSelector:
matchLabels:
app: system-prometheus
- from:
- namespaceSelector:
matchLabels:
verrazzano.io/namespace: verrazzano-system
podSelector:
matchLabels:
app: coherence-operator
- from:
- namespaceSelector:
matchLabels:
verrazzano.io/namespace: verrazzano-system
podSelector:
matchLabels:
app: weblogic-operator
エグレスNetworkPolicies
egress:
- ports:
- port: 15012
protocol: TCP
to:
- namespaceSelector:
matchLabels:
verrazzano.io/namespace: istio-system
podSelector:
matchLabels:
app: istiod
- to:
- namespaceSelector:
matchLabels:
verrazzano.io/namespace: istio-system
podSelector:
matchLabels:
app: istio-egressgateway
- ports:
- port: 53
protocol: TCP
- port: 53
protocol: UDP
to:
- namespaceSelector:
matchLabels:
verrazzano.io/namespace: kube-system
- ports:
- port: 8000
protocol: TCP
to:
- namespaceSelector:
matchLabels:
verrazzano.io/namespace: verrazzano-system
podSelector:
matchLabels:
app: coherence-operator
Envoyサイドカー・プロキシのNetworkPolicies
前述のとおり、Envoyサイドカー・プロキシは、システム・コンポーネント・ポッドおよびアプリケーション・ポッドの両方で実行されます。各プロキシは、様々な理由でIstioコントロール・プレーン・ポッドistiod
にリクエストを送信します。インストール時に、Verrazzanoはistio-system
ネームスペースにistiod-access
という名前のNetworkPolicyを作成し、システム・コンポーネントのサイドカー・プロキシにイングレスを付与します。アプリケーションについては、Verrazzanoはistio-system
ネームスペースにアプリケーションごとのNetworkPolicyを作成し、istiod
への同じアクセスを許可します。アプリケーションが削除されると、Verrazzanoはそのポリシーを削除します。
mTLS
Istioを有効にすると、メッシュ内のサービス間、およびIstioゲートウェイとEnvoyサイドカー・プロキシの間でmTLSを使用できます。mTLSの使用をカスタマイズするための様々なオプションがあります。たとえば、ポート単位で無効にできます。Istioコントロール・プレーンIstiodはCAであり、Envoyプロキシ(ゲートウェイとサイドカー)のキーおよび証明書のローテーションを提供します。
Verrazzanoは、メッシュに対して厳密なmTLSを持つようにIstioを構成します。メッシュに配置されているすべてのコンポーネントおよびアプリケーションは、メッシュにないCoherenceクラスタを除き、mTLSを使用します。また、Istioイングレス・ゲートウェイとメッシュ・サイドカーの間のすべてのトラフィックはmTLSを使用します。プロキシ・サイドカーとエグレス・ゲートウェイの間も同様です。
Verrazzanoは、インストール時、次のようにPeerAuthenticationリソースを使用してmTLSを設定します:
apiVersion: v1
items:
- apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
...
spec:
mtls:
mode: STRICT
TLS
TLSは、NGINX Ingress ControllerとIstioイングレス・ゲートウェイを介してクラスタにアクセスするために外部クライアントによって使用されます。これらのTLS接続で使用される証明書は様々です。詳細は、Verrazzanoセキュリティを参照してください。すべてのTLS接続はイングレス・プロキシで終了します。2つのプロキシと内部クラスタPodの間のトラフィックは、PodがすべてIstioメッシュ内にあるため、常にmTLSを使用します。
Istioメッシュ
Istioは、Istio Securityで説明されているように、認証および認可の両方に対して広範なセキュリティ保護を提供します。アクセス制御とmTLSは、Verrazzanoによって構成される2つのセキュリティ機能です。これらのセキュリティ機能は、サービス・メッシュのコンテキストで使用できます。
サービス・メッシュは、セキュリティ、可観測性、ロード・バランシングなどの特定の機能をサービスに提供するインフラストラクチャ・レイヤーです。Istioはここでサービス・メッシュを定義します。Kubernetes上のIstioのコンテキストでは、メッシュ内のサービスはKubernetes Serviceです。複数のOAMコンポーネントが定義されているBob’s Booksサンプル・アプリケーションについて考えてみます。実行時には、コンポーネントごとにKubernetes Serviceが存在し、各Serviceはメッシュ内に存在し、1つ以上のPodがサービスに関連付けられています。メッシュ内のすべてのサービスは、Podの前にEnvoyプロキシを持ち、Podとの間のネットワーク・トラフィックが捕捉されます。Kubernetesでは、そのプロキシは各Podで実行されているサイドカーになります。
メッシュにサービスを配置するには様々な方法があります。Verrazzanoは、ネームスペース・ラベルistio-injection: enabled
を使用して、特定のネームスペース内のすべてのPodがメッシュに存在することを指定します。そのネームスペースにPodが作成されると、Istioコントロール・プレーンの変更WebフックによってEnvoyプロキシ・サイドカー・コンテナを追加するようPod仕様が変更され、Podがメッシュに置かれます。
サイドカー・インジェクションの無効化
場合によっては、Verrazzanoはネームスペースの特定のPodに対してサイドカー・インジェクションを無効にする必要があります。これは2つの方法で行われます。1つ目は、インストール中に、VerrazzanoがIstioチャートのHelmオーバーライド・ファイルを使用してistio-sidecar-injector
ConfigMapを変更する方法です。これによって、Verrazzanoアプリケーション・オペレータなど、いくつかのコンポーネントがメッシュから除外されます。2つ目は、Coherence Podなどの特定のPodを実行時にsidecar.istio.io/inject="false"
でラベル付けし、メッシュから除外する方法です。
メッシュ内のコンポーネント
次のVerrazzanoコンポーネントはメッシュ内にあり、すべてのサービス間の通信にmTLSを使用します。
- Elasticsearch
- Fluentd
- Grafana
- Kibana
- Keycloak
- MySQL
- NGINX Ingress Controller
- Prometheus
- Verrazzano認証プロキシ
- Verrazzanoコンソール
- WebLogic Kubernetes Operator
これらのコンポーネントの一部については、次の項で説明する、メッシュ関連の詳細に注意してください。
NGINX
NGINX Ingress ControllerはHTTPSトラフィックをリスニングし、クラスタへのイングレスを提供します。NGINXは、クライアント接続のTLS終了を実行するように構成されています。NGINXからメッシュ・サービスへのトラフィックはすべてmTLSを使用します。つまり、トラフィックはクライアントからターゲットのバックエンド・サービスまで完全に暗号化されます。
KeycloakとMySQL
KeycloakとMySQLもメッシュ内にあり、ネットワーク・トラフィックにmTLSを使用します。Keycloakを使用するすべてのコンポーネントはメッシュ内にあるため、Keycloakによって処理されるすべてのアイデンティティ管理にはエンドツーエンドのmTLSセキュリティがあります。次のコンポーネントは、Keycloakにアクセスします:
- Verrazzano認証プロキシ
- Verrazzanoコンソール
- Elasticsearch
- Prometheus
- Grafana
- Kibana
Prometheus
Prometheusはメッシュ内にありますが、Keycloakとの通信時にのみEnvoyサイドカーおよびmTLSを使用するように構成されます。メトリックのスクレイピングに関連するトラフィックはすべて、サイドカー・プロキシをバイパスし、サービスIPアドレスを使用せず、Pod IPアドレスを使用してスクレイピングのターゲットに接続します。スクレイピング・ターゲットがメッシュ内にある場合はHTTPSが使用され、それ以外の場合はHTTPが使用されます。Verrazzanoマルチクラスタでは、Prometheusは、HTTPSを使用し、管理対象クラスタNGINXイングレスを使用して、管理クラスタから管理対象クラスタ内のPrometheusサーバーに接続します。管理対象クラスタのPrometheusは、クラスタ外部のターゲットへの接続を確立しません。
Prometheusはメッシュ内にあるため、Podのスクレイピング時にEnvoyサイドカーをバイパスできるように、追加の構成が行われます。これは、Prometheus Pod注釈traffic.sidecar.istio.io/includeOutboundIPRanges: <keycloak-service-ip>
を使用して行います。これにより、Keycloak向けのトラフィックはEnvoyサイドカーを通過し、その他すべてのトラフィックはサイドカーをバイパスします。
WebLogic Kubernetes Operator
WebLogicオペレータは、ドメインを作成するとき、ドメイン内のPodと通信する必要があります。Verrazzanoは、WebLogicオペレータをメッシュに入れて、mTLSを使用してドメインPodと通信できるようにします。そのため、メッシュにWebLogicドメインを作成する必要があります。
メッシュ内のアプリケーション
Verrazzanoアプリケーションを作成する前に、これをメッシュに含めるかどうかを決定する必要があります。アプリケーション・ネームスペースにistio-injection=enabled
またはistio-injection=disabled
をラベル付けすることで、メッシュ包含などのサイドカー・インジェクションを制御します。デフォルトでは、ラベルがない場合、アプリケーションはメッシュに配置されません。アプリケーションでVerrazzanoプロジェクトを使用する場合、Verrazzanoは、プロジェクトのネームスペースにラベルを付けて、インジェクションを有効にします。アプリケーションがメッシュ内にある場合は、mTLSが使用されます。厳密なmTLSを必要としない場合は、必要に応じてPeerAuthentication mTLSモードを変更できます。また、mTLSポート例外を追加する必要がある場合は、DestinationRulesを使用するか、アプリケーション・ネームスペースに別のPeerAuthenticationリソースを作成することによってこれを実行できます。詳細は、Istioのドキュメントを参照してください。
WebLogic
WebLogicオペレータは、ドメインを作成するとき、ドメイン内のPodと通信する必要があります。Verrazzanoは、WebLogicオペレータをメッシュに入れて、mTLSを使用してドメインPodと通信できるようにします。そのため、メッシュにWebLogicドメインを作成する必要があります。また、mTLSが使用されるため、TLSを使用するようにWebLogicを構成しないでください。アプリケーションにカスタム証明書を使用する場合は、ApplicationConfigurationで指定できますが、そのTLS接続はVerrazzano IngressTraitを使用して構成するIstioイングレス・ゲートウェイで終了します。
Coherence
Coherenceクラスタは、Coherenceリソースによって表され、メッシュには含まれません。Verrazzanoが、サイドカー・インジェクションをするよう注釈が付いたネームスペースにCoherenceクラスタを作成すると、前述のsidecar.istio.io/inject="false"
ラベルを使用してCoherenceリソースのインジェクションを無効にします。さらに、Verrazzanoはアプリケーション・ネームスペースにDestinationRuleを作成し、Coherence拡張ポート9000
のmTLSを無効にします。これにより、メッシュ内のサービスがCoherence拡張プロキシを呼び出すことができます。例については、Bobs Booksを参照してください。
Coherenceクラスタを含むBob’s Booksアプリケーション用に作成されたDestinationRuleの例を次に示します。
API Version: networking.istio.io/v1beta1
Kind: DestinationRule
...
Spec:
Host: *.bobs-books.svc.cluster.local
Traffic Policy:
Port Level Settings:
Port:
Number: 9000
Tls:
Tls:
Mode: ISTIO_MUTUAL
Istioのアクセス制御
Istioでは、AuthorizationPolicyリソースを使用して、メッシュ内のワークロードへのアクセスを制御できます。これにより、ワークロードにアクセスできるサービスまたはPodを制御できます。これらのオプションの一部にはmTLSが必要です。詳細は、Authorization Policyを参照してください。
Verrazzanoは常にアプリケーション用にAuthorizationPoliciesを作成しますが、システム・コンポーネント用には作成しません。アプリケーションのデプロイメント中に、Verrazzanoはアプリケーション・ネームスペースにポリシーを作成し、次のものからのアクセスを許可するように構成します:
- アプリケーションのその他のPod
- Istioイングレス・ゲートウェイ
- Prometheusスクレイパ
これにより、クラスタ内の他のPodがアプリケーションPodにネットワーク・アクセスできなくなります。
Istioは、サービス・アイデンティティを使用してリクエスト元のアイデンティティを決定します。Kubernetesの場合、このアイデンティティはサービス・アカウントです。Verrazzanoは、次のようにアプリケーションごとのAuthorizationPolicyを作成します:
AuthorizationPolicy
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
...
spec:
rules:
- from:
- source:
principals:
- cluster.local/ns/sales/sa/greeter
- cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account
- cluster.local/ns/verrazzano-system/sa/verrazzano-monitoring-operator
WebLogicドメイン・アクセス
WebLogicアプリケーションの場合、WebLogicオペレータは2つの理由からドメインPodにアクセスできる必要があります。第一に、ドメイン・サーバーにアクセスしてヘルス・ステータスを取得する必要があります。第二に、ドメイン・サーバーPodで実行されているMonitoring Exporterサイドカーに構成を注入する必要があります。WebLogicドメインが作成される際、Verrazzanoはprincipals
セクションにソースcluster.local/ns/verrazzano-system/sa/weblogic-operator-sa
を追加し、そのアクセスを許可します。