首页 > 数据库 >28. 使用MySQL之安全管理

28. 使用MySQL之安全管理

时间:2024-11-17 23:33:58浏览次数:1  
标签:账号 访问 28 用户 安全 user MySQL 权限

1. 访问控制

MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。换句话说,用户不能对过多的数据具有
过多的访问权。

考虑以下内容:

  • 多数用户只需要对表进行读和写,但少数用户甚至需要能创建和删除表;

  • 某些用户需要读表,但可能不需要更新表;

  • 你可能想允许用户添加数据,但不允许他们删除数据;

  • 某些用户(管理员)可能需要处理用户账号的权限,但多数用户不需要;

  • 你可能想让用户通过存储过程访问数据,但不允许他们直接访问数据;

  • 你可能想根据用户登录的地点限制对某些功能的访问。

这些都只是例子,但有助于说明一个重要的事实,即你需要给用户提供他们所需的访问权,且仅提供他们所需的访问权。这就是所谓的访问控制,管理访问控制需要创建和管理用户账号。

我们知道,为了执行数据库操作,需要登录MySQL。MySQL创建一个名为root的用户账号,它对整个MySQL服务器具有完全的控制。,在对非现实的数据库试验MySQL时,使用root进行登录很好。不过在现实世界的日常工作中,决不能使用root。应该创建一系列的账号,有的用于管理,有的供用户使用,有的供开发人员使用,等等。

补充

  • 防止无意的错误:

    重要的是注意到,访问控制的目的不仅仅是防止用户的恶意企图。数据梦魇更为常见的是无意识错误的结果,如错打MySQL语句,在不合适的数据库中操作或其他一些用户错误。通过保证用户不能执行他们不应该执行的语句,访问控制有助于避免这些情况的发生。

  • 不要使用root:

    应该严肃对待root登录的使用。仅在绝对需要时使用它(或许在你不能登录其他管理账号时使用)。不应该在日常的MySQL操作中使用root。

2. 管理用户

MySQL用户账号和信息存储在名为mysql的MySQL数据库中。一般不需要直接访问mysql数据库和表(稍后会明白这一点),但有时需要直接访问。需要直接访问它的时机之一是在需要获得所有用户账号列表时。

为此,可使用以下代码:

use mysql;
select user from user;

输出如下:

img

mysql数据库有一个名为user的表,它包含所有用户账号。user表有一个名为user的列,它存储用户登录名。新安装的服务器可能只有一个用户,过去建立的服务器可能具有很多用户。

补充

  • 用多个客户机进行试验:

试验对用户账号和权限进行更改的最好办法是打开多个数据库客户机(如mysql命令行实用程序的多个副本),一个作为管理登录,其他作为被测试的用户登录。

2.1 创建用户账号

为了创建一个新用户账号,使用 CREATE USER 语句。

比如:

create user ben identified by 'p@$$w0rd';

CREATE USER创建一个新用户账号。在创建用户账号时不一定需要口令,不过这个例子用 IDENTIFIED BY 'p@$$wOrd' 给出了一个口令。

如果再次列出用户账号,将会在输出中看到新账号:

img

补充

  • 指定散列口令:

    IDENTIFIED BY指定的口令为纯文本,MySQL将在保存到user表之前对其进行加密。为了作为散列值指定口令,使用IDENTIFIED BY PASSWORD

    插句题外话

    对上面的话解释下:

    1. IDENTIFIED BY 用于指定密码:

    当使用 IDENTIFIED BY 'password' 时,password 是以纯文本的形式提供的密码。MySQL 会自动将这个密码进行加密(通常使用哈希算法),然后存储在 mysql.user 系统表的 authentication_string 列中。

    1. IDENTIFIED BY PASSWORD 用于直接指定加密后的哈希值:

    如果你使用 IDENTIFIED BY PASSWORD 'hash_value',你需要提供一个已经经过加密处理的密码(散列值)。MySQL 不会再对这个值进行加密,而是直接将其存储到 mysql.user 表中。

  • 使用GRANT或INSERT:

    GRANT语句(稍后介绍)也可以创建用户账号,但一般来说CREATE USER是最清楚和最简单的句子。此外,也可以通过直接插入行到user表来增加用户,不过为安全起见,一般不建议这样做。MySQL用来存储用户账号信息的表(以及表模式等)极为重要,对它们的任何毁坏都可能严重地伤害到MySQL服务器。因此,相对于直接处理来说,最好是用标记和函数来处理这些表。

