数据库远程访问与安全

默认只绑本机,确需远程时用最小权限账号 + 防火墙白名单 + 加密通道,绝不把数据库端口对公网裸开。

数据库是整个业务最敏感的资产。很多入侵事件的根因,不是漏洞多高深,而是有人把 3306、5432、6379 直接开到了公网,再配上弱密码或默认账号。本文讲清楚:默认怎么绑、确需远程时怎么安全打开。

默认:只监听 127.0.0.1

如果数据库和应用跑在同一台服务器上,就让数据库只监听本机回环地址,外部根本无法连接。

MySQL/MariaDB(/etc/mysql/mysql.conf.d/mysqld.cnf):

[mysqld]
bind-address = 127.0.0.1

PostgreSQL(/etc/postgresql//main/postgresql.conf):

listen_addresses = 'localhost'

Redis 尤其危险,务必绑本机并设密码(/etc/redis/redis.conf):

bind 127.0.0.1
requirepass 你的强密码

改完重启服务,并用 ss -tlnp 确认端口只在 127.0.0.1 上监听,而不是 0.0.0.0。

确需远程访问:四道防线

1. 谨慎放开 bind-address

只有在必要时,才把监听地址改成内网 IP(如 10.0.0.5),尽量不要用 0.0.0.0。

2. 防火墙只放行可信 IP

用 ufw 把端口限制到已知来源,而非全网开放:

sudo ufw allow from 203.0.113.10 to any port 5432 proto tcp
sudo ufw deny 5432

3. 建专用最小权限账号,别用 root

给远程应用单独建号,只授它需要的库和权限:

CREATE USER 'app'@'10.0.0.%' IDENTIFIED BY '强密码';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'app'@'10.0.0.%';

4. 启用 SSL 或走 SSH 隧道

最简单稳妥的是 SSH 隧道,无需公开数据库端口:

ssh -L 5432:127.0.0.1:5432 user@你的服务器
# 之后本地连 127.0.0.1:5432 即可

应用与库同内网:优先走内网

如果应用和数据库在同一内网(同一 VPC / 同机房私网),让它们通过内网地址互访,数据库根本不必暴露到公网,连接更快也更安全。

小结

  • 默认只绑 127.0.0.1,ss -tlnp 复核监听地址。
  • Redis/MySQL/PostgreSQL 都别对公网裸开 6379/3306/5432。
  • 确需远程:改 bind-address + 防火墙白名单 + 专用最小权限账号 + SSL/SSH 隧道。
  • 同内网优先走内网通信,能不暴露就不暴露。把攻击面收到最小,是数据库安全最划算的投资。