数据库远程访问权限关闭加固站点安全
为什么数据库远程访问会成为安全漏洞
许多新手站长在安装数据库(如MySQL、MariaDB)时,默认配置允许从任何IP远程连接。
这意味着只要攻击者猜到你的数据库端口和密码,就可能直接脱库或植入恶意数据。
关闭数据库远程访问权限是 加固站点安全 最直接有效的一步。
适用场景与前提条件
- 适用场景:单机部署的Web应用(数据库和Web服务在同一台服务器),无需其他服务器远程读取数据库。
- 前提条件:拥有服务器 root 或 sudo 权限;知道数据库的服务名(如
mysql、mariadb);本文以 MySQL 为例,MariaDB、Percona等兼容数据库操作完全一致。
第一步:检查当前数据库是否允许远程连接
登录服务器后,先确认当前状态。
执行以下命令查看MySQL的绑定地址:
sudo netstat -tlnp | grep 3306
如果输出中出现 0.0.0.0:3306 或 :::3306,说明MySQL当前监听在所有网络接口上,即开启了远程访问。
如果显示 127.0.0.1:3306,则已关闭远程访问,本文后续步骤可跳过。
第二步:修改配置文件关闭远程绑定
- 找到MySQL配置文件,常见路径:
/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)/etc/my.cnf或/etc/my.cnf.d/server.cnf(CentOS/RHEL)
- 使用编辑器(如
sudo vi或sudo nano)打开配置文件。 - 找到
[mysqld]节,修改或添加以下内容:
[mysqld]
bind-address = 127.0.0.1
# 如果存在 skip-networking 选项,建议注释掉(除非你不需要任何TCP连接)
# skip-networking
注意:bind-address = 127.0.0.1 表示MySQL只监听本地回环地址,外部无法通过TCP连接。如果你的数据库需要通过Socket(Unix域套接字)访问,不受影响。
- 保存文件并退出。
第三步:重启数据库服务并验证
执行以下命令重启MySQL:
sudo systemctl restart mysql
(如果服务名为 mariadb,则使用 sudo systemctl restart mariadb)
再次运行检查命令:
sudo netstat -tlnp | grep 3306
现在应该只显示 127.0.0.1:3306。
额外加固:防火墙与云平台安全组
即使关闭了数据库的远程监听,也建议在防火墙层面拒绝外部对3306端口的访问(双重保险)。
以iptables为例:
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP
如果使用云服务器(阿里云、腾讯云、华为云等),请登录控制台,在 安全组/防火墙 规则中删除或拒绝来自 0.0.0.0/0 的3306端口入站规则。
避坑说明
- 重启后本地应用连接失败:如果应用使用
localhost连接数据库,不受影响;如果使用服务器的公网IP或内网IP连接,需要改为localhost或127.0.0.1。 - 多服务器架构:如果你的Web服务器和数据库在不同机器上,不能简单关闭远程访问。应当改为 只允许特定IP访问:在配置文件中设置
bind-address = 0.0.0.0然后在防火墙中仅放行Web服务器的IP,或使用ssh隧道。 - 其他数据库:PostgreSQL的配置文件是
postgresql.conf,修改listen_addresses = 'localhost'即可;SQL Server需要禁用TCP/IP协议。
常见问题
Q:关闭远程后,本地用127.0.0.1能连接,但用localhost报错?
A:检查MySQL用户表的host字段是否包含 'localhost'。默认root用户通常有 'localhost' 和 '127.0.0.1' 两个条目,若缺少请联系系统管理员补全。
Q:修改配置后重启失败怎么办?
A:检查配置语法,执行 sudo mysqld --validate-config 验证。常见错误是bind-address拼写错误或重复配置。
总结
关闭数据库远程访问权限是 加固站点安全 的基础操作,只需修改一个配置项、重启服务,就能大幅降低被远程攻击的风险。
执行完本文步骤后,建议同步检查服务器上其他服务(如Redis、Memcached)是否也存在不必要的远程监听,一并加固。
如果你正在处理站点安全加固,先按本文操作,再根据自己的架构调整应用连接方式。