CryptoMB - Istio向けTLSハンドシェイクアクセラレーション

Istioゲートウェイとサイドカーにおいて、CryptoMB秘密鍵プロバイダ設定を使用してTLSハンドシェイクを高速化します。

2022年6月15日 | Ravi kumar Veeramally - Intel、Ismo Puustinen - Intel、Sakari Poussa - Intel

暗号化処理は、安全な接続において最も計算集約的で重要な処理の1つです。Istioは、安全な接続の処理とトラフィックのインターセプトにEnvoyを「ゲートウェイ/サイドカー」として使用します。

ユースケースによっては、イングレスゲートウェイがサイドカープロキシを介して多数の着信TLS接続とサービス間接続を処理する必要がある場合、Envoyへの負荷が増加します。潜在的なパフォーマンスは、Envoyが実行されているcpusetのサイズ、着信トラフィックパターン、鍵サイズなど、多くの要因に依存します。これらの要因は、Envoyが多数の新しい着信TLSリクエストを処理することに影響を与える可能性があります。パフォーマンスの向上とハンドシェイクの高速化を実現するために、Envoy 1.20とIstio 1.14で新しい機能が導入されました。これは、第3世代Intel® Xeon® Scalableプロセッサ、Intel® Integrated Performance Primitives (Intel® IPP)暗号ライブラリ、EnvoyでのCryptoMB秘密鍵プロバイダメソッドサポート、そして`ProxyConfig`を使用したIstioでの秘密鍵プロバイダ設定によって実現できます。

CryptoMB

Intel IPP 暗号ライブラリは、マルチバッファ暗号操作をサポートしています。簡単に言うと、マルチバッファ暗号化は、SIMD(Single Instruction, Multiple Data)メカニズムを使用してIntel® Advanced Vector Extensions 512(Intel® AVX-512)命令で実装されています。最大8つのRSAまたはECDSA操作がバッファに収集され、同時に処理されるため、パフォーマンスが向上する可能性があります。Intel AVX-512命令は、最近発売された第3世代Intel Xeon Scalableプロセッササーバープロセッサ(Ice Lakeサーバー)で使用できます。

EnvoyのCryptoMB秘密鍵プロバイダの考え方は、着信TLSハンドシェイクのRSA操作をIntel AVX-512マルチバッファ命令を使用して高速化することです。

Intel AVX-512命令によるEnvoyの高速化

Envoyは、デフォルトのTLSライブラリとしてBoringSSLを使用します。BoringSSLは非同期秘密鍵操作のオフロードのための秘密鍵メソッドの設定をサポートしており、EnvoyはBoringSSLフックを使用してTLSハンドシェイクの秘密鍵操作(署名と復号)を処理するEnvoy拡張機能の作成を可能にする秘密鍵プロバイダフレームワークを実装しています。

CryptoMB秘密鍵プロバイダは、Intel AVX-512マルチバッファアクセラレーションを使用してBoringSSL TLS RSA操作を処理するEnvoy拡張機能です。新しいハンドシェイクが発生すると、BoringSSLは暗号化操作を要求するために秘密鍵プロバイダを呼び出し、その後制御がEnvoyに戻ります。RSA要求はバッファに収集されます。バッファがいっぱいになった場合、またはタイマーが期限切れになった場合、秘密鍵プロバイダはバッファのIntel AVX-512処理を呼び出します。処理が完了すると、Envoyは暗号化操作が完了し、ハンドシェイクを続行できることが通知されます。

Envoy <-> BoringSSL <-> PrivateKeyProvider
Envoy <-> BoringSSL <-> PrivateKeyProvider

Envoyワーカスレッドには、8つのRSA要求のバッファサイズがあります。最初のRSA要求がバッファに格納されると、タイマーが開始されます(タイマーの持続時間は、CryptoMB設定の`poll_delay`フィールドで設定されます)。

Buffer timer started
バッファタイマー開始

バッファがいっぱいになった場合、またはタイマーが期限切れになった場合、すべてのRSA要求に対して同時に暗号化操作が実行されます。SIMD(Single Instruction, Multiple Data)処理により、非アクセラレーションの場合と比較して、潜在的なパフォーマンス上の利点が得られます。

Buffer timer expired
バッファタイマー期限切れ

Envoy CryptoMB秘密鍵プロバイダ設定

通常のTLS設定では、秘密鍵のみが使用されます。秘密鍵プロバイダを使用する場合、秘密鍵フィールドは秘密鍵プロバイダフィールドに置き換えられます。これには、プロバイダ名と型付き構成の2つのフィールドが含まれます。型付き構成はCryptoMbPrivateKeyMethodConfigであり、秘密鍵とポーリング遅延を指定します。

