前言为什么需要用户管理在数据库的实际应用中如果所有人都使用root超级管理员账号会存在巨大的安全隐患。想象一下你的数据库里有多个库比如mytest和msg你希望张三只能操作mytest李四只能操作msg。如果给他们root账户他们就能看到并操作所有的数据库这显然是不安全的。因此MySQL提供了完善的用户管理机制允许我们创建不同的用户并为他们分配特定的权限。一、用户1.1 用户信息MySQL 中所有的用户信息都统一存储在系统数据库 mysql的user 表中这个表包含了用户名、登录主机、加密密码、用户权限等核心信息。-- 切换到系统数据库mysql该库存储了MySQL的所有系统配置、用户信息 use mysql; -- 执行结果Database changed 表示切换数据库成功 -- 查询user表中的登录主机、用户名、加密密码字段 select host,user,authentication_string from user;USE mysql; 切换到名为mysql的系统数据库这里面存放着MySQL的元数据。SELECT host, user, authentication_string FROM user; 从user表中查询三个关键字段。host 允许用户从哪台主机登录。localhost表示只能从数据库服务器本机登录%表示可以从任何主机登录生产环境需谨慎。user 用户名。authentication_string 经过password函数加密后的密码字符串。1.2 创建用户创建用户是权限管理的第一步。使用CREATE USER语句。登录的主机名字/ip 不可以省略 此时便可以使用新账号新密码进行登陆啦创建用户时如果设置的密码过于简单比如 123456会触发 MySQL 的密码策略校验抛出如下报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements解决方法先查看当前 MySQL 的密码策略要求SHOW VARIABLES LIKE validate_password%;执行后会展示密码的长度要求、复杂度要求是否包含数字 / 字母 / 特殊字符等可根据需求修改密码策略或直接设置符合要求的复杂密码具体修改方法可参考 MySQL 官方文档或密码策略配置教程。重要注意事项不要轻易创建%的用户即允许从任意主机登录的用户会极大增加账号泄露的风险生产环境中建议指定具体的登录 IP / 主机。不要把MySQL端口号暴露在公网1. 暴力破解攻击最常见公网上的黑客 / 扫描器会全天候扫描 3306 端口对暴露的 MySQL 服务发起密码爆破用字典库尝试root/123456、admin/admin等弱密码一旦破解就能完全控制数据库弱口令检测哪怕你设置了普通复杂度的密码如123456a也可能被算力强的攻击者破解。✅ 后果数据库被篡改、删除核心数据用户信息、交易记录被盗取甚至被植入勒索病毒。2. 未授权访问 / 漏洞利用若 MySQL 配置不当比如开启skip-grant-tables、权限设置过宽攻击者可直接无密码登录公网暴露会让 MySQL 的已知漏洞如缓冲区溢出、权限绕过被精准利用哪怕你没及时升级补丁攻击者也能快速找到并入侵。3. 数据传输风险默认情况下MySQL 的数据传输是明文的除非开启 SSL/TLS公网传输时攻击者可通过抓包获取登录的账号密码查询的敏感数据如手机号、银行卡号、订单信息。1.3 删除用户1.4 修改用户密码密码是被加密后才被保存在数据库中自己改自己密码无需指定用户名登录对应用户后直接执行password(新密码)会自动对新密码进行加密。root用户修改指定用户的密码查询结果的字段会变成新的加密串说明密码修改成功此时 ZS 用户需使用新密码 123321登录。二、数据库的权限2.1 给用户授权新创建的用户是没有任何权限的他们甚至无法查看数据库列表。我们需要使用GRANT命令给他们授权。权限列表 可以是SELECT、INSERT、ALL等多个权限用逗号隔开。数据库名.对象名*.* 表示所有数据库中的所有对象。test.* 表示test数据库中的所有对象表、视图等。test.account 表示test数据库中的account表。权限适用上下文操作对象核心作用SELECT数据库、表查询表 / 库中的数据INSERT数据库、表向表中插入数据UPDATE数据库、表修改表中的数据DELETE数据库、表删除表中的数据CREATE数据库、表、索引创建数据库 / 表 / 索引DROP数据库、表删除数据库 / 表ALTER表修改表结构如添加 / 删除字段CREATE VIEW视图创建视图SHOW VIEW视图查看视图ALL PRIVILEGES所有对象拥有指定对象的全部操作权限FILE服务器主机文件访问服务器主机上的文件SHUTDOWN服务器管理关闭 MySQL 服务器权限的分配遵循最小权限原则—— 即只给用户分配完成工作所需的最少权限避免权限过大导致的安全风险。lisi 用户被创建了 但是并没有授权 所以有一些库就根本看不到授权后 可以对库和表进行相应的操作查询用户具备的权限 如果想确认某个用户拥有哪些权限使用如下语法show grants for 用户名主机名;-- 查看zs%的权限示例 show grants for zs%; -- 执行结果 -- GRANT USAGE ON *.* TO zs% USAGE表示无基础权限 -- GRANT ALL PRIVILEGES ON test.* TO zs% 拥有test库的全部权限 -- 查看root%的权限root超级用户 show grants for root%; -- 执行结果GRANT ALL PRIVILEGES ON *.* TO root% WITH GRANT OPTION -- WITH GRANT OPTION表示root用户可以给其他用户分配权限2.2 权限不生效的解决方法如果执行授权命令后用户的权限没有立即生效执行如下刷新权限的命令即可flush privileges;执行后 MySQL 会重新加载权限配置授权立即生效。2.3 回收权限当用户不再需要某部分权限时需要及时回收避免权限滥用。revoke 权限列表 on 库.对象名 from 用户名登陆位置;
MySQL【用户管理】
前言为什么需要用户管理在数据库的实际应用中如果所有人都使用root超级管理员账号会存在巨大的安全隐患。想象一下你的数据库里有多个库比如mytest和msg你希望张三只能操作mytest李四只能操作msg。如果给他们root账户他们就能看到并操作所有的数据库这显然是不安全的。因此MySQL提供了完善的用户管理机制允许我们创建不同的用户并为他们分配特定的权限。一、用户1.1 用户信息MySQL 中所有的用户信息都统一存储在系统数据库 mysql的user 表中这个表包含了用户名、登录主机、加密密码、用户权限等核心信息。-- 切换到系统数据库mysql该库存储了MySQL的所有系统配置、用户信息 use mysql; -- 执行结果Database changed 表示切换数据库成功 -- 查询user表中的登录主机、用户名、加密密码字段 select host,user,authentication_string from user;USE mysql; 切换到名为mysql的系统数据库这里面存放着MySQL的元数据。SELECT host, user, authentication_string FROM user; 从user表中查询三个关键字段。host 允许用户从哪台主机登录。localhost表示只能从数据库服务器本机登录%表示可以从任何主机登录生产环境需谨慎。user 用户名。authentication_string 经过password函数加密后的密码字符串。1.2 创建用户创建用户是权限管理的第一步。使用CREATE USER语句。登录的主机名字/ip 不可以省略 此时便可以使用新账号新密码进行登陆啦创建用户时如果设置的密码过于简单比如 123456会触发 MySQL 的密码策略校验抛出如下报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements解决方法先查看当前 MySQL 的密码策略要求SHOW VARIABLES LIKE validate_password%;执行后会展示密码的长度要求、复杂度要求是否包含数字 / 字母 / 特殊字符等可根据需求修改密码策略或直接设置符合要求的复杂密码具体修改方法可参考 MySQL 官方文档或密码策略配置教程。重要注意事项不要轻易创建%的用户即允许从任意主机登录的用户会极大增加账号泄露的风险生产环境中建议指定具体的登录 IP / 主机。不要把MySQL端口号暴露在公网1. 暴力破解攻击最常见公网上的黑客 / 扫描器会全天候扫描 3306 端口对暴露的 MySQL 服务发起密码爆破用字典库尝试root/123456、admin/admin等弱密码一旦破解就能完全控制数据库弱口令检测哪怕你设置了普通复杂度的密码如123456a也可能被算力强的攻击者破解。✅ 后果数据库被篡改、删除核心数据用户信息、交易记录被盗取甚至被植入勒索病毒。2. 未授权访问 / 漏洞利用若 MySQL 配置不当比如开启skip-grant-tables、权限设置过宽攻击者可直接无密码登录公网暴露会让 MySQL 的已知漏洞如缓冲区溢出、权限绕过被精准利用哪怕你没及时升级补丁攻击者也能快速找到并入侵。3. 数据传输风险默认情况下MySQL 的数据传输是明文的除非开启 SSL/TLS公网传输时攻击者可通过抓包获取登录的账号密码查询的敏感数据如手机号、银行卡号、订单信息。1.3 删除用户1.4 修改用户密码密码是被加密后才被保存在数据库中自己改自己密码无需指定用户名登录对应用户后直接执行password(新密码)会自动对新密码进行加密。root用户修改指定用户的密码查询结果的字段会变成新的加密串说明密码修改成功此时 ZS 用户需使用新密码 123321登录。二、数据库的权限2.1 给用户授权新创建的用户是没有任何权限的他们甚至无法查看数据库列表。我们需要使用GRANT命令给他们授权。权限列表 可以是SELECT、INSERT、ALL等多个权限用逗号隔开。数据库名.对象名*.* 表示所有数据库中的所有对象。test.* 表示test数据库中的所有对象表、视图等。test.account 表示test数据库中的account表。权限适用上下文操作对象核心作用SELECT数据库、表查询表 / 库中的数据INSERT数据库、表向表中插入数据UPDATE数据库、表修改表中的数据DELETE数据库、表删除表中的数据CREATE数据库、表、索引创建数据库 / 表 / 索引DROP数据库、表删除数据库 / 表ALTER表修改表结构如添加 / 删除字段CREATE VIEW视图创建视图SHOW VIEW视图查看视图ALL PRIVILEGES所有对象拥有指定对象的全部操作权限FILE服务器主机文件访问服务器主机上的文件SHUTDOWN服务器管理关闭 MySQL 服务器权限的分配遵循最小权限原则—— 即只给用户分配完成工作所需的最少权限避免权限过大导致的安全风险。lisi 用户被创建了 但是并没有授权 所以有一些库就根本看不到授权后 可以对库和表进行相应的操作查询用户具备的权限 如果想确认某个用户拥有哪些权限使用如下语法show grants for 用户名主机名;-- 查看zs%的权限示例 show grants for zs%; -- 执行结果 -- GRANT USAGE ON *.* TO zs% USAGE表示无基础权限 -- GRANT ALL PRIVILEGES ON test.* TO zs% 拥有test库的全部权限 -- 查看root%的权限root超级用户 show grants for root%; -- 执行结果GRANT ALL PRIVILEGES ON *.* TO root% WITH GRANT OPTION -- WITH GRANT OPTION表示root用户可以给其他用户分配权限2.2 权限不生效的解决方法如果执行授权命令后用户的权限没有立即生效执行如下刷新权限的命令即可flush privileges;执行后 MySQL 会重新加载权限配置授权立即生效。2.3 回收权限当用户不再需要某部分权限时需要及时回收避免权限滥用。revoke 权限列表 on 库.对象名 from 用户名登陆位置;