数据库远程访问与安全
默认只绑本机,确需远程时用最小权限账号 + 防火墙白名单 + 加密通道,绝不把数据库端口对公网裸开。
数据库是整个业务最敏感的资产。很多入侵事件的根因,不是漏洞多高深,而是有人把 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 隧道。
- 同内网优先走内网通信,能不暴露就不暴露。把攻击面收到最小,是数据库安全最划算的投资。