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