序言
安全需求
安全方案
-
敏感数据加密传输
认证
鉴权
数据完整性和一致性
证书的基本原理
-
单向证书
双向证书
gRPC安全机制
-
SSL/TLS认证
GoogleOAuth2.0
自定义安全认证策略
序言
网络安全领域在攻和防对抗规模群体已经成熟,但是两端从业者对于安全原理掌握程度参差不齐,中间鸿沟般的差距构成了漏洞研究领域的主战场。笔者“三省吾身”,在工作中会犯错误把一些加密、认证、鉴权的概念和实现方案搞混,尤其是加解密涉及算法和公私钥机制的概念不深入细节。
最近的几个影响颇大的安全漏洞,Apache Shiro 权限绕过漏洞、CVE-2020-14882weblogic 绕过登录、微软ZeroLogon,这些漏洞原理的共同点都是和基本的安全算法、认证鉴权方案缺陷有关。也许未来的漏洞攻防将转移到安全基础领域的对抗,从业人员除了要求推进安全方案的必要性,涉及安全建设的可用性更为重要,所以特此开专栏系列,为大家普及一些安全基本功。
本文主要通过介绍gRPC的双向认证方案,理清证书领域的知识。
安全需求
RPC是一种技术思想,实现有阿里的 Dubbo/SOFA、Google gRPC、Facebook 的 Thrift,实现时的远程通信规范和协议可以用RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。这种服务间通信机制为企业内部各系统、模块之间的微服务和接口之间互相调用,RPC实现需要考虑安全性,RPC 调用安全主要涉及如下三点:
个人 / 企业敏感数据加密:例如针对个人的账号、密码、手机号等敏感信息进行加密传输,打印接口日志时需要做数据模糊化处理等,不能明文打印;
对调用方的身份认证:调用来源是否合法,是否有访问某个资源的权限,防止越权访问;
数据防篡改和完整性:通过对请求参数、消息头和消息体做签名,防止请求消息在传输过程中被非法篡改。
安全方案
常见的安全攻防重视rpc协议的反序列漏洞,但是如果业务方问道如果做以上的安全需求,SDL同学就傻眼了,正确的做法是区分加密传输、认证、鉴权、数据完整性和一致性四个方向:
敏感数据加密传输
基于SSL/TLS的通道加密
当存在跨网络边界的 RPC 调用时,往往需要通过 TLS/SSL 对传输通道进行加密,以防止请求和响应消息中的敏感数据泄漏。跨网络边界调用场景主要有三种:
后端微服务直接开放给端侧,例如手机 App、TV、多屏等,没有统一的 API 网关/SLB 做安全接入和认证;
后端微服务直接开放给 DMZ 部署的管理或者运维类 Portal;
后端微服务直接开放给第三方合作伙伴 / 渠道。
除了跨网络之外,对于一些安全等级要求比较高的业务场景,即便是内网通信,只要跨主机 /VM/ 容器通信,都强制要求对传输通道进行加密。在该场景下,即便只存在内网各模块的 RPC 调用,仍然需要做 SSL/TLS。
使用 SSL/TLS 的典型场景如下所示:
通道加密的的实现技术难度稍大,对性能有损耗,定制化程度高,但是效果显著,建设收益明显
针对敏感数据的单独加密
有些 RPC 调用并不涉及敏感数据的传输,或者敏感字段占比较低,为了最大程度的提升吞吐量,降低调用时延,通常会