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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: Linkerd Service Mesh 授权策略(Server & ServerAuthorization)

简介



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 spec 的 ports 中的端口。
proxyProtocol 为入站连接配置协议发现。取代 config.linkerd.io/opaque-ports annotation。必须是 unknownHTTP/1HTTP/2gRPCopaqueTLS 之一。如果未设置,则默认为 unknown

podSelector


这与 Kubernetes 中的 labelSelector 字段相同。属于此选择器的所有 pod 都将属于 Server 组。podSelector 对象必须恰好包含以下字段之一:


field value
matchExpressions matchExpressions 是 label 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



相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6月前
|
Kubernetes 网络协议 数据库
在Service Mesh内访问网格外的服务
阿里云服务网格ASM提供了访问外部服务的三种方式,包含设置外部服务访问策略、配置ServiceEntry和设置拦截对外访问的网段。本文介绍如何在服务网格ASM上访问外部服务。
98 0
|
3月前
【Azure Fabric Service】Service Fabric 托管群集通过 Connect-ServiceFabricCluster 连接时候报错 CertificatedNotMatched
【Azure Fabric Service】Service Fabric 托管群集通过 Connect-ServiceFabricCluster 连接时候报错 CertificatedNotMatched
|
3月前
|
安全 数据可视化 数据安全/隐私保护
【Azure 微服务】新创建的Service Fabric集群,如何从本地机器上连接到Service Fabric Explorer(Service Fabric状态/错误查看工具)呢?
【Azure 微服务】新创建的Service Fabric集群,如何从本地机器上连接到Service Fabric Explorer(Service Fabric状态/错误查看工具)呢?
【Azure 微服务】新创建的Service Fabric集群,如何从本地机器上连接到Service Fabric Explorer(Service Fabric状态/错误查看工具)呢?
|
3月前
|
资源调度 Kubernetes API
在K8S中,能否实现不通过api-Server创建Pod?
在K8S中,能否实现不通过api-Server创建Pod?
|
3月前
|
监控 安全 前端开发
【Azure 应用服务】App Service 运行状况健康检查功能简介 (Health check)
【Azure 应用服务】App Service 运行状况健康检查功能简介 (Health check)
|
3月前
|
Kubernetes 负载均衡 API
在K8S中,api-service 和 kube-schedule 高可用原理是什么?
在K8S中,api-service 和 kube-schedule 高可用原理是什么?
|
存储 Kubernetes 负载均衡
Kubernetes.Service—使用源 IP
Kubernetes.Service—使用源 IP
158 0
|
云安全 Kubernetes 安全
云安全之Kubernetes API Server 8080端口未授权
在Kubernetes中,API Server是与集群通信的核心组件之一。默认情况下,Kubernetes API Server会在端口8080上侦听请求,如果Kubernetes API Server在8080端口上启用了未授权访问,那么攻击者可以通过该端口访问API Server并获取敏感信息或执行攻击。这可能会影响任何使用未经身份验证的HTTP协议连接的版本,包括Kubernetes的早期版本和未经修补的漏洞版本。
1607 0
|
缓存 Kubernetes 数据库
【kubernetes】Service: 将外部服务定位为 Service
【kubernetes】Service: 将外部服务定位为 Service
122 0
|
Kubernetes 负载均衡 网络协议
K8S 集群核心概念 Service_通过资源清单文件创建 Service_ClusterIP | 学习笔记
快速学习 K8S 集群核心概念 Service_通过资源清单文件创建 Service_ClusterIP
169 0
K8S 集群核心概念 Service_通过资源清单文件创建 Service_ClusterIP | 学习笔记