Xử lý HTTPS với ISTIO
Để Istio sidecar (Envoy proxy) hiểu được các gói tin HTTPS mã hóa, bạn có một số lựa chọn:
1. Sử dụng mTLS giữa ứng dụng và Envoy
Envoy proxy không thể tự động đọc được dữ liệu của các gói tin mã hóa bằng HTTPS, trừ khi bạn sử dụng mTLS (mutual TLS) trong nội bộ giữa ứng dụng và sidecar Envoy. Trong trường hợp này:
Ứng dụng của bạn có thể giao tiếp không mã hóa với sidecar (HTTP).
Envoy sẽ thực hiện mã hóa thông qua HTTPS khi gửi yêu cầu ra ngoài dịch vụ bên ngoài Kubernetes.
Các bước:
Cấu hình Istio để không sử dụng HTTPS giữa ứng dụng và Envoy (gửi HTTP từ ứng dụng đến sidecar).
Envoy sẽ chịu trách nhiệm mã hóa và giải mã thông qua giao thức TLS/HTTPS khi kết nối với dịch vụ bên ngoài.
2. Sử dụng Envoy TLS Termination
Nếu bạn muốn Envoy xử lý TLS (HTTPS termination), bạn có thể cấu hình ServiceEntry
và DestinationRule
để sử dụng TLS termination. Điều này cho phép Envoy sidecar thực hiện giải mã TLS khi nhận gói tin, phân tích dữ liệu, rồi mã hóa lại trước khi gửi yêu cầu ra ngoài.
Ví dụ cấu hình:
ServiceEntry
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-service
spec:
hosts:
- external-service.example.com
ports:
- number: 443
name: https
protocol: HTTPS
resolution: DNS
DestinationRule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: external-service-destination
spec:
host: external-service.example.com
trafficPolicy:
tls:
mode: SIMPLE # TLS termination
3. Envoy Filter để giải mã gói tin
Nếu bạn cần một cách phức tạp hơn, bạn có thể sử dụng EnvoyFilter
để tùy chỉnh xử lý HTTPS. Bạn có thể thêm logic Lua hoặc WASM vào Envoy Filter để giải mã dữ liệu, xử lý nó, và mã hóa lại trước khi gửi đi.
Tuy nhiên, việc tùy chỉnh EnvoyFilter để giải mã yêu cầu HTTPS yêu cầu bạn phải quản lý chứng chỉ TLS và khóa cá nhân trong sidecar để có thể đọc được dữ liệu gốc.
Sử dụng mTLS (mutual TLS) giữa ứng dụng và sidecar Envoy
Trong kiến trúc Istio, mutual TLS (mTLS) là cơ chế bảo mật cho phép cả hai bên (ứng dụng và Envoy sidecar) xác thực lẫn nhau thông qua chứng chỉ TLS. Việc sử dụng mTLS giữa ứng dụng và Envoy cho phép mã hóa dữ liệu truyền giữa chúng, đồng thời bảo vệ tính toàn vẹn của dữ liệu và đảm bảo rằng cả hai bên đều đáng tin cậy.
Lợi ích của mTLS
Bảo mật end-to-end: mTLS đảm bảo rằng cả phía ứng dụng và Envoy đều được xác thực và tất cả dữ liệu được truyền giữa chúng đều được mã hóa.
Bảo vệ chống lại các cuộc tấn công "man-in-the-middle" (MITM): Vì cả hai bên đều phải xác thực nhau, nên sẽ khó để bên thứ ba chèn vào luồng truyền tải.
Tăng cường tính bảo mật nội bộ trong ứng dụng: Giảm thiểu rủi ro nếu có sự xâm nhập vào ứng dụng hoặc mạng, vì toàn bộ dữ liệu giữa các thành phần đều được mã hóa.
Cách mTLS hoạt động giữa ứng dụng và Envoy
Xác thực hai chiều: Cả ứng dụng và Envoy đều cần cung cấp và xác thực chứng chỉ TLS. Điều này khác với TLS thông thường (chỉ có server cung cấp chứng chỉ), ở đây cả hai bên đều cung cấp chứng chỉ để xác thực nhau.
Mã hóa dữ liệu: Khi mTLS được kích hoạt, tất cả dữ liệu truyền giữa ứng dụng và Envoy sidecar đều được mã hóa bằng TLS. Điều này đảm bảo rằng dữ liệu không thể bị giải mã bởi các bên không có khóa bảo mật.
Chứng chỉ do Istio cấp: Istio có thể tự động quản lý chứng chỉ cho Envoy thông qua thành phần Citadel (bây giờ là Istiod). Citadel sẽ tự động cấp và gia hạn chứng chỉ cho các sidecar Envoy.
Mã hóa trong ứng dụng và Envoy: Ứng dụng của bạn sẽ giao tiếp qua TLS (thường là HTTPS) với Envoy. Envoy sẽ thực hiện mã hóa dữ liệu trước khi truyền dữ liệu ra ngoài, và đảm bảo rằng mọi thông tin qua mạng đều bảo mật.
Ví dụ: mTLS giữa ứng dụng và Envoy
Giả sử bạn có một ứng dụng "App A" giao tiếp với một dịch vụ ngoài Kubernetes thông qua Envoy. Cấu hình mTLS có thể diễn ra như sau:
Bước 1: Cấu hình Envoy sidecar sử dụng mTLS
Bạn sẽ cấu hìnhDestinationRule
với tùy chọn mTLS, để Envoy có thể mã hóa dữ liệu với HTTPS.apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: app-a-destination-rule spec: host: app-a-service trafficPolicy: tls: mode: ISTIO_MUTUAL # Kích hoạt mTLS giữa ứng dụng và Envoy
Bước 2: Xác thực mTLS giữa ứng dụng và Envoy Ứng dụng sẽ cần cấu hình để hỗ trợ mTLS và phải xác thực bằng cách cung cấp chứng chỉ cho Envoy sidecar. Mỗi kết nối sẽ bao gồm:
Chứng chỉ khách hàng (Client Certificate): Ứng dụng của bạn sẽ gửi chứng chỉ này để Envoy xác thực.
Chứng chỉ máy chủ (Server Certificate): Envoy sẽ gửi chứng chỉ để ứng dụng xác thực.
Bước 3: Mã hóa và giải mã Khi ứng dụng gửi yêu cầu HTTP(S), Envoy sẽ tự động sử dụng mTLS để mã hóa yêu cầu trước khi chuyển tiếp ra ngoài dịch vụ hoặc tới các thành phần khác.
Mô hình hoạt động mTLS nội bộ giữa ứng dụng và Envoy
+------------------+ +--------------------+ +---------------------+ | Ứng dụng (App) | <---> | Envoy Sidecar | ----> | Dịch vụ bên ngoài | | (mTLS kết nối) | | (Xác thực mTLS) | HTTPS | (Sử dụng HTTPS) | +------------------+ +--------------------+ +---------------------+
Trong sơ đồ trên:
Kết nối mTLS giữa App và Envoy: Dữ liệu truyền giữa App và Envoy sẽ sử dụng mTLS, cả hai đều xác thực lẫn nhau và mã hóa dữ liệu.
Envoy gửi yêu cầu HTTPS ra ngoài: Sau khi dữ liệu được mã hóa, Envoy sẽ chuyển tiếp yêu cầu đến dịch vụ bên ngoài Kubernetes.
Cách cấu hình mTLS trong Istio
Istio có thể tự động hóa nhiều khía cạnh của mTLS, bao gồm cấp chứng chỉ và cấu hình Envoy. Bạn có thể sử dụng DestinationRule
để bật chế độ mTLS trong nội bộ giữa ứng dụng và sidecar.
Ví dụ về cấu hình DestinationRule
với mTLS:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: my-app-mtls spec: host: my-app trafficPolicy: tls: mode: ISTIO_MUTUAL # Chế độ mTLS tự động trong Istio
Khi nào nên sử dụng mTLS giữa ứng dụng và Envoy?
Khi cần tăng cường bảo mật nội bộ: Nếu ứng dụng và sidecar giao tiếp trong môi trường nhạy cảm hoặc bạn muốn bảo vệ dữ liệu nội bộ khỏi bị đánh cắp.
Ứng dụng yêu cầu xác thực TLS: Một số ứng dụng yêu cầu giao tiếp TLS để duy trì bảo mật end-to-end.
Quy định bảo mật tuân thủ: Các tổ chức có các quy định tuân thủ yêu cầu tất cả giao tiếp mạng nội bộ phải được mã hóa và xác thực.
Subscribe to my newsletter
Read articles from Kilo directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by