乐趣区

关于信息安全:CODING-代码资产安全系列之-构建全链路安全能力守护代码资产安全

本文作者:王振威 – CODING 研发总监
CODING 开创团队成员之一,多年系统软件开发教训,善于 Linux,Golang,Java,Ruby,Docker 等技术畛域。近两年来始终在 CODING 从事零碎架构和运维工作。

不同类型的企业资产有不同的治理方法,但守护资产的安全性无一例外都是重中之重,但对如何保障代码资产平安并没有造成对立认知。本文将就“代码资产的安全性”这一话题开展全面的论述,尝试从代码治理的生命周期进行全链路剖析,读者能够据此来扫视本人企业的代码资产平安。

代码资产平安是什么

代码资产平安不等于信息安全

代码资产平安不等于信息安全,这是很容易了解的。整个企业的信息系统组成不仅仅是代码资产,甚至能够说大多数状况下不波及代码资产。企业的信息系统往往由根底计算设施、网络平台、软件、数据库等方面组成。信息安全重点是关注上述信息设施在投产之后运行过程中的平安问题。而大多数软件运行的程序包是经由源代码编译的后果,跟源代码自身是宰割开来的。信息安全关注的方面更为全面,代码资产平安只是其中的一部分,而且往往不是最为关注的一部分。

代码资产平安不等于代码平安

代码资产平安不等于代码平安,这不太容易了解。代码平安往往指代代码自身的安全性,如代码中是否有近程过程执行破绽,注入破绽等等。而代码资产平安是一个治理概念,强调治理过程的平安,而非代码自身平安,例如某钻研机构须要钻研某种计算机病毒,他们须要在源码库中寄存对应病毒的源码。这病毒的源码就是这个机构的重要资产。

代码管理系统不扫视源码中的破绽或者歹意行为,而是必须 忠诚地确保存储的代码的原始文件

代码资产治理是围绕代码仓库的全生命周期治理

代码资产治理的外围是代码仓库。仓库里寄存着企业的全副代码,配置文件以及全副历史版本。守护代码资产平安的外围就是围绕代码仓库的三个关键环节构建起全链路的平安能力,这三个环节别离是 检入,存储和检出

检入平安

检入能够了解为开发者在开发环境上编辑好代码,并且把代码传送到代码仓库的过程。这个环节关注两个方面,别离是 机密性 完整性

机密性

机密性是指开发者把开发环境中的代码检入代码仓库的过程不被第三方窃取,个别通过传输过程加密来实现。Git 代码仓库最罕用的是 HTTPS 和 SSH 传输协定。

HTTPS 协定是通过 HTTP 协定加上传输层平安协定(TLS)实现的。HTTP 协定是明文传输协定,这意味着如果没有 TLS,网络节点中的路由设施都能够轻松窃取代码。TLS 能够在 TCP 协定之上建设双向加密能力,配合 HTTP 协定上就是 HTTPS。HTTPS 客户端和服务端先通过非对称加密协商加密算法和密钥,再应用协商的算法和密钥来进行对称加密传输。本文不波及具体算法的安全性介绍,不过随着密码学的倒退,算法在与时俱进,咱们能够认为加密算法自身是平安的。

然而这一过程并不齐备,攻击者能够制作两头服务器,使得客户端在发动连贯的时候误连贯了两头服务器,从而跟这个两头服务器进行加密通信。这将导致 即使是加密传输,但最终还是会被歹意服务器窃取,这就造成了中间人攻打

行业推出了 CA(证书受权机构)机制应对此问题,即服务器在提供加密传输服务前,要把本人的公钥和服务的域名绑定,并且在寰球公信的 CA 处注销。这样一来,HTTPS 客户端在尝试建设加密链接的时候,会要求服务器出示 CA 签发的证书,客户端能够应用预装置在操作系统或者浏览器内的 CA 公钥进行验证,确认服务器对域名的所有权,这样一来就能够确保不会有中间人攻打。有行业公信力 CA,也有企业外部 CA,而后者须要在客户端装置企业外部 CA 的证书文件。

