Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Istio Mutual TLS

Istio Mutual TLS

Takashi Kusumi

August 06, 2018
Tweet

More Decks by Takashi Kusumi

Other Decks in Programming

Transcript

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

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

    サービス間通信を簡単に暗号化 + 証明書の発⾏・更新が⾃動 + k8s の Secret として管理される ▶ Istio のグローバル設定で有効・無効を選択する ▶ SPIFFE ID によって相互に認証・識別ができている + RBAC による認可が可能 (Alpha) 3 3
  3. 導⼊のモチベーション ▶ 最⼩⼯数で 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
  4. Architecture 5 istio-ca (Citadel) Pod http istio-proxy App istio-proxy App

    https ServiceAccount ごとに証明書を発⾏し Secret に保存される。proxy がマウントする spiffe://..../app-A spiffe://..../app-B
  5. 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
  6. RBAC による認可 (Alpha) ▶ ロールベースでサービス間通信の認可が⾏える + ServiceRole: ロールの定義 + ServiceRoleBinding:

    ロールとユーザ(サービス)の紐づけ ▶ サービスは SPIFFE ID を使って識別する ▶ L7 のため NetworkPolcy より細かい制御が可能 + HTTP メソッドやパスごとに制御できる 7
  7. 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
  8. 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
  9. メッシュ外への通信 ▶ Istio はメッシュ外へはデフォルトでは通信できない + 特に https は証明書の問題がある ▶ 対策

    + ServiceEntry で⼀つずつ登録する + https の場合は tcpプロクシーとして動作する (SNI Sniffing) + --includeIPRanges でメッシュ外はすべて直接通信にする + Circuit Breaker やトレーシングなどの機能も使えない 11