image.png 转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。请尊重原创,文明转载,谢谢。

背景

前段时间,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

如图: image.png

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数据为空: image.png image.png

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连接。 执行效果: image.png

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

这里使用第一种全量迁移即可: image.png

完成迁移后,在minio2023上能看到minio的bucket了: image.png image.png

但此时在minio2023界面打开test2021这个bucket,却发现文件无法查看,一直处于loading状态: image.png

此时会发现,nginx错误日志可能会没有报错,且如果绕开nginx代理,直接IP+端口访问,就会是正常的。

浏览器打开F12就会发现,有关于WebSocket的报错,访问bucket发起的是websocket请求: image.png

所以,minio2023的nginx需要加上websocket代理:

#开启websocket
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

如图: image.png

reload nginx后,再刷新界面,文件加载正常: image.png

数据存与写的区别

进入minio2021和minio2023的数据目录,可以看到数据文件有很大的区别。

在minio2021的数据目录下,看到的是一个一个的文件,与web浏览器端看到的文件一一对应,这些文件可以直接从服务器下载到本地。

这就意味着如果minio的数据目录挂载到服务器本地,则可以直接通过写磁盘的方式将文件写入minio,在minio界面也能正常下载。

但当数据迁移到minio2023后,不管是从minio2021迁移过来的数据,还是新上传的数据,每一个文件,在2023版本的存储目录下都是一个目录,目录下存的是一个.meta元数据文件。

这就意味着在默认情况下,像2021老版本那样直接通过写磁盘的方式将文件写入minio,是行不通了。

minio2023与minio2021文件对比如下图: image.png

至此,整个minio升级和数据迁移完成。