从Gitlab误删数据库事件,说一说IT审计的那些事儿

标签: 信息安全 投稿 | 发表时间:2017-02-04 09:48 | 作者:点融黑帮
分享到:
出处:http://www.tmtpost.com

屏幕快照_2017-02-04_下午5

就在两天前,《Gitlab误删300GB数据,备份失效后直播抢救》、《Gitlab不小心删除了数据库导致网站下线》霸屏了科技新闻的头条。 

整个事件的回顾,Gitlab 第一时间放到了 Google Doc 上,并在 Twitter 上对事件的处置状态进行实时更新,后来索性在 Youtube上 开了频道直播恢复进程,目前网站已经恢复了正常,不幸的是,Gitlab 还是丢掉了差不多6个小时的数据。

对于事件的前因后果,Gitlab 在 Google Doc 上面已经进行了详细说明,简单来说:

Gitlab 遭受了恶意邮件发送者的 DDoS 攻击,导致数据库写入锁定,网站出现不稳定和宕机,在阻止了恶意邮件发送者之后,运维人员开始修复数据库不同步的问题,在修复过程中,错误的在生产环境上执行了数据库目录删除命令,导致300GB数据被删除,Gitlab 被迫下线。

在试图进行数据恢复时,发现只有 db1.staging 的数据库可以用于恢复,其它五种备份机制均无效。db1.staging 是6小时前的数据,而且传输速率有限,导致恢复进程缓慢。

作为一个信息系统审计师和信息安全顾问,笔者曾经对数十家企业的信息系统运维工作进行过审计,类似的事件屡见不鲜,其中也不乏国际知名的IT巨头和国内顶尖的科技公司,只是传播范围、影响力、事件透明度都没有这个事件这么大。

这次事件,其实是一个非常典型的信息安全风险爆发、信息安全控制措施失效的案例,笔者将从 IT 审计的角度,进行一些简单分析和分享。

1、IT审计的逻辑是什么

IT 审计是一种针对信息系统的审计方式,不同于财务审计对财务报告真实性、有效性、准确性的验证,IT 审计关注于对信息系统本身的稳定性、准确性、安全性的检查以及围绕信息系统运维管理活动有效性的检查。

直白一点来说,除了要检查信息系统本身能否正确、稳定的进行信息处理,IT 审计还关注是否针对信息系统运维风险的设计了有效的控制措施,并有效执行。

在 IT 审计中,审计的出发点叫做 WCGW (What Could Go Wrong),说白了就是要识别出哪些场景可以导致信息系统的不稳定、不准确的情况发生。这是一个基于过程的分析方式,用 Gitlab 事件举个例子,其中的一个 WCGW 就可以是『错误的将对备库操作在生产库上执行』。

在大量的IT风险事件基础上,IT审计服务机构识别出了很多的WCGW,并进行归类和分析,并据此设计出一套方法论和控制措施检查清单。IT审计服务机构根据这一方法论和检查清单对企业执行IT审计,以判断是否有能力应对潜在的IT风险。

