服务网格安全框架 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
- OAuth 2.0
- OpenID Connect
- JWT
- TokenTypes
- Opaque tokens
- Transparent tokens
- API-oriented 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时,通常有定义数字证书(服务端或客户端)、票证密钥和证书校验机制三种类型,但每个定义仅能指定为其中一种类型;
|
|
在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获取;
|
|
UpstreamTIs
定义在cluster
中,与集群中的主机通信时使用,它同样支持类似listener的 tls_context
一样的三种定义格式;
|
|
静态TLS配置实例
下面的示例中定义了三个secrets
- server_cert:服务器端证书,同下游客户端通信时使用,由listener调用
- client_cert:客户端证书,与上游端点通信时使用,由cluster调用
- valication_context:校验客户端对等证书的配置,由listener调用以校验请求方的证书