努力
加油

新手如何在云服务器Ubuntu系统中安全地部署数据库?

在 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

这个过程你会遇到几个选项,请务必仔细看:

  1. VALIDATE PASSWORD COMPONENT:询问是否启用密码强度检测插件。
    • 建议:选 Y,等级选 2(Strong)。这能防止你设置像 "123456" 这种弱口令。
  2. Remove anonymous users:移除匿名用户。
    • 建议:选 Y。生产环境不需要匿名访问。
  3. Disallow root login remotely:禁止 root 远程登录。
    • 建议:选 Y。这是重中之重。Root 账号只能从 localhost(本机)登录。如果你需要远程管理,请创建一个有权限的子账号。
  4. Remove test database and access to it:删除测试数据库。
    • 建议:选 Y。测试库往往是入侵的跳板。
  5. 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 里关了端口,但在云控制台的安全组里可能还开着。

  1. 登录你的云控制台。
  2. 找到实例 -> 安全组规则。
  3. 入方向规则:
    • 确保没有 0.0.0.0/0 对 3306 (MySQL) 或 5432 (PostgreSQL) 的开放规则。
    • 如果有,立刻删除。
  4. 如何远程连接数据库?
    • 方案 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。

第六步:备份与监控(最后的保险)

安全不仅仅是防黑客,还包括防误删、防硬件故障。

  1. 自动化备份:
    使用 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

    注意:密码放在环境变量里,不要明文写在脚本里。

  2. 开启慢查询日志:
    在 /etc/mysql/mysql.conf.d/mysqld.cnf 中开启 slow_query_log,帮助发现性能瓶颈。

给新手的特别建议

  1. 不要在生产环境用 root 连接应用。一旦应用代码存在 SQL 注入漏洞,root 权限意味着整个服务器可能被接管。
  2. 定期更新系统:sudo apt upgrade 偶尔跑一下,修复内核和软件包的安全漏洞。
  3. 考虑托管版数据库:如果预算允许,且业务不是极度敏感,直接使用云厂商提供的 RDS(关系型数据库服务)。他们负责底层安全、备份和高可用,你只需要关注 SQL 语句和业务逻辑。对于新手来说,这是性价比最高的“安全”方案。

部署数据库不是装个软件就结束了,它是一个持续的过程。按照上面这套流程走一遍,你的数据库至少比 80% 的新手要安全得多。