Apollo客户端与服务端之间没有口令认证,跨网络存在安全问题。
考虑基于如下方案提供安全认证:
- 客户端侧需要配置加密的认证口令(可逆加密存储);
- 服务端需要配置加密的认证口令(单向哈希存储);
客户端与服务端侧加密认证口令均需要有安全的存储加密密钥的诉求,在不涉及外部组件的情况下,考虑使用分散的密钥材料合成根密钥再加密工作密钥的方案。
1. 客户端
1.1. 客户端挂载材料
以 secret 挂载三个材料:
- 根密因子明文
- 工作密钥密文,由合成的根密钥加密得到
- Apollo服务端提供的口令的密文,由上述工作密钥明文使用AES256加密
1.2. 客户端根密钥
使用外置的根密钥因子明文与代码内置的根密钥因子,通过PBKDF2单向哈希合成根密钥。
1.3. 客户端工作密钥
使用上述合成的根密钥作为密钥,使用AES256算法加解密工作密钥。
1.4. 客户端侧Apollo口令密文
部署时,使用加密工具,使用上述工作密钥,加密 Apollo 服务端的口令明文,得到口令密文,通过 secret 挂载至客户端服务。
1.5. 客户端尝试连接Apollo服务端
1.6. 客户端传输口令至Apollo服务端
可以基于客户端、服务端双向数字证书认证方式提供的加密通道来明文传输Apollo口令。
也可以再使用一个额外的工作密钥再加密一次明文口令用于传输,参考客户端根密钥、工作密钥方式得到解密传输过来的口令密文的密钥。
本文通过双向数字证书加密通道来明文传输口令。
2. Apollo服务端
2.1. Apollo服务端配置一个材料
以 Secret 方式挂载:
- 口令密文,使用PBKDF2单向哈希值
2.2. Apollo服务端口令加密保存说明
Apollo服务端侧保存提供给客户端侧鉴权的口令,其明文通过PBKDF2单向哈希后保存在配置文件中。PBKDF2单向哈希值使用加密工具在安装时得到并配置。