秘密鍵のみを使用したTLS設定。

tls_certificates:
  certificate_chain: { "filename": "/path/cert.pem" }
  private_key: { "filename": "/path/key.pem" }

CryptoMB秘密鍵プロバイダを使用したTLS設定。

tls_certificates:
  certificate_chain: { "filename": "/path/cert.pem" }
  private_key_provider:
    provider_name: cryptomb
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.private_key_providers.cryptomb.v3alpha.CryptoMbPrivateKeyMethodConfig
      private_key: { "filename": "/path/key.pem" }
      poll_delay: 10ms

Istio CryptoMB秘密鍵プロバイダ設定

Istioでは、CryptoMB秘密鍵プロバイダ設定を、ポッドアノテーションを使用してメッシュ全体、ゲートウェイ固有、またはポッド固有の構成に適用できます。ユーザーは、`pollDelay`値とともに`ProxyConfig`で`PrivateKeyProvider`を提供します。この設定は、メッシュ全体(ゲートウェイとすべてのサイドカー)に適用されます。

Sample mesh wide configuration
メッシュ全体の設定例

Istioメッシュ全体の設定

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: example-istiocontrolplane
spec:
  profile: demo
  components:
    egressGateways:
    - name: istio-egressgateway
      enabled: true
    ingressGateways:
    - name: istio-ingressgateway
      enabled: true
  meshConfig:
    defaultConfig:
      privateKeyProvider:
        cryptomb:
          pollDelay: 10ms

Istioゲートウェイの設定

ユーザーがイングレスゲートウェイのみに秘密鍵プロバイダ設定を適用する場合は、以下の設定例に従ってください。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: istio-system
  name: example-istiocontrolplane
spec:
  profile: demo
  components:
    egressGateways:
    - name: istio-egressgateway
      enabled: true
    ingressGateways:
    - name: istio-ingressgateway
      enabled: true
      k8s:
        podAnnotations:
          proxy.istio.io/config: |
            privateKeyProvider:
              cryptomb:
                pollDelay: 10ms

ポッドアノテーションを使用したIstioサイドカーの設定

ユーザーがアプリケーション固有のポッドに秘密鍵プロバイダ設定を適用する場合は、以下のサンプルのようにポッドアノテーションを使用して設定します。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: httpbin
---
apiVersion: v1
kind: Service
metadata:
  name: httpbin
  labels:
    app: httpbin
    service: httpbin
spec:
  ports:
  - name: http
    port: 8000
    targetPort: 80
  selector:
    app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpbin
      version: v1
  template:
    metadata:
      labels:
        app: httpbin
        version: v1
      annotations:
        proxy.istio.io/config: |
          privateKeyProvider:
            cryptomb:
              pollDelay: 10ms
    spec:
      serviceAccountName: httpbin
      containers:
      - image: docker.io/kennethreitz/httpbin
        imagePullPolicy: IfNotPresent
        name: httpbin
        ports:
        - containerPort: 80

パフォーマンス

潜在的なパフォーマンス上の利点は、多くの要因に依存します。たとえば、Envoyが実行されているcpusetのサイズ、着信トラフィックパターン、暗号化の種類(RSAまたはECDSA)、鍵サイズなどです。

以下は、k6、ゲートウェイ、Fortioサーバー間の合計遅延に基づいたパフォーマンスを示しています。これらは、CryptoMBプロバイダを使用した相対的なパフォーマンスの向上を示しており、Istioの一般的なパフォーマンスまたはベンチマーク結果を代表するものではありません。測定では、異なるクライアントツール(k6とfortio)、異なる設定(クライアント、ゲートウェイ、サーバーは別々のノードで実行)、そしてHTTPリクエストごとに新しいTLSハンドシェイクを作成しています。

一般的な暗号化パフォーマンスの数値については、ホワイトペーパーを公開しています。

Istio ingress gateway TLS handshake performance comparison. Tested using 1.14-dev on May 10th 2022
IstioイングレスゲートウェイTLSハンドシェイクパフォーマンス比較。2022年5月10日に1.14-devを使用してテスト済み

上記の比較で使用された設定。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  components:
    ingressGateways:
    - enabled: true
      name: istio-ingressgateway
      k8s:
        # this controls the SDS service which configures ingress gateway
        podAnnotations:
          proxy.istio.io/config: |
            privateKeyProvider:
              cryptomb:
                pollDelay: 1ms
  values:
    # Annotate pods with
    #     inject.istio.io/templates: sidecar, cryptomb
    sidecarInjectorWebhook:
      templates:
        cryptomb: |
          spec:
            containers:
            - name: istio-proxy
この投稿を共有する