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

新手在 Ubuntu 云服务器上安全部署数据库(以主流的 PostgreSQL 或 MySQL/MariaDB 为例)需兼顾功能性、最小权限、网络隔离、加密与可维护性。以下是分步、安全、可落地的操作指南(以 PostgreSQL 为主,MySQL 作为对比补充),适用于阿里云/腾讯云/AWS 等主流平台:


✅ 一、部署前的安全准备(关键!)

步骤 操作 安全意义
1. 创建专用非 root 用户 sudo adduser dbadminsudo usermod -aG sudo dbadmin禁用 root 密码登录sudo passwd -l root 避免直接使用 root,遵循最小权限原则
2. 配置防火墙(UFW) bash<br>sudo ufw default deny incoming<br>sudo ufw allow OpenSSH<br>sudo ufw enable<br> 默认拒绝所有入站,仅开放必要端口(SSH)
3. 更新系统 sudo apt update && sudo apt upgrade -y && sudo reboot 修复已知漏洞

⚠️ 注意:不要在公网直接暴露数据库端口(5432/3306)! 后续通过 SSH 隧道或云平台安全组限制访问。


✅ 二、安全安装数据库(以 PostgreSQL 为例)

# 1. 添加官方仓库(确保最新稳定版 + 安全更新)
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt update

# 2. 安装(不安装额外示例/文档)
sudo apt install -y postgresql-15 postgresql-client-15 postgresql-contrib-15

# 3. 验证服务状态
sudo systemctl status postgresql  # 应为 active (running)

为什么选 PostgreSQL?

  • 默认启用 peer/md5 认证,比 MySQL 默认空密码更安全
  • 内置行级安全(RLS)、透明数据加密(TDE 需扩展)、更严格的权限模型

🔁 MySQL 替代方案

sudo apt install -y mysql-server
sudo mysql_secure_installation  # ❗必须运行!设置 root 密码、删除匿名用户、禁用远程 root 等

✅ 三、核心安全配置(重中之重!)

🔐 1. 修改监听地址(禁止公网暴露)

# 编辑主配置文件
sudo nano /etc/postgresql/*/main/postgresql.conf

修改以下两行:

# 将监听地址改为仅本地(默认已如此,确认!)
listen_addresses = 'localhost'   # ❌ 不要写成 '*' 或 '0.0.0.0'
port = 5432

🔐 2. 配置客户端认证(pg_hba.conf)

sudo nano /etc/postgresql/*/main/pg_hba.conf

在文件末尾添加(按需调整):

# TYPE  DATABASE  USER  ADDRESS      METHOD
local   all       all                peer          # Unix socket 本地连接(安全)
host    all       all   127.0.0.1/32 md5          # 仅允许本机 IPv4,密码认证
host    all       all   ::1/128      md5          # 仅允许本机 IPv6
# ❌ 删除或注释掉所有 0.0.0.0/0 或任意 IP 的规则!

✅ 保存后重启:sudo systemctl restart postgresql

🔐 3. 创建专用数据库与用户(绝不使用 postgres 账户!)

sudo -u postgres psql
-- 1. 创建新数据库(避免用 postgres 默认库)
CREATE DATABASE myapp_db OWNER myapp_user;

-- 2. 创建强密码用户(密码至少12位,含大小写字母+数字+符号)
CREATE USER myapp_user WITH PASSWORD 'Y0ur$tr0ngP@ssw0rd!2024';

-- 3. 授予最小必要权限(❌ 不给 CREATEDB/SUPERUSER)
GRANT CONNECT ON DATABASE myapp_db TO myapp_user;
c myapp_db
GRANT USAGE ON SCHEMA public TO myapp_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO myapp_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO myapp_user;

-- 4. (可选)限制连接数与超时
ALTER ROLE myapp_user CONNECTION LIMIT 10;
ALTER ROLE myapp_user SET idle_in_transaction_session_timeout = '5min';

q

💡 提示:用 psql -h localhost -U myapp_user -d myapp_db 测试连接(会提示输入密码)


✅ 四、增强安全性(进阶但强烈推荐)

措施 操作 说明
✅ 启用 SSL 加密 postgresql.conf 中:
ssl = on
ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem'
ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'
→ 重启后,应用连接字符串加 ?sslmode=require
防止内网嗅探(尤其云服务器可能共享物理网络)
✅ 自动备份 + 加密 使用 pg_dump + gpg + cron
0 2 * * * pg_dump -U myapp_user myapp_db | gpg --cipher-algo AES256 -e -r admin@yourdomain.com > /backup/db_$(date +%F).sql.gpg
防勒索、防误删;密钥离线保管
✅ 日志审计 postgresql.conf 中:
log_statement = 'mod' (记录 DDL/DML)
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
追溯异常操作
✅ 云平台安全组 在阿里云/腾讯云控制台,数据库服务器的安全组仅放行 SSH(22)端口禁止开放 5432/3306 公网端口 最外层网络防线(比防火墙更前置)

✅ 五、安全连接方式(应用如何连?)

场景 推荐方式 示例
本地开发连云服务器数据库 ✅ SSH 隧道(最安全) ssh -L 5433:localhost:5432 user@your-server-ip -N → 应用连 localhost:5433
同 VPC 内其他云服务(如 Web 服务器) ✅ 内网 IP + 安全组放行 Web 服务器安全组放行数据库内网 IP 的 5432 端口
绝对需要公网访问(不推荐!) ⚠️ 仅限测试 + IP 白名单 + 强密码 + SSL pg_hba.confhost myapp_db myapp_user x.x.x.x/32 scram-sha-256

✅ 六、日常维护与检查清单

  • 📌 每月:sudo apt update && sudo apt list --upgradable → 升级 postgresql-*
  • 📌 每周:检查日志 sudo tail -50 /var/log/postgresql/*.log 是否有 FATAL 或暴力破解尝试
  • 📌 每次部署应用:确认数据库连接字符串中 无硬编码密码 → 改用环境变量或 secrets manager
  • 📌 备份验证:每月抽样解密并 psql -f backup.sql 恢复到测试库

❌ 绝对禁止的操作(新手常见雷区)

  • ❌ 直接用 rootpostgres 用户运行应用
  • ❌ 在 pg_hba.conf 中写 host all all 0.0.0.0/0 md5
  • ❌ 使用弱密码(如 password123, 123456)或空密码
  • ❌ 关闭防火墙或云安全组
  • ❌ 在 GitHub 上传 .env 文件含数据库密码

📚 推荐学习资源

  • PostgreSQL 官方安全指南:https://www.postgresql.org/docs/current/security.html
  • Ubuntu Server 官方防火墙文档:https://ubuntu.com/server/docs/security-firewall
  • OWASP 数据库安全检查表:https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/05-Testing_for_SQL_Injection

如你告知具体数据库类型(PostgreSQL/MySQL/MariaDB)、云平台(阿里云?AWS?)和应用场景(个人博客?企业后台?),我可为你定制完整部署脚本(含自动配置、备份、监控)。欢迎继续提问! 🌟