审计执行过程一般分为两个阶段:

  • 制度、流程、控制措施的 设计有效性检查阶段
  • 制度、流程、控制措施的 执行有效性检查阶段
  • 首先,控制设计的有效性主要是检查企业是否建立了制度、流程,以对风险进行控制。

    笔者在实际检查过程中,经常发现不完善的企业的IT规则严重依赖信息系统管理、维护人员的个人能力和意识,信息系统的维护活动、操作执行对企业管理者来说是完全的黑盒。

    而正规一些的IT组织,则会建立完整的规则,且不论这些规则是否执行有效,至少在纸面上可以做到『有法可依』。在审计的逻辑里面,有法可依是第一步,如果连基本的管理要求都不存在,也就谈不上执行的有效性了。

    其次,控制执行有效性检查,是基于『控制设计是有效的』这一结论。

    一般来说,如果设计有效性评价为无效,是不会进行执行有效性检查的,因为那意味着『无法可依』或者『法律无效』。在Gitlab这个事件中,有评论分析说,管理员之所以执行了误操作,是因为『迷失在了N多个终端窗口当中』。

    这样的场景很常见,很多企业都制定了生产环境操作的规则以防止类似的事情发生,可实际上由于这些控制措施未被执行,还是会导致生产事故的发生。笔者曾听闻了多起类似的由于多窗口不同环境同时操作导致的生产事故,这种情况被称为控制措施执行的失效。

    2、IT审计的三大重点

    如前所述,各家IT审计服务机构都有一套控制检查清单,其中,最为基础的被称为『一般性IT控制措施』,这当中包括了三大审计重点。就笔者实际服务经验来看,这三大重点往往涵盖了绝大多数的生产故障发生的原因。

    重点一:变更管理

    在Gitlab事件中,最为令人惊讶的(其实也没那么惊讶)是运维人员在事件处置过程中,可以不经任何授权、评估、测试,直接在生产环境上进行实验性的操作,而且执行的是删除目录这样高危的操作。

    在ITIL所描述的变更发布管理优秀实践中,变更管理往往会经过多个控制环节,以确保变更的成功,这些环节包括了变更申请、授权、评估(业务影响、风险、可行性)、测试(单元、集成、用户验收)、审批、发布执行、回滚计划、上线验证等等。

    之所以变更流程的优秀实践如此之复杂,是因为生产环境的变更实际上是信息系统安全性最大的隐忧。

    在IT审计中,变更管理的有效性,也是关注的第一大重点。

    作为审计师,我们会关注变更流程中是否有有效的审批授权(以确认变更操作不是个人的、非授权的行为)、是否进行了合理而充分的测试(以确认变更在上线前是否得到质量验证)、是否遵循了不相容职责分离的原则(申请与审批、开发与测试、开发与上线部署等)。

    在Gitlab事件中,我们明显的看到管理员对生产环境执行的变更操作未能遵循上述基本要求。

    虽然Gitlab作为一家创业型的科技企业,实际上无需遵守什么样特定的运维流程,但一些通用风险控制的管理方式也是可以借鉴的,毕竟这些控制点和实践是从大量的教训当中积累出来的。

    从审计的角度来说,所有的形式、文档、记录都是为了『证明我们确实这么做了』,但从目的来说,更重要的是『即使我们不需要证明什么,我们也会遵循一些要求来提高我们系统的安全性和稳定性』。

    重点二:访问控制

    在IT审计中的第二个重点是访问控制,访问控制一般会关注两大问题:

    • 账号合理性的问题
    • 权限合理性的问题
    • 直白一点来讲,第一个问题关注哪些人能开哪些门,第二个问题关注这些人进到屋子里面之后能干些什么。

      Gitlab事件当中,我们注意到了很多有趣、有价值的建议,例如生产运维账号权限限制以及自动化运维,这些建议其实都可以看作是访问控制的一种延伸。

      在对生产运维账号权限进行限制时,运维人员将无法直接对一些敏感、高危的操作直接执行,而必须额外的获得更高的权限执行操作,这些特异性的操作方式由于有别于开发、测试环境,将有利于运维人员获得操作危险性提示,这当然是对『人肉运维』的一种改良性的尝试。

      而自动化运维,则是更加彻底可以降低这一风险的运维技术发展趋势。除了应急情况下备用的管理员账号,信息系统当中只存在自动化运维工具的账号,这些运维工具被配置特定的权限、执行特定的操作,这将大大的降低『人肉运维』可能带来的风险。

      『人肉运维』仍然是绝大多数企业采用的操作方式,很多运维人员甚至认为使用root权限进行生产环境线上操作处理问题是能力高超的表现。单独依靠运维人员的个人能力进行运维,风险不光有人员能力的天花板,企业还不得不面对可能的(有些地方甚至是必然的)运维人员流动带给信息系统的巨大风险。

      重点三:备份和恢复测试

      笔者在为很多企业进行IT审计服务时,最常提出的风险发现之一就是『未执行备份的恢复测试,无法验证备份数据的有效性』,这也被业内人士自嘲式的称为『最没有营养的IT审计发现之一』,因为这一发现并不会在实质上影响审计结论。然而,在Gitlab事件中,我们看到了令人惊诧的一幕,多重备份机制竟然只有一个可以用于数据恢复。

      随着技术的飞速发展,已经有了越来越多的技术手段,帮助企业提高信息系统的可用性和连续性。我们看到了集群式高可用架构,异地多活数据中心,提供数据高完整性保障的云服务。然而在这纷繁缭乱的新技术中,回归到信息系统连续性管理的本源,我们是否对数据做了有效的备份,并且能够在突发情况下可以实际的实现数据的恢复?

      我们各种备份机制下,是否设定了合理的RPO,以满足我们对数据恢复时可以容忍的数据损失?我们是否真正的执行过演练,以验证我们设定的RTO,真的能够完成我们的服务恢复?

      对于备份和恢复管理,Gitlab事件堪称绝佳的案例,集中的体现出了备份有效性、RPO和RTO未得到验证的问题。这也是为什么,越来越多的领军企业开始关注信息系统的连续性管理和应急响应,越来越多的企业开始真刀真枪的开展数据中心的切换演练、数据恢复测试演练、应急预案演练。

      而演练过程中,也确确实实可以发现大量的不可预期的问题,例如交通耗时、备用的设施设备可用性、各类系统的版本和兼容性问题、读写速度和运营商带宽限制问题、介质有效性问题等等,而这些问题在缺少演练的情况下,是很难暴露出来的。

      小结

      1)前车之鉴,未雨绸缪 

      就像互联网金融行业里面一直在讨论的『投资者教育』的问题,在发生实质性违约事件之前,总是有很多人无法理解『责任自担』的含义。

      不论是Gitlab事件,还是当年的携程宕机事件,都应当作为自我审视和优化的一个契机。审视一下自己公司的规则是否完备,审视一下规则是否有效的落实,把每一个别人的事故当成自我检查的标准,把每一个预案场景都实实在在的进行一下演练。安全稳定的系统环境,需要我们以前车之鉴,做未雨绸缪。

      2)『有风险意识的工程师文化』

      笔者在IT风险领域从业多年,尽管在从业过程中一再的强调管理导向的重要性,却也是坚定的工程师文化的追随者。作为技术公司,我们应当更多的相信技术而不是管理。

      安全的运维需要规则,但规则的落实要尽可能的依赖技术的力量,而非纸面上的制度、流程、管理活动。而我也相信,重规则、轻流程的技术导向型IT风险管理,可以让企业走的更高更远。

      【钛媒体作者介绍:马寅龙(点融黑帮),点融网信息安全合规专家,2年IT审计和6年信息安全风险咨询服务经验】

      更多精彩内容,关注钛媒体微信号(ID:taimeiti),或者下载钛媒体App

      相关 [gitlab 数据库 事件] 推荐:

      从Gitlab误删数据库事件,说一说IT审计的那些事儿

      - - 钛媒体:网罗天下创新事
      就在两天前,《Gitlab误删300GB数据,备份失效后直播抢救》、《Gitlab不小心删除了数据库导致网站下线》霸屏了科技新闻的头条. 整个事件的回顾,Gitlab 第一时间放到了 Google Doc 上,并在 Twitter 上对事件的处置状态进行实时更新,后来索性在 Youtube上 开了频道直播恢复进程,目前网站已经恢复了正常,不幸的是,Gitlab 还是丢掉了差不多6个小时的数据.

      从Gitlab误删除数据库想到的

      - - 酷 壳 – CoolShell
      昨天,Gitlab.com发生了一个大事,某同学误删了数据库,这个事看似是个低级错误,不过,因为Gitlab把整个过程的细节都全部暴露出来了,所以,可以看到很多东西,而对于类似这样的事情,我自己以前也干过,而在最近的两公司中我也见过(Amazon中见过一次,阿里中见过至少四次),正好通过这个事来说说一下自己的一些感想和观点吧.

      如何评价 2017 年 2 月 1 日 GitLab 数据库被误删?

      - - 知乎每日精选
      GitLab官方的事故报告(postmortem):. 恢复过程直播,有一些工程师的现场答疑:. Gitlab.com 误删数据,备份恢复失败已宕机 10 小时. YCombinator的英文讨论:. 目前来看最终会丢失一小部分线上数据(6个小时的issues、comments、merge requests等,代码和wiki文档不受影响),或许不算是灾难级的事故,但教训仍然是深刻的.

      数据库sharding

      - - 数据库 - ITeye博客
      当团队决定自行实现sharding的时候,DAO层可能是嵌入sharding逻辑的首选位置,因为在这个层面上,每一个DAO的方法都明确地知道需要访问的数据表以及查询参数,借助这些信息可以直接定位到目标shard上,而不必像框架那样需要对SQL进行解析然后再依据配置的规则进行路由. 另一个优势是不会受ORM框架的制约.

      数据库索引

      - - CSDN博客推荐文章
      索引是由用户创建的、能够被修改和删除的、实际存储于数据库中的物理存在;创建索引的目的是使用户能够从整体内容直接查找到某个特定部分的内容. 一般来说,索引能够提高查询,但是会增加额外的空间消耗,并且降低删除、插入和修改速度. 1.聚集索引:表数据按照索引的顺序来存储的. 2.非聚集索引:表数据存储顺序与索引顺序无关.

      数据库事务

      - - CSDN博客推荐文章
      事务具备4个特性:原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持续性(Durability). 这4个特性也简称为ACID性. (1)原子性:事务是能够用中最小执行单位,具有不可再分性. (2)一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态.

      数据库优化

      - - 数据库 - ITeye博客
      程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点: . a) SQL的使用规范: .   i.尽量避免大事务操作,慎用holdlock子句,提高系统并发能力.   ii.尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接.   iii.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作.

      数据库事务

      - - 数据库 - ITeye博客
      事务传播发生在类似以下情形:. 假设methodB的配置是:. 如果methodA在事务里,那么methodB也在这个事务中运行. 如果methodA不在事务里,那么methodB重新建立一个事务运行. 如果methodA在事务里,那么methodB也在这个事务中运行. 如果methodA不在是事务里,那么methodB在非事务中运行.

      数据库调优

      - - 数据库 - ITeye博客
      1、1、调整数据结构的设计. 这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等. 这一部分也是在开发信息系统之前完成,程序员在这一步需要考虑应用程序使用什么样的体系结构,是使用传统的Client/Server两层体系结构,还是使用Browser/Web/Database的三层体系结构.

      MySQL数据库的修复

      - Xin - 博客园-首页原创精华区
      找到mysql的安装目录的bin/myisamchk工具,在命令行中输入:. 然后myisamchk 工具会帮助你恢复数据表的索引. 好象也不用重新启动mysql,问题就解决了. 当你试图修复一个被破坏的表的问题时,有三种修复类型. 如果你得到一个错误信息指出一个临时文件不能建立,删除信息所指出的文件并再试一次--这通常是上一次修复操作遗留下来的.