如何配置服务器数据库权限?服务器权限设置最佳实践
- 互联网
- 2026-02-09
- 4657
核心配置步骤
登录数据库服务器
# MySQL/MariaDB mysql -u root -p # PostgreSQL sudo -u postgres psql # MongoDB mongo --username admin --password --authenticationDatabase admin
创建专用数据库用户(避免使用 root)
-- MySQL CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPassword123!'; -- PostgreSQL CREATE USER app_user WITH PASSWORD 'StrongPassword123!'; -- MongoDB use admin db.createUser({user: "app_user", pwd: "StrongPassword123!", roles: []})
创建数据库并授权
-- MySQL CREATE DATABASE app_db; GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'%'; -- PostgreSQL CREATE DATABASE app_db; GRANT CONNECT ON DATABASE app_db TO app_user; c app_db GRANT USAGE ON SCHEMA public TO app_user; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user; -- MongoDB use app_db db.grantRolesToUser("app_user", [{role: "readWrite", db: "app_db"}])
刷新权限
-- MySQL FLUSH PRIVILEGES; -- PostgreSQL (无需刷新) -- MongoDB (立即生效)
验证权限
-- MySQL SHOW GRANTS FOR 'app_user'@'%'; -- PostgreSQL du app_user -- MongoDB db.getUser("app_user")
关键安全实践
-
最小权限原则

- 只授予必要权限(如 SELECT/INSERT),避免 ALL PRIVILEGES。
- 示例:拒绝删表权限 -- MySQL REVOKE DROP ON app_db.* FROM 'app_user'@'%';
-
访问来源限制
- 绑定用户 IP(替换 为具体 IP): -- MySQL CREATE USER 'app_user'@'192.168.1.100' IDENTIFIED BY 'password';
-
加密连接

- 强制使用 SSL/TLS(MySQL): ALTER USER 'app_user'@'%' REQUIRE SSL;
-
定期审计
- 检查异常登录: # MySQL SELECT * FROM mysql.general_log WHERE command_type = 'Connect';
防火墙配置
仅允许特定 IP 访问数据库端口:
# MySQL (3306) sudo ufw allow from 192.168.1.100 to any port 3306 # PostgreSQL (5432) sudo ufw allow from 192.168.1.100 to any port 5432 # MongoDB (27017) sudo ufw allow from 192.168.1.100 to any port 27017
不同场景权限示例
| 场景 | MySQL 权限命令 | PostgreSQL 权限命令 |
|---|---|---|
| 只读用户 | GRANT SELECT ON db.* TO 'user'@'%'; | GRANT SELECT ON ALL TABLES TO user; |
| 读写用户 | GRANT SELECT, INSERT, UPDATE, DELETE ... | GRANT SELECT, INSERT, UPDATE, DELETE... |
| 禁止删除数据 | REVOKE DELETE ON db.* FROM 'user'@'%'; | REVOKE DELETE ON ALL TABLES FROM user; |
故障排查
- 连接被拒绝
- 检查防火墙、数据库绑定 IP(bind-address 是否设为 0.0.0)。
- 权限不生效
- 确保执行 FLUSH PRIVILEGES;(MySQL)。
- 用户无法访问表
- PostgreSQL 需额外授权 Schema: GRANT USAGE ON SCHEMA public TO user;
重要提示:生产环境操作前务必备份数据!使用强密码并定期轮换。
