您的系统设计存在一些不寻常的信息安全隐患。它有一个比平常更大的attack surface,因为它要求您的客户将他们的 MySQL 服务器公开给来自您的服务器的连接。如果您的服务器可以进入,那么网络爬虫也可能更容易进入。如果他们的数据很敏感,他们可能会要求您使用他们的环境和您的环境之间的始终在线 VPN 隧道访问他们的服务器。怎么做?超出 Stack Overflow 答案的范围。
您可以采取一些措施使其更安全。
首先,让您的客户要求从您的 nodejs 程序到客户提供的 MySQL 实例中的 ssl-encrypted MySQL connections。您不希望您的客户数据在没有加密的情况下通过公共网络移动,因为您不希望网络窃贼拦截或更改它。这需要您的客户将其服务器配置为支持 TLS。
其次,告诉您的客户在他们的服务器上创建 MySQL 帐户,专门供您的应用程序使用。这些帐户应具有您的应用运行所需的最低权限。要求您的客户限制这些帐户对您的服务器的访问。例如,如果您的服务器的 IP 地址是 192.0.2.123、192.0.2.124 和 192.0.2.125,您可以向他们询问 create accounts like this:
CREATE USER 'rodrigo'@'192.0.2.123' IDENTIFIED BY 'hardToGuess' REQUIRE SSL;
CREATE USER 'rodrigo'@'192.0.2.124' IDENTIFIED BY 'hardToGuess' REQUIRE SSL;
CREATE USER 'rodrigo'@'192.0.2.125' IDENTIFIED BY 'hardToGuess' REQUIRE SSL;
GRANT SELECT,INSERT,UPDATE,DELETE ON rodrigoAppDb.* TO
'rodrigo'@'192.0.2.123',
'rodrigo'@'192.0.2.124',
'rodrigo'@'192.0.2.125';
FLUSH PRIVILEGES;
第三,让我们利用关于应用程序密码身份验证的事实。如果您正确地进行密码身份验证,那么您唯一可以访问您的 用户的未哈希登录密码的时间是当他们从您的登录表单和you check them 向您发布密码时。因为您对用户的密码进行哈希处理,所以它们不会以可用的形式存储在您的 MySQL 数据库中。
这意味着您可以使用他们的登录密码(他们的纯文本登录密码本身,而不是他们的登录密码的哈希)作为他们的密钥来加密客户的 MySQL 密码。这样您就不必存储这些密码的文本。您需要在登录过程中检索和解密他们的 MySQL 密码。然后,您可以为每个用户的 MySQL 数据库打开一个连接池,以便在该用户的会话期间使用。 (请务必为每个池设置较短的过期时间,以便在您的用户离开后不久过期。)
请注意:如果您的用户更改了密码,您将不得不更新他们的密码哈希并重新加密他们的数据库密码。这意味着您必须在密码更新页面提示用户的现有密码和新密码。
同样,您需要一个屏幕来接受每个用户的 MySQL 连接数据。在该屏幕上,您还必须重新向系统请求用户密码。