基于已有海光硬件的安全部署方案
项目背景
客户购买指定海光型号的服务器,具备海光CSV的安全能力。运维同学需要将完整的符信产品部署至客户环境。客户环境可能联网,可能不联网,涉及到的安全能力需要区分此种区别。
安全威胁
- 交付时需要一并交付客户Root账户,故客户侧掌握服务器的全部运维权限。
- 客户可能会采取任何行为尝试获取敏感数据,以往客户已经证明客户侧会试图将我们的数据进行转储并进一步利用。
- 系统任何告警或警示行为在离线环境下无法触达云阵侧。即离线状态下当风险发生时尽可能采取熔断措施来阻挡数据安全问题。而非提示或告警。客户可能有意隐藏这些信息。
安全加固范围
- 需要保护的资产:
- 敏感数据:敏感数据生命周期中,包括计算中间状态和存储状态两种状态。
- 中间状态主要包括数据导入流程以及数据查询状态。
- 存储状态主要包括数据库存储和搜索引擎存储。
- 应用资产:应用资产主要包括,非预期的应用部署,应用知识产权保护。
- 非预期的应用部署可以有效阻止诸如劫持攻击或中间人攻击的攻击手法。保障K8S中部署的应用都是安全可信的。
- 应用知识产权保护主要包括静态防护和运行时防护。
- 静态防护主要指容器镜像的安全存储。
- 运行时防护为防止对运行中的容器进行dump,拉取其中的jar包或任何代码文件进行反编译进而获取其中的风险部分。
- 敏感数据:敏感数据生命周期中,包括计算中间状态和存储状态两种状态。
具体加固方案
一、数据资产保护
(1)、数据中间状态保护
数据导入流程保护
- 数据导入发生时,数据会以各种中间态出现在内存和磁盘中,对于磁盘来说,应用在导入流程中需要保证中间态数据得到及时的删除,不允许有中间态数据留存。对于内存来说,所有容器都受到海光CSV安全虚拟化技术的保护。外部的非法访问无法获取容器中的内存机密信息。即使是root也无法基于物理机获取虚拟机中的内存数据。

- 数据导入过程中,敏感数据不会明文落盘,仅仅明文出现在内存中,然后存储于可信存储设备中。
数据查询状态
- 系统中允许客户对敏感数据进行计算和查询,除业务正常功能外,需要防止用户进行爬虫,越权等操作。
- 在执行查询任务时,需要保证日志输出中不包含敏感信息,防止日志泄漏机密数据。
(2)、数据存储状态保护
安全风险:
- 数据文件被直接拷贝至其他实例,其他实例可随意查询数据内容,敏感信息遭到泄漏。
- 存储系统存在后门,可被攻击者利用实现越权操作。
- 数据连接信息泄漏,应用的连接信息被用户获取,用户可直接对存储实例进行非法访问。获取敏感信息。
防护措施:
数据库存储以及搜索引擎存储(优先解决主机安全被攻破的问题)
- 磁盘IO加密:对PG和ES的数据落盘进行改造,新增加密能力,对落盘数据进行加密,数据在磁盘上密文存储,即使文件被拷贝至其他实例,也无法读取其中敏感信息。(IO实际上是数据库实例的改造)(根密钥,秘密共享存储在实例外部,磁盘上)
- 用户鉴权防护:PG数据库的特权用户把控,保证PG提供的用户权限最小化。
- 可信信道传输:PG数据库网络层面进行加密传输,只有指定客户端和SDK能够对查得数据进行解密。(初始化一个密钥)

文件服务存储
- 文件服务存储指Minio存储服务,支持S3协议。此文件服务中存储包括客户自行上传数据,不包含敏感数据,故不需要进行保存处理。专题化数据已经加密存储了。
连接信息保护
- 保护Pod中的properties信息,对文件进行加密,在SpringBoot读取properties时进行解密。保护落盘中的配置信息不泄漏。(秘密共享算法)
- 对于数据库和搜索引擎的连接,经过了严格的鉴权,并且应用了证书进行鉴权,只有特定的client应用和SDK能够访问目标连接。除此之外,用户不知晓任何连接密钥。
- ES X-Pack Security组件新增用户鉴权。
二、应用资产保护
(1)、非预期的应用部署
- 镜像安全:保障镜像安全可信。使用镜像加密技术,对镜像进行加密传输和存储,同时K8S部署校验可信执行环境,只有通过校验才会对镜像进行解密部署。

- 镜像仓库安全:客户现场部署时需要部署私有镜像仓库,采取自签名证书的方式来保护镜像仓库的安全可信。有条件可以使用有CA机构认证的证书签名。
- 使用远程证明:利用远程证明来对容器的身份进行鉴别。保障部署的应用和K8Sservice未经过中间人劫持。避免数据泄漏或鉴权系统遭到篡改。

(2)、知识产权保护
- 镜像加密存储
- 镜像存储遵循OciCrypt协议进行加密。密钥由统一程序进行管理,并且使用一定的混淆方法对密钥进行隐藏或拆分。比如秘密共享算法,信息隐藏算法。
- 代码加密和混淆
- 使用代码混淆工具,通过改变源代码结构、变量名和方法名等方式,增加代码的复杂性,使得逆向工程难度增加。
- 对于Java此类反编译较为容易的情况:可以通过修改JVM的方式,将Jar包进行加密打包,Jvm加载Class字节码时进行解密。进而完成对代码的混淆加密。