本文目录导读:

为应用程序单独创建数据库用户是保障安全的最佳实践,可以遵循 最小权限原则(只给应用必需的操作权限)。
具体操作取决于你使用的数据库类型,以下是主流数据库(MySQL、PostgreSQL、SQL Server)的标准操作步骤:
MySQL / MariaDB
核心思想: 创建一个用户,并只授予其操作特定数据库的权限,禁止访问其他库。
-- 1. 连接到MySQL(使用root账号) mysql -u root -p -- 2. 创建用户(指定密码) -- 格式: CREATE USER '用户名'@'访问来源' IDENTIFIED BY '强密码'; -- 'localhost' 表示只能从本机连接(推荐) -- '%' 表示可从任何IP连接(危险,仅开发环境使用) CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'YourStrong!Pass123'; -- 如果应用服务器和数据库不在同一台机器,用:CREATE USER 'app_user'@'192.168.1.%' ... (限制网段) -- 3. 创建专属数据库(如果还没有) CREATE DATABASE `my_app_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 4. 授予该用户对该数据库的所有权限 GRANT ALL PRIVILEGES ON `my_app_db`.* TO 'app_user'@'localhost'; -- 如果想更严格,只给 SELECT, INSERT, UPDATE, DELETE,替换为: -- GRANT SELECT, INSERT, UPDATE, DELETE ON `my_app_db`.* TO 'app_user'@'localhost'; -- 5. 刷新权限(使新设置生效) FLUSH PRIVILEGES; -- 6. 验证(可选) SHOW GRANTS FOR 'app_user'@'localhost';
注意事项:
- 不要给
app_user授予GRANT OPTION,否则该用户可以创建其他用户,破坏权限控制。 - 禁止 使用
GRANT ALL ON *.*(对所有库有权限)。
PostgreSQL
核心思想: 用户(角色)需要拥有数据库的 CONNECT 权限和 Schema 下表的 USAGE 及数据操作权限。
-- 1. 连接到PostgreSQL(使用超级管理员postgres) psql -U postgres -- 2. 创建专属数据库 CREATE DATABASE my_app_db; -- 3. 创建用户(角色)并设置密码 CREATE USER app_user WITH PASSWORD 'YourStrong!Pass123'; -- 4. 授予该用户连接数据库的权限 GRANT CONNECT ON DATABASE my_app_db TO app_user; -- 5. 切换到新数据库(给Schema授权) \c my_app_db -- 6. 授予该用户在 public schema(默认)下创建对象和执行操作的权限 -- 注意:如果只是使用表(不创建表),用下面这种: GRANT USAGE ON SCHEMA public TO app_user; --允许访问Schema GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user; --对现有表授权 -- 7. (重要)让用户在未来新建的表上也有相同权限(自动继承) ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_user; -- 8. 如果应用需要执行存储过程或函数,还需要: GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO app_user;
PostgreSQL 特别注意:
- PostgreSQL 权限系统比 MySQL 更精细,需要在 库 和 Schema 两个层级授权。
- 很多常见错误(
permission denied for schema public)就是因为没有执行GRANT USAGE ON SCHEMA。
SQL Server
核心思想: 创建登录名(Login)→ 映射到数据库用户(User)→ 授予数据库角色。
-- 1. 连接到SQL Server(使用sa或管理员) USE [master]; GO -- 2. 创建登录名(服务器级别) CREATE LOGIN [app_login] WITH PASSWORD = N'YourStrong!Pass123'; -- 可以指定默认数据库: -- CREATE LOGIN [app_login] WITH PASSWORD=N'...', DEFAULT_DATABASE=[my_app_db]; GO -- 3. 切换到要操作的数据库 USE [my_app_db]; GO -- 4. 为登录名创建数据库用户(映射) CREATE USER [app_user] FOR LOGIN [app_login]; GO -- 5. 授予数据库角色(推荐使用db_datareader + db_datawriter) -- 组合这两个角色相当于授予 SELECT, INSERT, UPDATE, DELETE ALTER ROLE [db_datareader] ADD MEMBER [app_user]; ALTER ROLE [db_datawriter] ADD MEMBER [app_user]; -- 如果需要执行存储过程,再加:ALTER ROLE [db_ddladmin] ADD MEMBER [app_user]; (谨慎) GO -- 6. (可选)如果应用仅操作特定Schema -- GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::[dbo] TO [app_user];
通用原则与安全建议
-
最小权限:
- 只授予
SELECT,INSERT,UPDATE,DELETE,不要 随意给DROP,ALTER,CREATE,TRUNCATE,除非应用确实需要动态创建表。 - 如果应用只读(如报表),只给
SELECT。
- 只授予
-
强密码:
- 密码至少16位,包含大小写字母、数字、特殊字符。
- 不要使用
password123、admin等。 - 如果数据库支持,使用
密码策略(如强制复杂密码)。
-
网络隔离:
- 将用户的主机来源限制为应用服务器 IP(如
168.1.10),避免来自外网任意 IP 的连接。 - 不要 使用 (MySQL)或
0.0.0/0允许所有IP。
- 将用户的主机来源限制为应用服务器 IP(如
-
避开 root / sa / postgres:
永远不要让应用程序代码直接使用数据库超级管理员账号,一旦代码被注入,攻击者可以删库跑路。
-
定期轮换:
定期(如每90天)更换应用数据库用户的密码,并更新配置文件。
一条清晰的脚本模板(以 MySQL 为例)
#!/bin/bash
# 创建应用用户的脚本(安全版)
DB_NAME="myapp_production"
DB_USER="myapp_user"
DB_PASS=$(openssl rand -base64 32) # 生成随机强密码
APP_SERVER_IP="192.168.1.50" # 替换为应用服务器真实IP
cat <<SQL | mysql -u root -p
CREATE DATABASE IF NOT EXISTS \`${DB_NAME}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '${DB_USER}'@'${APP_SERVER_IP}' IDENTIFIED BY '${DB_PASS}';
GRANT SELECT, INSERT, UPDATE, DELETE ON \`${DB_NAME}\`.* TO '${DB_USER}'@'${APP_SERVER_IP}';
FLUSH PRIVILEGES;
SQL
echo "用户创建成功!密码: ${DB_PASS}"
最后一步:将生成的密码安全地存入应用配置文件(如 .env 文件,且应设置文件权限为 600),千万不要硬编码在代码仓库中。