假设我在地球另一端的某个地方有一台带有 SQL 数据库的服务器。通过互联网建立连接安全吗?例如使用 MySQL Workbench。
我之所以问这个问题,是因为我听说与服务器的连接(尤其是使用上述软件的连接)默认是未加密的。如果我强制每个远程连接都使用 SSL,会有什么风险?开放的 MySQL 端口本身是否存在安全风险?
答案1
MySQL 参考手册有完整的第 6 章 安全。
首先,您不应允许来自互联网上任何地方的连接,而应仅允许来自已知受信任主机的连接。虽然用户也有允许的主机列表,6.1.1 安全指南建议在防火墙级别执行此操作,在主机连接到 MySQL 服务器(默认端口3306
)之前。这可以提高安全性,因为它还可以防止使用任何潜在的漏洞。
如果你确实需要在本地 Workbench 和远程 MySQL 服务器之间建立直接连接,使用安全连接。但是还有其他方法可以保护与 SQL 服务器的连接。考虑到访问控制和使用 OpenSSL 保护 SQL 连接所需的工作量,以下方法更为实用:
使用 SSH 隧道,您可以像 Workbench 一样连接 MySQL 服务器。此示例将本地端口
13306
和隧道连接绑定到localhost:3306
远程端:ssh -L 13306:localhost:3306 [email protected]
使用 VPN 并仅允许来自内部 VPN 网络的连接。
使用这两种方法您localhost
都可以将 MySQL 绑定到;这是最安全的选择。
答案2
回答您的问题:不,这并不安全。
仅列举一些安全问题:
1:登录 您的登录数据会以明文形式通过互联网传输,您显然不希望这样:)
2:SQL 查询您发送的查询(及其响应)再次以纯文本形式发送,您不希望这样,因为有人可以轻松篡改这些数据。
此外,查询结果以纯文本形式返回,其中可能包含敏感信息,这是另一个问题。如果是个人文件,在某些国家/地区,您甚至可能因忽视/无视个人数据安全准则而被起诉。
3:互联网上开放的 SQL 端口对于潜在的恶意用户来说始终是一个额外的攻击媒介。想想远程 mysql 服务器漏洞等等。
如果您确实需要远程连接,请使用 SSL。
我总结了假设您在 Linux 上运行 mysql 服务器所需要遵循的步骤:
在 mysql-server 上,生成 mysql ssl 证书:
生成CA私钥:
openssl genrsa 4096 > ca-key.pem
使用之前创建的密钥生成证书(回答默认问题):
openssl req -sha256 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
接下来为 mysql 服务器创建一个新的私钥(再次,默认问题):
openssl req -sha256 -newkey rsa:4096 -days 730 -nodes -keyout server-key.pem > server-req.pem
导出私钥:
openssl rsa -in server-key.pem -out server-key.pem
创建服务器证书:
openssl x509 -sha256 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
现在在您的 my.cnf(位于 /etc/mysql/my.cnf)中编辑 mysqld 部分并添加以下内容:
ssl-ca = /etc/mysql/ca-cert.pem ssl-cert = /etc/mysql/server-cert.pem ssl-key = /etc/mysql/server-key.pem
重新启动 mysql 服务:
service mysql restart
现在您的 mysql 服务器已经使用服务器证书运行,接下来我们将从特定地址(如果可能,为您的远程静态 ip)添加用户,因此在您的 mysql 控制台中执行以下操作:
GRANT ALL PRIVILEGES ON 'database'.* TO 'yourremotelogin'@'your.remote.ip.xxx' IDENTIFIED BY 'password' REQUIRE SSL;
FLUSH PRIVILEGES;
好的,现在我们有一个 SSL mysql 服务器,它可以通过 SSL 接受来自特定 IP 的远程连接,但我们仍然需要生成客户端证书:
因此,仍然在mysql服务器上执行以下操作:
openssl req -sha256 -newkey rsa:4096 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -sha256 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
现在将 ca-cert.pem、client-key.pem 和 client-cert.pem 复制到 mysql 工作台所在的远程电脑。
在 mysql workbench 中打开服务器连接管理并编辑您与服务器的现有连接。在连接选项卡中,选择 SSL 子选项卡并选择“使用 SSL 要求”。
在下面的字段中,选择 ca-cert.pem 作为您的 SSL CA 文件,选择 cielnt-cert.pem 作为 SSL CERT 文件,选择 client-key.pem 作为 SSL 密钥文件。
现在如果您尝试连接,您仍会被要求输入密码(您之前定义的),但它是通过 SSL 进行的:)
希望这个答案就是您所寻找的答案。