意外暴露端口?

时间:2019-06-23 03:21:07

标签: mysql docker networking containers

我是n = int(input()) num = [] for i in range(0,n): ele = int(input()) num.append(ele) docker的初学者,我使用下面的命令来运行mysql容器

mysql

现在它可以成功运行,并且为了获取生成的密码,我在命令下面运行

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

在日志中可以找到我的docker container logs [containerID] ,但是在尝试阅读日志时,我注意到了以下日志

  

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

我可以知道这是什么意思吗?我打开端口33060是否有可能?以及如何验证呢?

3 个答案:

答案 0 :(得分:1)

这似乎是一个MySQL插件,向MySQL添加了面向文档的API。在这里您可以找到更多信息: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,或者它存在但未映射,则很安全。在任何情况下,只有在启动容器时才可以映射它,因此,如果不这样做,则不会被映射。

答案 1 :(得分:1)

与我的@Isaac等效的MySQL日志条目使我感到惊讶,尽管我不使用Docker,但它使我想到了您的问题。这是我认为我已经学到的东西以及我所做的事情。

MySQL的“ X插件”扩展了MySQL,使其能够用作文档存储。参见MySQL manual section on server pluginsmanual section on document store featuresApril 2018 document store availability announcement

默认情况下,对于X插件功能,MySQL侦听绑定到所有IP地址的端口33060。请参见manual section on X plugin options and system variables(指示“ mysqlx_port”和“ mysqlx_bind_address”的默认值)和X plugin option and variable reference。对于传统功能,MySQL默认仍使用port 3306

我相信默认的X插件端口和网络地址就是您发布的日志条目中反映的内容。特别是,我相信摘录X Plugin ... bind-address: '::'表示MySQL对X插件连接的默认通配符IP地址绑定。

如果您想使用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手册提供有关指定选项on the command lineoption file中的有用的常规信息。这是有关setting MySQL options in a Docker container的一些信息,尽管我从未尝试过。

似乎MySQL的启用X插件的功能和MySQL的传统功能可以监听的网络地址都有不同的设置。您可以使用bind_address option设置传统功能的网络地址。因此,如果您希望将这两组功能都限制为侦听来自本地主机的TCP / IP连接,则可以将其放在您的MySQL选项文件中,这是我在我的尝试中所做的:

[mysqld]
bind_address = 127.0.0.1
mysqlx_bind_address = 127.0.0.1

相反,似乎可以设置一个系统变量skip_networking来仅允许本地非TCP / IP连接(例如Unix套接字或Windows命名管道或共享内存)用于传统功能和X插件功能。

如果您根本不想使用X插件功能,可以按照@alx的建议disable them

要验证MySQL正在侦听哪些网络地址和端口,您有一个variety of options。在非docker Linux环境中,我发现

netstat -l | grep tcp

sudo lsof -i | grep mysql

有帮助。

答案 2 :(得分:0)

您已经发布了端口。该--publish 3306:3306实际上将您的容器端口发布为主机端口,现在您的主机端口3306被mysql占用。如果您不希望这样做,则只需删除--published 3306:3306,并且容器端口将不会绑定到主机端口。