微调MariaDB赠款以允许用户创建数据库,但不允许新用户创建

z31licg0  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(129)

我有以下初始化脚本:

GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;

CREATE USER IF NOT EXISTS 'developer'@'%' IDENTIFIED BY 'devpassword1';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON *.* TO 'developer'@'%'; 
CREATE USER IF NOT EXISTS 'maintainer'@'%' IDENTIFIED BY 'maintainerpw1';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON *.* TO 'maintainer'@'%';
FLUSH PRIVILEGES;

我使用docker-compose.yml文件中的卷挂载将其挂载到运行mariadb的docker容器中

services:
  mariadb:
    image: mariadb:10.7.3
    container_name: sql-db
    volumes:
      - ./mariadb/init-scripts:/docker-entrypoint-initdb.d

要求

我希望授予developermaintainer大部分的R/W授权,但他们可能不会创建新的用户。这应该是可能的,只有通过admin用户。

试验

我试着将CREATE USER添加到maintainer/developer用户中,它工作正常,这是我不希望有的。
这可以通过执行以下操作实现:
第一次
并且在这两种情况下,CREATE USER dummy1@'%'实际上都创建了用户。是否可以对mariadb用户授权进行微调,以允许他们创建数据库而不创建用户?

a6b3iqyw

a6b3iqyw1#

创建users需要对mysql.global_priv具有insert权限。要避免此权限的限制很难,除非授予否定赠款(不久的将来将随MDEV-14443一起提供)。这是因为创建任意数据库需要具有*.*权限(除非您希望将数据库的名称空间限制为非mysql前缀grant all on u_*.* to maintainer)。
您可以创建一个类似于mysql.create_db的过程,然后

MariaDB [mysql]> create or replace procedure
    mysql.create_db(IN dbname VARCHAR(30))
    SQL SECURITY DEFINER
    execute immediate concat('create database ',dbname);
Query OK, 0 rows affected (0.013 sec)

MariaDB [mysql]> call mysql.create_db('catdog');
Query OK, 1 row affected (0.001 sec)

MariaDB [mysql]> create role maintainer;
Query OK, 0 rows affected (0.005 sec)

MariaDB [mysql]> grant execute on procedure mysql.create_db to maintainer;
Query OK, 0 rows affected (0.003 sec)

尽管使用容器,您可能只能够为每个DB创建一个数据库示例,而忽略了多个数据库在一起的复杂性。

相关问题