离职员工从删库到跑路,咋办?(离职员工删除数据)
mhr18 2024-10-12 04:48 20 浏览 0 评论
当年,Verelox的所有客户数据被一个离职工程师删除,事故非常严重。Verelox是荷兰海牙的一家云主机商。它成立于2014,以VPS、服务器出租和托管为主。它的VPS基于KVM架构,分HDD和SSD,有加拿大、荷兰、法国三处数据中心,也支持Windows系统,支持按小时和月付。事故发生后,Verelox在官网上公布了该事件,并全力为客户恢复数据,但是,已经不可能恢复全部数据。
删除云主机上的客户数据相当于暴力破坏公司核心资产,是一种犯罪行为,该工程师一定会受到法律的制裁,但是巨大的损失已经造成,无法挽回。
比离职员工删库跑路更频繁发生的是各种意外删除数据的事件。
2017年1月31日23:00 左右,Gitlab一名系统管理员在极度疲劳的情况下,尝试删除一个空的目录,结果指令发往了另外一台服务器的命令窗口,等他回过神来的时候,27分钟过去, 终止删除操作为时已晚,大约 300 GB 左右的数据只剩下约4.5 GB。 GitLab.com丢失了 6 小时的数据库数据(问题,合并请求,用户,评论,片段等)。
4 月 5 日,知名的 VPS 服务商 DigitalOcean 出现了一次删除生产数据库的事故。删库导致 DigitalOcean 的控制面板和 API 无法正常使用,时间长达 4 小时 56 分。DigitalOcean 官博撰文致歉,并说明了事故前后过程:“ 在 2017 年 4 月 5 日 10:24 AM EDT,我们开始收到公共服务功能失效的警报。在警报最初的 3 分钟,我们发现主数据库已经被删除了。4 分钟后,我们开始从一台有延迟的数据库副本着手恢复。在接下来的 4 个小时中,我们复制并把数据恢复到主备副本。服务中断这么长时间,主要是因为从副本把数据恢复到在线服务器这个过程非常耗时。” 此次事故的根本原因是工程师驱动的配置错误。有个用于自动化测试的程序,错误使用了生产证书。
无论是主观还是无意,数据库被删除,都是互联网公司难以承受之重,Fintech公司尤其无法接受跟钱相关的数据丢失,技术团队必须要防患于未然。
首先要防止的是,数据库被开发人员误删。
开发人员是否需要连接生产数据?有人说需要,有人说不需要。不同的情况下有不同的道理。这里我们分开来讨论。如果开发人员不需要直接连接数据库,是最好不过的了,就杜绝了数据被开发人员删除的危险,也没有数据被泄露的风险,也不会因为敲出了一个select * from xxx造成负载异常升高。
如果开发人员需要连接呢?通常需要做到以下两点:
- 如果开发人员需要能连接生产数据库,需要给到只读账号,且需要一个人一个账号
- 如果生产库有从库/备库,最好能让开发人员连接从库/备库。
其次,需要防止数据被管理员删除。事实上,Verelox的数据就是被不开心的系统管理员恶意删除的。管理员不能使用root账号直接在操作系统层面操作数据文件,尽量使用客户端从远端连接到数据库进行维护。由于意外失误,像Gitlab管理员一样,在昏昏欲睡的时候,rm -rf清掉整个硬盘的事故也太多了,需要使用堡垒机等工具配合屏蔽这类高危命令。最后,尽量减少使用图形工具,因为太多的图形工具,会隐含的具有某些功能,如autocommit,设置字符集等。
第三,如何防止数据被程序删除呢?通常,架构设计上需要注意,重要数据永远不要直接删除,标记为“删除”状态。不能给程序的用户all privileges。Insert、delete、update各类命令的权限单独赋予。
第四,我们也要防黑客。应用的网络进行分层设计。接入层,应用层,数据层。数据层只对固定的应用服务器开放。数据库永远只放在内网,监听在内网IP上。
第五,必须有周密的备份,即使管理员跑路也不怕。数据的物理备份和逻辑备份相互补充,文件不小心被删除的,用物理备份恢复;表被drop掉的,用逻辑备份恢复。备份也经常需要演练。因为一方面要保证我们的备份可用;另外一个方面我们也需要对多久可以恢复负责。对CTO及运维负责人而言,备份情况也需要每天检查。
最后,请各位读者牢记强哥的独家私藏小秘籍:
- 数据文件被删除了,复制可以救命;数据表被drop掉了,延时复制可以救命;
- 数据文件被rm掉了,不要急,在不关闭进程的情况通过linux的方法恢复文件;
- oracle的flaskback query,flashback database等;
- 在mysql,sql server维护数据的时候关闭autocommit,待确认数据正确之后再提交;
- 各种数据库的基于时间点的数据恢复,有些时候真的非常有用,所以一定要进行周期性的演练。
当然,最好的办法还是好好照顾自家运维人员,开心工作开心生活,减少人肉运维,不要疲劳驾驶,也不要闹到通过删库报复公司报复社会的程度。
运维不易,请多多关爱。
相关推荐
- IT界10倍高效学习法!用这种方式,一年学完清华大学四年的课程
-
有没有在某一个瞬间,让你放弃学编程刚开始学python时,我找了几十本国内外的python编程书籍学习后,我还是似懂非懂,那些书里面到处都是抽象的概念,复杂的逻辑,这样的书,对于专业开发者来说,在平常...
- 数据库设计原则:构建高效可靠的数据存储
-
简介数据库设计是软件开发中至关重要的一环,它决定了数据在系统中的存储方式和组织结构。良好的数据库设计可以提高系统的性能、可靠性和可维护性。本文将介绍一些常见的数据库设计原则,包括范式化、冗余与一致性、...
- Deno 操作 Oracle 数据库全解析:从入门到精通的实战指南
-
在企业级应用开发中,Oracle数据库凭借其强大的功能、高可靠性和安全性,一直是大型系统的首选数据存储方案。Deno作为新一代JavaScript/TypeScript运行时,以安全、高效和现...
- APIJSON快速入门-零后端代码,接口所见即所得
-
1.流程说明一个接口的开发,比如Java用SpringBoot,Mybatis来开发一般来说就像下面这个流程部署上这个项目后,流程变成了这样如果使用apijson-framework,还可进一步简化...
- 每天从外包系统同步百万数据,用什么方案?Java实战讲解
-
用户问的是每天从外包系统同步百万数据,用什么方案,还要Java实战讲解。首先,我需要明确用户的需求。他们每天需要处理的数据量是百万级别,这个量级不算特别大,但也要考虑效率和稳定性。可能用户是企业的开发...
- SpringBoot条件化配置(@Conditional)全面解析与实战指南
-
一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...
- 禁止join,我该怎么办(禁止后不再提示是什么意思)
-
join是什么SQL中JOIN子句用于把来自两个或多个表的行结合起来。在实际的数据库应用中,经常需要从多个数据表中读取数据,这时就可以使用SQL语句中的连接(JOIN)子句,在两个或多个数据...
- Spring IoC Container 原理解析(spring的ioc底层实现原理)
-
IoC、DI基础概念关于IoC和DI大家都不陌生,我们直接上martinfowler的原文,里面已经有DI的例子和spring的使用示例《InversionofControlContainer...
- SUSE再次宣布推出自己的 RHEL 兼容发行版
-
SUSE再次宣布推出自己的RHEL兼容发行版变色龙牧场主选择了一条新的岩石路线周三12七月2023SUSE正在重新考虑去年初所做的改变:它正在推出自己的RHEL兼容发行版,或者用它的话说...
- Seatunnel介绍与datax对比及使用教程
-
什么是SeatunnelSeaTunnel是一款极简易用、性能卓越的分布式数据集成平台。它以轻量高效的架构设计,为用户提供了一站式数据集成解决方案,可轻松实现跨系统、跨格式的数据实时/批量同步与...
- Spring Boot 大屏展示,私活项目,已开源,接私活必备,真香
-
一款基于代码生成器的低代码平台!前后端分离架构SpringBoot2.x,SpringCloud,AntDesign&Vue,Mybatis-plus,Shiro,JWT,支持微服务。强大的代码生...
- 互联网大厂后端必看Spring Boot3与Oracle数据库的高效连接全攻略
-
你是不是在使用SpringBoot3开发项目时,正为连接Oracle数据库而头疼?明明按照常规方法配置,却总是出现各种错误,耗费大量时间却毫无进展?别担心,这篇文章就是为你量身定制的!开发现...
- Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
-
据oracle网3月20日报道,Oracle宣布在OracleDatabase@Azure的百万兆次级基础设施上全面推出OracleExadata数据库服务。百万兆次级部署选项无需供应...
- Oracle数据库中查询最前面的100条数据,三种方法对比
-
在Oracle数据库中查询最前面的100条数据,可通过多种方法实现,不同方法适用于不同场景和版本。以下是基于当前技术文档的三种核心方案及其适用性分析:一、使用ROWNUM伪列(通用方案,全版本适用...
- Oracle数据库中判断字段不为空?(oracle判断字段是否包含数字)
-
Oracle数据库中如何判断字段不为空在Oracle数据库中,判断字段(列)不为空通常涉及到几种不同的场景和需求。下面是一些常见的方法来检查字段是否不为空:1.使用NVL函数NVL函数可以用来将NU...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- IT界10倍高效学习法!用这种方式,一年学完清华大学四年的课程
- 数据库设计原则:构建高效可靠的数据存储
- Deno 操作 Oracle 数据库全解析:从入门到精通的实战指南
- APIJSON快速入门-零后端代码,接口所见即所得
- 每天从外包系统同步百万数据,用什么方案?Java实战讲解
- SpringBoot条件化配置(@Conditional)全面解析与实战指南
- 禁止join,我该怎么办(禁止后不再提示是什么意思)
- Spring IoC Container 原理解析(spring的ioc底层实现原理)
- SUSE再次宣布推出自己的 RHEL 兼容发行版
- Seatunnel介绍与datax对比及使用教程
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)