为重新命名一个用户账号,使用RENAME USER语句,如下所示:

rename user ben to bforta;

发现发生改变:

img

补充

  • MySQL 5之前:

    仅MySQL 5或之后的版本支持RENAME USER。为了在以前的MySQL中重命名一个用户,可使用UPDATE直接更新user表。

2.2 删除用户账号

为了删除一个用户账号(以及相关的权限),使用 DROP USER 语句.

比如:

drop user bforta;

补充

  • MySQL 5之前:

    自MySQL 5以来,DROP USER删除用户账号和所有相关的账号权限。在MySQL 5以前,DROP USER只能用来删除用户账号,不能删除相关的权限。因此,如果使用旧版本的MySQL,需要先用REVOKE删除与账号相关的权限,然后
    再用DROP USER删除账号。

2.3 设置访问权限

在创建用户账号后,必须接着分配访问权限。新创建的用户账号没有访问权限。它们能登录MySQL,但不能看到数据,不能执行任何数据库操作。

为看到赋予用户账号的权限,使用 SHOW GRANTS FOR,如下所示:

show grants for bforta;

输出如下:

img

输出结果显示用户bforta有一个权限USAGE ON *.*。USAGE表示根本没有权限,所以,此结果表示在任意数据库和任意表上对任何东西没有权限。

补充

  • 用户定义为user@host:

    MySQL的权限用用户名和主机名结合定义。如果不指定主机名,则使用默认的主机名%(授予用户访问权限而不管主机名)。

为设置权限,使用GRANT语句。GRANT要求你至少给出以下信息:

  • 要授予的权限;

  • 被授予访问权限的数据库或表;

  • 用户名。

举例说明:

grant select on crashcourse.* to bforta;

此GRANT允许用户在 crashcourse.*(crashcourse数据库的所有表)上使用SELECT。通过只授予SELECT访问权限,用户bforta对crashcourse数据库中的所有数据具有只读访问权限。

SHOW GRANTS反映这个更改:

show grants for bforta;

输出如下:

img

每个GRANT添加(或更新)用户的一个权限。MySQL读取所有授权,并根据它们确定权限。

GRANT的反操作为REVOKE,用它来撤销特定的权限。

revoke select on crashcourse.* from bforta;

这条REVOKE语句取消刚赋予用户bforta的SELECT访问权限。被撤销的访问权限必须存在,否则会出错。

GRANT和REVOKE可在几个层次上控制访问权限:

  • 整个服务器,使用 GRANT ALL和REVOKE ALL

  • 整个数据库,使用 ON database.*

  • 特定的表,使用 ON database.table

  • 特定的列;

  • 特定的存储过程。

表28-1列出可以授予或撤销的每个权限。

img
img

使用GRANT和REVOKE,再结合表28-1中列出的权限,你能对用户可以
就你的宝贵数据做什么事情和不能做什么事情具有完全的控制。

补充

  • 未来的授权:

    在使用GRANT和REVOKE时,用户账号必须存在,但对所涉及的对象没有这个要求。这允许管理员在创建数据库和表之前设计和实现安全措施。这样做的副作用是,当某个数据库或表被删除时(用DROP语句),相关的访问权限仍然存在。而且,如果将来重新创建该数据库或表,这些权限仍然起作用。

  • 简化多次授权:

    可通过列出各权限并用逗号分隔,将多条GRANT语句串在一起,如下所示:

    grant select, insert on crashcourse.* to bforta;
    

2.4 更改口令

为了更改用户口令,可使用 SET PASSWORD 语句。新口令必须如下加密:

set password for bforta = password('n3w p@$$w0rd');

SET PASSWORD更新用户口令。新口令必须传递到Password()函数进行加密。

SET PASSWORD还可以用来设置你自己的口令:

set password = password('n3w p@$$w0rd');

在不指定用户名时,SET PASSWORD更新当前登录用户的口令。

标签:账号,访问,28,用户,安全,user,MySQL,权限
From: https://www.cnblogs.com/hisun9/p/18551382