出名平安机构 Qualys 能够在线对 HTTPS 服务器进行 SSL/TLS 多方面的报告评估,如下图为两家国内云计算公司推出的代码托管服务器的评估:

HTTPS 尽管解决了传输平安,但在认证用户身份这里,Git 代码仓库还是依赖 Basic Auth 机制来实现。Git 代码仓库会要求 HTTPS 客户端提供账号密码,并附在申请体中一并传输给服务器,由服务器来确认操作者身份。在传输过程中,账号和明码是被 TLS 一并加密传输的,咱们不用放心传输过程的明码泄露问题。但开发者通常为了不用每次操作都输出账号密码,会让电脑记住明码,如果不妥善处理,可能会导致泄露。这里重点是肯定不能把账号密码拼接在近程仓库拜访地址外面,正确的做法是应用 Git 在各种操作系统下的 凭据管理器,如 macOS 是应用钥匙串治理,Windows 是应用 Git Credential Manager for Windows 来进行治理。

SSH 是一种罕用于远程管理 Linux/Unix 服务器的平安加密协议,其性能十分多样。以 Git 为根底的代码托管也常应用这个协定进行加密代码传输。使用者提前把本人的公钥文件配置在服务器上后,能够在后续的传输过程中确认身份。

SSH 应用非对称加密(用户的公钥)确认身份,用对称加密传输数据。跟 HTTPS 不同的是,SSH 协定无奈指定域名,所以无奈引入 CA 机制来避免中间人攻打。

但 SSH 客户端在与未知服务器进行连贯时,会提醒服务器的公钥指纹信息,使用者该当比照服务供应商官网提供的公钥布告和命令行提示信息来确认服务器身份,确保不被中间人攻打。

如图展现腾讯云 CODING SSH 服务器的公钥指纹公示:

如图所示,SSH 客户端尝试连贯服务器时给出的服务器公钥指纹确认:

在用户确认身份(输出 yes 并按下回车)后,SSH 客户端会把服务器的公钥信息记录在 ~/.ssh/known_hosts 中,下次即可间接连贯,不再询问。

要点小结

  • 代码的传输要应用双向加密协议,HTTPS 和 SSH 都能够
  • HTTPS 协定须要关注服务器的证书签发方(CA)的权威性
  • HTTPS 协定须要关注客户端是否装置了不受信赖的 CA 文件(避免 CA 欺诈)
  • 应用 Git 凭据管理器保存 Git HTTPS 协定的账号密码
  • SSH 协定在应用的时候须要认真比对服务器提供的公钥指纹跟服务提供商布告的公钥指纹是否完全一致,避免中间人攻打
  • 客户端须要留神避免攻击者歹意篡改 ~/.ssh/known_hosts 文件内容或者 SSH 的客户端配置(能够通过疏忽服务器公钥信赖机制)
  • 妥善保存 SSH 私钥文件(往往寄存于 ~/.ssh/id_rsa),如 Linux 下确保此文件的权限是 400 等,避免他们读取

完整性

代码检入的完整性蕴含两个方面:

  1. 开发者一次提交的代码变动是否残缺(内容不被篡改)
  2. 某次提交是否确为某开发者做出的变动(不被冒名顶替)

以 Git 为例子,这个代码版本控制软件曾经从内生机制上确保了内容不被篡改。Git 采纳一品种 Merkel 哈希树的机制来实现分层校验。

哈希是一种把任意数据映射成等长数据的算法,且不可逆。哈希算法有的特点是原始数据产生一点变动,映射的后果会产生较大变动,而且这一变动毫无法则。映射后的等长的数据被称为指纹。

哈希算法非常适合用来疾速比拟两段数据是否完全一致(指纹统一简直能够推断原文统一)。在咱们上文中提到的比照 SSH 服务器出示的公钥指纹,和服务提供商布告的指纹就是这种原理的利用。

Merkel 哈希树:

