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

Istio Mutual TLS

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

Istio Mutual TLS

Avatar for Takashi Kusumi

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