• 第6章——数据库的安全性


    维护MySQL数据库的安全性


    这一章的主要目的是:学习如何对MySQL中的用户进行操作。比如:创建用户、删除用户、修改密码等操作。

    一、添加MySQL的用户

      添加MySQL的用户也是非常重要的知识点!而创建用户的方法一共有三种,分别是使用Create User语句、Grant语句或Insert语句。

    1.1、Create User语句

    使用Create User语句添加MySQL用户的语法格式如下:

    Create User<用户名>@<主机名> | <IP地址>[Identified By[Password][<密码>]]
    
    • 1

    以上各参数说明如下:

    1. 用户名、主机名或IP地址、密码都需要使用半角单引号引起来;
    2. “主机名”也可以使用IP地址。如果是本机,则使用localhost,IP地址为“127.0.0.1”。如果对所有的主机开发权限,允许任何用户从远程主机登录服务器,那么这里可以使用通配符“%”,“%”表示一组主机;
    3. 字符“@”与前面的用户名之间及后面的主机名之间都不能有空格,否则用户创建不会成功;
    4. 如果两个用户具有相同的用户名但主机不同,则MySQL将视其为不同的用户,允许为这两个用户分配不同的权限(也就是说,只要主机名不同,那么就是不同的用户);
    5. 如果一个用户名或主机名包含特殊符号,则需要使用单引号将其引起来;
    6. “Identified By”关键字用于设置用户的密码,如果指定用户登录不需要密码,则可以省略改选项,此时,MySQL服务器使用内建的身份验证机制,用户登录时不用指定密码。如果需要创建指定密码的用户,则需要使用关键字“Identified By”指定明文密码值;
    7. 为了避免指定明文密码,如果知道密码的哈希值(也称为散列值),则可以通过使用关键字Password来设置密码。密码的哈希值是可以通过Password()函数获取的。如果密码只是一个普通字符串,则不使用哈希值设置密码,关键字Password可省略。

      使用“Create User”语句创建新用户时,必须拥有MySQL数据库的全局“Create User”的权限或“Insert”权限。如果添加的用户已存在,则会出现错误提示信息。注意:每添加一个MySQL用户,会在mysql.user数据表中添加一条新纪录,但是新创建的用户没有任何权限,需要对其进行授权操作。

    1.2、Grant语句

      Create User语句可以用来添加用户,通过该语句可以在user数据表中添加一条新的记录,但是Create User语句创建的新用户没有任何权限,还需要使用Grant语句赋予用户权限。而Grant语句不仅可以创建新用户,还可以在创建的同时对用户授权。Grant还可以指定用户的其他特点。使用Grant语句创建新用户时必须有Grant权限。Grant语句是添加新用户并授权它们访问MySQL服务器的首选方法,其语法格式如下:

    Grant <权限类型名称>On<表名>To<用户名>@<主机名>[Identified By<密码>]
    		[With Grant Option]
    //格式中的表名是指用户权限所作用的数据库中的表。如果需要对数据库中的所有表都授予,则可以使用“*”
    
    • 1
    • 2
    • 3

    以上各参数说明如下:

    1. “权限类型名称”指的是赋予新添加用户的权限;
    2. “Identified By”关键字用于设置密码,如果设置的密码为哈希值,则在密码处添加“Password”关键字;
    3. “With Grant Option”为可选项,表示对新添加的用户赋予Grant权限,即该用户可以对其他用户赋予权限;
    4. Grant语句不仅可以创建用户,还可以修改用户密码,也可以设置用户的权限。

    1.3、Insert语句

      使用Create User语句或者Grant语句添加新用户时,实际上都在user数据表中添加一条新纪录。因此,可以使用Insert语句直接将用户的信息添加到“mysql.user”数据表中,但必须拥有对“mysql.user”数据表的Insert权限,通常而言,Insert语句只能添加host、user、password这3个字段的值。其语法格式如下:

    Insert Into mysql.user(Host,User,Authentication_string)
    		Values(<主机名>,<用户名>,Password(<密码>));
    
    • 1
    • 2

    以上各参数说明如下:

    1. Host、User、Authentication_string分别表示user数据表中的主机字段名、用户字段名和密码字段;
    2. Password( )函数为密码加密函数。

    二、修改MySQL用户的名称

      使用“Rename User”语句可以对已有的MySQL用户进行重命名,修改MySQL用户名称的语法格式如下:

    Rename User<已有用户的用户名>To<新的用户名>;
    
    • 1

    使用该语句修改用户名时需要注意:

    1. 如果原有用户名不存在或者新的用户名已经存在,则重命名是不会成功,会出现如下的错误提示信息:

      ERROR 1396(HY000):Operation RENAME USER failed for'better'@'localhost'
      
      • 1
    2. 要使用“Rename User”语句,必须拥有全局“Rename User”权限和MySQL数据库Update权限;

    3. 一条“Rename User”语句可以同时对多个已存在的用户进行重命名。

    三、修改MySQL的root用户的密码

      在MySQL中,root用户拥有最高权限,因此必须保证root用户的密码安全。root用户可以通过多种方式来修改密码。

    3.1、使用mysqladmin命令

    使用mysqladmin命令修改root用户的密码的语法格式如下:

    mysqladmin  -u<已有用户名> -p password<新密码>;
    
    • 1

      其中,“password”为关键字,不是指旧密码,而是指新密码。新密码必须使用半角双引号括起来,使用半角单引号会出现错误。

    3.2、使用Set语句

      使用root用户登录到MySQL服务器后,可以使用Set语句修改密码,其语法格式如下:

    Set Password=PASSWORD(<新密码>);
    
    • 1

      新密码必须使用“PASSWORD”密码来加密,且新密码必须使用半角双引号引起来。为了使新密码生效,需要重新启动MySQL或者使用“Flush Privileges;”语句重新加载权限表。

    3.3、使用Update语句更新

      使用root用户登录到MySQL服务器后,可以使用Update语句来更新“mysql.user”数据表中的密码字段值,从而达到修改密码的目的。其语法格式如下:

    Update mysql.user Set Authentication_string = PASSWORD(<新密码>)
    					Where User="root" And Host="localhost";
    
    • 1
    • 2

      新密码必须使用PASSWORD( )函数加密,且使用半角双引号引起来。执行Update语句以后,为了使新密码生效,需要重新启动MySQL或者使用“Flush Privileges;”语句重新加载权限表。

    四、root用户修改普通用户的密码

    root用户拥有很高的权限,不仅可以修改其自身的密码,还可以修改其他普通用户的密码。

    4.1、使用Set语句修改

    使用root用户登录到MySQL服务器后,使用Set语句修改普通用户的密码的语法格式如下:

    Set Password For<用户名>@<主机名>=PASSWORD(<新密码>);
    //注意:新密码必须使用PASSWORD()函数来加密
    
    • 1
    • 2

    4.2、使用Update语句修改

      使用root用户登录到MySQL服务器后,使用Update语句修改mysql数据库的user数据表的密码字段值,从而修改普通用户的密码。其语法格式如下:

    Update mysql.user Set Authentication_string=PASSWORD(<新密码>)
    					Where User=<用户名> And Host=<主机名>;
    
    • 1
    • 2

      新密码必须使用PASSWORD()函数来加密,执行Update语句后,需要执行Flush Privileges语句重新加载用户权限。

    4.3、使用Grant语句修改

      使用root用户登录到MySQL服务器后,可以使用Grant语句修改普通用户的密码。其语法格式如下:

    Grant Usage On *.*To<用户名>@'localhost' Identified By<新密码>;
    
    • 1

      注意:通过Grant语句中的Usage权限,可以创建用户而不授予任何权限,即可将所有全局权限设为’N’。这里不需要使用PASSWORD()函数。

    4.4、修改普通用户的密码

      普通用户登录MySQL服务器后,可以通过Set语句设置自身的密码,其语法格式如下:

    Set Password=PASSWORD(<新密码>);
    //注意:新密码必须使用PASSWORD()函数来加密。
    
    • 1
    • 2

    五、删除普通用户

    5.1、使用Drop User语句

    使用Drop User语句删除普通用户的语法格式如下:

    Drop User<用户名>@<主机名>;
    
    • 1

    注意:

    1. 使用Drop User语句删除用户时,必须拥有MySQL数据库的“Drop User”的权限;
    2. 自然可以一次性删除多个用户,但是要注意各个用户之间要使用逗号分隔开;
    3. 如果删除的用户已经创建了数据表、索引或其他的数据库对象,则它们将继续保留,因为MySQL并没有关注哪一个用户创建了这些对象。

    5.2、使用Delete语句

      使用Delete语句可以直接删除用户的信息从“mysql.user”数据表中删除。其语法格式如下:

    Delete From mysql.user Where Host=<主机名> And User=<用户名>;
    
    • 1

    使用Delete语句所要注意的和使用Drop User语句是一样的。

    六、授予权限

      授予权限就是为用户赋予某些权限,这是非常重要的知识点。合理的授予能够保证数据库的安全,不合理的授权会使数据库存在安全隐患。在MySQL中使用“Grant”语句为用户授予权限,必须拥有Grant权限的用户才可以执行Grant语句。

    常见的MySQL的权限:

    权限层级可能设置的权限类型
    用户权限Create、Alter、Drop、Grant、Show Databases、Execute
    数据库权限Create Routine、Execute、Alter Routine、Grant
    数据表权限Select、Insert、Update、Delete、Create、Drop、Grant、References、Index、Alter
    字段权限Select、Insert、Update、References
    过程权限Execute、Alter Routine、Grant

    授予的权限层级及其语法格式如下:

    6.1、全局层级(用户层级)

      全局权限适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user数据表中。对于授予数据库权限的语句,也可以定义在用户权限上。例如:在用户层级上授予某用户“Create”权限,该用户可以创建一个新的数据库,也可以在所有数据库中创建数据表。授予用户全局权限语句的语法格式如下:

    Grant All|All Privileges On *.*;
    
    • 1

      MySQL授予用户权限时,在“Grant”语句中,On子句使用“* . *”表示所有数据库的所有数据表。除了可以授予数据库权限值之外,还可以授予Create User、Show Databases等权限。

    6.2、数据库层级

      数据库权限适用于一个给定数据库中的所有对象。这些权限存储在mysql.db和mysql.host数据表中。例如:在已有的数据库中创建数据表或删除数据表的权限。授予数据库权限语句的语法格式如下:

    Grant All|All Privileges|<权限类型> On *|<表名>.* To <用户名>@<主机名>;
    
    • 1

    其中,All或All Privileges表示授予全部权限,“*”表示当前数据库中的所有数据表,“<表名>. *”表示指定数据库中的所有数据表,“权限类型”可以为适用于数据库的所有权限名。

    6.3、数据表层级

    数据表权限适用于一个给定数据表中的所有字段。这些权限存储在mysql.tables_priv书籍表中。例如:使用“Insert Into”语句向数据表中插入记录的权限。授予数据表权限语句的语法格式如下:

    Grant All|All Privileges|<权限类型> On <数据库名>.<数据表名>|<视图名>
    	To <用户名>@<主机名>;
    
    • 1
    • 2

    注意:

    1. 权限类型表示授予的权限,如果想让该用户可以为其他用户授权,则可以在语句后加上With Grant Option关键字。如果在创建用户的时候不指定With Grant Option选项,则会导致该用户不能使用Grant命令创建用户或者给其他用户授权;
    2. 如果给数据表授权表层级所有类型的权限,则将“<权限类型>"改为“All”即可;
    3. 如果在“To”子句中使用“Identified By<新密码>”关键字给存在的用户指定新密码,则新密码将会覆盖用户原来定义的密码;
    4. 如果权限授予了一个不存在的用户,则MySQL会自动执行一条“Create User”语句来创建用户,但必须为该用户指定密码。

    6.4、字段层级

    字段权限适用于一个给定数据中的单一字段。这些权限存储在mysql.procs_priv数据表中。例如:使用“Update”语句更新数据表字段值的权限。授予数据表中字段权限语句的语法格式如下:

    Grant <权限类型>(字段名列表)On<数据库名>.<数据表名> To <用户名>@<主机名>;
    
    • 1

      对于字段权限,权限类型只能取Select、Insert、Update,并且权限名后需要加上字段名。

    6.5、过程层级

      过程权限适用于数据表中已有的存储过程和函数。这些权限存储在mysql.procs_priv数据表中。

    (1)授予指定用户对存储过程有操作权限的语法格式如下:

    Grant<权限类型>On Procedure<数据库名>.<存储过程名> To <用户名>@<主机名>;
    
    • 1

    (2)授予指定用户对已有函数有操作权限的语法格式如下:

    Grant<权限类型>On Function<数据库名>.<函数名> To <用户名>@<主机名>;
    
    • 1

    注意:授予过程权限时,权限类型只能取Execute、Alter Rountime、Grant。

    七、查看用户的权限信息

    7.1、使用Show Grant语句

    使用Show Grant语句查看用户权限信息的语法格式如下:

    Show Grant For'<用户名>'@'<主机名称>'|''
    
    • 1

      注意:使用该语句时,指定的用户名和主机名都要使用半角引号(单引号或双引号)引起来,并使用“@”符合将两个名称分隔开。

    7.2、使用Select语句

    使用Select语句查询mysql.user表中的用户权限的语法格式如下:

    Select <权限字段> From mysql.user[Where user='<用户名>' And Host='<主机名>'];
    
    • 1

      其中,权限字段指Select_priv、Insert_priv、Update_priv、Delete_priv、Create_priv、Drop_priv等字段。

    八、权限的转换和限制

      Grant语句的最后如果使用了With Grant Option子句,则表示To子句中指定的所有用户都有把自身所拥有的权限授予其他用户的权限,而不管其他用户是否拥有该权限,这就是权限的转换。

    With子句也可以对一个用户授予使用限制,其中,“Max_Queries_Per_Hour<次数>”表示每小时可以查询数据库的次数限制;“Max_Connections_Per_Hour<次数>”表示每小时可以连接数据库的次数限制;“Max_Update_Per_Hour<次数>”表示每小时可以修改数据库的次数限制;“Max_User_Per_Hour<次数>”表示同时连接MySQL的最大用户量。对于前三个字段,如果次数为0,则表示不起限制作用。

    其语法格式如下:

    Grant<权限类型名称> On <数据库名>.<表名> To <用户名>@<主机名>
    	With Grant Option;
    
    • 1
    • 2

    九、回收权限

      回收权限就是取消某个用户的某些权限,要从一个用户回收权限,但不从user数据表中删除用户,可以使用Revoke语句,该语句与Grant语句的语法格式类似,但具有相反的效果。要使用Revoke语句,用户必须拥有MySQL数据库的全局“Create User”权限和Update权限。

    回收指定权限语句的语法格式如下:

    Revoke <权限类型>[<字段列表>] On <数据库名>.<表名> From <用户名>@<主机名>;
    
    • 1

    回收全部权限的语法格式如下:

    Revoke All Privileges,Grant Option From <用户名>@<主机名>;
    
    • 1
  • 相关阅读:
    【算法题】得到K个半回文串的最小修改次数
    子查询与内联结分别应该怎么写?
    记一次 .NET某设备监控自动化系统 CPU爆高分析
    Vue的暗黑模式
    【奇思妙想】【节省磁盘空间】我有一些文件,我不想移动它们,但又想节省磁盘空间,该怎么做呢?
    目标检测算法
    @weakify 与 @strongify 实现原理
    Docker 部署 Geoserver
    多维时序 | MATLAB实现SSA-CNN-BiLSTM-Attention多变量时间序列预测(SE注意力机制)
    [Vulnhub] lazysysadmin
  • 原文地址:https://blog.csdn.net/weixin_49794837/article/details/126074590