新手在 Ubuntu 云服务器上安全部署数据库(以主流的 PostgreSQL 或 MySQL/MariaDB 为例)需兼顾功能性、最小权限、网络隔离、加密与可维护性。以下是分步、安全、可落地的操作指南(以 PostgreSQL 为主,MySQL 作为对比补充),适用于阿里云/腾讯云/AWS 等主流平台:
✅ 一、部署前的安全准备(关键!)
| 步骤 | 操作 | 安全意义 |
|---|---|---|
| 1. 创建专用非 root 用户 | sudo adduser dbadmin → sudo 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 = onssl_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.conf 加 host 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恢复到测试库
❌ 绝对禁止的操作(新手常见雷区)
- ❌ 直接用
root或postgres用户运行应用 - ❌ 在
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?)和应用场景(个人博客?企业后台?),我可为你定制完整部署脚本(含自动配置、备份、监控)。欢迎继续提问! 🌟
PHPWP博客