就在最近,我有一个开发人员不小心尝试将数据库恢复到生产环境,而他本应该恢复到临时副本。这很容易做到,因为数据库名称相似,即 CustomerName_Staging 与 CustomerName_Production。
理想情况下,我会将它们放在完全独立的盒子上,但成本太高,而且严格来说,如果用户连接到错误的盒子,它并不能阻止同样的事情发生。
这本身不是一个安全问题——它是使用临时数据库的正确用户,如果在生产数据库上有工作要做,那也是他。我很想有一个部署官来区分这些问题,但是团队还不够大。
我很想听听一些关于如何防止这种情况的实践、配置和控制方面的建议。
我不同意问题中的假设——这就是安全性——但我也不同意自动化本身就能挽救局面。我将从问题开始:
你不应该意外地对生产做任何事情!
这包括不小心做自动化的事情。
您将系统安全性与“允许谁做什么”之类的概念混淆了。您的开发帐户应该只能写入其副本、版本控制服务器和开发数据库。如果他们可以读/写生产,他们可能会被黑客攻击和利用来窃取客户数据,或者(如您所展示的)可能被错误处理而丢失客户数据。
您需要首先整理您的工作流程。
您的开发人员帐户应该能够写入自己的副本、版本控制,并可能从版本控制中提取到测试环境中。
备份用户应该只能从生产中读取并写入您的备份存储(应该受到适当的保护)。
在生产环境中进行任何其他读/写操作都需要特殊且不方便的身份验证。您不应该溜进去或忘记您已登录。物理访问控制在这里很有用。智能卡,翻转开关“武装”帐户,同时转动双键访问。
访问生产不应该是您每天都需要做的事情。大部分工作应该在您的测试平台上进行,并且在经过仔细审查后将非工作时间部署到生产环境中。一点不便不会杀死你。
自动化是解决方案的一部分。
我并不忽视这样一个事实,即完整的周转(上传到 VCS、检查覆盖率、拉到测试服务器、运行自动化测试、重新身份验证、创建备份、从 VCS 拉出)是一个漫长的过程。
根据 Ben 的回答,这就是自动化可以提供帮助的地方。有许多不同的脚本语言可以使运行某些任务变得非常容易。只要确保你不要让做愚蠢的事情变得太容易。您的重新身份验证步骤仍应明确(如果危险),它们应该不方便且难以不加思索地完成。
但仅此而已,自动化比无用更糟糕。它只会帮助你用更少的想法犯下更大的错误。
适合各种规模的团队。
我注意到您指出了您团队的规模。我是一个人,我让自己经历了这件事,因为发生事故只需要一个人。有开销,但这是值得的。您最终会得到一个更安全、更安全的开发和生产环境。
如果这是您看到自己经常做的事情,请将其自动化。而且由于你们都是开发人员,因此编写一些代码应该在您的驾驶室中。:) 说真的……通过自动化它,您可以执行以下操作:
等等。你只受限于你的想象力。
我的一位同事对此有一个有趣的方法。他的生产终端配色方案很丑。灰色和粉红色,难以阅读,理论上应该确保无论他写什么,他都是真的打算写。
您的里程可能会有所不同......而且我可能不必说它本身几乎不是防弹的。:)
开发人员不应该知道生产数据库的密码。prod 密码应该是随机的且不易记——类似于键盘混搭 (
Z^kC83N*(#$Hx
) 的结果。您的开发密码可以是$YourDog'sName
或correct horse battery staple
或其他。当然,您可以通过查看客户端应用程序的配置文件找出密码是什么,特别是如果您是一个小团队的话。那是唯一应该存在 prod 密码的地方。这样可以确保您必须刻意努力才能获得 prod 密码。
(与往常一样,您应该为生产数据库进行时间点备份。例如,使用 MySQL,将二进制日志存档为增量备份。对于 PostgreSQL,存档预写日志。这是您最后的保护措施任何类型的灾难,无论是自己造成的还是其他原因。)
简短的回答是 RBAC - 基于角色的访问控制。
您对所有环境的权限都需要不同 - 就像 UAC 这样的东西一样烦人,您需要它们:尤其是对于 PROD 环境。
开发人员没有理由直接访问Prod - 无论组织/团队有多小。您的“开发人员”也可能戴着“阶段”和“产品”的帽子,但他需要有不同的凭据和流程来应对不同的环境。
烦人吗?绝对地。但它 [帮助] 防止破坏您的环境吗?绝对地。
一个快速简单的解决方案:使用两个不同的用户帐户,一个用于您的正常开发工作,只能访问开发数据库,另一个用于实际操作生产数据库,具有完全访问权限。这样,您必须主动更改您正在使用的帐户,然后才能在生产中进行任何更改,这足以防止意外错误。
如果您有两个网站、两台服务器或两个整体环境,则可以使用相同的方法:一个用户帐户用于开发,但无权访问(或至少没有写访问权)生产,另一个用户帐户用于在生产系统上工作( s)。
这与系统管理员具有用于日常工作(阅读电子邮件、网上冲浪、跟踪工单、归档时间表、编写文档等)的标准非管理员帐户和实际操作时使用的不同的完全管理员帐户的方法相同在服务器和/或 Active Directory 上。