[系统设计/开发] APP密钥签发服务器
公司的信息安全制度要求对产线的APP进行严格的签发管理,确保密钥、密码的安全。
之前的做法是:
- 建立一台独立的签发主机;
- 密钥放在签发主机上,由专人管理;
- 构建系统每构建出一个产线APP,都要手动拷贝到该台主机上,人工输入密码进行签发,签好后再把APP拷出去
这个做法比较安全,但是有明显的缺点:
- 不方便,构建系统每构建出一个产线APP,都要找专人去拷贝APP、输入密码、拷出APP,很麻烦;
- 造成持续集成环境的脱节,之前,开发维护代码、构建系统下载代码、构建系统构建APP、发布到内部FTP、测试人员测试都是持续的过程,但是现在到了构建产线APP这一步就脱节了;
为了解决这个问题,部门领导让我重新设计一台签发服务器。经过多次收集需求,做了较长时间的分析,我给出了下述方案:
1. 需求概述
1.1 持续集成
CI上的APP构建系统在构建产线APP时,能自动连接签发服务器进行签发,使签发过程加入到持续集成环境;
1.2 减少人工干预
签发服务器在运行期间只需要输入一次签发密码,可随时、连续签发构建系统指定的APP,直到签发服务器重启后才需要重新输入签发密码;
1.3 安全保障
签发服务器做最大化安全设置,签发密钥和密码不落地、系统仅允许构建系统访问;
2. 概要设计
2.1. 签发服务器启动过程
2.2. 签发程序工作流程
2.2. 说明
2.2.1 持续集成的实现
-
签发程序自动从内存读取加密的密钥和密码,不需要人工输入,实现不间断签发;
-
CI通过参数控制构建系统是否构建产线版本,构建系统决定是否连接签发服务器:
如果CI要求构建系统构建产线版本,则构建系统自动连接签发服务器,并用产线的密钥签发;否则,构建系统用测试环境的密钥签发;
-
签发服务器自动从FTP服务器下载未签发APP、上传已签发APP
2.2.2 密码问题的解决
-
用户启动加密程序将密钥和密码注入到内存中,签发程序签发APP时自动从内存读取加密的密钥和密码,替代人工输入;
-
内存中加密的密钥和密码在重启服务器后被清空。
2.2.3 安全保障
-
签发服务器仅允许构建服务器访问;
-
签发密钥和密码加密注入内存、不落地;
有了这套方案,实现起来就比较简单了。其中一定会有一个问题:
密钥文件、密码是怎么注入内存的?
其实,我是在签发服务器上建立了redis服务,首先禁止它往本地写dump,使它只能把数据存在内存里;然后通过各种redis接口,把数据加密后放进去,以后取出来也是非常方便的。
另外,这个方案假定APP构建服务器是安全的,允许它访问签发服务器,因此,必须做好APP构建服务器的安全工作。