Envoy 服务网格安全体系tls静态配置
来源:原创
时间:2019-12-07
作者:脚本小站
分类:云原生
JWT:json web token
mtls:mutual TLS 双向通信
Envoy三种配置方式:直接定义,静态定义secret,xDS中的secretDS
设定Secret:
定义Secret时, 通常有定义数字证书( 服务端或客户端) 、 票证密钥和证书校验机制三种类型, 但每个定义仅能指定为其中一种类型。
static_resources: listeners: [] clusters: [] secrets: [] # 静态指定的Secret列表, 定义时, 以下三种方式可选其一; - name: ... # 可用于引用此秘密( Secret) 的惟一标识; tls_cretificate: {...} # 数字证书 certificate_chain: {...} # TLS证书链 filename: ... # 保存有证书信息的文件; 也可使用inline_bytes或inline_string进行指定, 即DataSource格式; private_key: {...} # TLS私钥, 遵循DataSource格式; password: {...} # 私钥信息的加解密密钥, 未指定时需要私钥文件处于未加密状态, 遵循DataSource格式; - name: ... # 可用于引用此秘密的惟一标识; session_ticket_keys: {...} # 定义用于加密和解密TLS会话票证的密钥 keys: [] # 密钥列表, 未指定时将使用内部生成和管理的密钥, 定义格式遵循DataSource格式; #安全起见, 应该每小时轮换一次, 但使用安全的随机数据源; - name: ... # 可用于引用此秘密( Secret) 的惟一标识; validation_context: {...} # 对等证书验证机制的相关配置 trusted_ca: {...} # 信任的CA的证书, 未指定时不会验证对端证书; crl: {...} # 可选的PEM格式的证书吊销列表, 定义格式遵循DataSource格式; verify_certificate_spki: [] # base64编码的SHA-256哈希码, 用于验证DER编码枨证书的公钥信息的SHA-256编码是否与列表项之一匹配 verify_certificate_hash: [] # base64编码的SHA-256哈希码, 用于验证DER编码格式证书的SHA-256编码是否与列表项之一匹配 verify_subject_alt_name: [] # Subject备用名称列表, 可选, 用于验证证书的主题备用名称是否与列表项之一匹配 allow_expired_certificate: ... # 布尔型数据, 用于定义是滞不会拒绝过期的证书
TLS Context:
auth.DownstreamTlsContext, 定义在listener中, 它支持三种定义格式
1、直接在listener的tls_context中通过tls_certificates参数定义;
2、在static_resource上下文定义secret, 而后在listener的tls_context中直接通过tls_certificate_sds_secret_configs参数引用;
3、直接在listener的tls_context中通过tls_certificate_sds_secret_configs参数的sds_config指定通过SDSAPI获取。
static_resources: listeners: [] clusters: [] secrets: [] # 静态指定的Secret列表, 定义时, 以下三种方式可选其一; - name: ... # 可用于引用此秘密( Secret) 的惟一标识; tls_cretificate: {...} # 数字证书 certificate_chain: {...} # TLS证书链 filename: ... # 保存有证书信息的文件; 也可使用inline_bytes或inline_string进行指定, 即DataSource格式; private_key: {...} # TLS私钥, 遵循DataSource格式; password: {...} # 私钥信息的加解密密钥, 未指定时需要私钥文件处于未加密状态, 遵循DataSource格式; - name: ... # 可用于引用此秘密的惟一标识; session_ticket_keys: {...} # 定义用于加密和解密TLS会话票证的密钥 keys: [] # 密钥列表, 未指定时将使用内部生成和管理的密钥, 定义格式遵循DataSource格式; #安全起见, 应该每小时轮换一次, 但使用安全的随机数据源; - name: ... # 可用于引用此秘密( Secret) 的惟一标识; validation_context: {...} # 对等证书验证机制的相关配置 trusted_ca: {...} # 信任的CA的证书, 未指定时不会验证对端证书; crl: {...} # 可选的PEM格式的证书吊销列表, 定义格式遵循DataSource格式; verify_certificate_spki: [] # base64编码的SHA-256哈希码, 用于验证DER编码枨证书的公钥信息的SHA-256编码是否与列表项之一匹配 verify_certificate_hash: [] # base64编码的SHA-256哈希码, 用于验证DER编码格式证书的SHA-256编码是否与列表项之一匹配 verify_subject_alt_name: [] # Subject备用名称列表, 可选, 用于验证证书的主题备用名称是否与列表项之一匹配 allow_expired_certificate: ... # 布尔型数据, 用于定义是滞不会拒绝过期的证书
TLS Context:
auth.UpstreamTlsContext , 定义在cluster中, 与集群中的主机通信时使用,它同样支持类似listener的tls_context一样的三种定义格式。
clusters: - name: ... ... tls_context: {...} # 当前过滤器的TLS上下文; tls_params: {...} # TLS协议版本和密码套件等; tls_certificates: [] # TLS证书列表; certificate_chain: {...} # TLS证书链; filename: ... # 保存有证书信息的文件; 也可使用inline_bytes或inline_string进行指定, 即DataSource格式; private_key: {...} # TLS私钥; password: {...} # 解密私钥文件的口令, 未指定时需要私钥文件处于未加密状态; tls_certificate_sds_secret_configs: {...} # 通过静态资源中定义的Secret或SDS获取Secret; name: ... # secret的惟一标识, 可以FQDN、 UUID、 SPKI或SHA256格式; 仅指定name时, 表示加载static_resources中定义的secret; sds_config: {...} # xDS API ConfigSource, 支持path、 api_config_source或ads格式; validation_context: {...} # 如何验证对等证书 validation_context_sds_secret_config: {...} # 通过SDS获取验证上下文; allow_renegotiation: ... # 布尔型值, 是否允许服务器启动的TLS重新协商; 、 max_session_key: ... # 为会话恢复而存储的最大会话密钥数, 默认为1, 0表示禁用会话恢复; sni: ... # 创建TLS后端连接时使用的SNI字符串
示例:
admin: access_log_path: "/dev/null" address: socket_address: address: 0.0.0.0 port_value: 9901 static_resources: secrets: # 预先定义secret以供后面使用 - name: server_cert tls_certificate: # 作为服务端时用的证书 certificate_chain: filename: "/etc/envoy/certs/server.crt" private_key: filename: "/etc/envoy/certs/server.key" - name: client_cert tls_certificate: # 服务端要验证客户端身份时的证书 certificate_chain: filename: "/etc/envoy/certs/client.crt" private_key: filename: "/etc/envoy/certs/client.key" - name: validation_context validation_context: # 用来认证被请求的服务端,upstream trusted_ca: filename: "/etc/envoy/ca/ca.crt" listeners: - name: listener_http address: socket_address: { address: 0.0.0.0, port_value: 80 } filter_chains: - filters: - name: envoy.http_connection_manager typed_config: "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager codec_type: AUTO stat_prefix: ingress_http route_config: name: local_route virtual_hosts: - name: backend domains: ["*"] routes: - match: prefix: "/" redirect: https_redirect: true port_redirect: 443 http_filters: - name: envoy.router typed_config: {} - name: listener_https address: socket_address: { address: 0.0.0.0, port_value: 443 } filter_chains: - filters: - name: envoy.http_connection_manager typed_config: "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager stat_prefix: ingress_https codec_type: AUTO route_config: name: https_route virtual_hosts: - name: https_route domains: ["*"] routes: - match: prefix: "/service/gray" route: cluster: service-gray - match: prefix: "/service/purple" route: cluster: service-purple - match: prefix: "/" route: cluster: mycluster http_filters: - name: envoy.router typed_config: {} tls_context: # 作为服务端的证书 common_tls_context: tls_certificate_sds_secret_configs: - name: server_cert clusters: - name: mycluster connect_timeout: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN http2_protocol_options: {} load_assignment: cluster_name: mycluster endpoints: - lb_endpoints: - endpoint: address: socket_address: address: myservice port_value: 80 - name: service-gray connect_timeout: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN http2_protocol_options: {} load_assignment: cluster_name: service-gray endpoints: - lb_endpoints: - endpoint: address: socket_address: address: service-gray port_value: 443 tls_context: # 这个集群需要加密通信来访问443端口,需要ca.crt来验证所访问服务端的正确性 common_tls_context: validation_context_sds_secret_config: name: validation_context - name: service-purple connect_timeout: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN http2_protocol_options: {} load_assignment: cluster_name: service-purple endpoints: - lb_endpoints: - endpoint: address: socket_address: address: service-purple port_value: 443 tls_context: # 这个集群需要双向认证,既需要提供作为客户端时的客户端证书,也需要验证服务端身份的ca.crt证书 common_tls_context: tls_certificate_sds_secret_configs: - name: client_cert validation_context_sds_secret_config: name: validation_context