MySQL 用户与权限管理

MySQLBeginner
立即练习

介绍

在本实验中,我们将探索 MariaDB 中的用户管理和权限设置,这些是保护数据库系统安全的关键技能。你将学习如何创建和管理用户账户、分配适当的权限以及查看权限。通过动手练习,你将获得这些关键数据库安全操作的实践经验,并了解如何在 MariaDB 中实施基本的安全措施。这些知识对于任何数据库管理员来说都是确保适当访问控制和数据保护的基础。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 98%。获得了学习者 100% 的好评率。

创建和管理用户账户

首先,以 root 用户身份连接到 MySQL:

sudo mysql -u root

创建用户

让我们创建具有不同访问模式的用户:

-- 创建一个只能从 localhost 连接的用户
CREATE USER 'hr_user'@'localhost' IDENTIFIED BY 'hr123';

-- 创建一个可以从任何主机连接的用户
CREATE USER 'reports_user'@'%' IDENTIFIED BY 'reports123';

-- 创建一个没有密码的用户(不推荐用于生产环境)
CREATE USER 'intern'@'localhost';

@'localhost' 限制连接仅来自本地机器,而 @'%' 允许来自任何主机的连接。在生产环境中不推荐创建没有密码的用户。

要查看我们创建的用户:

SELECT User, Host FROM mysql.user;

预期输出显示系统中的所有用户:

+--------------+-----------+
| User         | Host      |
+--------------+-----------+
| reports_user | %         |
| hr_user      | localhost |
| intern       | localhost |
| mariadb.sys  | localhost |
| mysql        | localhost |
| root         | localhost |
+--------------+-----------+

管理现有用户

要修改现有用户:

-- 更改用户的密码
SET PASSWORD FOR 'intern'@'localhost' = PASSWORD('intern123');

-- 要求用户在下次登录时更改密码
ALTER USER 'hr_user'@'localhost' PASSWORD EXPIRE;

PASSWORD EXPIRE 选项强制用户在下次登录时更改密码——适用于临时密码。

要删除用户:

-- 删除用户
DROP USER 'reports_user'@'%';

删除用户后,验证用户列表是否已更新:

+-------------+-----------+
| User        | Host      |
+-------------+-----------+
| hr_user     | localhost |
| intern      | localhost |
| mariadb.sys | localhost |
| mysql       | localhost |
| root        | localhost |
+-------------+-----------+

分配权限

现在我们将学习分配不同类型的权限,以控制用户可以执行的操作。

基本权限管理

让我们为我们的 HR 用户授予一些基本权限:

-- 授予 company_db.employees 表的 SELECT 和 INSERT 权限
GRANT SELECT, INSERT ON company_db.employees TO 'hr_user'@'localhost';

-- 验证权限
SHOW GRANTS FOR 'hr_user'@'localhost';

GRANT 命令授予用户对特定数据库对象的特定权限(如 SELECT、INSERT)。SHOW GRANTS 命令显示当前权限。

预期输出:

+----------------------------------------------------------------------------------------------------------------+
| Grants for hr_user@localhost                                                                                   |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `hr_user`@`localhost` IDENTIFIED BY PASSWORD '*27DB7FC6D35D1F5E6A4C37473D9018DD46DC2944' |
| GRANT SELECT, INSERT ON `company_db`.`employees` TO `hr_user`@`localhost`                                      |
+----------------------------------------------------------------------------------------------------------------+

不同级别的权限

MariaDB 支持不同粒度的权限:

-- 全局权限(所有数据库)
GRANT CREATE USER ON *.* TO 'intern'@'localhost';

-- 数据库级别权限
GRANT ALL PRIVILEGES ON company_db.* TO 'hr_user'@'localhost';

-- 表级别权限
GRANT SELECT, UPDATE ON company_db.employees TO 'intern'@'localhost';

-- 列级别权限
GRANT SELECT (name, department), UPDATE (department)
ON company_db.employees TO 'intern'@'localhost';

*.* 语法表示所有数据库和表,而 database.* 表示特定数据库中的所有表。列级别权限允许细粒度的访问控制。

撤销权限

要移除权限:

-- 撤销特定权限
REVOKE INSERT ON company_db.employees FROM 'hr_user'@'localhost';

-- 撤销所有权限
REVOKE ALL PRIVILEGES ON company_db.employees FROM 'intern'@'localhost';

撤销权限后,始终使用 SHOW GRANTS 验证权限更改。

MariaDB [(none)]> SHOW GRANTS FOR 'hr_user'@'localhost';
+----------------------------------------------------------------------------------------------------------------+
| Grants for hr_user@localhost                                                                                   |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `hr_user`@`localhost` IDENTIFIED BY PASSWORD '*27DB7FC6D35D1F5E6A4C37473D9018DD46DC2944' |
| GRANT ALL PRIVILEGES ON `company_db`.* TO `hr_user`@`localhost`                                                |
| GRANT SELECT ON `company_db`.`employees` TO `hr_user`@`localhost`                                              |
+----------------------------------------------------------------------------------------------------------------+
MariaDB [(none)]> SHOW GRANTS FOR 'intern'@'localhost';
+---------------------------------------------------------------------------------------------------------------+
| Grants for intern@localhost                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `intern`@`localhost` IDENTIFIED BY PASSWORD '*A381F474A9DDCAA5BC97DAB83A69431B1C8D8902' |
+---------------------------------------------------------------------------------------------------------------+

总结

在本实验中,我们涵盖了 MariaDB 用户和权限管理的基本内容:

  1. 创建和管理具有不同连接限制的用户账户
  2. 在不同级别(全局、数据库、表、列)分配和撤销权限

这些技能对于保护你的 MariaDB 安装和实现适当的访问控制至关重要。理解用户管理和权限对于维护数据库安全以及确保用户对数据库资源具有适当的访问权限非常重要。