就在最近,我有一个开发人员不小心尝试将数据库恢复到生产阶段,而他应该将其恢复到临时副本。 考虑到数据库名称是相似的,即CustomerName_Staging和CustomerName_Production很容易做到。
理想情况下,我会把这些放在完全独立的盒子上,但是这样做成本过高,严格来说,如果用户连接到错误的盒子,就不会阻止同样的事情发生。
这本身并不是一个安全问题 – 它是使用临时数据库的正确用户,如果在生产数据库上有工作要做,那也是他自己的工作。 我希望有一名部署人员将这些担忧分离出来,但是这个团队还不够大。
我很想听听一些关于如何防止这种情况的练习,configuration和控制方面的build议。
如果这是你自己经常做的事情,那就自动化。 既然你们都是开发者,那么编写一些代码应该是你的舵手。 :)虽然认真…通过自动化,你可以做的事情,如:
等等。 你只受到你的想象力的限制。
我不同意在这个问题上的假设 – 这是安全的 – 但我也不同意自动化将自己节省一天。 我将从这个问题开始:
这包括意外地做自动化的事情。
你把系统安全与“谁被允许做什么”这样的概念混淆起来。 您的开发帐户只能写入其副本,版本控制服务器和开发数据库。 如果他们可以读写生产,他们可以被黑客利用来窃取客户数据,或者(如你所示)可能被误操作丢失了客户数据。
你需要开始整理你的工作stream程。
您的开发人员帐户应该能够写入他们自己的副本,版本控制,并可能从版本控制到testing环境。
备份用户应该只能从生产中读取数据并写入备份存储(应该受到恰当的保护)。
对生产进行任何其他读/写操作都需要特殊和不方便的authentication。 您应该无法进入或忘记您已login。物理访问控制在此处非常有用。 智能卡,翻转开关来“武装”帐户,同时开启双键访问。
获取生产不应该是你每天需要做的事情。 大部分工作应该放在您的testing平台上,并在仔细审查之后进行生产部署。 有点不方便不会杀了你
我并不关心整个周转过程(上传到VCS,检查覆盖范围,拉动到testing服务器,运行自动化testing,重新authentication,创build备份,从VCS提取)是一个漫长的过程。
根据Ben的回答, 这就是自动化可以提供帮助的地方。 有许多不同的脚本语言使得运行某些任务变得非常容易。 只要确保你不会太容易做愚蠢的事情。 您的重新authentication步骤应该仍然是明确的(如果有危险的话),他们应该是不方便的,难以忽视。
但仅此而已 ,自动化比无用的更糟糕。 它只会帮助你更less的思考犯大错误。
我注意到你指出你的团队的规模。 我是一个人,我把自己放在这里,因为只有一个人发生事故。 有一个开销,但它是值得的。 最终你会得到一个更安全,更安全的开发和生产环境。
我的一个同事对此有一个有趣的方法。 他的terminal配色scheme很难做到 。 灰色和粉红色,难以阅读,这在理论上应该保证,无论他写什么,他真的打算写。
你的里程可能会有所不同…我可能不用说它自己几乎是无懈可击的。 🙂
开发人员不应该知道生产数据库的密码。 产品密码应该是随机的,不会令人难忘的 – 就像键盘混合的结果( Z^kC83N*(#$Hx
)。你的dev密码可以是$YourDog'sName
或correct horse battery staple
或任何东西。
当然,通过查看客户端应用程序的configuration文件,您可以找出密码是什么,特别是如果您是一个小团队。 这是产品密码唯一存在的地方。 这可以确保你必须有意识地获得prod密码。
(像往常一样,你应该有你的生产数据库的时间点备份,例如,使用MySQL,将二进制日志存档为增量备份;对于PostgreSQL,存档提前写入日志,这是你保护最后的手段任何forms的灾难,自己造成的或其他的)
简短的答案是RBAC – 基于angular色的访问控制。
您对所有环境的权限需要不同 – 像UAC之类的事情一样烦人,您需要它们:尤其是对于PROD环境。
开发者从来不会有直接访问Prod的理由 – 无论组织/团队多小。 你的“开发者”也可能穿着“舞台”和“制作”帽子,但他需要有不同的凭据和stream程来打击不同的环境。
这是烦人的吗? 绝对。 但是[帮助]阻止你的环境? 绝对。
一个简单而快速的解决scheme:使用两个不同的用户帐户,一个用于只能访问开发数据库的正常开发工作,另一个用于在生产数据库上进行实际操作的完全访问权限。 这样,您必须主动更改您正在使用的帐户,然后才能进行生产更改,这应该足以防止意外错误。
如果您有两个网站,或者两个服务器,或者两个整个环境,则可以使用相同的方法:一个开发用户帐户,没有访问权限(或至less没有写入权限)到生产环境,另一个用于生产系统的用户帐户S)。
这与系统pipe理员使用标准的非pipe理员帐户进行日常工作(阅读电子邮件,上网,跟踪票据,提交时间表,编写文档等)以及在实际运行时使用的完全独立的pipe理员帐户在服务器和/或Active Directory上。