文章目录

  • 1、MySQL的权限类型
  • 2、权限的授予和更改
  • 3、权限更改的生效时机
  • 4、常用权限
  • 4.1、常用权限
  • 4.2、常用权限操作示例
  • 5、强化安全机制
  • 6、总结


1、MySQL的权限类型

MySQL有两类权限:系统权限、对象权限:

  1. 系统权限:允许执行一些特定的功能,如关闭数据库、终止进程、显示数据库列表、查看当前执行的查询等。
  2. 对象权限:指对一些特殊的对象(表、列、视图、数据库)的访问权限,例如是否允许访问某张表,是否允许在某个库中创建表。

2、权限的授予和更改

  1. 一般不允许直接更改MySQL的权限表,而是通过GRANT和REVOKE语句进行权限的赋予和收回。GRANT和REVOKE语句允许系统管理员创建MySQL用户账户、授予权限和撤销权限。授予的权限可以分为多个级别:服务器级(全局)、数据库级、表级、列级、子程序级。撤销权限即回收已经存在的权限。 GRANT和REVOKE的基本语法如下所示。
GRANT [privileges] ON [objects] TO [user]
GRANT [privileges] ON [objects] TO [user] IDENTIFIED BY [password]
REVOKE [privileges] ON [objects] FROM [user]
  1. MySQL允许对不存在的数据库目标授予权限。这个特性是特意设计的,目的是允许数据库管理员为将在此后被创建的数据库目标预留用户账户和权限。
  2. 当在GRANT语句中指定数据库名称时,允许使用“”和“%”通配符。这意味着,如果想要使用“”字符作为一个数据库名称的一部分,则应该在GRANT语句中指定它为“_”,例如,"GRANT…ON‘foo\_bar’.*TO…"
  3. MySQL用户主机字符串通配符“%”不包括“localhost”。“localhost”和IP地址“127.0.0.1”并不等同,如果使用“mysql -uroot-h localhost”,则默认会去连接socket文件。如果我们要连接TCP端口,正确的写法应该是“mysql -uroot-h 127.0.0.1”。
  4. 不要采取给相同的用户名(但来自于不同的主机)赋予不同权限的方式。这样很容易造成混淆,导致维护的困难,可以另外创建单独的账号。
  1. SHOW TABLES命令不会显示用户没有权限访问的表。

3、权限更改的生效时机

  1. 当mysqld启动时,所有授权表的内容将被读进内存并且从此时开始生效。
  2. 安装完MySQL之后,一定要移除匿名账号和空密码账号。
  3. 当权限变更时:
  1. 表和列的权限在客户端的下一次请求时生效。
  2. 数据库的权限改变在下一个USE db_name命令生效。
  3. 全局权限的改变和密码改变在下一次客户端连接时生效。
  4. 如果使用GRANT、REVOKE或SET PASSWORD命令对授权表进行修改,那么服务器会注意到更改并立即将授权表重新载入内存。
  5. 如果手动地修改授权表(使用INSERT、UPDATE或DELETE等),则应该执行mysqladmin f lush-privi leges或mysqladmin reload告诉服务器再重新装载授权表,否则手动的更改将不会生效,除非重启服务器。

4、常用权限

4.1、常用权限

SHOW PRIVILEGES命令可以显示MySQL所支持的权限,可以阅读官方文档来进一步了解具体的权限。如下是一些常用的权限。

如何查看mysql root的权限_mysql

4.2、常用权限操作示例

  1. 显示某个用户的权限
SHOW GRANTS FOR username@'ip_range';
  1. 赋予某个用户对库db1进行SELECT、INSERT、UPDATE和DELETE的权限的命令
GRANT SELECT,INSERT,UPDATE,DELETE ON db1.* TO username@'10.%' IDENTIFIED BY 'your_password';
  1. 赋予备份整个实例的权限
GRANT LOCK TABLES,RELOAD,SUPER,SELECT,SHOW VIEW,TRIGGER,PROCESS ON *.* TO backup@localhost IDENTIFIED BY 'xxxxxx';
  1. 赋予远程备份各个库的权限
GRANT LOCK TABLES,SELECT,RELOAD,SHOW VIEW,trigger ON *.* TO backup@'10.10.10.10' IDENTIFIED BY 'xxxxxx';
  1. 修改用户密码方式一:
mysql>SET PASSWORD FOR user@'ip_range' = PASSWORD('some password');
  1. 修改用户密码方式二:
# 使用GRANT命令重新赋予用户连接密码。
mysql>GRANT USAGE ON *.* TO user@'ip_range' IDENTIFIED BY 'some password';

7 修改用户密码方式三:使用如下命令直接修改系统表,以修改用户密码

shell> mysql -u root
mysql> UPDATE mysql.user SET PASSWORD=PASSWORD('newpwd')  WHERE user='root';
mysql> FLUSH PRIVILEGES;
  1. 配置复制时,复制用户需要REPLICATION SLAVE权限,查看复制状态需要REPLICATIONCLIENT权限。

5、强化安全机制

  • 内网部署:一般将所有数据库都部署于内网(仅监听内网IP),需要慎重对待跨IDC的数据库同步,MySQL自身并没有很好的方式加密数据传输。
  • 防火墙:开放外网访问的MySQL服务器,需要有相应的访问控制策略,例如通过部署防火墙来限制来源IP。
  • 不要让任何人(除了root账户)访问MySQL数据库中的mysql系统库!
  • 用GRANT和REVOKE语句来控制对MySQL的访问。不要授予超过需求的权限。绝对不能为所有主机授权。不要给程序账号授予SUPER权限。
  • 生产库上不要留研发人员的账号。
  • 隔离生产环境、开发环境和测试环境,不允许研发、测试人员有权限更改生产环境或知道生产环境的账号密码。
  • 初始安装后应该移除匿名和空密码账号。
  • 数据库不保存明文密码:不要将纯文本密码保存到数据库中,不要从字典中选择密码。
  • 避免SQL注入:不要信任应用程序的用户输入的任何数据。
  • 不要向非管理用户授予FILE权限:拥有FILE权限的任何用户都能在拥有mysqld守护进程权限的文件系统里非法写入或读取文件。

6、总结

  1. MySQL的权限分为系统权限(如启停数据库)和对象权限(数据库、表、视图、触发器等)两类。分为服务器、数据库、表、列、子程序几级。
  2. 用GRANT授予权限,用REVOKE收回权限。GRANT、REVOKE或SET PASSWORD命令执行后,权限会立即生效。
  3. 数据库务必内网部署,端口尽量只在内网开放,GRANT授权只授予需要的最小权限,对外网开放要部署防火墙。隔离生产、开发和测试环境,不许研发、测试人员有权更改生产环境。