在我工作的公司中,devops工程师(目前只有2位成员,分别是我和另一位同事)是唯一可以访问生产数据库的人员。

因此,当任何其他开发人员需要在生产数据库上执行MySQL查询时。他们会将查询发送给2位工程师,让他们执行查询。

在以下情况下,我们需要对生产数据库执行命令:


该数据库包含损坏的数据,这些错误会产生错误。他们执行命令来修复错误。
报告了一个错误。他们想查看数据库中的当前值。
我们的一位客户想要修改他/她的数据。但是我们的Web应用程序没有能力进行修改。因此,我们必须直接将MySQL命令发送到数据库,以完成客户的需求。
质量检查团队在生产环境中创建了测试帐户。他们想更改帐户的状态,以便可以进行其他测试。

这给其他同事带来了很多干扰。在白天开发程序时,我们常常不得不切换上下文以执行一些查询。

我认为这对公司而言不是一个好的架构。您如何控制对公司生产环境的权限?

我们的生产数据库包含敏感的客户信息。如果数据泄露,我们公司可能会被罚款数百万美元。

#1 楼

如果您的问题是如何管理数据库更改,请考虑使用Flyway。这样,您就可以通过存储库中跟踪的配置文件控制更改,并通过自动化和受控的流程应用更改-使用常规的代码查看和升级步骤。

如果问题是“我如何获得开发者停止烦我运行任意SQL命令的麻烦”,那么您可能需要考虑编写一种脚本来使其自动化或为它们提供第三者用户界面,以便与已锁定的帐户一起使用,以防止更改并限制它们查看任何敏感表。 YMMV取决于数据库的布局。

评论


我的问题是关于如何让开发人员停止烦扰我以运行任意SQL命令。我认为我可以使用ProxySQL屏蔽敏感的客户数据,以便其他开发人员可以读取生产数据库。

–布赖恩
19年2月20日在2:18

您是否要阻止他们搞砸或查看敏感数据?前者您可以使用mysql-web-ui之类的东西为他们提供RO访问权限。第二个要求使用Phil W的回答中所述的RBAC。

–TheFiddlerWins
19年2月20日在13:23

#2 楼

您可以使用称为数据库迁移的概念将数据库架构和数据更改嵌入到源代码控制中。然后可以将它们作为部分自动化部署过程的一部分在开发和登台环境上执行。

例如,在我的环境(PHP Web应用程序)中,我正在使用Doctrine Schema进行模式更新,Yii2迁移用于数据更改。各自的命令是7行bash脚本的一部分,该脚本运行所有必需的命令以在每个环境中部署更改。

#3 楼

我看到第一个问题,DevOps是关于建立能够处理从构建到开发的应用程序的团队。
因此,您的开发人员应该可以访问数据库,您引用了很多情况,对于许多人来说,主要缺点是使您和您的同事成为瓶颈,并妨碍您自己的工作。

其他答案很好地解决了架构更改或计划更改,这些更改确实应作为应用程序交付过程的一部分集成,但是当开发人员可能需要转储数据库以了解导致该错误的原因以及例如如何修复该错误时,它们不允许快速解决实时访问需求。

诸如ProxySQL之类的东西已经在评论中引用的MySQL数据库可能是好的,仅配置MySQL来记录事情可能也是一个好方法,MySQL提供了一个商业审计插件,可以解决让您的开发人员访问数据库并满足CISO要求的问题。跟踪什么是唐e。

如果您不仅拥有Mysql DB并且需要审核其访问权限,则配置每个系统以审核日志用户的操作而不是应用程序的操作可能很麻烦。保持封闭状态可能会更糟,有一天开发人员会在应用程序中集成数据库外壳程序来规避此障碍,并且最终它将在没有适当访问控制的情况下投入生产并公开所有数据,我强烈建议您询问您的公司可以审查此政策。

我知道有一个商业解决方案,它可以帮助strongDM(帮助审核数据库请求而不只是DB请求),还可以审核ssh和rdp会话,就像您的开发人员需要访问数据库,他们可能还需要访问托管应用程序的计算机以进行调试。

#4 楼


...我和另一个同事...是唯一有权访问生产数据库的人。


这是一个很好的起点。
通常,DBA会在马逃跑后发现自己试图关闭马stable的门。


因此,当任何其他开发人员需要在生产数据库上执行MySQL查询时,... ...


问题:
为什么要开发人员对生产数据库运行任何操作?


如何控制公司中生产环境的权限?


基于角色的访问控制。

授予用户访问每个数据库的权限,并在需要其工作角色时提供访问权限,并且使用角色授予他们访问每个数据库内表的权限。创建这些帐户和授予角色的过程受到集中管理和严格审核。

开发人员永远不应“动手”在其开发数据库之外更新访问权限。其他所有内容都应通过预先准备的,受控的(最好是自动化的)渠道进行脚本编写,测试,审核和发布。