Ask DBA: 你所在的公司是如何访问生产数据库的?
💡 本文翻译自 Reddit 上的讨论帖 How do you deal with developers asking for production DB access? (https://www.reddit.com/r/devops/comments/11fmo4l/how_do_you_deal_with_developers_asking_for/) 。
如果不妥善处理,这类要求会导致可怕的后果,如 DoS、数据泄露等,通常可以借用工具让开发者访问匿名数据,或在数据上运行 EXPLAIN。
acdha(108 赞)
首先要考虑你与开发人员的关系,以及你的具体工作职责是什么。一般来说,最好和开发人员站在同一阵线上,如果阻止他们完成他们的工作,最后发现他们只是把 phpMyAdmin 的副本偷偷放到服务器上了,以避免和你打交道(特别是如果你没有权力制定这种限制的话)。
另一些方法包括授予通过安全培训并了解贵司的责任、法规等人访问权 (如果这样以后你仍旧不相信他们,那可能要想想你怎么敢把他们的代码发布到生产环境);记录每一条查询和查询人,并且审核这些日志;或者只在返回几行的情况下运行查询语句,一个做优化的开发人员不需要检索一百万行来获得查询计划或者手动测试 SELECT COUNT(*) FROM (此处手动插入一条糟糕查询) 需要多少时间。
我一般建议搞个只读副本,以避免对性能问题或不经意的改变,这样还是能有效地进行调试,也不浪费你的时间复制数据。
最大的问题是数据泄露,这是对你所拥有的数据类型和可用资源水平的一种权衡。一般来说,你要考虑的大多数事情都是你需要做的事情,例如把个人识别信息(Personal Identification Information / PII)存到一个独立的数据库中,由一个单独的服务来处理那些需要用户家庭地址的请求,这样更大程度避免了简单错误影响到应用程序。但这并不容易做到,不过至少可以了解下贵司是否有政策限制了谁可以访问这些数据。在某些情况下还有一种方式,给开发人员访问一个生产数据库的副本(去掉带有限制的表)。也有人这样做:访问一个不能访问互联网或其他内部系统的壳服务器,不过这并无法阻止泄漏数据,但可以避免更常见的非恶意破坏,比如把「临时」文件放置多年。
还有一个强大的工具,虽然很难实施,不过非常值得考虑:字段或行级加密。如果出于某些原因(可能是性能)你有一个混合敏感级别的库,使用一个只有少数人有权解密的 AWS KMS Envelope 会更安全,以免有人不小心把它打印到了日志里,或者由于一些 bug。
💬 高赞评论
100% 同意。DevOps 的工作是让操作更安全,但也是为开发团队提供性能和效用。他们是盟友,不是对手。相互尊重和理解对这项工作至关重要。
bxsephjo (137 赞)
我会给他们做一个副本数据库,定期复制和匿名化原始数据。
💬 高赞评论
我很想这么做,但对于初创企业来说,这个时间成本太高了。在公司做 SOC2 和 BC;DR 之前就是赌博。
如果他们和你签署了同样的保密协议,你为什么不相信他们,就像你相信自己一样?真实的数据很多时候对于了解业务情况是必要的。
cgssg (94 赞)
在我看来,很多情况下,对生产环境的数据库进行选择性的只读是可以接受的。风险存在于一个持续的过程中,预防措施(比如无权限)具备最强大的威慑力,但代价也是最高的(降低的故障处理效率,较慢的故障恢复时间)。有选择的授权访问能尽可能防止数据泄漏,可以通过 RBAC 和控制监管(审计日志)来实现。要进一步防止泄漏,可以使用自动生成的一次性账户或定期密码变更进行只读访问。数据库实例也应该是网络隔离的,所以所有的访问都可以通过受控的访问点、jump hosts 等。
keto_brain (48 赞)
为什么不给开发团队访问他们的生产数据库的权利?在 DevOps 里,开发团队负责从开发到生产的环境,包括他们的后台数据库。他们给自己的应用程序提供支持,而不是我,包括他们的数据库。如果他们搞砸了,那是他们的事。
我们如何建立工具,帮助开发人员自动识别的生产数据快照到预生产环境,是另外一个问题。
💬 高赞评论
100% 同意,只需要有控制措施,以确保如果数据库出现漏洞,数据泄漏是可控的。这就是多重身份验证(MFA),独立的证书或某种 PAM,日志等。我认为当涉及到人们完成自己的工作方面,合规性是远远落后的。他们仍然相信瀑布模型,因为那更容易卖。
SuperQue (21 赞)
在我之前从事数据库自动化的工作中,情况是这样的:
Infra/SRE 只负责数据库和备份的自动化。我们为团队提供工具,并在需要时为他们提供升级协助。常规的日常数据库操作是由各个团队来完成的。
💬 高赞评论
态度不错
CyberMonkey1976 (6 赞)
elitesense (5 赞)
the-computer-guy (5 赞)
Irythros (2 赞)
damienjarvo (2 赞)
Bytebase 的解决之道
- 管理员模式:Bytebase 在 SQL 编辑器中提供管理模式,允许 DBA 执行数据库管理命令,可以替代标准的 database 命令行客户端。
- 基于数据库的访问控制:开发者无权限在 SQL 编辑器查询受保护环境中的数据库。但 DBA 可以配置数据库白名单,授予开发者查询权限。
- 数据脱敏:开发者在 SQL 编辑器中查询数据时,敏感列的查询结果将被匿名化处理。它适用于所有查询类型,例如子查询、JOIN、公用表表达式(CTE)。
- 基于角色的变更语句管控:开发者对指定数据库发起 DDL 或 DML 变更将自动触发审核流程。
- 审计日志:Bytebase 审计日志记录了在 SQL 编辑器中执行过的所有查询。
- 协同工作表:DBA 和开发人员可以将编写的 SQL 语句保存为工作表,并共享给团队成员。除此之外,该版本支持将上传的 SQL 脚本(单个文件不超过 100M)保存为工作表,以便在工单中使用。