MySQL 用户最佳实践:按站分离、改密码、改授权、限制 IP

一台服务器上跑着好几个站,图省事全用 root 连库——这是最常见的做法,也是出事时代价最大的做法。本文讲怎么把数据库账号按站拆开、怎么安全地改密码和授权、怎么把账号锁到指定来源 IP,以及几个容易被忽略的配套问题。 文中场景与配置均已脱敏。 一、为什么要按站分离 假设一台机器上跑两个站:一个商城前台,一个用 WordPress 做的收单页。两个站各有各的库。 如果两个站都用 root 连库,那么任何一个站被打穿,攻击者拿到的就是整台机器上所有库的完全控制权——包括另一个站的订单、用户、支付记录。一个不起眼的插件漏洞,赔上的是全部数据。 正确做法是一站一账号,每个账号只授权自己那个库: CREATE USER 'shop_app'@'%' IDENTIFIED BY '强密码'; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON `shop`.* TO 'shop_app'@'%'; CREATE USER 'wp_app'@'%' IDENTIFIED BY '另一个强密码'; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `wordpress`.* TO 'wp_app'@'%'; FLUSH PRIVILEGES; 这样 WordPress 那个站即使被完全控制,攻击者在数据库层面也只能看到 wordpress 库,商城的数据碰不到。 权限给到什么程度 Web 应用需要的其实就两类: 数据操作:SELECT INSERT UPDATE DELETE——日常读写 结构操作:CREATE DROP INDEX ALTER——迁移(migration)要用 CREATE TEMPORARY TABLES 和 LOCK TABLES 按框架需要给。剩下的一律不给,尤其这几个: 权限 作用 为什么不给 EVENT 数据库定时任务 应用调度一般在系统层(cron / systemd timer),用不上;给了等于让攻击者能植入定时后门 TRIGGER 触发器 业务逻辑写在应用里的项目用不到;给了能悄悄篡改写入的数据 EXECUTE 存储过程 同上 FILE 读写服务器文件 绝对不能给,能直接读 /etc/passwd、写 webshell GRANT OPTION 给别人授权 给了等于账号能自我提权 二、账号分离不等于安全 账号按上面的方式拆开之后,看起来隔离已经做到位了。但如果 WordPress 那个站被一个免登录 RCE 漏洞打穿,情况未必如预期。 ...

September 2, 2026 · 3 min · 翼橙

MongoDB 用户管理详解:admin 用户 vs 数据库用户

在 MongoDB 中,用户建在哪个库决定了它的作用范围和管理方式,这一点和 MySQL 很不一样,也是新手最容易绕进去的地方。本文讲清楚两种用户的区别、各自的使用场景、 完整的管理操作,以及连接时那个必须写对的 authSource。 零、先确认认证是开着的 MongoDB 默认不开认证。 没开的时候,你建的用户一个都不生效——任何人连上来 都是完全权限,db.createUser() 只是往集合里写了几行数据而已。 编辑 /etc/mongod.conf: security: authorization: enabled 改完重启,之后所有操作都需要认证: sudo systemctl restart mongod 顺序很重要:先在没开认证的状态下建好第一个管理员账号,再打开认证重启。 反过来的话,认证开着但一个用户都没有,你就把自己关在门外了 (只能用 --noauth 重启一次救回来)。 一、两种类型的用户 1. admin 数据库创建的用户(全局用户) 这种用户是在 admin 数据库中创建的,可以访问多个数据库,并对多个数据库赋予不同权限。 use admin db.createUser({ user: "adminUser", pwd: "secure123", roles: [ { role: "readWrite", db: "sales" }, { role: "read", db: "analytics" } ] }) 特点 用户信息存储在 admin 库; 可以管理和访问多个数据库; 适合平台管理员、系统服务等集中权限场景。 使用场景 运维或 DevOps 脚本; 应用需要访问多个数据库; 多库统一管理权限。 2. 普通数据库创建的用户(局部用户) 这种用户只能在某一个数据库中创建,默认仅能访问该数据库。 use appdb db.createUser({ user: "appUser", pwd: "pass123", roles: [ { role: "readWrite", db: "appdb" } ] }) 特点 用户信息只存在于当前库; 默认只能访问当前数据库; 隔离性好,更安全。 使用场景 Web 应用访问自己的数据; 每个业务数据库独立授权; 多租户系统中的租户隔离。 二、常见用户管理操作 创建用户 db.createUser({ user: "user1", pwd: "123456", roles: [ { role: "readWrite", db: "mydb" } ] }) 修改用户密码 db.updateUser("user1", { pwd: "newpass" }) 要在用户所属数据库执行。 ...

July 23, 2025 · 2 min · 翼橙