意外暴露端口?

3

我是一个初学者,掌握有限的dockermysql知识。下面是我用于启动mysql容器的命令。

docker container run --publish 3306:3306 --name mysqlDB -d --env MYSQL_RANDOM_ROOT_PASSWORD=yes mysql

现在它已成功运行,为了获取生成的密码,我运行以下命令:

docker container logs [containerID]

在日志中,我可以找到生成的根密码(GENERATED ROOT PASSWORD),但在读取日志时,我注意到以下日志:

[系统] [MY-011323] [服务器] X Plugin已准备好连接。套接字:'/var/run/mysqld/mysqlx.sock' 绑定地址:'::' 端口:33060

请问这是什么意思?我是否已经打开了端口33060?我该如何验证?

3个回答

2
我被类似于你的MySQL日志条目所惊讶,@Isaac,这使我找到了你的问题,尽管我没有使用Docker。以下是我认为我已经学到的和我所做的事情。
MySQL的“X插件”扩展了MySQL,使其能够作为文档存储库运行。请参见MySQL手册中的服务器插件部分文档存储功能部分2018年4月文档存储可用性公告
默认情况下,MySQL的X插件功能监听端口33060,并绑定到所有IP地址。请参见X插件选项和系统变量的手册部分(指示“mysqlx_port”和“mysqlx_bind_address”的默认值),以及X插件选项和变量参考。对于其传统功能,MySQL仍然默认使用端口3306
我认为您发布的日志条目反映了默认的X插件端口和网络地址。特别是,我相信摘录X Plugin ... bind-address: '::'表示MySQL默认使用通配符IP地址绑定X插件连接。
如果您想使用X插件的功能,但不希望监听所有IP地址,可以使用mysqlx_bind_address option指定它监听TCP/IP连接的地址。命令行格式如下:--mysqlx-bind-address=addr。或者,您可以在MySQL选项文件中设置该系统变量,例如:
[mysqld]
<... other mysqld option group settings>
mysqlx_bind_address = 127.0.0.1

MySQL手册提供了有关在命令行或选项文件中指定选项的有用一般信息(链接1)。这里有一些关于在Docker容器中设置MySQL选项的信息(链接3),虽然我从未尝试过。
似乎对于MySQL的X插件启用功能和MySQL的传统功能,有不同的网络地址设置。您可以使用bind_address选项设置传统功能的网络地址。因此,如果您想将两组功能都限制为仅从localhost监听TCP/IP连接,则可以例如将此放入您的MySQL选项文件中,这是我刚刚在我的选项文件中尝试的:
[mysqld]
bind_address = 127.0.0.1
mysqlx_bind_address = 127.0.0.1

相比之下,似乎你可以设置一个单一的系统变量skip_networking,仅允许传统和X插件功能使用本地的非TCP/IP连接(例如Unix套接字、Windows命名管道或共享内存)。
如果你根本不想使用X插件功能,你可以像@alx建议的那样禁用它们
要验证MySQL正在监听哪些网络地址和端口,你有多种选项。在我的非Docker Linux环境中,我发现
netstat -l | grep tcp

并且

sudo lsof -i | grep mysql

有帮助的。

2
这似乎是一个MySQL插件,它将面向文档的API添加到MySQL中。您可以在此处找到更多信息:https://www.percona.com/blog/2019/01/07/understanding-mysql-x-all-flavors/ 那个端口号似乎与您的绑定无关,那只是该插件的默认端口号。
此外,该端口号未公开,因此没有什么可担心的,攻击面仍然相同。
如果您想禁用该插件,请参考以下说明:https://dev.mysql.com/doc/refman/8.0/en/x-plugin-disabling.html(考虑到Docker环境,命令行选项可能是最好的选择)。
为确保端口未公开,您可以运行容器并执行docker ps,您将看到类似于以下内容:
$ docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                            NAMES
43dd96119ded        lb_geo-api               "/bin/sh -c 'exec sh…"   6 months ago        Up 7 days           80/tcp, 0.0.0.0:4203->8080/tcp                   lb_geo-api_1_a86ebad528fc

最后一列--"PORTS"--是端口列表及其在主机上的绑定情况:
  • 80/tcp--端口80可以从容器内部公开,但未映射到主机端口,因此外部无法连接。
  • 0.0.0.0:4203->8080/tcp--端口8080已公开,并在所有网络适配器上映射到端口4203,可以从外部进行连接。
如果输出中没有端口33060,或者它存在但未映射,则您是安全的。在任何情况下,只有在启动容器时才能映射它,因此如果您没有这样做,则未映射它。

我仍然很难理解docker。那么我该如何验证“该端口号未公开”? - Isaac
已更新我的答案,包括验证端口映射的方法。 - alx

0

您已经发布了您的端口。那个--publish 3306:3306实际上将您的容器端口发布到主机端口,现在您的主机端口3306被mysql占用了。如果您不想这样,您可以只删除--published 3306:3306,容器端口就不会绑定到主机端口。


是的,MySQL需要 3306 端口,但日志中提到的是 33060 - Isaac
请附上您的Dockerfile内容和/var/run/mysqld/mysqlx.sock。 - deosha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接