Skip to content

安全管理

用户管理 / 权限授予与回收 / 密码安全

到目前为止,我们一直用 root 登录——root 是超级管理员,想干嘛干嘛。但实际项目中,不会所有人都用 root。

比如:

  • 实习生只要能查数据就行
  • 后端程序要能增删改查,但不能删表
  • DBA 要能管理所有表结构

这就需要对不同的人分权限

创建用户

sql
CREATE USER 'zhangsan'@'localhost' IDENTIFIED BY 'mypassword123';

拆开看:

  • 'zhangsan'@'localhost' — 用户名 + 从哪里登录。localhost 表示只能本机登录
  • IDENTIFIED BY 'mypassword123' — 设置密码
sql
-- 允许从任何机器远程登录
CREATE USER 'zhangsan'@'%' IDENTIFIED BY 'mypassword123';

-- 只允许从特定 IP 登录
CREATE USER 'zhangsan'@'192.168.1.100' IDENTIFIED BY 'mypassword123';

权限:GRANT 授权

新用户什么权限都没有。连登录都做不了什么——USE tutorial 也会被拒绝。

授予表级权限

sql
-- 让 zhangsan 能查 users 表
GRANT SELECT ON tutorial.users TO 'zhangsan'@'localhost';

-- 能查、能改、能删
GRANT SELECT, INSERT, UPDATE, DELETE ON tutorial.users TO 'zhangsan'@'localhost';

授予库级权限

sql
-- 对整个 tutorial 库有全部表的查询权限
GRANT SELECT ON tutorial.* TO 'zhangsan'@'localhost';

-- 对整个库有全部权限(但不能管理用户)
GRANT ALL PRIVILEGES ON tutorial.* TO 'zhangsan'@'localhost';

授予全局权限

sql
-- 超级管理员(和 root 一样)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;

WITH GRANT OPTION 允许他把自己的权限再授予别人。

常用权限速查

权限能干嘛
SELECT查数据
INSERT插入数据
UPDATE修改数据
DELETE删除数据
CREATE建表
ALTER改表结构
DROP删表
INDEX创建/删除索引
ALL PRIVILEGES以上全部

查看权限

sql
-- 看某个用户的权限
SHOW GRANTS FOR 'zhangsan'@'localhost';
+------------------------------------------------------------------------------+
| Grants for zhangsan@localhost                                                |
+------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `zhangsan`@`localhost`                                 |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `tutorial`.`users` TO ...            |
+------------------------------------------------------------------------------+

GRANT USAGE ON *.* 意思是"能登录,但没全局权限"——所有新用户默认都有这一条。

REVOKE:回收权限

sql
-- 收回删除权限
REVOKE DELETE ON tutorial.users FROM 'zhangsan'@'localhost';

-- 收回所有权限
REVOKE ALL PRIVILEGES ON tutorial.* FROM 'zhangsan'@'localhost';

回收的语法和 GRANT 一样,只是关键字从 GRANT ... TO 变成 REVOKE ... FROM

修改密码

改自己的密码

sql
ALTER USER 'zhangsan'@'localhost' IDENTIFIED BY 'newpassword456';

改别人的密码(需要管理员权限)

sql
SET PASSWORD FOR 'zhangsan'@'localhost' = 'newpassword456';

删除用户

sql
DROP USER 'zhangsan'@'localhost';

权限生效

GRANT 和 REVOKE 的改动会立即生效。但如果改了当前登录用户的权限,需要重新登录才能感受变化。

让权限立即生效:

sql
FLUSH PRIVILEGES;

💡 大多数情况下不需要手动 FLUSH——GRANT/REVOKE 会自动更新内存中的权限表。只有在直接操作 mysql.user 表时才需要。

安全管理的好习惯

  1. 不要所有人用 root — 应用连数据库用独立账号,只给必要的权限
  2. 最小权限原则 — 能用 SELECT 就别给 DELETE,能操作一张表就别给整个库
  3. 密码强度 — 别用 123456password
  4. 远程连接要注意 — 生产环境限制 @'%',只允许特定 IP
sql
-- 典型的应用账号:只对业务库有增删改查权限
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'strong_password_here';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app_user'@'192.168.1.%';

小结

安全管理的核心是分权限——不同的人做不同的事:

  1. CREATE USER 建用户 — 指定用户名、登录来源、密码
  2. GRANT 授权 — 可以精确到表级别甚至列级别
  3. REVOKE 回收 — 语法和 GRANT 一样,TOFROM
  4. 最小权限原则 — 能 SELECT 就别给 DELETE,能操作一张表就别给整个库
  5. 应用账号不要用 root — 生产环境给应用建独立账号,只给必须的权限

💡 权限管理是最后一道防线。一个误操作可能删库,但一个权限受限的账号最多删几行。

自主练习

  1. 创建一个新用户 test_user,只给 tutorial 库的 SELECT 权限
  2. SHOW GRANTS 查看 test_user 的权限
  3. 追加 INSERT 和 UPDATE 权限,再查看确认
  4. 回收 INSERT 权限,验证只能查不能插

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8