mysql如何设置只读用户_mysql只读权限配置方法

7次阅读

MySQL 设置只读用户的核心是禁止写操作权限并禁用 SUPER 等高危权限,具体步骤包括:一、创建限定 IP 的用户;二、仅授予 SELECT 权限;三、显式撤销 INSERT、UPDATE、DELETE 等写权限及 SUPER 等危险权限;四、FLUSH PRIVILEGES 并验证。

mysql 如何设置只读用户_mysql 只读权限配置方法

MySQL 设置只读用户,核心是 ** 禁止写操作权限(INSERT、UPDATE、DELETE、DROP、CREATE、ALTER 等),仅保留 SELECT 权限 **,并确保该用户无法切换到可写模式(如禁用 SUPER 权限)。以下是安全、实用的配置方法。

一、创建用户并限制登录来源

先创建一个专用只读账号,建议限定访问主机(避免使用 ‘%’ 开放所有地址):

示例(只允许从内网 192.168.10.% 登录):

CREATE USER ‘readonly_user’@’192.168.10.%’ IDENTIFIED BY ‘StrongPass123!’;

二、授予最小必要权限:仅 SELECT

对指定数据库(如 myapp_db)授予 SELECT 权限,不赋予任何写权限:

GRANT SELECT ON myapp_db.* TO ‘readonly_user’@’192.168.10.%’;

若需跨多个库只读,逐个授权:

GRANT SELECT ON sales_db.* TO ‘readonly_user’@’192.168.10.%’;
GRANT SELECT ON reports_db.* TO ‘readonly_user’@’192.168.10.%’;

⚠️ 注意:不要执行 GRANT SELECT ON *.*(全局 SELECT),这会暴露系统库(如 mysql、information_schema),存在信息泄露风险。

三、显式撤销高危权限(关键步骤)

即使未显式授权,某些旧版本或复制环境可能隐含权限。为保险起见,主动回收潜在危险权限:

  • REVOKE INSERT, UPDATE, DELETE, DROP, CREATE, ALTER, INDEX, LOCK TABLES, CREATE VIEW, SHOW VIEW, TRIGGER, EXECUTE ON *.* FROM ‘readonly_user’@’192.168.10.%’;
  • REVOKE SUPER, REPLICATION CLIENT, REPLICATION SLAVE ON *.* FROM ‘readonly_user’@’192.168.10.%’;

这些权限一旦拥有,可能绕过只读限制(例如 SUPER 可修改 sql_log_bin 或 set session read_only=0)。

四、刷新权限并验证效果

执行后必须刷新才能生效:

FLUSH PRIVILEGES;

验证是否真正只读:

  • 用该用户连接:mysql -u readonly_user -p -h your_host
  • 执行 SELECT COUNT(*) FROM myapp_db.users; → 应成功
  • 执行 INSERT INTO myapp_db.users(name) VALUES('test'); → 应报错 ERROR 1142 (42000): INSERT command denied
  • 执行 SHOW GRANTS FOR CURRENT_USER; → 确认输出中只有 SELECT 行,无其他 DML/DCL 权限

不复杂但容易忽略。

text=ZqhQzanResources