2.13. セキュリティー
Service Mesh アプリケーションが多くの複雑なマイクロサービスで構築されている場合は、Red Hat OpenShift Service Mesh を使用して、それらのサービス間の通信セキュリティーをカスタマイズできます。Service Mesh のトラフィック管理機能と共に OpenShift Container Platform のインフラストラクチャーを使用すると、アプリケーションの複雑性を管理し、マイクロサービスのセキュリティーを確保できるようにします。
作業を開始する前に
プロジェクトがある場合は、プロジェクトを ServiceMeshMemberRoll リソース に追加します。
プロジェクトがない場合は、Bookinfo サンプルアプリケーション をインストールし、ServiceMeshMemberRoll リソースに追加してください。サンプルアプリケーションは、セキュリティーの概念を説明するのに役立ちます。
2.13.1. Mutual Transport Layer Security (mTLS) について リンクのコピーリンクがクリップボードにコピーされました!
Mutual Transport Layer Security (mTLS) は、二者が相互認証できるようにするプロトコルです。これは、一部のプロトコル (IKE、SSH) での認証のデフォルトモードであり、他のプロトコル (TLS) ではオプションになります。mTLS は、アプリケーションやサービスコードを変更せずに使用できます。TLS は、Service Mesh インフラストラクチャーおよび 2 つのサイドカープロキシー間で完全に処理されます。
デフォルトでは、Red Hat OpenShift Service Mesh の mTLS は有効になっており、permissive モードに設定されています。このモードでは、Service Mesh のサイドカーがプレーンテキストのトラフィックと、mTLS を使用して暗号化された接続の両方を受け入れます。厳密な mTLS を使用するように設定されたメッシュ内のサービスがメッシュ外のサービスと通信している場合、厳密な mTLS においてクライアントとサーバーの両方が互いの ID を検証できる必要があるため、これらのサービス間の通信が中断される可能性があります。ワークロードを Service Mesh に移行する間に Permissive モードを使用します。次に、メッシュ、namespace、またはアプリケーションで厳密な mTLS を有効にできます。
Service Mesh コントロールプレーンのレベルでメッシュ全体で mTLS を有効にすると、アプリケーションとワークロードを書き換えずに Service Mesh 内のすべてのトラフィックのセキュリティーが保護されます。メッシュの namespace のセキュリティーは、ServiceMeshControlPlane リソースのデータプレーンレベルで保護できます。トラフィックの暗号化接続をカスタマイズするには、アプリケーションレベルで namespace を PeerAuthentication および DestinationRule リソースで設定します。
2.13.1.1. Service Mesh 全体での厳密な mTLS の有効化 リンクのコピーリンクがクリップボードにコピーされました!
ワークロードがメッシュ外のサービスと通信しない場合は、通信を中断せずに mTLS をメッシュ全体ですぐに有効にできます。これを有効にするには、ServiceMeshControlPlane リソースで spec.security.dataPlane.mtls を true に設定します。Operator は必要なリソースを作成します。
apiVersion: maistra.io/v2
kind: ServiceMeshControlPlane
spec:
version: v2.6
security:
dataPlane:
mtls: true
OpenShift Container Platform Web コンソールを使用して mTLS を有効にすることもできます。
手順
- Web コンソールにログインします。
- Project メニューをクリックし、Service Mesh コントロールプレーンをインストールしたプロジェクト (例: istio-system) を選択します。
-
Ecosystem
Installed Operators をクリックします。 - Provided APIs の Service Mesh Control Plane をクリックします。
-
ServiceMeshControlPlaneリソースの名前 (例:basic) をクリックします。 - Details ページで、Data Plane Security の Security セクションでトグルをクリックします。
2.13.1.1.1. 特定のサービスの受信接続用のサイドカーの設定 リンクのコピーリンクがクリップボードにコピーされました!
ポリシーを作成して、個別のサービスに mTLS を設定することもできます。
手順
以下のサンプルを使用して YAML ファイルを作成します。
PeerAuthentication ポリシーの例 (policy.yaml)
apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: default namespace: <namespace> spec: mtls: mode: STRICT-
<namespace>は、サービスが置かれている namespace に置き換えます。
-
以下のコマンドを実行して、サービスが置かれている namespace にリソースを作成します。先ほど作成した Policy リソースの
namespaceフィールドと一致させる必要があります。$ oc create -n <namespace> -f <policy.yaml>
自動 mTLS を使用しておらず、PeerAuthentication を STRICT に設定する場合は、サービスの DestinationRule リソースを作成する必要があります。
2.13.1.1.2. 送信接続用のサイドカーの設定 リンクのコピーリンクがクリップボードにコピーされました!
宛先ルールを作成し、Service Mesh がメッシュ内の他のサービスに要求を送信する際に mTLS を使用するように設定します。
手順
以下のサンプルを使用して YAML ファイルを作成します。
DestinationRule の例 (destination-rule.yaml)
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: default namespace: <namespace> spec: host: "*.<namespace>.svc.cluster.local" trafficPolicy: tls: mode: ISTIO_MUTUAL-
<namespace>は、サービスが置かれている namespace に置き換えます。
-
以下のコマンドを実行して、サービスが置かれている namespace にリソースを作成します。先ほど作成した
DestinationRuleリソースのnamespaceフィールドと一致させる必要があります。$ oc create -n <namespace> -f <destination-rule.yaml>
2.13.1.1.3. 最小および最大のプロトコルバージョンの設定 リンクのコピーリンクがクリップボードにコピーされました!
ご使用の環境の Service Mesh に暗号化されたトラフィックの特定の要件がある場合は、許可される暗号化機能を制御できます。これは、ServiceMeshControlPlane リソースに spec.security.controlPlane.tls.minProtocolVersion または spec.security.controlPlane.tls.maxProtocolVersion を設定して許可できます。Service Mesh コントロールプレーンリソースで設定されるこれらの値は、TLS 経由でセキュアに通信する場合にメッシュコンポーネントによって使用される最小および最大の TLS バージョンを定義します。
デフォルトは TLS_AUTO であり、TLS のバージョンは指定しません。
| 値 | 説明 |
|---|---|
|
| default |
|
| TLS バージョン 1.0 |
|
| TLS バージョン 1.1 |
|
| TLS バージョン 1.2 |
|
| TLS バージョン 1.3 |
手順
- Web コンソールにログインします。
- Project メニューをクリックし、Service Mesh コントロールプレーンをインストールしたプロジェクト (例: istio-system) を選択します。
-
Ecosystem
Installed Operators をクリックします。 - Provided APIs の Service Mesh Control Plane をクリックします。
-
ServiceMeshControlPlaneリソースの名前 (例:basic) をクリックします。 - YAML タブをクリックします。
以下のコードスニペットを YAML エディターに挿入します。
minProtocolVersionの値は、TLS バージョンの値に置き換えます。この例では、最小の TLS バージョンはTLSv1_2に設定されます。ServiceMeshControlPlane スニペット
kind: ServiceMeshControlPlane spec: security: controlPlane: tls: minProtocolVersion: TLSv1_2- Save をクリックします。
- Refresh をクリックし、変更が正しく更新されたことを確認します。
2.13.1.2. Kiali による暗号化の検証 リンクのコピーリンクがクリップボードにコピーされました!
Kiali コンソールは、アプリケーション、サービス、ワークロードが mTLS 暗号化を有効にしているかどうかを検証するためのいくつかの方法を提供します。
図2.5 マストヘッドアイコンメッシュワイド mTLS が有効
サービスメッシュ全体で厳密に mTLS が有効化されている場合、Kiali はマストヘッドの右側にロックアイコンを表示します。これは、メッシュ内のすべての通信に mTLS が使用されていることを意味します。
図2.6 マストヘッドアイコンメッシュワイド mTLS が一部有効
メッシュが PERMISSIVE モードに設定されているか、メッシュ全体の mTLS 設定にエラーが発生している場合、Kiali は中空ロックアイコンを表示します。
図2.7 セキュリティーバッジ
Graph ページには、mTLS が有効であることを示すために、グラフの端に Security バッジを表示するオプションがあります。グラフにセキュリティーバッジを表示するには、Display メニューの Show Badges で Security チェックボックスをオンにします。エッジにロックアイコンが表示されている場合は、mTLS が有効なリクエストが少なくとも 1 つ存在することを意味します。mTLS と non-mTLS の両方のリクエストがある場合、サイドパネルには mTLS を使用するリクエストのパーセンテージが表示されます。
Applications Detail Overview ページでは、mTLS が有効なリクエストが 1 つ以上存在するグラフの端に Security アイコンが表示されます。
Workloads Detail Overview ページでは、mTLS が有効なリクエストが 1 つ以上存在するグラフの端に Security アイコンが表示されます。
Services Detail Overview ページでは、mTLS が有効なリクエストが 1 つ以上存在するグラフの端に Security アイコンが表示されます。また、Kiali では、mTLS を設定したポートの横の Network セクションにロックアイコンが表示されることに注意してください。