简介
在专业的系统管理中,日常应用连接使用 root 用户会带来重大安全风险。如果攻击者通过 root 账户攻陷某个应用,就能完全控制服务器上的所有数据库。
最佳实践要求每个应用都使用自己的专用用户,并且只能访问属于该应用的专用数据库。
这相当于在操作系统层面分离应用身份。访问控制应当反映实际用途,而不只是图方便。
这也是你在 Linux 用户管理中学过的最小权限原则在数据库中的应用。如果某个应用账户被攻陷,受限的权限可以减小影响范围。
在本实验中,你将按照以下标准流程保护数据库环境:
- 为假设的应用创建一个新数据库。
- 为该应用创建专用用户账户。
- 只授予该用户访问其专用数据库的权限。
- 以新用户身份登录,验证配置是否正确。
创建新数据库
首先,你需要使用管理权限登录 MySQL 服务器,才能创建新数据库。
打开终端,运行以下命令进入 MySQL shell:
sudo mysql
注意:该命令通过系统套接字使用
sudo以 root 身份进行身份验证。如果系统提示输入你不知道的密码,请尝试使用mysql -u root -p。
看到 mysql> 提示符后,就可以执行 SQL 命令了。
此时,你是以数据库管理员用户身份连接的,因为创建数据库属于特权操作。普通应用账户通常没有这样的控制权限。
创建名为 app_db 的新数据库。该数据库将用于存放应用的数据。
CREATE DATABASE app_db;
如果操作成功,MySQL 会返回 Query OK。你可以列出所有数据库,确认该数据库是否存在:
SHOW DATABASES;
你应该能在列表中看到 app_db。
创建专用用户
现在已经有了数据库,接下来需要创建一个用于管理它的用户。我们将创建名为 app_user 的用户。
在同一个 MySQL shell 中执行以下命令:
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'password';
命令说明:
'app_user':用户名。'@'localhost':限制该用户只能从此服务器进行连接,这是一项安全措施。IDENTIFIED BY 'password':将密码设置为password。
此时,用户已经存在,但没有任何权限。该用户可以登录,但不能读取或写入数据。
这是一个值得理解的安全模型:身份和权限是相互独立的。创建账户并不会自动授予其使用所有数据库对象的权限。
你可以通过检查系统用户表来确认用户是否存在:
SELECT User, Host FROM mysql.user WHERE User = 'app_user';
授予权限
现在必须明确授予 app_user 使用 app_db 的权限。
我们要将 app_db 上的 ALL 权限授予该用户,包括读取、写入和修改表的权限。
在 MySQL shell 中运行以下命令:
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';
语法说明:
GRANT ALL PRIVILEGES:授予完整访问权限。ON app_db.*:将这些权限应用于app_db数据库以及其中的*(所有表)。TO 'app_user'@'localhost':指定获得这些权限的用户。
database.* 模式非常重要,因为权限可以限定作用范围。在 MySQL/MariaDB 中,可以授予全局权限、数据库级权限、表级权限,有时还可以进一步缩小范围。
这样可以确保 app_user 在 app_db 中拥有足够的操作权限,但在其他位置没有权限。
运行以下命令,确认权限已正确分配:
SHOW GRANTS FOR 'app_user'@'localhost';
验证用户访问权限
为了确保一切符合预期,我们将退出 root 账户,然后尝试以新用户身份登录。
首先退出 root 会话:
EXIT;
现在回到 Linux 终端,以 app_user 身份登录:
mysql -u app_user -p
系统提示输入密码时,输入 password。
登录后,检查你能看到哪些数据库:
SHOW DATABASES;
需要检查的内容:
- 你应该看到
app_db和information_schema。 - 你不应该看到
mysql或sys。
这表明权限设置正确:该用户只能看到获准访问的内容。
在访问控制中,验证步骤非常重要。仅执行 GRANT 语句还不够,你还应该确认系统最终呈现的访问范围符合预期的最小权限设计。
切换到你的数据库,完成本实验:
USE app_db;
EXIT;
总结
在本实验中,你成功实现了安全的数据库访问模型。你学习了如何:
- 创建新数据库(
app_db)。 - 创建专用用户(
app_user)。 - 使用
GRANT命令授予精确的权限。 - 验证访问控制是否按预期生效。
这种「最小权限」模型是数据库安全的基础,应当用于你部署的每个应用。



