在 Ubuntu 上部署数据库,新手最容易犯的错误就是“裸奔”——装完直接用 root 或者默认配置对外开放。作为过来人,我得先泼盆冷水:云服务器上的数据库,默认就是黑客的提款机。
别被那些复杂的架构吓到,对于个人项目或中小企业初期,我们追求的是“够用、安全、好维护”。下面我把流程拆解成几个关键步骤,按这个顺序走,能避开 90% 的坑。
第一步:系统层面的“硬骨头”先啃下来
在装数据库之前,先把操作系统的安全底座打好。Ubuntu 自带的防火墙 ufw 必须启用,而且默认策略要设为“拒绝所有”。
# 更新源并安装 ufw(如果没装的话)
sudo apt update && sudo apt install ufw -y
# 启用防火墙
sudo ufw enable
# 设置默认策略:只进不出是不行的,我们需要严格控制入站
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许 SSH 连接(这是你管理服务器的命脉,千万别封了)
sudo ufw allow OpenSSH
# 注意:此时不要开放任何数据库端口!
这一步做完,你的服务器除了 SSH,其他门都是关着的。这是安全的第一道防线。
第二步:选择适合你的数据库引擎
新手通常纠结于 MySQL 还是 PostgreSQL。
- MySQL/MariaDB:生态最成熟,教程最多,适合大多数 Web 应用(WordPress, Laravel 等)。
- PostgreSQL:功能更强大,对复杂查询和 JSON 支持更好,适合数据密集型应用。
这里以目前市场占有率最高的 MySQL (5.7/8.0) 为例,PostgreSQL 的逻辑大同小异。
# 安装 MySQL Server
sudo apt install mysql-server -y
# 检查服务状态
sudo systemctl status mysql
第三步:执行安全加固脚本(最关键的一步)
很多新手装完就跑去改配置文件,其实官方提供了一个交互式脚本,专门用来解决默认安装留下的安全隐患。
运行:
sudo mysql_secure_installation
这个过程你会遇到几个选项,请务必仔细看:
- VALIDATE PASSWORD COMPONENT:询问是否启用密码强度检测插件。
- 建议:选
Y,等级选2(Strong)。这能防止你设置像 "123456" 这种弱口令。
- 建议:选
- Remove anonymous users:移除匿名用户。
- 建议:选
Y。生产环境不需要匿名访问。
- 建议:选
- Disallow root login remotely:禁止 root 远程登录。
- 建议:选
Y。这是重中之重。Root 账号只能从 localhost(本机)登录。如果你需要远程管理,请创建一个有权限的子账号。
- 建议:选
- Remove test database and access to it:删除测试数据库。
- 建议:选
Y。测试库往往是入侵的跳板。
- 建议:选
- Reload privilege tables now:刷新权限表。
- 建议:选
Y。让上述更改立即生效。
- 建议:选
第四步:创建专用用户和数据库
永远不要用 root 去连接你的应用程序。你需要创建一个专门的数据库用户,并赋予最小权限原则。
登录 MySQL:
sudo mysql
在 SQL 命令行中执行以下操作(以创建名为 myapp 的数据库和用户为例):
-- 1. 创建数据库,指定字符集为 utf8mb4(支持 emoji 等特殊字符)
CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 2. 创建用户,限制只能从特定 IP 访问(强烈建议替换为你的应用服务器 IP,或者 % 表示任意 IP 但配合强密码)
-- 注意:如果是本地应用连接,host 写 'localhost';如果是跨服务器连接,写应用服务器的公网 IP 或内网 IP
CREATE USER 'myapp_user'@'%' IDENTIFIED BY 'Your_Strong_Password_123!';
-- 3. 授权,只授予该用户对特定库的操作权限
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON myapp_db.* TO 'myapp_user'@'%';
-- 4. 刷新权限
FLUSH PRIVILEGES;
-- 5. 退出
EXIT;
技巧:如果你的应用和数据库在同一台服务器上,将 '%' 改为 'localhost' 安全性更高,因为即使应用被黑,攻击者也无法通过网络协议绕过 Unix Socket 直接连 DB,虽然难度不大,但多一层屏障。
第五步:配置云厂商的安全组(Security Group)
这是国内云服务器(阿里云、腾讯云、华为云等)特有的环节,也是新手最容易忽略的。
你在 ufw 里关了端口,但在云控制台的安全组里可能还开着。
- 登录你的云控制台。
- 找到实例 -> 安全组规则。
- 入方向规则:
- 确保没有
0.0.0.0/0对3306(MySQL) 或5432(PostgreSQL) 的开放规则。 - 如果有,立刻删除。
- 确保没有
- 如何远程连接数据库?
- 方案 A(推荐):使用堡垒机或 SSH 隧道。在本地电脑通过 SSH 端口转发,把本地的
3306映射到云服务器的3306。这样数据库端口依然对公网关闭。 - 方案 B(次选):如果必须直连,修改 MySQL 配置文件
/etc/mysql/mysql.conf.d/mysqld.cnf,找到bind-address,将其改为你的应用服务器 IP 或0.0.0.0(不推荐全开),然后在云安全组里,将入站规则的来源 IP 限制为你自己的固定出口 IP 或应用服务器 IP,严禁设置为 0.0.0.0/0。
- 方案 A(推荐):使用堡垒机或 SSH 隧道。在本地电脑通过 SSH 端口转发,把本地的
第六步:备份与监控(最后的保险)
安全不仅仅是防黑客,还包括防误删、防硬件故障。
-
自动化备份:
使用mysqldump编写一个简单的 shell 脚本,利用crontab每天凌晨自动备份,并上传到对象存储(OSS/COS)或另一台机器。# 示例 crontab 任务,每天凌晨 2 点备份 0 2 * * * /usr/bin/mysqldump --all-databases -u root -p'password' | gzip > /backup/db_$(date +%F).sql.gz注意:密码放在环境变量里,不要明文写在脚本里。
-
开启慢查询日志:
在/etc/mysql/mysql.conf.d/mysqld.cnf中开启slow_query_log,帮助发现性能瓶颈。
给新手的特别建议
- 不要在生产环境用
root连接应用。一旦应用代码存在 SQL 注入漏洞,root权限意味着整个服务器可能被接管。 - 定期更新系统:
sudo apt upgrade偶尔跑一下,修复内核和软件包的安全漏洞。 - 考虑托管版数据库:如果预算允许,且业务不是极度敏感,直接使用云厂商提供的 RDS(关系型数据库服务)。他们负责底层安全、备份和高可用,你只需要关注 SQL 语句和业务逻辑。对于新手来说,这是性价比最高的“安全”方案。
部署数据库不是装个软件就结束了,它是一个持续的过程。按照上面这套流程走一遍,你的数据库至少比 80% 的新手要安全得多。
云技术博客