安装与基础配置
在 CentOS 7 或 8 系统中,官方仓库默认提供的是 MariaDB,它是 MySQL 的一个分支,与 MySQL 在绝大多数操作上保持高度兼容,我们以 MariaDB 为例进行说明。
通过 yum
或 dnf
包管理器安装 MariaDB 服务器端:
sudo yum install mariadb-server
安装完成后,启动服务并设置其开机自启,这是确保数据库持续可用的关键步骤:
sudo systemctl start mariadb sudo systemctl enable mariadb
安全初始化设置
新安装的 MySQL/MariaDB 存在诸多安全隐患,例如默认的空 root 密码、匿名用户等,官方提供了一个安全脚本 mysql_secure_installation
来引导我们完成基础的安全加固。
执行以下命令:
sudo mysql_secure_installation
脚本会通过一系列交互式问题来引导你:
- 设置 root 密码:为数据库管理员 root 用户设置一个强密码。
- 移除匿名用户:删除无需密码即可登录的匿名账户,增强安全性。
- 禁止 root 远程登录:默认情况下,root 用户仅允许从服务器本机(localhost)登录,禁止其远程登录是一个重要的安全实践,可以防止对管理员账户的暴力破解。
- 移除测试数据库:删除默认创建的
test
数据库,该数据库对任何人开放,存在安全风险。 - 重新加载权限表:使以上所有修改立即生效。
完成这些步骤后,你的数据库实例就有了一个坚实的安全基础。
配置本地连接
本地连接是数据库管理最直接的方式,在服务器上,你可以使用以下命令登录数据库:
mysql -u root -p
-u root
:指定以 root 用户身份登录。-p
:提示输入密码,出于安全考虑,不建议直接在命令行中跟写密码。
输入在安全初始化阶段设置的密码后,你将成功进入 MySQL 命令行界面,提示符变为 MariaDB [(none)]>
,此时即可执行 SQL 语句。
配置远程连接
允许远程连接是配置中最复杂也最关键的一环,涉及防火墙、MySQL 用户权限和 MySQL 服务本身监听地址三个层面。
配置防火墙
CentOS 默认使用 firewalld
作为防火墙管理工具,MySQL 默认监听 3306 端口,你需要开放此端口以允许外部流量进入。
# 永久开放 3306/tcp 端口 sudo firewall-cmd --permanent --add-port=3306/tcp # 重新加载防火墙规则使配置生效 sudo firewall-cmd --reload # 查看已开放的端口以确认 sudo firewall-cmd --list-ports
创建并授权远程用户
出于安全考虑,不应直接使用 root 用户进行远程连接,最佳实践是创建一个专用的数据库用户,并仅授予其必要的权限,同时限制其可连接的主机。
登录 MySQL 后,执行以下 SQL 命令:
-- 创建一个名为 'app_user' 的新用户,密码为 'StrongPassword123!' -- '%' 表示该用户可以从任意 IP 地址连接,你也可以指定特定IP,如 '192.168.1.100' CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPassword123!'; -- 授予该用户在 'my_app_db' 数据库上的所有权限 GRANT ALL PRIVILEGES ON my_app_db.* TO 'app_user'@'%'; -- 刷新权限,使授权立即生效 FLUSH PRIVILEGES;
修改 MySQL 监听地址
默认情况下,MySQL/MariaDB 仅监听 0.0.1
(localhost),这意味着它只接受来自本机的连接请求,要允许远程连接,需要修改其配置文件,让它监听服务器的所有网络接口。
配置文件通常位于 /etc/my.cnf
或 /etc/my.cnf.d/mariadb-server.cnf
,使用编辑器打开文件:
sudo vi /etc/my.cnf.d/mariadb-server.cnf
在 [mysqld]
或 [mariadb]
节点下,找到 bind-address
行,将其修改为:
# 将 127.0.0.1 修改为 0.0.0.0,表示监听所有IP地址 bind-address = 0.0.0.0
安全提示:将 bind-address
设置为 0.0.0
会使数据库服务暴露在所有网络接口上,务必确保你已经配置了强大的防火墙规则和使用了复杂的用户密码,否则将带来严重的安全风险。
修改完成后,重启 MariaDB 服务使配置生效:
sudo systemctl restart mariadb
至此,远程客户端(如另一台服务器上的应用程序或 MySQL Workbench)就可以使用 app_user
的凭据连接到这台 CentOS 服务器的 MySQL 了。
配置要点小编总结
为了方便查阅,以下表格小编总结了远程连接的核心配置项:
配置项 | 文件/命令 | 说明 |
---|---|---|
防火墙端口 | firewall-cmd --add-port=3306/tcp | 允许外部流量访问 MySQL 的 3306 端口。 |
远程用户授权 | CREATE USER 'user'@'%' | 创建允许从任意主机连接的用户。 可替换为特定 IP。 |
权限授予 | GRANT ALL PRIVILEGES ON db.* TO 'user'@'%' | 为远程用户分配特定数据库的操作权限。 |
服务监听地址 | bind-address = 0.0.0.0 (在 my.cnf 中) | 使 MySQL 服务监听服务器的所有网络接口,而非仅本地。 |
服务重启 | systemctl restart mariadb | 使修改后的配置文件(如 bind-address )生效。 |
相关问答 (FAQs)
问题1:我已经按照步骤设置了 bind-address = 0.0.0.0
并开放了防火墙,为什么还是无法远程连接,提示 “Can’t connect to MySQL server”?
解答:这个问题通常由以下几个原因导致:
- SELinux 限制:CentOS 默认启用的 SELinux 安全模块可能会阻止 MariaDB 监听非标准端口,你可以通过以下命令临时关闭 SELinux 进行测试:
setenforce 0
,如果测试后可以连接,说明是 SELinux 的问题,正确的解决方法是设置 SELinux 策略允许 MariaDB 网络连接:setsebool -P httpd_can_network_connect=1
(如果通过 Web 服务器连接)或setsebool -P mysql_connect_any=1
。 - 用户权限问题:请再次确认你创建的用户是否被授权从你的客户端 IP 地址连接,如果你授权的是
'user'@'192.168.1.%'
,但你的客户端 IP 是0.0.5
,那么连接会被拒绝,使用'user'@'%'
可以允许从任何 IP 连接,但安全性较低。 - 网络问题:检查客户端和服务器之间是否存在其他网络设备(如路由器、云服务商的安全组)阻止了 3306 端口的通信。
问题2:将 bind-address
设置为 0.0.0
是否安全?有没有更安全的方案?
解答:直接将 bind-address
设置为 0.0.0
并将数据库端口暴露在公网上确实存在较高的安全风险,它会成为黑客扫描和攻击的目标,更安全的方案包括:
- 使用 VPN 或 SSH 隧道:这是推荐的最佳实践,客户端先通过 VPN 或 SSH 隧道连接到服务器所在的内网,然后通过内网 IP 地址(如
0.0.10
)连接数据库,这样,数据库服务本身无需暴露在公网上,bind-address
可以设置为内网 IP 或保持0.0.1
(通过 SSH 端口转发)。 - 严格的防火墙规则:如果必须直接暴露端口,应在防火墙层面做严格的 IP 白名单限制,只允许特定的、可信的 IP 地址访问 3306 端口。
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="YOUR_TRUSTED_IP" port protocol="tcp" port="3306" accept'
。 - 使用云服务商的私有网络:如果你的服务器部署在云上(如阿里云、AWS),请将数据库服务器部署在 VPC(虚拟私有云)或 VNet 内,并确保只有同一网络内的应用服务器才能访问它。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复