如何阻止任何外部登录我的 Mysql 数据库?
也就是说,如何确保我的数据库可以被操纵的唯一方法是使用 SSH 登录到我的计算机并以 root/sudoer 身份工作。
我的机器是Ubuntu服务器操作,我已经删除了 PHPmyadmin,所以当我使用 HTTPS 时,人们无法尝试从端口 80 或 443 登录,但我认为人们仍然可以尝试使用类似的软件登录Mysql工作台或类似的软件,我也希望防止这种情况发生,并实际锁定我的数据库,这样只有我的操作系统的 root 用户/sudoer 才能通过mysql -u root -p
.
为了澄清,我希望其他数据库用户无法使用他们的密码从我的系统或外部登录——我是唯一使用这台机器的人,但即使除了 root/sudoer 之外还有其他机器用户,我仍然希望他们无法登录Mysql,并且我也不希望任何人从机器外部登录 - 换句话说,我不希望除了我之外的任何其他人来操作数据库。
我想我应该锁定除 3306 之外的一些额外端口。这是正确的吗?
我可以从这些列表中删除任何此类端口/etc/csf/csf.conf
:
# Allow incoming TCP ports
TCP_IN = "20,21,22,25,53,80,110,143,443,465,587,993,995,9000"
# Allow outgoing TCP ports
TCP_OUT = "20,21,22,25,53,80,110,113,443,587,993,995,9000"
注意:我已为 PHP-FPM 取消过滤端口 9000。
答案1
只让mysqld
监听环回
例如/etc/mysql/my.cnf
添加或更改以下配置
bind-address 127.0.0.1
这样只有本地运行的程序才能连接到mysql数据库
答案2
锁定对 MySQL 的外部访问的正确方法是使用bind-address
中的指令/etc/mysql.cnf
,如下所示雏菊描述的。您无法有效地阻止拥有有效 MySQL 帐户的人在本地登录(但请注意,UNIX 帐户并不意味着 MySQL 帐户;它们彼此不同)。
我将回答你问题的另一部分:
我想我应该锁定除 3306 之外的一些额外端口。这是正确的吗?
# Allow incoming TCP ports TCP_IN = "20,21,22,25,53,80,110,143,443,465,587,993,995,9000"
目前,您的csf.conf
文件将防火墙设置为允许许多服务进入,因此几乎不值得使用。
- 20 - FTP 数据(为什么允许通过 Internet 进行 FTP?)
- 21 - FTP 命令(同上)
- 22 - SSH(这很好,但要确保您的帐户被严格锁定;考虑禁用全部非证书登录)
- 25 - SMTP 入站(您真的在运行传入邮件服务器吗?)
- 53 - DNS(您真的运行公共 DNS 吗?)
- 80 - HTTP(您正在运行网络服务器吗?)
- 110 - POP3(过时的协议;如果您正在运行邮件服务器,请考虑使用 993 上的 IMAPS)
- 143 - IMAP(不安全;在 993 上使用 IMAPS)
- 443 - HTTPS(您正在运行网络服务器吗?)
- 465 - SMTPS(您真的在运行公共邮件服务器吗?)
- 587 - SMTP-MSA(同上)
- 993 - IMAPS(仅当您在此服务器上接收邮件消息以供阅读时)
- 995 POP3S(安全但仍然过时)
- 9000——谁知道呢
如果您不提供服务,则不允许其进入。POP3、IMAP 和 POP3S 应全部关闭,以支持 IMAPS(如果有的话)。不要提供 SMTP*,除非您确实正在运行需要的邮件服务器收到来自互联网的电子邮件。不要运行 FTP。请改用 SSH 进行文件传输。
如果您想在不同的系统上使用 MySQL Workbench,您仍然可以通过跨 .net 运行转发器将 MySQL 设置为仅允许本地连接ssh
。我为我的几台服务器执行此操作:
ssh -nf -L localhost:3306:localhost:3306 ADDRESS_OF_REMOTE_SYSTEM sleep 60
# Using Workbench, now connect to MySQL seemingly on the local machine
答案3
到目前为止,roaima 在这里肯定有权威的答案,所以我只想添加一组非常简单的东西,你可能不知道通过 ssh 在命令行上运行 MySQL:
禁用 root 登录,如果可行的话,禁用密码登录,并需要密钥,但这并不那么重要,并且可能并不总是很方便,但是在设置好系统后,应尽可能避免为 ssh 启用 root 功能,如果您没有真正的理由需要它,请不要这样做。提示:使用复杂的随机用户名,这只是猜测的又一障碍。
我认为大多数人都没有意识到这一点:当您在 ssh shell 上输入某些内容时,该内容会存储在 shell 历史记录中,并且可以通过运行历史记录来检索,因此如果您在命令上使用 mysql 密码作为发出命令或连接到 mysql 的一部分的行,这些将记录在历史记录中。有一个极其简单的方法可以避免这个问题:在命令行中输入的所有 mysql 命令之前放置一个空格。就是这样。空格使 shell 在将命令添加到其历史记录中时忽略该命令。
然后运行:history -c 清除 shell 历史记录。这至少对 Bash 有效,我不知道对所有其他的都有效。
这些都是非常简单的事情,几乎不需要花费任何精力,并且消除了两个常见的弱点:shell 历史记录和非常容易猜测的 ssh 用户名。