本文发布于Cylon的收藏册,转载请著名原文链接~

服务网格安全框架 Microservice Security Basics

零信任安全 | 什么是零信任网络?

零信任是一种安全模型,其基础是维护严格的访问控制并且默认不信任任何人,即便是已在网络边界内的人。零信任安全

IAAA (Identification and Authentication, Authorization and Accountability

Identification: 必须支持多个身份和属性

  • Your name, username, ID number, employee number, SSN etc.
  • “I am Thor”.

Authentication: 必须支持多种认证方式以及委托认证方式

Authorization: 对于单个请求的授权可以在请求路径中的多个点确认

Accountability: 从API中捕获相关安全数据或元数据

服务网格常见安全解决方案

网络级别控制 Network Level Contros

  • local isolation 主机隔离

  • Network segementation 网络分割

    • 意味着新人底层的服务器及网络设施,信任隔离机制及实现过程且信任网段内的所有组件;
  • SSL/TLS

    • mTLS、spiffe/spire

应用级别控制 Network Level Contros

  • 传统网络令牌认证 Traditional Web Tokens
    • API-oriented Tokens
    • TokenTypes
      • Opaque tokens
      • Transparent tokens
  • 基于cookie的会话 cookie based sessions
  • SAML Security Assertion Markup Language 一种基于XML开源标准的数据格式,它在当事方之间交换身份验证和授权数据,尤其是在身份提供者和服务提供者之间交换。

Envoy的身份认证机制

传输认证

传输认证:即服务组件的认证,它基于双向TLS实现传输认证(即mTLS),包括双向认证、信道安全和证书自动管理;每个服务都需要有其用于服务间双向认证的标识,以实现此种认证机制;

用户认证

用户认证:也称为终端用户认证,用于认证请求的最终用户或者设备;Envoy通过JWT(JSON Web Token)实现此类认证需求,以保护服务端的资源;

  • 客户端基于HTTP标头向服务端发送JWT
  • 服务端验证签名
  • envoy.filters.http.jwt_authn过滤器

Envoy支持在侦听器中实现TLS终止以及与上游集群建立连接时的TLS始发

  • TLS终止定义于Listener中,而与上游集群的连接始发定义于Cluster中;
  • 在底层使用BoringSSL作为SSL库;
  • DownstreamTIsContexts支持多个TLS证书(多个证书需要属于同一类型,RSA或ECDSA),但UpstreamTIsContexts目前仅支持单个证书
  • 支持执行标准边缘代理任务,以及启动与具有高级TLS要求的外部服务(TLS1.2,SNl等)的连接;

仅在验证上下文指定一个或多个受信任的证书颁发机构后才会启用上下游的证书验证功能;

/etc/sl/certs/ca-certificates.crt(Debian/Ubuntu/Gentoo等)

/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem(CentOS/RHEL7)

/etc/pki/tls/certs/ca-bundle.crt(Fedora/RHEL6)

/etc/sl/ca-bundle.pem(OpenSUSE)

/usr/local/etc/ssl/cert.pem(FreeBSD)

/etc/sl/cert.pem(OpenBSD)

Envoy 配置数字证书

配置时,可以通过静态资源格式指定使用的TLS证书,也可以通过SDS动态获取TLS证书;

SDS可以简化证书管理

  • 各实例的证书可由SDS统一推送;
  • 证书过期后,SDS推送新证书至Envoy实例可立即生效而无需重启或重新部署;

获取到所需要的证书之后侦听器方能就绪;不过,若因同SDS服务器的连接失败或收到其错误响应而无法获取证书,则侦听器会打开端口,但会重置连接请求;

Envoy同SDS服务器之间的通信必须使用安全连接;

SDS服务器需要实现gRPC服务SecretDiscoveryService,它遵循与其他xDS相同的协议;

设定数字证书的方式

静态格式的Secret定义在static_resources上下文,并由listener或cluster在tls_context通过指定文件路径引用,也可不予事先定义,而由listener或cluster直接在tls_context中定义;

而通过SDS提供证书时,需要配置好SDS集群,并由listener或cluster在ts_context中通过sds_config引用;

定义Secret时,通常有定义数字证书(服务端或客户端)、票证密钥和证书校验机制三种类型,但每个定义仅能指定为其中一种类型;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
  secrets: [] # 静态定义指定的secret列表,定义时,以下三种方式任选其一
  - name:  # 用于引用此 secret的唯一标识
    tls_certificate: {} # 数字证书
      certificate_chain: {} # tls证书链
        filename: # 保存证书信息的文件,也可使用inline_bytes inline_string 
      private_key: # TLS私钥
      password: # 私钥信息的加解密密钥,未指定时需要私钥文件处于未加密状态
  
  - name: 
    session_ticket_keys: {} # 定义用于加密和解密tls会话票证的密钥
      keys: [] # 密钥列表,未指定时将使用内生成和管理的秘钥
      - filename:
      - inline_string:
  
  - name: 
    validation_context: {} # 对等证书验证机制的相关配置
      trust_ca: {} # 信任的ca证书,未指定时不会验证对端证书
      crl: {} # 可选的PEM格式的证书吊销列表,如果指定,Envoy将验证此CRL是否未撤销所提供的对等证书
      verify_certificate_spki: [] # base64的SHA-256哈希码,用于验证DER编码证书的公钥是与列表项之一匹配
      verify_certificate_hash: [] # base64的SHA-256哈希码,用于验证DER编码证书是否与列表项之一匹配
      allow_expired_certificate: # 布尔值,如果指定,Envoy将不会拒绝过期的证书。
      match_subject_alt_names: [] # subject备用名称匹配器的可选列表。envoy将验证所提供证书的“使用者备用名称”是否与指定的匹配项之一匹配。

在listener和cluster中引用证书

DownstreamTIsContext

定义在listener中,它支持三种定义格式

  • 直接在listener的tls_context中通过tls_certificates参数定义;

  • static_resource 上下文定义 secret,而后在listener的ts_context中直接通过 tls_certificate_sds_secret_configs 参数引用;

  • 直接在listener的tls_context中通过ts_certificate_sds_secret_configs参数的sds_config指定通过SDS APl获取;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
listeners:
- name: ..
  ..
  filter_chains:
  - filters: []
    ..
    transport_socket: # 当前过滤器链中的tls
      name:
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext
        common_tls_context: # 当前过滤器的tls上下文
          tls_params: {}   
          tls_certificates: []  # tls证书列表 
            - certificate_chain: 
                filename: 
                inline_string:
              private_key: {}
            tls_certificate_sds_secret_configs: 
              name: {} # secret的唯一标识符,可以fqdn UUID SPKI或sha256格式
              sds_config: {} # xds api源
            validation_context: {} # How to validate peer certificates.
            validation_context_sds_secret_config: {}
        require_client_certificate: # boolval ture,Envoy将拒绝没有有效客户端证书的连接。
        session_ticket_keys: # tls会话票据相关设置

UpstreamTIs

定义在cluster中,与集群中的主机通信时使用,它同样支持类似listener的 tls_context 一样的三种定义格式;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
clusters:
- name:
  transport_socket:
    name:
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
      common_tls_context:
        tls_params: {} # tls协议版本和密码套件等
        tls_certificates: []  # tls证书列表
        - certificate_chain: {} # 证书链
            filename: 
          private_key: {} # tls密钥
            filename: 
        
        tls_certificate_sds_secret_configs: [] # 通过静态资源中定义的secret或SDS获取secret
        - name: # secret唯一标识,可以FQDN | UUID | SPKI | sha256 仅指定name时,表示加载static_resources中的secret
          sds_config: {} # xds api 配置源
        
        validation_context_sds_secret_config: {} #通过sds获取验证上下文
        - name:
          sds_config: {}
      allow_renegotiation: boolVal # 如果为true,则将允许服务器启动的TLS重新协商。
      max_session_keys: {} # 为了恢复会话而存储的最大会话密钥数, 默认值为1,将此值设置为0将禁用会话恢复

静态TLS配置实例

下面的示例中定义了三个secrets

  • server_cert:服务器端证书,同下游客户端通信时使用,由listener调用
  • client_cert:客户端证书,与上游端点通信时使用,由cluster调用
  • valication_context:校验客户端对等证书的配置,由listener调用以校验请求方的证书

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:服务网格安全体系

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。