我们有一家员工不足 10 人的小型企业。我们有一个包含敏感信息的 MySQL 数据库,托管在 AWS EC2 实例上。员工需要访问该数据库。目前,我已将数据库公开到互联网上,每个员工都有自己的用户名/密码。
允许从互联网访问数据库的最安全方法和最佳做法是什么?
以下是我目前想到的选项:
1- Keep the username/password method
2- Disable remote access to the DB and force users to create an SSH tunnel (with PuTTY for example)
3- Disable remote access to the DB and setup a VPN to which users will connect to
谢谢
答案1
允许从互联网访问数据库的最安全方法和最佳做法是什么?
对于包含敏感信息的数据库,最佳做法是拒绝从互联网访问。:-)
好吧,现在让我别开玩笑了。我有时无法快速正确地回答问题实现某些结果的最安全方法,因为系统越坚固,与之交互就越困难。信息安全在某种程度上是通过风险分析得出的。假设数据泄露造成的赔偿金额和市场损失是否比部署安全控制措施相关的管理成本更高?如果是这样,可以改进或增加安全控制措施。如果不是,这意味着管理成本太高,可以通过放松安全控制来降低。没有唯一或规范答案因为它受到商业现实的影响。
我看到了表情敏感信息正因为如此,我强烈反对将 DB 端口 ( [::]:3306
) 直接暴露在互联网上。在这种情况下,MySQL 中的一个 0-day 漏洞就足以泄露所有数据。我根本不会放弃用户名/密码方法 (选项1),但我建议使用间接暴露,即使用 SSH 隧道(选项 #2)或 VPN 隧道(选项 #3) 作为额外的安全层。我会使用 SSH,因为它比 VPN 增加的复杂性更少,而且,最近的 OpenSSH 版本除了允许 TCP (L4) 隧道外,还允许以太网 (L2) 和点对点 (L3) 隧道(如果需要)。我建议采取以下步骤:
设置网络防火墙,例如IP表或者表,仅允许传入到 SSH 端口 (
[::]:22
) 的连接。如果使用数据库的应用程序在不同的主机上运行,则[::]:3306
仅允许来自该主机的 DB 端口 ( ) 的连接。配置失败禁止该服务与配置的网络防火墙配合,监视 SSH 身份验证失败并阻止暴力破解尝试。
在 OpenSSH 配置文件中,仅允许基于密钥文件的身份验证:
# /etc/ssh/sshd_config
GSSAPIAuthentication no
HostbasedAuthentication no
KbdInteractiveAuthentication no
PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
要求每位员工生成一个 SSH 密钥对并向您发送他们的公钥。建议他们设置密钥密码。他们可以
PuTTYgen
为此使用。创建一个本地用户作为 MySQL 数据库的桥梁,并将
${HOME}/.ssh/authorized_keys
所有员工的公钥存储到关联文件中。将这些密钥的 SSH 功能限制为与 MySQL 服务器建立隧道连接所需的最低限度:
# ${HOME}/.ssh/authorized_keys
restrict,command="/bin/false",port-forwarding,permitopen="localhost:3306",permitopen="127.0.0.1:3306",permitopen="[::1]:3306" ssh-rsa AAAA...
restrict,command="/bin/false",port-forwarding,permitopen="localhost:3306",permitopen="127.0.0.1:3306",permitopen="[::1]:3306" ssh-rsa AAAB...
restrict,command="/bin/false",port-forwarding,permitopen="localhost:3306",permitopen="127.0.0.1:3306",permitopen="[::1]:3306" ssh-rsa AAAC...
指导员工如何正确建立 SSH 连接。
例如
PuTTY
,必须调整以下设置:- 在连接 => 数据 => 登录详细信息,字段中需填写桥接用户的姓名
Auto-login username
。 - 在连接 => SSH => 协议选项
Don't start a shell or command at all
,必须选中该框。 - 在连接 => SSH => Auth => 身份验证参数,必须提供正确的私钥文件。
- 在连接 => SSH => 隧道 => 端口转发,必须存在本地转发端口条目
L13306 localhost:3306
。实际上,源端口13306
可以由员工自由更改。
这些更改可通过 Windows 注册表文件分发。检查这个 Stack Overflow 问题了解详情。
对于 OpenSSH 客户端,所有这些更改都指定为命令行标志:
- 在连接 => 数据 => 登录详细信息,字段中需填写桥接用户的姓名
$ ssh -l bridgeuser -f -N -i /path/to/private/key -L 13306:localhost:3306 server.example.com
$ mysql --protocol=TCP -h localhost -P 13306`
- 指导员工任何 MySQL 客户端都需要连接到
localhost:13306
。
答案2
一些想法(可能不是全部答案)
您应该有一个安全组来限制您可以从中登录的 IP 地址
应该强化服务器,禁用不需要的服务。CIS(互联网安全中心)有一些资源可以帮助实现这一点,例如预先强化的图像,但这不是一项简单的任务
包括 MySQL 在内的服务器应定期修补
最佳实践可能是使用 AWS RDS 服务,但这比在 EC2 上托管自己的服务更昂贵。他们会为您完成所有更新,这是一个优势。
答案3
如果“将 MySQL 暴露给互联网”的意思是将 TCP/3306 暴露给 0.0.0.0/0,我甚至不会考虑这个选项。
1) 如果您将用户的访问权限限制为 TCP/3306 及其 IP(或共享办公室 IP),则可正常工作。[在 AWS 中,您可以使用安全组来执行此操作]
2) 会更好,但同样,我不会向全世界公开 TCP/22,而是限制对特定 IP 的访问。
3) 可能非常理想。