微调MariaDB授权允许用户创建数据库,但不允许创建新用户



我有以下初始化脚本:

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;

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

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用户中,它可以工作,这是我不希望拥有的。

可以这样做:

docker exec -it sql-db mariadb -u developer -p
docker exec -it sql-db mariadb -u maintainer -p

,在这两种情况下,CREATE USER dummy1@'%'实际上创建了用户。是否有一个微调可能对mariadb授予用户,让他们创建数据库,而不是用户?

创建用户需要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创建一个数据库实例,而忽略多个数据库一起的复杂性。

最新更新