ネットワーク・セキュリティ

Verrazzanoは、Verrazzanoシステム・コンポーネントとデプロイされたアプリケーションの間のネットワーク・トラフィックを管理および保護します。Verrazzanoでは、Kubernetesクラスタ自体、またはクラスタ内で実行中の非Verrazzanoサービスやアプリケーションのトラフィックを管理または保護しません。トラフィックは、ネットワーク・スタックの2つのレベルで保護されます:

  • ISOレイヤー3/4: NetworkPoliciesを使用してPodへのIPアクセスを制御します。
  • ISOレイヤー6: TLSと総合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ポート 起点 説明
Argo CD 443 NGINXイングレス 外部クライアントからのアクセス
Argo CD 8080 Argo CDサーバー、内部 Argo CDサーバー・データ・ポート
cert-manager 9402 Prometheus Prometheusスクレイピング
Coherenceオペレータ 9443 Prometheus Webフック・エントリポイント
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スクレイピング
OpenSearch 8775 Fluentd Fluentdからのアクセス
OpenSearch 9200 OpenSearchダッシュボード、内部 OpenSearchデータ・ポート
OpenSearch 9300 内部 OpenSearchクラスタ・ポート
OpenSearch 15090 Prometheus Envoyメトリック・スクレイピング
OpenSearch 8775 NGINXイングレス 外部クライアントからのアクセス
Prometheus 8775 NGINXイングレス 外部クライアントからのアクセス
Prometheus 9090 Grafana Grafanaコンソールに対するアクセス
Rancher 80 NGINXイングレス 外部クライアントからのアクセス
Rancher 9443 Kubernetes APIサーバー Webフック・エントリポイント
Verrazzanoアプリケーション・オペレータ 9443 Kubernetes APIサーバー Webフック・エントリポイント
Verrazzano認証プロキシ 8775 NGINXイングレス 外部クライアントからのアクセス
Verrazzano認証プロキシ 15090 Prometheus Prometheusスクレイピング
Verrazzanoコンソール 8000 NGINXイングレス 外部クライアントからのアクセス
Verrazzanoコンソール 15090 Prometheus Prometheusスクレイピング
Verrazzanoプラットフォーム・オペレータ 9443 Kubernetes APIサーバー Webフック・エントリポイント

アプリケーションのNetworkPolicies

デフォルトでは、アプリケーションには、アプリケーションへのイングレスやアプリケーションからのエグレスを制限するNetworkPoliciesはありません。アプリケーション・ネームスペースに対して構成するには、VerrazzanoプロジェクトのNetworkPolicyセクションを使用します。

Envoyサイドカー・プロキシのNetworkPolicies

前述のとおり、Envoyサイドカー・プロキシは、システム・コンポーネント・ポッドおよびアプリケーション・ポッドの両方で実行されます。各プロキシは、様々な理由でIstioコントロール・プレーン・ポッドistiodにリクエストを送信します。インストール時に、Verrazzanoはistio-systemネームスペースにistiod-accessという名前のNetworkPolicyを作成し、システム・コンポーネントおよびアプリケーション・サイドカー・プロキシにイングレスを付与します。

相互TLS認証(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を使用します。

  • Argo CD
  • Fluentd
  • Grafana
  • Kiali
  • Keycloak
  • MySQL
  • NGINX Ingress Controller
  • OpenSearch
  • OpenSearchダッシュボード
  • 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コンソール
  • OpenSearch
  • Prometheus
  • Grafana
  • Kiali
  • OpenSearchダッシュボード

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 Kubernetesオペレータは、ドメインを作成するとき、ドメイン内のPodと通信する必要があります。Verrazzanoは、オペレータをメッシュに入れて、mTLSを使用してドメインPodと通信できるようにします。そのため、メッシュにWebLogicドメインを作成する必要があります。

メッシュ内のアプリケーション

Verrazzanoアプリケーションを作成する前に、これをメッシュに含めるかどうかを決定する必要があります。アプリケーション・ネームスペースにistio-injection=enabledまたはistio-injection=disabledをラベル付けすることで、メッシュ包含などのサイドカー・インジェクションを制御します。デフォルトでは、ラベルがない場合、アプリケーションはメッシュに配置されません。アプリケーションでVerrazzanoプロジェクトを使用する場合、Verrazzanoは、プロジェクトのネームスペースにラベルを付けて、インジェクションを有効にします。アプリケーションがメッシュ内にある場合は、mTLSが使用されます。厳密なmTLSを必要としない場合は、必要に応じてPeerAuthentication mTLSモードを変更できます。また、mTLSポート例外を追加する必要がある場合は、DestinationRulesを使用するか、アプリケーション・ネームスペースに別のPeerAuthenticationリソースを作成することによってこれを実行できます。詳細は、Istioのドキュメントを参照してください。

WebLogic

WebLogic Kubernetesオペレータは、ドメインを作成するとき、ドメイン内のPodと通信する必要があります。Verrazzanoは、オペレータをメッシュに入れて、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 Kubernetesオペレータは2つの理由からドメインPodにアクセスできる必要があります。第一に、ドメイン・サーバーにアクセスしてヘルス・ステータスを取得する必要があります。第二に、ドメイン・サーバーPodで実行されているMonitoring Exporterサイドカーに構成を注入する必要があります。WebLogicドメインが作成される際、Verrazzanoはprincipalsセクションにソースcluster.local/ns/verrazzano-system/sa/weblogic-operator-saを追加し、そのアクセスを許可します。


証明書のカスタマイズ

Verrazzanoシステム・エンドポイントのSSL証明書生成のカスタマイズ