Linkerd Service Mesh 授權策略(Server & ServerAuthorization)

為少發表於2021-12-10

簡介

ServerServerAuthorizationLinkerd 中的兩種策略資源,
用於控制對 mesh 應用程式的入站訪問。

linkerd 安裝期間,policyController.defaultAllowPolicy 欄位用於指定當沒有
Server 選擇 pod 時的預設策略。此欄位可以是以下之一:

  • all-unauthenticated: 允許所有請求。這是預設設定。
  • all-authenticated: 允許來自相同或不同叢集(使用 multi-cluster)中的 mesh 客戶端的請求。
  • cluster-authenticated: 允許來自同一叢集中的 mesh 客戶端的請求。
  • cluster-unauthenticated: 允許來自同一叢集中的 mesh 和非 mesh 客戶端的請求。
  • deny: 所有請求都被拒絕。(然後應建立 Policy 資源以允許服務之間的特定通訊)。

可以通過在 pod spec 或其名稱空間上設定註釋 config.linkerd.io/default-inbound-policy 來覆蓋此預設值。

pod & port 配置 Server 後,其預設行為是 deny 流量,
並且必須建立 ServerAuthorization 資源以允許 Server 上的流量。

系列

中文手冊(https://hacker-linner.com)

Server

Server 在與 server 相同的名稱空間中的一組 pod 上選擇一個埠。
它通常選擇 pod 上的單個埠,但在按名稱引用埠時它可能會選擇多個埠(例如 admin-http)。
雖然 Server 資源類似於 Kubernetes 的 Service
但它增加了多個 Server 例項不能重疊的限制:它們不能選擇相同的 pod/port 對。
Linkerd 附帶了一個 admission controller,試圖防止建立重疊的 server

當伺服器選擇一個埠時,預設情況下會拒絕流量,
並且必須使用 ServerAuthorization 來授權 Server 選擇的埠上的流量。

Spec

Server spec 可能包含以下頂級欄位:

field value
podSelector podSelector 選擇相同名稱空間中的 pod
port 埠名稱或編號。僅考慮 pod specports 中的埠。
proxyProtocol 為入站連線配置協議發現。取代 config.linkerd.io/opaque-ports annotation。必須是 unknownHTTP/1HTTP/2gRPCopaqueTLS 之一。 如果未設定,則預設為 unknown

podSelector

這與 Kubernetes 中的 labelSelector 欄位相同
屬於此選擇器的所有 pod 都將屬於 Server 組。podSelector 物件必須恰好包含以下欄位之一:

field value
matchExpressions matchExpressionslabel selector 要求的列表。要求是 AND 組合。
matchLabels matchLabels{key,value} 對的對映。

有關更多詳細資訊,請參閱 Kubernetes LabelSelector reference

Server 示例

一個 Server 選擇具有特定標籤的 pod,使用 gRPC 作為 proxyProtocol

apiVersion: policy.linkerd.io/v1beta1
kind: Server
metadata:
  namespace: emojivoto
  name: emoji-grpc
spec:
  podSelector:
    matchLabels:
      app: emoji-svc
  port: grpc
  proxyProtocol: gRPC

一個 Server 選擇帶有 matchExpressionspodHTTP/2 作為 proxyProtocol,在埠 8080 上。

apiVersion: policy.linkerd.io/v1beta1
kind: Server
metadata:
  namespace: emojivoto
  name: backend-services
spec:
  podSelector:
    matchExpressions:
    - {key: app, operator: In, values: [voting-svc, emoji-svc]}
    - {key: environment, operator: NotIn, values: [dev]}
  port: 8080
  proxyProtocol: "HTTP/2"

ServerAuthorization

ServerAuthorization 提供了一種向一個或多個 Server 授權流量的方法。

Spec

ServerAuthorization spec 必須包含以下頂級欄位:

field value
client client 描述授權訪問 server 的客戶端。
server server 在此授權適用的同一名稱空間中標識 Servers

Server

Server 物件必須包含以下欄位之一:

field value
name 按名稱引用 Server 例項。
selector selector 選擇在同一名稱空間中應用此授權的 server

selector

這與 Kubernetes 中的 labelSelector 欄位相同
屬於此選擇器的所有伺服器都將應用此授權。
selector 物件必須恰好包含以下欄位之一:

field value
matchExpressions matchExpressions 是標籤選擇器要求的列表。 要求是 AND 組合。
matchLabels matchLabels 是 {key,value} 對的對映。

client

client 物件必須包含以下欄位之一:

field value
meshTLS meshTLS 用於授權 mesh 客戶端訪問伺服器
unauthenticated 授權未經身份驗證的客戶端訪問伺服器的布林值。

或者,它還可以包含 networks 欄位:

field value
networks 限制此授權適用的客戶端 IP 地址。 如果未設定,伺服器將選擇預設值(通常為所有 IP 或叢集的 pod 網路)。

meshTLS

meshTLS 物件必須恰好包含以下欄位之一:

field value
unauthenticatedTLS 一個布林值,表示通訊不需要客戶端身份。這對於身份控制器非常重要,它必須終止來自尚未擁有證書的客戶端的 TLS 連線。
identities 授權的代理身份字串列表(通過 MTLS 提供)。* 字首可用於匹配域中的所有身份。* 標識字串表示所有身份驗證客戶端都已授權。
serviceAccounts 授權客戶端 serviceAccount 的列表(通過 MTLS 提供)。

serviceAccount

serviceAccount 欄位包含以下頂級欄位:

field value
name ServiceAccount 的名稱。
namespace ServiceAccount 的名稱空間。如果未設定,則使用授權的名稱空間。

ServerAuthorization 示例

一個 ServerAuthorization 允許 mesh
客戶端使用 *.emojivoto.serviceaccount.identity.linkerd.cluster.local 代理身份,
emojivoto 名稱空間中的所有服務帳戶。

apiVersion: policy.linkerd.io/v1beta1
kind: ServerAuthorization
metadata:
  namespace: emojivoto
  name: emoji-grpc
spec:
  # Allow all authenticated clients to access the (read-only) emoji service.
  server:
    selector:
      matchLabels:
        app: emoji-svc
  client:
    meshTLS:
      identities:
        - "*.emojivoto.serviceaccount.identity.linkerd.cluster.local"

一個允許任何未經身份驗證的客戶端的 ServerAuthorization

apiVersion: policy.linkerd.io/v1beta1
kind: ServerAuthorization
metadata:
  namespace: emojivoto
  name: web-public
spec:
  server:
    name: web-http
  # Allow all clients to access the web HTTP port without regard for
  # authentication. If unauthenticated connections are permitted, there is no
  # need to describe authenticated clients.
  client:
    unauthenticated: true
    networks:
      - cidr: 0.0.0.0/0
      - cidr: ::/0

一個允許具有特定服務帳戶的 mesh 客戶端的 ServerAuthorization

apiVersion: policy.linkerd.io/v1beta1
kind: ServerAuthorization
metadata:
  namespace: emojivoto
  name: prom-prometheus
spec:
  server:
    name: prom
  client:
    meshTLS:
      serviceAccounts:
        - namespace: linkerd-viz
          name: prometheus
公眾號:黑客下午茶

相關文章