• MySQL学习笔记(24):权限与安全


    本文更新于2020-05-03,使用MySQL 5.7,操作系统为Deepin 15.4。

    权限

    权限存取需要用到mysql库中user、db、host、tables_priv、columns_prvi这几个权限表。列分为4个部分:用户列、权限列、安全列、资源控制列。权限列又分为普通权限和管理权限。

    表名 user db host 说明
    用户列 host host host
    用户列 user db db
    用户列 password user
    权限列 select_priv select_priv select_priv 查询记录
    权限列 insert_priv insert_priv insert_priv 插入记录
    权限列 update_priv insert_priv insert_priv 更新记录
    权限列 delete_priv delete_priv delete_priv 删除记录
    权限列 index_priv index_priv index_priv 维护索引
    权限列 alter_priv alter_priv alter_priv 修改数据库或表
    权限列 create_priv create_priv create_priv 创建数据库或表
    权限列 drop_priv drop_priv drop_priv 删除数据库或表
    权限列 grant_priv grant_priv grant_priv 授予权限
    权限列 create_view_priv create_view_priv create_view_priv 创建视图
    权限列 show_view_priv show_view_priv show_view_priv 展示视图
    权限列 create_routine_priv create_routine_priv 创建存储过程或函数
    权限列 alter_routine_priv alter_routine_priv 修改存储过程或函数
    权限列 references_priv references_priv references_priv ?
    权限列 reload_priv 重新加载MySQL
    权限列 shutdown_priv 关闭MySQL
    权限列 process_priv 查看所有线程
    权限列 file_priv 导出导入文件
    权限列 show_db_priv 展示所有库
    权限列 super_priv 超级权限
    权限列 create_tmp_table_priv create_tmp_table_priv create_tmp_table_priv 创建临时表
    权限列 lock_tables_priv lock_tables_priv lock_tables_priv 锁表
    权限列 execute_priv 执行存储过程或函数
    权限列 repl_slave_priv 与复制有关
    权限列 repl_client_priv 与复制有关
    安全列 ssl_type
    安全列 ssl_cipher
    安全列 x509_issuer
    安全列 x509_subject
    资源控制列 max_questions
    资源控制列 max_updates
    资源控制列 max_connections
    资源控制列 max_user_connections

    权限的存取有以下两个阶段:

    1. 先从user表的host、user和password字段判断是否通过身份验证。
    2. 按照以下权限表的顺序查看是否取得权限:user->db->tables_priv->columns_priv,如果有权限表相应的值为Y,则取得该权限。在这几个权限表中,权限范围依次递减,全局权限覆盖局部权限。

    安全

    操作系统相关的安全问题

    • 严格控制操作系统账号(通常为mysql)和权限。
    • 尽量避免以root(通常使用mysql)权限运行MySQL。
    • 防止DNS欺骗:创建账号时host可指定域名,但若域名对应的IP地址被恶意修改,则数据库就会被恶意的IP地址访问。

    数据库相关的安全问题

    • 删除匿名账号。
    • 给root账号设置密码。
    • 设置安全密码。使用密码有以下几种方式,也需注意安全问题:直接将密码写在命令行中;交互式输入密码;将账号和密码写在配置文件中,如写在/etc/my.cnf的client组中。
    • 只授予账号必需的权限。
    • 除root外,任何账号不应有mysql库user表的存取权限。
    • 不要把FILEPROCESSSUPER权限授予管理员以外的账号。
    • 注意LOAD DATA LOCAL从客户端本地读取文件带来的安全问题。
    • 使用MERGE存储引擎潜藏的安全漏洞:通过MERGE表还可以访问已被回收权限的子表。
    • DROP TABLE并不回收相关权限,导致重新创建同名表时,此前其他用户对此表的权限会自动赋予。
    • 使用SSL。
    • 如果可能,给所有用户加上访问host限制。
    • REVOKE的漏洞:在一个数据库上多次赋予权限,权限会自动合并;但是在多个数据库上多次赋予权限,每个数据库上都会认为是单独的一组权限,必须在此数据库上用REVOKE单独进行权限回收,而REVOKE ALL ON *.*并不会自动完成这个过程。

    数据库安全设置选项

    • --old-passwords:该参数只是为了支持4.1版本前的客户端,这将使得新建或修改的密码全部变成旧格式,降低了系统安全性。
    • --safe-user-create:使用户不能用GRANT创建新账号,除非用户有mysql.user表的INSERT权限。
    • --secure-auth:使4.1版本前的客户端无法进行用户认证,即使使用了--old-passwords也不行。
    • --skip-grant-tables:令服务器不使用权限系统。
    • --skip-networking:不允许TCP/IP连接,所有连接必须经命名管道(Named Pipes)、共享内存(Shared Memory)、UNIX套接字(Socket)文件进行。
    • --skip-show-database:使用该选项,只有赋予SHOW DATABASES权限的用户才能执行且显示所有库名;不使用该选项,则所有用户都能执行,但只显示有权限的库名。
  • 相关阅读:
    Kafka概述与部署
    理解微前端技术原理
    Docker之单机网络一
    MySQL Binlog解析
    MySQL之Xtrabackup
    MySQL之mysqldump
    学生成绩管理系统
    凯域课程表使用体验(软件名:上课了)
    动手动脑问题分析
    关于十天集训的收获
  • 原文地址:https://www.cnblogs.com/garvenc/p/mysql_learning_24_privilege_and_safety.html
Copyright © 2020-2023  润新知