Git 对仓库中的每一个文件内容和其根本信息整合进行哈希。会将一个目录树下的所有文件门路和文件哈希值组合再哈希造成目录树的哈希。会把目录树和提交信息组合再哈希,此哈希后果就是 Git 的版本号。这意味着每次提交都产生一个齐全不同的版本号,版本号即哈希。在给定一个版本号,咱们能够认为这个版本背地对应的全副文件内容,历史记录,提交信息,目录构造都是完全一致的。对于确定的版本号就没有篡改的可能性

哈希算法小概率会产生抵触(同一个指纹对应多个不同原始数据的状况),这时可能导致一致性校验生效。所以哈希算法也在与时俱进,如当下 MD5 算法曾经简直过期,Git 以后正在应用 SHA1 算法,将来可能会降级到更为平安的 SHA256 算法。

如图展现 Git 中的某个目录树的内容信息:

即使开发者本人提交的版本通过 Git 的层层哈希,能够确保内容不被歹意篡改,但 依然有被冒名顶替的危险

因为 Git 在提交过程不须要验证用户身份,而且提交能够被不同的人在各种传输过程中传输和展现。构想攻击者假冒公司员工制作一个提交,却被公司其余员工认为是公司外部人士会有多可怕。目前基于 Git,业界的广泛做法是 引入 GPG 签名机制

GPG 是基于非对称加密算法的一个利用,其原理是应用私钥解决一段信息,失去一段新的信息,这段新的信息只能由私钥生成,而且能够应用对应的公钥来辨认这段新的信息的生成起源,这段新的信息就被称为数字签名。

简略来说,信息发布者应用本人的私钥(私人印章)对要公布的信息(待签名文件)进行签名,并且把原始文件和数字签名一并发送给应用方。应用方持有公布方的公钥,对收到的数字签名和原始文件进行校验就能够确认的确是公布方收回的,未被冒名顶替。这相似给要公布的信息盖了个章。

如图展现 Git 中某个提交被开发者增加 GPG 签名的成果:

要点小结

  • Git 自身的哈希机制可确保内容不被篡改
  • 应用 GPG 为提交签名可避免冒名顶替
  • 服务器端要校验 Git 提交邮箱申明和 GPG 签名

存储平安

存储平安是指当代码被检入到代码仓库后,如何保证数据的机密性,完整性和可用性。抛开基础设施的安全性不谈,对于代码存储来说,数据往往由数据库数据和代码库文件组成,这里重点探讨代码文件存储平安问题。

机密性

代码仓库中的代码大多间接寄存于操作系统的磁盘中,在服务器软件进行读写操作的时候,不波及网络传输的机密性危险,但间接写入磁盘上的文件在未做管制的状况下,往往能够被操作系统上的很多不相干过程随便读写,这些非预期的代码读写会造成额定的危险。

一种做法是去管制每一个文件的读写权限,如对立设置为 600,另一种做法是罗唆只容许服务器上运行一个业务过程,实现操作系统级别隔离。

容器技术提供了一种良好的隔离过程计划:如在 Kubernetes 体系下,代码仓库存储在 PV 上,并只被挂载进代码仓库的利用容器内读写,而且基于容器的调度和弹性个性能够较好的反对高可用并防止资源节约。

完整性和可用性

咱们晓得 Git 自身会通过哈希校验机制来确保仓库的完整性,但前提是仓库文件是齐备的。如果仓库的文件失落或者损坏,Git 的哈希校验也将无奈工作。数据的完整性有很多种解决方案,最常见的冷备,半实时备份,实时备份,磁盘快照等计划都是为了确保文件在失落或者损坏的时候能够找回,来确保仓库的完整性的。不过总的来说,备份往往是预先的复原伎俩,无奈实现即时的自愈,最终根据备份机制来进行数据修复往往会影响可用性。

尽管业界没有针对代码仓库的通用高可用计划,但数据库主从策略和 RAID 机制是两个能够参考的做法,这里来做下简要介绍。

数据库主从策略,一种做法是数据写入主库,从库主动增量同步数据。当主库产生故障时,从库主动代替。代码存储相似,能够把存储节点分为主节点和从节点。

RAID 机制是一种磁盘分片存储的冗余机制,有多种做法,如 RAID5,分片存储,并存储一份校验信息,当任意一块磁盘坏掉,能够通过校验信息来还原数据。

腾讯云 CODING DevOps 在这方面进行了深入研究,并联合了主从和 RAID 的思路,实现了针对代码仓库的高可用策略,可妥善保障仓库的完整性。

如图所示,对于 D 仓库来说,他的主仓库 D(m) 寄存于第二个节点,他的从仓库 D(s) 寄存于第一个节点(本质上还能够设定更多从仓库,这里为了图示不便,只显示了一个)。这样的设计让各个节点都能够不闲置计算资源,而且任意一个节点呈现损坏都能够疾速复原。

检出平安

代码检出后能力应用,而检出也波及传输机密性问题,这点与检入局部没有区别。而对于 Git 仓库来说,检出环节的仓库完整性会由 Git 的哈希校验机制保障,也不会有太大问题。检出环节的平安问题往往是因为 不适合的权限策略和密钥治理导致代码泄露

企业外部代码通常有如下四个场景:

  1. 检出开发
  2. 浏览评审
  3. 主动执行(CI,自动化测试等)
  4. 治理审计

检出开发权限

须要辨别开发者能读写的权限范畴,爱护好要害资源和密钥,按如下准则:

  • 依照业务、组件等进行分门别类的寄存,仓库隔离
  • 依据所处的部门和组织关系配置仓库的权限
  • 为分支设定读写权限,只容许有权限的成员写入
  • 应用文件锁定形式爱护敏感文件不被误批改
  • 对立传输协定,如只容许 HTTPS 或者 SSH
  • 为集体明码,令牌,公钥等设定有限期
  • 审计明码,令牌,公钥等的应用记录
  • 为目录设定读写权限,只容许指定开发者读取或者写入某些目录
  • 禁止强制推送策略,避免代码被回退

如图所示,设置仓库内的目录权限:

浏览评审权限

诉求是看源码和辅助信息,并做出本人的评审后果,不波及写入代码,按如下准则:

  • 辨别读写和只读成员群体,禁用后者的写入权限
  • 辨别深刻评审和轻量级评审,禁用后者的代码检出权限,只容许其 Web 页面查看源码
  • 应用 CODEOWNERS 机制主动指定评审成员

如图所示,设置仓库的 CODEOWNERS:

主动执行权限

主动检出,检出行为背地不对应一个人,不波及代码写回,按如下准则:

  • 禁止成员把本人的明码,令牌,密钥用于主动执行
  • 应用我的项目 / 仓库令牌,部署公钥机制确保令牌和密钥只对指定仓库有权限
  • 为不同场景设置专用的令牌,不得混用,也不得用于其余用处
  • 为令牌,公钥等设置有效期
  • 为令牌,公钥等设置禁止写入权限
  • 审计令牌,公钥等的应用记录

如图所示,设置令牌的权限和有效期:

治理审计权限

这种场景是非技术人员心愿理解仓库统计信息,沉闷状况,理解研发过程进度等,按如下准则:

  • 给成员凋谢所管辖的仓库列表和仓库详情的 Web 页拜访权限
  • 禁止成员应用 HTTPS/SSH 协定把源码检出到本地
  • 禁止成员在网页端下载源码包

如图所示,设置禁止仓库写入等权限

总结

代码资产治理是个体系化的工程,这个过程中的安全性不是某个单点能够齐全保障的,须要从检入,存储,检出三个环节对全链条进行危险剖析。很多企业在这些方面很器重,但聚焦错了方向,可能付出了很大致力,但本质上仍然冒着代码资产的失落和泄露的微小危险。心愿此文能够帮忙企业正视代码资产平安,为代码资产管理者提供一个扫视平安的根本框架。

让 CODING 为您的代码资产保驾护航

退出移动版