如何安全地连接到另一台服务器上的 MySQL 数据库?

How to securely connect to MySQL database on another server?

我正在尝试 link 我的 Discord 机器人使用另一台服务器上的 MySQL 数据库。然而,这个例子显然是不安全的:

const mysql = require('mysql');
const connection = mysql.createConnection({
  host     : 'hostname',
  port     : 'portnum',
  user     : 'db_user',
  password : 'db_user_password',
  database : 'db_name',
  charset  : 'utf8mb4'
});

我将如何建立(更)安全的连接?

这并不是真的不安全。你有几个选择。首先,专用网络上的服务器是否在防火墙后面?或者他们只能通过 public ip 地址相互连接?如果前者是真的,那你就没事了。但是,我会在服务器上添加防火墙规则,以便它只允许来自另一台机器的连接。如果他们在 public IP 地址上连接,您将需要执行相同的操作,并为 MySQL 使用 non-standard 端口。您还可以添加另一个 NIC 并将 MySQL 服务绑定到它。这样,如果黑客发现了您的服务器,它就会显示所有端口都已关闭。

如果它是托管数据库服务器并且您有安全端点 URL(意思是 https:// 主机),那么只需将其用作主机名 host: 'hostname' 就足够了。

如果它是您拥有的私人服务器并且您拥有 SSL 证书,那么您可以使用以下内容:

const fs = require('fs');
const mysql = require('mysql');

var connection = mysql.createConnection({
    host: '127.0.0.1',
    port: '3306',
    user: 'root',
    password: 'passw0rd',
    database: 'test',
    ssl: {
        ca: fs.readFileSync(__dirname + '/certs/ca.pem'),
        key: fs.readFileSync(__dirname + '/certs/client-key.pem'),
        cert: fs.readFileSync(__dirname + '/certs/client-cert.pem')
    }
});

connection.connect();

您可以使用 SSL 连接,方法如下:

const fs = require('fs');
const mysql = require('mysql');
const connection = mysql.createConnection({
  host     : 'hostname',
  port     : 'portnum',
  user     : 'db_user',
  password : 'db_user_password',
  database : 'db_name',
  charset  : 'utf8mb4',
  ssl: {
      ca: fs.readFileSync(__dirname + '/certs/ca.pem'),
      key: fs.readFileSync(__dirname + '/certs/client-key.pem'),
      cert: fs.readFileSync(__dirname + '/certs/client-cert.pem')
  }
});

您还必须在 MySql 服务器上启用 SSL。有一些 tutorials 在线展示如何操作,但您需要 root 访问权限才能执行此操作。