相关文章

  • 一次性秘钥的语义安全性
    通过两个实验来定义语义安全性有一个试图攻击系统的敌人Adv.A。(类似于伪随机数生成器中的统计测试)有两个Challenger,非常相似,用0或1来区分。会做些什么呢?:(1)从秘钥空间K中随机选择秘钥k;(2)敌人会输出两条消息m......
  • 计算机毕业设计在线购物商城超市购物系统日用品商城小商品在线购买网站php+mysql+html
     一.功能介绍用户前台功能:前台主要包括网站首页、今日特卖、限时打折、商品中心、常见问题、我的购物车、登录、注册、商品详情,联系卖家,加入购物车、结算、个人中心等功能模块。今日特卖、限时打折、商品中心模块,用户可以查看全部商品信息,联系卖家、选择商品进行添加购物......
  • php毕业设计购物商城在线购物系统美食购物商城外卖系统点餐系统美食网站php+mysql+htm
    一,功能介绍        前台主要包括网站首页、商品推荐、最新商品、新闻咨询、商品分类、商品资讯、评论、登录、注册、加入购物车、结算、个人中心等功能模块商品推荐、最新商品在商品推荐、最新商品模块,用户可以查看全部商品信息,选择商品进行添加购物车等操作,购物......
  • Linux隐藏登录和清除历史命令以及其他相关安全操作示例
    隐藏登录ssh -T [email protected] /bin/bash -i 命令拆解-T:告诉ssh客户端,不要分配一个TTY(伪终端)root:连接用户xxx.xxx.xxx.xxx:连接的服务器ip地址/bin/bash:在远程服务器上启动一个交互式的Bashshell。效果如下,默认登录一个终端的时候,会有一个pts/0,但是这里已经......
  • 2024-2025-1 20241328 《计算机基础与程序设计》第八周学习总结
    2024-2025-120241328《计算机基础与程序设计》第八周学习总结作业信息课程2024-2025-1-计算机基础与程序设计作业要求2024-2025-1计算机基础与程序设计第八周作业作业目标功能设计与面向对象设计,面向对象设计过程,面向对象语言三要素,汇编、编译、解释、执行作......
  • 基于Java+SSM+JSP+MYSQL实现的宠物领养收养管理系统功能设计与实现六
    一、前言介绍:免费学习:猿来入此1.1项目摘要随着人们生活水平的提高,宠物已经成为越来越多家庭的重要成员。然而,宠物的数量增长也带来了一系列问题,如流浪宠物数量的增加、宠物健康管理的缺失以及宠物领养收养信息的不透明等。这些问题不仅影响了宠物的生存状况,也给社会带来了一定......
  • 基于Java+SSM+JSP+MYSQL实现的宠物领养收养管理系统功能设计与实现五
    一、前言介绍:免费学习:猿来入此1.1项目摘要随着人们生活水平的提高,宠物已经成为越来越多家庭的重要成员。然而,宠物的数量增长也带来了一系列问题,如流浪宠物数量的增加、宠物健康管理的缺失以及宠物领养收养信息的不透明等。这些问题不仅影响了宠物的生存状况,也给社会带来了一定......
  • HopToDesk 安全加密、免费开源,远程桌面新选择!
    远程桌面工具越来越成为现代工作生活的刚需。你是否还在为寻找一个既安全又免费的工具而苦恼?HopToDesk,一款支持安全加密、免费开源的远程桌面软件,或许正是你的不二之HopToDesk与传统的远程桌面工具相比有哪些独特优势?它如何满足开发者和普通用户的需求?为什么说它是远程桌面工......
  • 大虫刷题 题库总览 精准上新类目 运行3月 总通过量113位 包含数通 安全 云计算 存储及
    严格的审题模式大虫刷题所有科目,均采用严格审核,多期对照考试中心考试原题对比,原题覆盖率超85%以上,答案正确率在90%以上才正式上架小程序题库,并不定期更新题库,修订错误答案,从而确保刷题通过率。至目前为止,所有大虫客户,未曾有过一类挂科学员,且所有成绩均保持在800分以上。 题......
  • Python学习从0到1 day28 Python 高阶技巧 ⑥ Socket服务端开发
    我们终将上岸,阳光万里                        ——24.11.13一、Socketsocket(简称套接字)是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行。进程之间想要进行网络通信需要socket。Socket负责进程之间的网......