Istio Mutual TLS

Istio Mutual TLS

365dfdeb6858bb8b82baedb582bfe1cf?s=128

Takashi Kusumi

August 06, 2018
Tweet

Transcript

  1. Istio Mutual TLS Cloud Native Deep Dive #2 Takashi Kusumi

    <tkusumi@zlab.co.jp>
  2. Mutual TLS とは 2 クライアントとサーバーで相互に TLS の認証を⾏うこと (正式な定義はない) Client Server

    ClientHello SeverHello, サーバー証明書送信, クライアント証明書要求 ... サーバー 証明書検証 クライアント証明書送信, .... 続く クライアント 証明書検証
  3. Istio Mutual TLS (v1.0) ▶ Mutual TLS を⾃動で実現 (Stable) +

    サービス間通信を簡単に暗号化 + 証明書の発⾏・更新が⾃動 + k8s の Secret として管理される ▶ Istio のグローバル設定で有効・無効を選択する ▶ SPIFFE ID によって相互に認証・識別ができている + RBAC による認可が可能 (Alpha) 3 3
  4. 導⼊のモチベーション ▶ 最⼩⼯数で Zero Trust Network を実現したい + サービス間通信の暗号化 +

    サービス間の認証・認可 4 “... zero trust model, a method that treats all hosts as if they're internet-facing, and considers the entire network to be compromised and hostile.” – Zero Trust Networks: Building Secure Systems in Untrusted Networks
  5. Architecture 5 istio-ca (Citadel) Pod http istio-proxy App istio-proxy App

    https ServiceAccount ごとに証明書を発⾏し Secret に保存される。proxy がマウントする spiffe://..../app-A spiffe://..../app-B
  6. SPIFFE ID ▶ 証明書には ServiceAccount に応じた SPIFFE ID が⼊っている ▶

    Secure Production Identity Framework For Everyone (SPIFFE) + サービス間認証のフレームワークとその仕様 + spiffe://<domain>/ns/<namespace>/sa/<serviceaccount> ▶ この識別⼦を利⽤して RBAC で認可の設定も可能 (Alpha) 6 # Subject Alternative Name に SPIFFE ID が入っている $ kubectl get secret istio.bookinfo-reviews ... | openssl x509 -text X509v3 Subject Alternative Name: URI:spiffe://cluster.local/ns/default/sa/bookinfo-reviews
  7. RBAC による認可 (Alpha) ▶ ロールベースでサービス間通信の認可が⾏える + ServiceRole: ロールの定義 + ServiceRoleBinding:

    ロールとユーザ(サービス)の紐づけ ▶ サービスは SPIFFE ID を使って識別する ▶ L7 のため NetworkPolcy より細かい制御が可能 + HTTP メソッドやパスごとに制御できる 7
  8. ServiceRole apiVersion: "rbac.istio.io/v1alpha1" kind: ServiceRole metadata: name: backend-apis-viewer spec: rules:

    - services: ["backend.default.svc.cluster.local"] # 対象サービス paths: ["/apis/*"] # 対象パス methods: ["GET"] # HTTP メソッド 8
  9. ServiceRoleBinding apiVersion: "rbac.istio.io/v1alpha1" kind: ServiceRoleBinding metadata: name: backend-apis-viewer spec: subjects:

    # 紐付ける対象の SPIFFE ID - user: "cluster.local/ns/default/sa/frontend" roleRef: kind: ServiceRole name: "backend-apis-viewer" # 紐付ける ServiceRole 名 9
  10. Istio導⼊の課題

  11. メッシュ外への通信 ▶ Istio はメッシュ外へはデフォルトでは通信できない + 特に https は証明書の問題がある ▶ 対策

    + ServiceEntry で⼀つずつ登録する + https の場合は tcpプロクシーとして動作する (SNI Sniffing) + --includeIPRanges でメッシュ外はすべて直接通信にする + Circuit Breaker やトレーシングなどの機能も使えない 11
  12. どこまで Istioに依存するか ▶ アプリケーションとサービスメッシュの境界線はどこか + サービス間の認証・認可はサービスメッシュ + エンドユーザ・サービス間の認証・認可はサービスメッシュ? ▶ サービスメッシュ間のポータビリティ

    12
  13. デバッグの難しさ ▶ Istio で問題が起きるとデバッグが難しい + 皆さんどうやってデバッグしてますか? ▶ containerPort を付け忘れただけで動かなかったり… 13

  14. We are hiring! bit.ly/zlab-careers