如何快速为所有数据库授予只读权限_全局SELECT的一键配置

小敏大大_3564

小敏大大_3564

2026-04-13

230人浏览

原创

mysql 8.0+ 推荐用 create role 统一管理只读权限,避免漏库、权限漂移;postgresql 需结合 schema 权限与 default privileges,并严格过滤系统库和敏感函数。

mysql 8.0+ 中用 create role 统一管理只读权限

直接建角色比逐库 grant select 更可靠,避免漏库、权限漂移或误加写权限。mysql 8.0 开始支持角色(role),这是唯一能真正“全局”控制只读访问的机制。

常见错误是给用户直接 GRANT SELECT ON *.* —— 这会暴露 information_schema、performance_schema 等系统库,且无法限制未来新建库的访问。角色天然隔离作用域,后续只需 GRANT role_name TO user 即可生效。

  • CREATE ROLE 'readonly_role';
  • GRANT SELECT ON `myapp\_%`.* TO 'readonly_role';(用前缀匹配业务库,如 myapp_prod、myapp_staging)
  • 不显式授权 mysql、sys 等系统库,角色默认无权访问
  • 执行 SET DEFAULT ROLE 'readonly_role' TO 'app_user'@'%'; 让用户自动继承权限

PostgreSQL 里用 DEFAULT PRIVILEGES 捕获新表,但库级仍需手动处理

PostgreSQL 没有“库级角色”,GRANT SELECT ON DATABASE 实际无效——它只允许连接,不赋予任何表访问权。真正起效的是对 schema 的权限,以及对现有/未来表的默认权限设置。

容易踩的坑:只运行 GRANT SELECT ON ALL TABLES IN SCHEMA public,却忘了新创建的表默认无权限,应用一写新表就报 permission denied for table xxx。

  • 先 GRANT CONNECT ON DATABASE mydb TO readonly_group;
  • 再 GRANT USAGE ON SCHEMA public TO readonly_group;
  • 对已有表:GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_group;
  • 对后续新建表:ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly_group;
  • 如果业务用多个 schema(如 analytics、logs),每 schema 都要重复上述三步

权限同步脚本必须排除系统库和临时库

无论用 MySQL 还是 PostgreSQL,写自动化脚本批量授只读权时,最常出问题的是没过滤掉不该碰的库。比如 MySQL 的 sys 库含敏感视图,PostgreSQL 的 pg_catalog 被误授 SELECT 后,攻击者能枚举所有用户密码哈希(pg_authid)。

另一个隐形雷区是测试库命名不规范,比如叫 test、tmp_xxx 或带数字后缀(app_v2),正则或 LIKE 匹配时一并扫进去了。

  • MySQL 排除列表:WHERE schema_name NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')
  • PostgreSQL 排除条件:AND datname NOT IN ('postgres', 'template0', 'template1'),且跳过 pg_ 开头的 schema
  • 建议用白名单:只对明确以 prod_、core_ 等前缀开头的库操作,比黑名单更安全

只读 ≠ 安全,SELECT 可能触发函数或泄露元数据

很多团队以为加了 SELECT 就万事大吉,但实际中 SELECT 权限可能被绕过或放大。例如 MySQL 的 LOAD_FILE() 函数不需要额外权限,只要用户能查到含路径的字段,就能读取服务器任意文件;PostgreSQL 的 pg_read_file() 同理,且 SELECT 权限配合 pg_stat_activity 可看到其他用户正在执行的 SQL。

真正可控的只读,必须叠加函数禁用和视图封装。

  • MySQL:启动时加 --secure-file-priv="" 并禁用 LOCAL INFILE,或在账号级 REVOKE FILE ON *.* FROM 'user'
  • PostgreSQL:用 REVOKE EXECUTE ON FUNCTION pg_read_file(text, bigint, bigint) FROM readonly_group;
  • 敏感字段(如密码重置 token、密钥)不要裸表暴露,应通过只读视图过滤列

权限不是设完就稳了,尤其当数据库版本升级、新函数加入或业务加了 UDF,得定期 audit SHOW GRANTS 和 \z 输出。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3009

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2268

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1200

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1158

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1336

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2098

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3320

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

14875

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习