我正在管理两台遵循开发和生产机器模型的服务器。
生产机器是精简版的软件,在严格的规则和有限的访问权限下运行。然而,开发机器则更加开放 - 开发人员可以要求安装几乎任何东西(有一些例外),并且他们可以获得无限数量的 MySQL 数据库进行测试。
然而,在两台服务器上,开发人员都必须请求一个新的用户名/密码/数据库组合,该组合通常在开发机器上被接受,并且仅在 Web 应用程序完成、完善、安全并准备起飞时才在生产机器上被接受。
有没有办法为开发机器上的每位开发人员创建一个具有创建(仅创建,而不是读取/修改/删除)具有固定权限集的模板用户权限的用户?这样,他们就可以创建自己的新安全用户名/密码/数据库集,而无需等待我接受他们的查询。
我们的开发服务器暴露在外面(因此开发人员可以通过 ssh 在家工作),因此我不想给一个用户太多权限,因为服务器上托管的应用程序具有实验性质。(如果数据库受到威胁,它能做的最好的事情就是删除应用程序数据库,而不是删除用户可以访问的所有数据库)。
答案1
MySQL 没有“模板权限”的概念。虽然提供了一些听起来很有用的权限类型,但这些权限类型不够精细,无法构建等效的权限。
数据库创建用户必须执行三个步骤:
- 创建新数据库— 通过向数据库创建用户授予 CREATE 权限来允许。
- 创建新用户- 通过将 CREATE USER 授予数据库创建用户来允许。不幸的是,CREATE USER 权限还允许使用 DROP USER、RENAME USER 和 REVOKE ALL PRIVILEGES。致命的是,这允许您运行 DROP USER 'root'@'localhost'; 和类似命令。
- 授予读/写权限。权限从数据库创建用户流向新用户,因此数据库创建用户必须具有新创建数据库的现有权限。这可以通过授予所有以前缀(例如 dev1_ )开头的数据库的 ALL PRIVILEGES 权限并要求新数据库以此前缀开头来实现。WITH GRANT OPTION 权限允许用户将其权限授予新创建的用户。
正如你所见,这一切几乎除了用户创建部分之外,其他部分都可以正常工作。一个可能的折衷方案是创建每个开发人员用户,这些用户可创建和使用多个测试数据库:
grant all privileges on `dev1_%`.* to 'dev1'@'%' identified by 'password';
grant create on `dev1_%`.* to 'dev1'@'%' identified by 'password';
这将创建一个用户“dev1”,该用户只能创建和使用以“dev1_”开头的数据库。
由于 MySQL 无法单独提供解决方案,我建议只编写一个程序来执行数据库和用户名创建步骤。开发人员可以像这样调用该问题:
create_dev_database --comment "xyz app test database" database_name username
由于您的程序正在控制数据库/用户的创建,因此您可以:
- 强制使用强密码(没有‘密码’密码,如上所述:))
- 通过主机名强制访问限制(将连接限制为“%.example.com”,而不是允许开发人员选择“%”)
- 记录新数据库的访问详情和目的(我们不希望有数百个活跃/休眠数据库,而且没有关于它们用途的文档)
此类程序必须使用并保护您的 MySQL 根密码。具体如何实现取决于平台。
祝你好运!
答案2
嗯,为什么不让开发人员在他们的开发虚拟机内管理自己的服务器,并使用与生产相同的安全锁定(尽管密码等不同)?
我是不是漏掉了什么?开发难道不应该与生产相同吗?每个开发人员难道不应该拥有自己的环境,可以随心所欲地使用吗?