簡體   English   中英

意外暴露端口?

[英]Accidentally expose port?

我是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插件准備連接。 套接字:'/var/run/mysqld/mysqlx.sock'綁定地址:'::'端口:33060

我可以知道這是什么意思嗎? 我打開端口33060是否有可能? 以及如何驗證?

這似乎是一個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環境)。

為了確保未暴露端口,您可以運行container並執行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,或者它存在但未映射,則很安全。 無論如何,只有在啟動容器時才可以映射它,因此,如果您沒有這樣做,則不會被映射。

我對與您類似的MySQL日志條目@Isaac感到驚訝,盡管我不使用Docker,但它使我想到了您的問題。 這是我認為我已經學到的東西以及我所做的事情。

MySQL的“ X插件”擴展了MySQL,使其能夠用作文檔存儲。 請參閱有關服務器插件的MySQL手冊部分有關文檔存儲功能的手冊部分以及2018年4月文檔存儲可用性公告

默認情況下,對於其X插件功能,MySQL偵聽綁定到所有IP地址的端口33060。 參見有關X插件選項和系統變量的手冊部分 (指示“ mysqlx_port”和“ mysqlx_bind_address”的默認值),以及X插件選項和變量參考 對於傳統功能,MySQL默認仍使用端口3306

我相信默認的X插件端口和網絡地址將反映在您發布的日志條目中。 特別是,我相信摘錄X Plugin ... bind-address: '::'表示X插件連接的MySQL默認通配符IP地址綁定。

如果您想使用X插件功能,但不監聽它們的所有IP地址,則可以使用mysqlx_bind_address選項指定監聽TCP / IP連接的地址 命令行格式為--mysqlx-bind-address=addr或者,您可以在MySQL選項文件中設置該系統變量,例如:

[mysqld]
<... other mysqld option group settings>
mysqlx_bind_address = 127.0.0.1

MySQL手冊提供了有關在命令行選項文件中指定選項的有用的常規信息。 這是一些有關在Docker容器中設置MySQL選項的信息,盡管我從未嘗試過。

MySQL的啟用X-plugin的功能和MySQL的傳統功能似乎對網絡地址有不同的設置。 您可以使用bind_address選項為傳統功能設置網絡地址。 因此,如果您希望將這兩組功能都限制為偵聽來自本地主機的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

很有幫助。

您已經發布了端口。 --publish 3306:3306實際上將您的容器端口發布為主機端口,現在您的主機端口3306被mysql占用。 如果您不希望這樣做,則可以刪除--published 3306:3306並且容器端口將不會綁定到主機端口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM