天天看点

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

<code>Server</code> 和 <code>ServerAuthorization</code> 是 <code>Linkerd</code> 中的两种策略资源,

用于控制对 <code>mesh</code> 应用程序的入站访问。

在 <code>linkerd</code> 安装期间,<code>policyController.defaultAllowPolicy</code> 字段用于指定当没有

<code>Server</code> 选择 <code>pod</code> 时的默认策略。此字段可以是以下之一:

<code>all-unauthenticated</code>: 允许所有请求。这是默认设置。

<code>all-authenticated</code>: 允许来自相同或不同集群(使用 <code>multi-cluster</code>)中的 <code>mesh</code> 客户端的请求。

<code>cluster-authenticated</code>: 允许来自同一集群中的 <code>mesh</code> 客户端的请求。

<code>cluster-unauthenticated</code>: 允许来自同一集群中的 <code>mesh</code> 和非 <code>mesh</code> 客户端的请求。

<code>deny</code>: 所有请求都被拒绝。(然后应创建 <code>Policy</code> 资源以允许服务之间的特定通信)。

可以通过在 <code>pod spec</code> 或其命名空间上设置注释 <code>config.linkerd.io/default-inbound-policy</code> 来覆盖此默认值。

为 <code>pod &amp; port</code> 配置 <code>Server</code> 后,其默认行为是 deny 流量,

并且必须创建 <code>ServerAuthorization</code> 资源以允许 <code>Server</code> 上的流量。

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

<code>Server</code> 在与 <code>server</code> 相同的命名空间中的一组 <code>pod</code> 上选择一个端口。

它通常选择 <code>pod</code> 上的单个端口,但在按名称引用端口时它可能会选择多个端口(例如 <code>admin-http</code>)。

虽然 <code>Server</code> 资源类似于 Kubernetes 的 <code>Service</code>,

但它增加了多个 <code>Server</code> 实例不能重叠的限制:它们不能选择相同的 <code>pod/port</code> 对。

<code>Linkerd</code> 附带了一个 <code>admission controller</code>,试图防止创建重叠的 <code>server</code>。

当服务器选择一个端口时,默认情况下会拒绝流量,

并且必须使用 <code>ServerAuthorization</code> 来授权 <code>Server</code> 选择的端口上的流量。

<code>Server</code> spec 可能包含以下顶级字段:

field

value

<code>podSelector</code>

<code>podSelector</code> 选择相同命名空间中的 <code>pod</code>。

<code>port</code>

端口名称或编号。仅考虑 <code>pod spec</code> 的 <code>ports</code> 中的端口。

<code>proxyProtocol</code>

为入站连接配置协议发现。取代 <code>config.linkerd.io/opaque-ports</code> annotation。必须是 <code>unknown</code>、<code>HTTP/1</code>、<code>HTTP/2</code>、<code>gRPC</code>、<code>opaque</code>、<code>TLS</code> 之一。 如果未设置,则默认为 <code>unknown</code>。

这与 Kubernetes 中的 labelSelector 字段相同。

属于此选择器的所有 <code>pod</code> 都将属于 <code>Server</code> 组。<code>podSelector</code> 对象必须恰好包含以下字段之一:

<code>matchExpressions</code>

<code>matchExpressions</code> 是 <code>label selector</code> 要求的列表。要求是 <code>AND</code> 组合。

<code>matchLabels</code>

<code>matchLabels</code> 是 <code>{key,value}</code> 对的映射。

有关更多详细信息,请参阅 Kubernetes LabelSelector reference。

https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/label-selector/#LabelSelector

一个 <code>Server</code> 选择具有特定标签的 <code>pod</code>,使用 <code>gRPC</code> 作为 <code>proxyProtocol</code>。

一个 <code>Server</code> 选择带有 <code>matchExpressions</code> 的 <code>pod</code>,<code>HTTP/2</code> 作为 <code>proxyProtocol</code>,在端口 <code>8080</code> 上。

<code>ServerAuthorization</code> 提供了一种向一个或多个 <code>Server</code> 授权流量的方法。

<code>ServerAuthorization spec</code> 必须包含以下顶级字段:

<code>client</code>

<code>client</code> 描述授权访问 <code>server</code> 的客户端。

<code>server</code>

<code>server</code> 在此授权适用的同一命名空间中标识 <code>Servers</code>。

<code>Server</code> 对象必须包含以下字段之一:

<code>name</code>

按名称引用 <code>Server</code> 实例。

<code>selector</code>

<code>selector</code> 选择在同一命名空间中应用此授权的 <code>server</code>。

属于此选择器的所有服务器都将应用此授权。

<code>selector</code> 对象必须恰好包含以下字段之一:

matchExpressions 是标签选择器要求的列表。 要求是 <code>AND</code> 组合。

matchLabels 是 {key,value} 对的映射。

<code>client</code> 对象必须包含以下字段之一:

<code>meshTLS</code>

<code>meshTLS</code> 用于授权 <code>mesh</code> 客户端访问服务器

<code>unauthenticated</code>

授权未经身份验证的客户端访问服务器的布尔值。

或者,它还可以包含 <code>networks</code> 字段:

<code>networks</code>

限制此授权适用的客户端 <code>IP</code> 地址。 如果未设置,服务器将选择默认值(通常为所有 <code>IP</code> 或集群的 <code>pod</code> 网络)。

<code>meshTLS</code> 对象必须恰好包含以下字段之一:

<code>unauthenticatedTLS</code>

一个布尔值,表示通信不需要客户端身份。这对于身份控制器非常重要,它必须终止来自尚未拥有证书的客户端的 TLS 连接。

<code>identities</code>

授权的代理身份字符串列表(通过 MTLS 提供)。<code>*</code> 前缀可用于匹配域中的所有身份。<code>*</code> 标识字符串表示所有身份验证客户端都已授权。

<code>serviceAccounts</code>

授权客户端 <code>serviceAccount</code> 的列表(通过 <code>MTLS</code> 提供)。

<code>serviceAccount</code> 字段包含以下顶级字段:

<code>ServiceAccount</code> 的名称。

<code>namespace</code>

<code>ServiceAccount</code> 的命名空间。如果未设置,则使用授权的命名空间。

一个 <code>ServerAuthorization</code> 允许 <code>mesh</code>

客户端使用 <code>*.emojivoto.serviceaccount.identity.linkerd.cluster.local</code> 代理身份,

即 <code>emojivoto</code> 命名空间中的所有服务帐户。

一个允许任何未经身份验证的客户端的 <code>ServerAuthorization</code>。

一个允许具有特定服务帐户的 <code>mesh</code> 客户端的 <code>ServerAuthorization</code>。