最值得拥有的Mysql安全配置指南

admin 2025年2月9日01:11:47评论6 views字数 10215阅读34分3秒阅读模式
随着鞭炮声的渐渐远去,我们迎来了新的一年。在这充满希望的时刻,我想向每一位辛勤工作的你们,致以最诚挚的新年问候和美好的祝愿。新年新气象,新征程新起点,让我们携手共进,为梦想而努力奋斗!
三沐数安持续分享更多有用的网络安全相关内容,还望新老粉丝持续关注,共同进步。
1. 前言
Mysql数据库安全配置、或者叫加固属于风险模型中的一环,它需要安全人员在理论和实践的学习中不断发现新的问题,并针对这些问题对数据的各个方面的配置进行强化。本文试图围绕着数据库风险识别、数据库安全加固这个问题,探讨可以采取的措施来最大程度的保证我们的数据库的安全控制处在一个较好的水平。 
最值得拥有的Mysql安全配置指南
2. Mysql账户权限安全
mysql中存在4个控制权限的表,分别为:
1. mysql.USER表2. mysql.DB表3. mysql.TABLES_PRIV表4. mysql.COLUMNS_PRIV表
要注意的是,Mysql中有一个数据库"information_schema",似乎里面保存的也是一些权限信息,但是要明白的是,这个数据库"information_schema"是为系统管理员提供元数据的一个简便方式,它实际上是一个视图,可以理解为对Mysql中的一个信息的封装,对于Mysql主程序来说,身份认证和授权的信息的来源只有一个,就是"mysql"。
1. mysql.USER表
select * from USER;desc USER;mysql> desc USER;+------------------------+-----------------------------------+------+-----+---------+-------+| Field                  | Type                              | Null | Key | Default | Extra |+------------------------+-----------------------------------+------+-----+---------+-------+| Host                   | char(60)                          | NO   | PRI |         |       || User                   | char(16)                          | NO   | PRI |         |       || Password               | char(41)                          | NO   |     |         |       || Select_priv            | enum('N','Y')                     | NO   |     | N       |       || Insert_priv            | enum('N','Y')                     | NO   |     | N       |       || Update_priv            | enum('N','Y')                     | NO   |     | N       |       || Delete_priv            | enum('N','Y')                     | NO   |     | N       |       || Create_priv            | enum('N','Y')                     | NO   |     | N       |       || Drop_priv              | enum('N','Y')                     | NO   |     | N       |       || Reload_priv            | enum('N','Y')                     | NO   |     | N       |       || Shutdown_priv          | enum('N','Y')                     | NO   |     | N       |       || Process_priv           | enum('N','Y')                     | NO   |     | N       |       || File_priv              | enum('N','Y')                     | NO   |     | N       |       || Grant_priv             | enum('N','Y')                     | NO   |     | N       |       || References_priv        | enum('N','Y')                     | NO   |     | N       |       || Index_priv             | enum('N','Y')                     | NO   |     | N       |       || Alter_priv             | enum('N','Y')                     | NO   |     | N       |       || Show_db_priv           | enum('N','Y')                     | NO   |     | N       |       || Super_priv             | enum('N','Y')                     | NO   |     | N       |       || Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N       |       || Lock_tables_priv       | enum('N','Y')                     | NO   |     | N       |       || Execute_priv           | enum('N','Y')                     | NO   |     | N       |       || Repl_slave_priv        | enum('N','Y')                     | NO   |     | N       |       || Repl_client_priv       | enum('N','Y')                     | NO   |     | N       |       || Create_view_priv       | enum('N','Y')                     | NO   |     | N       |       || Show_view_priv         | enum('N','Y')                     | NO   |     | N       |       || Create_routine_priv    | enum('N','Y')                     | NO   |     | N       |       || Alter_routine_priv     | enum('N','Y')                     | NO   |     | N       |       || Create_user_priv       | enum('N','Y')                     | NO   |     | N       |       || Event_priv             | enum('N','Y')                     | NO   |     | N       |       || Trigger_priv           | enum('N','Y')                     | NO   |     | N       |       || Create_tablespace_priv | enum('N','Y')                     | NO   |     | N       |       || ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       || ssl_cipher             | blob                              | NO   |     | NULL    |       || x509_issuer            | blob                              | NO   |     | NULL    |       || x509_subject           | blob                              | NO   |     | NULL    |       || max_questions          | int(11unsigned                  | NO   |     | 0       |       || max_updates            | int(11unsigned                  | NO   |     | 0       |       || max_connections        | int(11unsigned                  | NO   |     | 0       |       || max_user_connections   | int(11unsigned                  | NO   |     | 0       |       || plugin                 | char(64)                          | YES  |     |         |       || authentication_string  | text                              | YES  |     | NULL    |       || password_expired       | enum('N','Y')                     | NO   |     | N       |       |+------------------------+-----------------------------------+------+-----+---------+-------+
2. mysql.DB表
select * from DB;desc DB;mysql> desc DB; +-----------------------+---------------+------+-----+---------+-------+| Field                 | Type          | Null | Key | Default | Extra |+-----------------------+---------------+------+-----+---------+-------+| Host                  | char(60)      | NO   | PRI |         |       || Db                    | char(64)      | NO   | PRI |         |       || User                  | char(16)      | NO   | PRI |         |       || Select_priv           | enum('N','Y') | NO   |     | N       |       || Insert_priv           | enum('N','Y') | NO   |     | N       |       || Update_priv           | enum('N','Y') | NO   |     | N       |       || Delete_priv           | enum('N','Y') | NO   |     | N       |       || Create_priv           | enum('N','Y') | NO   |     | N       |       || Drop_priv             | enum('N','Y') | NO   |     | N       |       || Grant_priv            | enum('N','Y') | NO   |     | N       |       || References_priv       | enum('N','Y') | NO   |     | N       |       || Index_priv            | enum('N','Y') | NO   |     | N       |       || Alter_priv            | enum('N','Y') | NO   |     | N       |       || Create_tmp_table_priv | enum('N','Y') | NO   |     | N       |       || Lock_tables_priv      | enum('N','Y') | NO   |     | N       |       || Create_view_priv      | enum('N','Y') | NO   |     | N       |       || Show_view_priv        | enum('N','Y') | NO   |     | N       |       || Create_routine_priv   | enum('N','Y') | NO   |     | N       |       || Alter_routine_priv    | enum('N','Y') | NO   |     | N       |       || Execute_priv          | enum('N','Y') | NO   |     | N       |       || Event_priv            | enum('N','Y') | NO   |     | N       |       || Trigger_priv          | enum('N','Y') | NO   |     | N       |       |+-----------------------+---------------+------+-----+---------+-------+
3. mysql.TABLES_PRIV表
select * from TABLES_PRIV;desc TABLES_PRIV;mysql> desc TABLES_PRIV;  +-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+| Field       | Type                                                                                                                              | Null | Key | Default           | Extra                       |+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+| Host        | char(60)                                                                                                                          | NO   | PRI |                   |                             || Db          | char(64)                                                                                                                          | NO   | PRI |                   |                             || User        | char(16)                                                                                                                          | NO   | PRI |                   |                             || Table_name  | char(64)                                                                                                                          | NO   | PRI |                   |                             || Grantor     | char(77)                                                                                                                          | NO   | MUL |                   |                             || Timestamp   | timestamp                                                                                                                         | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP || Table_priv  | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') | NO   |     |                   |                             || Column_priv | set('Select','Insert','Update','References')                                                                                      | NO   |     |                   |                             |+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
4. mysql.COLUMNS_PRIV表
select * from COLUMNS_PRIV;desc COLUMNS_PRIV;mysql> desc COLUMNS_PRIV;  +-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+| Field       | Type                                         | Null | Key | Default           | Extra                       |+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+| Host        | char(60)                                     | NO   | PRI |                   |                             || Db          | char(64)                                     | NO   | PRI |                   |                             || User        | char(16)                                     | NO   | PRI |                   |                             || Table_name  | char(64)                                     | NO   | PRI |                   |                             || Column_name | char(64)                                     | NO   | PRI |                   |                             || Timestamp   | timestamp                                    | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP || Column_priv | set('Select','Insert','Update','References') | NO   |     |                   |                             |+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
以上是这4个表的基本结构,在我们进行数据库连接、登录的时候,mysql权限表的验证过程为:
1. 先从user表中的:1) Host2User3) Password3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。2. 通过身份认证后,进行权限分配,按照:1user2) db3) tables_priv4) columns_priv的顺序进行验证。即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db,tables_priv,columns_priv如果全局权限表user对应的权限为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。逐级下降
用流程图表示如下:
最值得拥有的Mysql安全配置指南
了解了Mysql的账户权限原理和判断流程,我们接下来需要了解就是应该以怎样的方式去进行权限配置,才能达到所谓的"最小权限原则"呢?Mysql的账户权限优先级顺序是:
user->db->tables_priv->columns_pri
稍作思考,我们可以发现,这些表的作用本质上是一样的,区别就在于它们的作用域范围不同,从user到columns_pri逐级作用域范围降低,因此控制粒度也增大,它们的配置遵循"就近原则",即以优先级最低的那个为准,所以,我们在进行Mysql的账户权限安全配置的时候会发现"我们似乎在做很多重复性的工作"。但我们要明白的,Mysql的这种逐层次的权限配置体系为我们提供了一个细粒度的控制方法。所以我们的权限配置也应该按照这个顺序来有规划。
1. USER表
权限 权限级别 权限说明 最佳安全实践: 网站使用账户是否给予
CREATE   数据库、表或索引 创建数据库、表或索引权限 建议给与,安装WEB系统时需要创建表
DROP   数据库或表 删除数据库或表权限 建议给与
GRANT OPTION 数据库、表或保存的程序 赋予权限选项 不建议给与
REFERENCES   数据库或表 不建议给与
ALTER     表 更改表,比如添加字段、索引等 建议给与
DELETE     表 删除数据权限 建议给与
INDEX     表 索引权限 建议给与
INSERT     表 插入权限 建议给与
SELECT     表 查询权限 建议给与
UPDATE     表 更新权限 建议给与
CREATE VIEW     视图 创建视图权限 建议给与
SHOW VIEW     视图 查看视图权限 建议给与
ALTER ROUTINE    存储过程 更改存储过程权限 不建议给与
CREATE ROUTINE    存储过程 创建存储过程权限 不建议给与
EXECUTE    存储过程 执行存储过程权限 不建议给与
FILE 服务器主机上的文件访问 文件访问权限 不建议给与,防止因为注入导致的隐私文件泄漏
CREATE TEMPORARY TABLES    服务器管理 创建临时表权限 不建议给与,防止借助临时表发动的二次注入
LOCK TABLES    服务器管理 锁表权限      不建议给与
CREATE USER    服务器管理 创建用户权限 不建议给与
PROCESS    服务器管理 查看进程权限 不建议给与
RELOAD    服务器管理 执行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的权限 不建议给与
REPLICATION CLIENT    服务器管理 复制权限      不建议给与
REPLICATION SLAVE      服务器管理 复制权限      不建议给与
SHOW DATABASES      服务器管理 查看数据库列表权限      不建议给与
SHUTDOWN    服务器管理 关闭数据库权限      不建议给与
SUPER    服务器管理 执行kill线程权限      不建议给与
从表格中可以看到,USER表主要针对数据库的账户进行粗粒度的权限控制,定义了"某人允许做什么事"。
2. DB表
权限 说明 网站使用账户是否给予
Select 可对其下所有表进行查询 建议给予
Insert 可对其下所有表进行插入 建议给予
Update 可对其下所有表进行更新 建议给予
Delete 可对其下所有表进行删除 建议给予
Create 可在此数据库下创建表或者索引 建议给予
Drop 可删除此数据库,及此数据库下的表 不建议给予
Grant 赋予权限选项 不建议给予
References 未来MySQL特性的占位符 不建议给予
Index 可对其下的所有表进行索引 建议给予
Alter 可对其下的所有表进行更改 建议给予
Create_tmp_table 创建临时表 不建议给予
Lock_tables 可对其下所有表进行锁定 不建议给予
Create_view 可在此数据下创建视图 建议给予
Show_view 可在此数据下查看视图 建议给予
Create_routine 可在此数据下创建存储过程 不建议给予
Alter_routine 可在此数据下更改存储过程 不建议给予
Execute 可在此数据下执行存储过程 不建议给予
Event 可在此数据下创建事件调度器 不建议给予
Trigger 可在此数据下创建触发器 不建议给予

原文始发于微信公众号(三沐数安):最值得拥有的Mysql安全配置指南,有用请打赏!

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月9日01:11:47
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   最值得拥有的Mysql安全配置指南https://cn-sec.com/archives/3714809.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息