转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。请尊重原创,文明转载,谢谢。
背景
前段时间,minio官方爆出一个安全漏洞: 在minio集群部署中,minio会返回所有的环境变量,包括MINIO_SECRET_KEY和 MINIO_ROOT_PASSWORD,导致信息泄露,分布式部署的所有用户都会受到影响,建议用户尽快升级。 为安全起见,将minio升级到安全版本。
漏洞编号:CVE-2023-28432 漏洞信息链接: https://github.com/minio/minio/security/advisories/GHSA-6xvq-wj2x-3h3q 安全版本:>=RELEASE.2023-03-20T20-16-18Z
升级与数据迁移方案
在升级时遇到一个问题:当前环境的版本太老,是2021年的老版本,要升级到安全版本RELEASE.2023-03-20T20-16-18Z,无法通过数据挂载的方式直接升级。
MinIO 网关和相关文件系统模式于 2020 年 7 月进入功能冻结状态。2022 年 2 月,MinIO 宣布弃用 MinIO 网关,随着弃用公告,MinIO还宣布该功能将在六个月内删除。
自发布2022-10-29T06-21-33Z起,MinIO网关和相关文件系统模式代码已被删除。 使用standalone 或 filesystem模式的老版本minio在升级到 RELEASE.2022-10-29T06-21-33Z 或更高版本时,会无法启动。
要升级到 RELEASE.2022-10-29T06-21-33Z 或更高版本,使用standalone 或 filesystem模式的用户必须先部署一个新的minio实例,然后手动将配置和数据内容迁移到新实例(注意新实例不能和原来老版本minio在相同的目录,如果是以磁盘为单位部署,则需要使用新的磁盘。总之,新版本在老版本数据盘上,是无法直接启动的)。
实验记录
1. 部署新旧2个版本minio实例
版本分别为: minio.RELEASE.2021-12-09T06-19-41Z minio.RELEASE.2023-03-24T21-41-23Z
如图:
2.部署nginx,配置个简单的nginx域名代理访问
minio2021配置文件:
upstream minio_console2021 {
server 10.0.0.102:9001 max_fails=3 fail_timeout=5s;
}
server {
listen 80;
server_name minio2021.test.com; #假域名,浏览器通过绑定windows电脑hosts访问
access_log /var/log/nginx/minio2021.test.com.log main;
error_log /var/log/nginx/minio2021.test.com_error.log warn;
location / {
proxy_http_version 1.1;
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://minio_console2021;
expires 0;
}
}
[root@test101 conf.d]#
minio2023配置文件:
upstream minio_console2023 {
server 10.0.0.102:9003 max_fails=3 fail_timeout=5s;
}
server {
listen 80;
server_name minio2023.test.com; #假域名,浏览器通过绑定windows电脑hosts访问
access_log /var/log/nginx/minio2023.test.com.log main;
error_log /var/log/nginx/minio2023.test.com_error.log warn;
location / {
proxy_http_version 1.1;
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://minio_console2023;
expires 0;
}
}
[root@test101 conf.d]#
3. 上传测试数据
在minio2021创建一个bucket并上传一些测试数据,minio2023数据为空:
4. 部署一个mc,做数据迁移
4.1 启动一个mc容器,并进入容器中
# docker run -it --entrypoint=/bin/sh minio/mc
4.2 分别设置minio2021和minio2023的alias:
# mc alias set minio2021 http://10.0.0.102:9000 admin admin@2021
## 别名 minio的后端链接端口 管理员账号 管理员密码
# mc alias set minio2023 http://10.0.0.102:9002 admin admin@2023
注意:
如上注释,上述命令中的端口是用的minio后端端口,此处是docker部署且映射到主机改了端口,通过ip+端口链接的。如在K8s中,可通过service连接。
执行效果:
4.3 mc迁移数据
mc迁移数据通常有下面三种场景:
##1. 全量迁移,重名文件不覆盖,如bucket不存在,会自动创建
mc mirror minio2021 minio2023
##2. 只迁移某个bucket,以test为例,迁移的目标bucket需要提前创建
mc mirror minio2021/test minio2023/test #test要提前在minio2023中创建
##3. 加上--overwrite参数,覆盖重名文件
mc mirror --overwrite minio2021 minio2023
mc mirror --overwrite minio2021/test minio2023/te
这里使用第一种全量迁移即可:
完成迁移后,在minio2023上能看到minio的bucket了:
但此时在minio2023界面打开test2021这个bucket,却发现文件无法查看,一直处于loading状态:
此时会发现,nginx错误日志可能会没有报错,且如果绕开nginx代理,直接IP+端口访问,就会是正常的。
浏览器打开F12就会发现,有关于WebSocket的报错,访问bucket发起的是websocket请求:
所以,minio2023的nginx需要加上websocket代理:
#开启websocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
如图:
reload nginx后,再刷新界面,文件加载正常:
数据存与写的区别
进入minio2021和minio2023的数据目录,可以看到数据文件有很大的区别。
在minio2021的数据目录下,看到的是一个一个的文件,与web浏览器端看到的文件一一对应,这些文件可以直接从服务器下载到本地。
这就意味着如果minio的数据目录挂载到服务器本地,则可以直接通过写磁盘的方式将文件写入minio,在minio界面也能正常下载。
但当数据迁移到minio2023后,不管是从minio2021迁移过来的数据,还是新上传的数据,每一个文件,在2023版本的存储目录下都是一个目录,目录下存的是一个.meta元数据文件。
这就意味着在默认情况下,像2021老版本那样直接通过写磁盘的方式将文件写入minio,是行不通了。
minio2023与minio2021文件对比如下图:
至此,整个minio升级和数据迁移完成。