Mike Zhang

DNS DevOps CISSP CISA Security+ 摄影 程序员 北京

DevOps的变更管理与安全合规

26 Dec 2018 » devops, security

DevOps除了需要满足快速的服务集成与部署外,还需要通过监控指标管理提供快速的信息反馈流来不断的优化服务运行。另外在建立充分信任的企业文化氛围的基础上还需要融入信息安全目标,保证服务的安全可靠运行,防范数据泄露风险等。

安全控制需要整合到开发和运维的日常工作中,集成在部署流水线,通过自动化的控制来优化手动操作,验收和审批流程,降低对职责分离和变更审批流程的控制依赖。将安全工作整合到所有人的日常工作中,使其成为每个人的责任的时候,组织就会获得更好的安全性。

典型的企业技术组织中,开发、运维和安全人员比例为100:10:1, 当安全人员较少的时候,如果相关工作没有自动化,没有融入整个的开发和运维团队的日常工作,信息安全方面做得只有合规性检查。

1. 安全与部署流水线的集成

开发人员在开发任何产品的时候,需要邀请安全人员进行产品的演示,依赖于安全人员的专业知识进行早期的指导和反馈, 通过观察和对于业务系统的理解,尽早的发现安全风险。

将开发运维平台系统中集成安全检查和合规性检查功能(很可能企业当前仅仅由安全人员独立管理这些流程),所有人员在安全问题和缺陷的出现,都能得到及时的反馈,通过召开一些事后分析会议,进行安全技能的教育,防范再次出现。

安全的配置应该集成到共享源代码库和共享服务中,利用统一的安全配置比如完整性监控,加密配置,任何工程师都可以轻松的使用日志记录和加密标准,无需额外的工作。对于操作系统的版本以及软件版本,基础镜像确保为安全和低风险的状态。

每次提交代码,需要同时运行代码安全测试,比如使用Gauntlt这类工具集成到部署流水线,对于应用程序依赖,应用程序以及环境版本进行自动化的安全测试。

开发人员更多的是进行功能正确性测试,而测试和QA人员更多的是进行错误性测试比如输入一些不合规的数据检查应用的反应。集成的时候需要同时集成这些操作到流水线中:

  • 静态分析:对于代码进行审核减少编码缺陷,后门以及一些非法的执行等(Code Climate, Brakeman等工具)
  • 动态分析:通过一些扫描工具对于运行的系统进行观察,检查系统的内存,响应时间以及整体稳定性等功能(OWASP ZAP, Arachni等)
  • 依赖组件扫描: 对于依赖的库文件进行扫描,确保不包含一些存在漏洞的程序的存在,引入到自身的系统中。
  • 源代码完整性和代码签名: CI服务创建的包需要进行签名操作,散列值记录在日志系统中用于审计

主要的方式包括,识别经常需要处理的安全问题,比如软件版本升级,缺陷修复等问题,通过自动化的工具,进行执行并防止问题的复发。引入一些专用的工具到部署流水线自动化的完成代码的检查,功能的安全扫描。对于一些代码问题,及时的反馈给开发人员必要的信息,防止问题的重复发生。

2. 开源软件管理

当前企业在开发新的系统时,依赖了越来越多的开源软件来构建,在使用开源软件的时候,需要同时对于软件中的缺陷问题进行管理和维护,当前的开源软件中存在很多的安全漏洞,且修复时间不确定。在开发系统时,需要利用安全检查软件检查是否依赖了已知漏洞的库或者软件包,并向开发工程师进行告知。

2015年调查报告显示,一个典型的企业依赖于7000多个构建组件,使用18000个不同版本,其中7.5%的存在已知的漏洞,且其中66%的漏洞存在超过两年以上,且尚未修复。

3. 系统环境安全

系统运行环境需要对于系统进行加固操作,降低运行的风险,并且引入持续的监控手段来确保生产服务器的良好运行。通过一些工具来理解实际的运行环境,比如通过nmap, metasploit等工具进行系统扫描,查看漏洞信息。

同时对于运行在生产环境中的服务器,由于缺乏对于日志或者审计信息的常规审查,组织存在的很多安全问题往往是通过外部渠道得知,且往往需要很久才能得到反馈。应该将所有的监控,日志记录以及告警开放给任何人去检查,从而及时的发现其中存在的问题,并敦促相关人员的及时修复。

对于系统中的一些关键信息需要及时的建立监测与反馈比如:

  1. 系统的未授权登入
  2. 用户安全组修改,密码的修改
  3. 配置的变更
  4. 文件修改监测
  5. Web服务的异常错误
  6. XSS或SQL注入错误等(单元测试进行检查)
  7. 某些IP流量导致程序的持续崩溃
  8. 数据库执行语法错误

如果能够持续的检查当前的安全监控指标,就能够从中不断的改善安全运行状况,提升平台整体的运行稳定性。

另外对于CI/CD,也需要加固构建和集成服务器,防治恶意的修改和数据泄露,审查每次引入到版本系统的变更,检查任何可疑的API调用,确保CI都是在隔离的环境中运行,确保CI系统使用的版本控制是只读。

4. 变更管理流程

变更管理流程用于减少运维和安全风险的主要控制手段,但是如果能够正确的部署流水线来降低部署风险,大部分的变革其实可以不需要手动的审批流程来完成,将审批人的审批依据和流程固化成为自动化执行的操作,实现变更的有效处理

ITIL定义的变更主要分为以下几个方面:

  • 标准变更: 低风险变更,网站的内容更新和样式更新,操作系统补丁升级等。
  • 常规变更:服务的正常升级处理,一般需要权威机构的审批来完成,服务的版本更新。
  • 紧急变更:安全补丁升级,服务紧急修复等,可以允许先执行后审批的方式完成

对于任何的变更都需要记录在变更管理系统中,比如ServiceNow或者Remedy系统,使用配置管理工具进行部署实施,可以自动将变更请求单连接到工作计划工具比如JIRA中,创建更多的关联。建立起完整的变更历史记录。

比如在ServiceNow中创建变更单,里面链接上JIRA中的工作计划,以及部署流水线上生成工具清单和测试输出。以及执行的自动化部署脚本链接。这些提交给变更审批人员也会加快审批的时间。

减少对于职责分离的依赖,应该更多的通过透明的代码审查和管理,结对编程等方式来预防错误的发生,为代码质量提供保证,职责分离会减少工程师在流程中的反馈,影响持续的优化。

DevOps加降低了运维和研发人员之间的隔阂,但是对于审计和合规人员则带来了更多的挑战,因此为了完成合规和审计,需要建立完善的数据监测体系,使得审计人员也可以通过自助的方式获得所需要的信息,借助于聊天室,部署流水线以及审计日志来增加生产系统运行的透明性。