minio最新源码编译(处理安全扫描中跨域访问、.js.map等不安全问题) 版本:RELEASE.2024-06-26T01-06-18Z

编译前注意事项

  1. 编译基于tag为RELEASE.2024-06-26T01-06-18Z的版本
  2. 处理安全扫描问题。如:敏感信息泄露、.js.map、跨域访问问题
  3. 需要准备两个工程,前端工程console和minio工程, 目录结构处理:
gowork/
│
└── src/├── github.com├── minio/└── minio/└── console/
  1. 若想直接使用处理后的源码,可以克隆minio仓库进行编译即可,(其中依赖的console已经更换成
    replace github.com/minio/console => gogs.zyjblogs.cn/minio/console v1.6.1-fix
git clone -b RELEASE.2024-06-26T01-06-18Z-fix https://gogs.zyjblogs.cn/minio/minio
  1. 若想直接使用修改后的minio二进制文件,详见蓝奏云链接: minio.tar.gz - 蓝奏云 (lanzout.com)
  2. 若想自行修改详见下文。

console编译

拉取minio的前端工程console

前端工程在console工程下web-app目录

#github.com上的仓库
git clone https://github.com/minio/console.git
#国内镜像加速仓库 gitcode
https://gitcode.com/gh_mirrors/console/console.git

修改package.json

在build下添加 GENERATE_SOURCEMAP=false关闭sourcemap

"scripts": {"start": "PORT=5005 react-scripts start","build": "GENERATE_SOURCEMAP=false react-scripts build","buildistanbulcoverage": "PORT=9090 USE_BABEL_PLUGIN_ISTANBUL=1 react-app-rewired build","test": "react-scripts test","eject": "react-scripts eject","playwright": "PORT=5005 USE_BABEL_PLUGIN_ISTANBUL=1 react-app-rewired start","find-deadcode": "ts-prune -s consoleApi.ts | sh -c '(! grep -v \"used in module\")'"},

如修改下图所示:
image.png

编译

安装依赖

#安装依赖
yarn install
#若出现证书问题可以忽略证书
## linux
export NODE_TLS_REJECT_UNAUTHORIZED=0 && yarn install
## windows
set NODE_TLS_REJECT_UNAUTHORIZED=0 && yarn install

编译前删除console工程下web-app/build目录

yarn build

修改获取不存在文件.js.map时返回文件且内容为index.html内容问题

console中有一个逻辑是访问不存在静态资源时会返回index.html的内容,因为安全漏洞扫描原因访问.js.map文件成功,虽然内容为index.html的内容,但是避免这类问题进行如下处理。

修改文件 api/configure_console.go

  1. 导入os库
import ("os"// 其他库
)
  1. 添加环境变量MINIO_HTTP_SERVER_INFO

修改通用的请求头Server显示的信息(默认为MinIO Console),进行自定义防止文件服务信息被泄露
修改方法FileServerMiddleware

func FileServerMiddleware(next http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {serverInfo := os.Getenv("MINIO_HTTP_SERVER_INFO")if serverInfo == "" {serverInfo = globalAppName}w.Header().Set("Server", serverInfo) // do not add version informationswitch {case strings.HasPrefix(r.URL.Path, "/ws"):serveWS(w, r)case strings.HasPrefix(r.URL.Path, "/api"):next.ServeHTTP(w, r)default:buildFs, err := fs.Sub(portal_ui.GetStaticAssets(), "build")if err != nil {panic(err)}wrapHandlerSinglePageApplication(requestBounce(http.FileServer(http.FS(buildFs)))).ServeHTTP(w, r)}})
}

如修改下图所示:
image.png

  1. 拦截.js.map

访问不存在资源且资源为资源为.js.map资源时返回404
修改方法wrapHandlerSinglePageApplication

func wrapHandlerSinglePageApplication(h http.Handler) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {if r.URL.Path == "/" {handleSPA(w, r)return}w.Header().Set("Content-Type", mimedb.TypeByExtension(filepath.Ext(r.URL.Path)))nfw := &notFoundRedirectRespWr{ResponseWriter: w}h.ServeHTTP(nfw, r)if nfw.status == http.StatusNotFound {// 拦截 .js.map 文件if strings.HasSuffix(r.URL.Path, ".js.map") {http.NotFound(w, r)return}handleSPA(w, r)}}
}

如修改下图所示:
image.png

minio编译

拉取minio工程

#github.com上的仓库
git clone https://github.com/minio/minio.git
#国内镜像加速仓库 gitcode
https://gitcode.com/gh_mirrors/mi/minio.git

处理go.mod文件

添加替换文件中依赖github.com/minio/console../console

# 若为本地源代码执行下面命令进行处理
go mod edit --replace github.com/minio/console=../console
# 若想使用已经修改完成的console则使用
go mod edit --replace github.com/minio/console=gogs.zyjblogs.cn/minio/console@v1.6.1-fix

依赖下载

go clean -modcache
go mod download
go mod tidy

修改项目源码

  1. 配置crossdomain.xml

原始minio访问crossdomain.xml可以看到返回xml内容:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"><cross-domain-policy><allow-access-from domain="*" secure="false" />
</cross-domain-policy>

该配置安全扫描为不安全项,需要设置allow-access-from为具体的域名。
现在把它修改为,读取配置的环境变量,然后设置为具体的域名,让其返回类似下面的xml,不能使用*

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy><allow-access-from domain="*.baidu.com" secure="false" /><allow-access-from domain="zyjblogs.cn" secure="false" />
</cross-domain-policy>

修改步骤:

(1)修改项目中的internal/config/constants.go文件,加入需要读取环境的名称,具体看修改后源码

const{}内添加两个环境变量,位置在 86~91行左右。 constants.go

const (//.....// 以下是自定的环境变量参数// EnvMinIOAllowAccessFromDomain crossdomain.xml cross-domain-policyEnvMinIOAllowAccessFromDomain = "MINIO_ALLOW_ACCESS_FROM_DOMAIN"// EnvMinIOServerInfo api 通用的请求头Server显示的信息,进行自定义防止文件服务信息被泄露EnvMinIOServerInfo = "MINIO_HTTP_SERVER_INFO"
)

如修改下图所示:

(2)然后修改crossdomain.xml对应的处理类cmd/crossdomain-xml-handler.go,修改读取环境变量配置的值,具体查看修改后的文件[crossdomain-xml-handler.go](minio/minio @ RELEASE.2024-06-26T01-06-18Z-fix - 逝水无痕の代码仓库 (zyjblogs.cn)。

  1. 在变量crossDomainXML后添如下代码。代码位置32行位置
// 自定义crossdomain.xml
const crossDomainXMLPrefix = `<?xml version="1.0"?><!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"><cross-domain-policy>`
const crossDomainXMLSuffix = `</cross-domain-policy>`
const allowAccessFromTemplate = `<allow-access-from domain="{{.Domain}}" secure="false" />`

如修改下图所示:
image.png

  1. 替换方法setCrossDomainPolicyMiddleware为如下内容。 位置

func setCrossDomainPolicyMiddleware(h http.Handler) http.Handler {// get env MINIO_ALLOW_ACCESS_FROM_DOMAINallowAccessFromDomain := os.Getenv(config.EnvMinIOAllowAccessFromDomain)if allowAccessFromDomain == "" {allowAccessFromDomain = "*"}// logger.Info("MINIO_ALLOW_ACCESS_FROM_DOMAIN=%s", allowAccessFromDomain)// 如果配置了多个就需要解析一下domains := strings.Split(allowAccessFromDomain, ",")allowAccessFrom := crossDomainXMLPrefixfor _, domain := range domains {// fill string templatebuffer := &bytes.Buffer{}tmpl, _ := template.New("tmp").Parse(allowAccessFromTemplate)data := struct{ Domain string }{Domain: domain}_ = tmpl.Execute(buffer, data)allowAccessFrom += buffer.String()}allowAccessFrom += crossDomainXMLSuffix// Write to ServeHTTPreturn http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {// Look for 'crossdomain.xml' in the incoming request.if r.URL.Path == crossDomainXMLEntity {// Write the standard cross domain policy xml.w.Write([]byte(allowAccessFrom))// Request completed, no need to serve to other handlers.return}h.ServeHTTP(w, r)})
}

然后访问对应的地址,即可使用配置的xml。
添加环境变量: MINIO_ALLOW_ACCESS_FROM_DOMAIN=http://localhost,http://127.0.0.1
http://IP:PORT/crossdomain.xml

效果如图所示:
image.png

(3) 添加功能:自定义响应头Server的信息

请求minio接口时,返回的请求头会返回Server: MinIO ,这样扫描会被针对扫描,需要修改为自定义的信息,例如这样:Server: MyOSS ,这样就可以不会暴露出文件服务器的信息了。

直接修改cmd/api-headers.go文件中的setCommonHeaders方法,读取配置环境变量,修改代码如下。可参考api-headers.go第55~59行

func setCommonHeaders(w http.ResponseWriter) {// Set the "Server" http header.// w.Header().Set(xhttp.ServerInfo, MinioStoreName)// Set the "Server" http header.serverInfo := os.Getenv(config.EnvMinIOServerInfo)if serverInfo == "" {serverInfo = MinioStoreName}w.Header().Set(xhttp.ServerInfo, serverInfo)// Set `x-amz-bucket-region` only if region is set on the server// by default minio uses an empty region.if region := globalSite.Region(); region != "" {w.Header().Set(xhttp.AmzBucketRegion, region)}w.Header().Set(xhttp.AcceptRanges, "bytes")// Remove sensitive informationcrypto.RemoveSensitiveHeaders(w.Header())
}

如修改下图所示:
image.png

(4)添加功能:追加安全扫描提示的响应头

安全扫描提示需要响应头

Referrer-Policy: strict-origin-when-cross-origin
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Permitted-Cross-Domain-Policies: master-only
X-Xss-Protection: 1; mode=block

修改步骤:修改cmd/generic-handlers.go文件的addCustomHeadersMiddleware方法,把缺少的响应头追加上即可,可参考修改后的源码generic-handlers.go第535~557行。

// 追加其他的请求头(安全漏洞提示处理)
header.Set("X-Permitted-Cross-Domain-Policies", "master-only")
header.Set("Referrer-Policy", "strict-origin-when-cross-origin")
header.Set("X-Frame-Options", "SAMEORIGIN")

如修改下图所示:
image.png

使用环境变量: export MINIO_HTTP_SERVER_INFO=MyOSS

效果如图所示:
image.png

编译项目

在minio工程下执行如下命令
参数介绍 go build -ldflags "-s -w" -o 编译后的二进制文件 项目工程目录
在minio工程执行构建命令时,使用.代表当前目录

# window 
go build -ldflags "-s -w" -o E:\minio.exe .
# linux
go build -ldflags "-s -w" -o ~/minio .

运行文件服务

使用环境变量配置启动参数:

export MINIO_ROOT_USER=minioadmin
export MINIO_ROOT_PASSWORD=minioadmin
#export MINIO_BROWSER=false
export MINIO_API_CORS_ALLOW_ORIGIN="https://*.zyjblogs.cn,https://*example.com"
#新添加的参数
export MINIO_ALLOW_ACCESS_FROM_DOMAIN=*.zyjblogs.cn,*example.com
export MINIO_HTTP_SERVER_INFO=MyOSS

变量说明:

变量名称说明
MINIO_ROOT_USER管理控制台账号
MINIO_ROOT_PASSWORD管理控制台密码
MINIO_BROWSERoff关闭web控制台
MINIO_API_CORS_ALLOW_ORIGINapi可使用域名
MINIO_ALLOW_ACCESS_FROM_DOMAIN[new] crossdomain.xml文件的域名配置
MINIO_HTTP_SERVER_INFO[new] 响应头Server的信息

使用9000端口启动文件服务:

#!/bin/bash
export MINIO_ROOT_USER=minioadmin
export MINIO_ROOT_PASSWORD=minioadmin
#export MINIO_BROWSER=false
export MINIO_API_CORS_ALLOW_ORIGIN="https://*.zyjblogs.cn,https://*example.com"
export MINIO_ALLOW_ACCESS_FROM_DOMAIN=*.zyjblogs.cn,*example.com
export MINIO_HTTP_SERVER_INFO=MyOSS
nohup ./minio server data > minio.log 2>&1 &

检查配置是否生效
image.png

参考:
https://www.cnblogs.com/lixingwu/p/17933091.html
https://blog.csdn.net/LoveTheMost/article/details/138950398

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/416263.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为 HCIP-Datacom H12-821 题库 (6)

有需要题库的可以看主页置顶 V群仅进行学习交流 1.转发表中 FLAG 字段中B 的含义是&#xff1f; A、可用路由 B、静态路由 C、黑洞路由 D、网关路由 答案&#xff1a;C 解析&#xff1a; 可用路由用U 表示&#xff0c;静态路由用 S 表示&#xff0c;黑洞路由用 B 表示&#x…

原油市场“闪崩”,国际油价单日下跌超4%!

KlipC报道&#xff1a;当地时间9月3日周二&#xff0c;延续早些时候的跌势&#xff0c;国际油价暴跌。WTI原油收跌近4.4%&#xff0c;逼近70美元大关&#xff1b;布伦特原油跌破75美元&#xff0c;跌幅4.86%&#xff0c;均抹去今年所有涨幅。 据悉&#xff0c;受到威胁后逃离了…

系统编程-数据库

数据库 目录 数据库 引入 1、先安装数据库 2、数据库设置密码 3、数据库的进入和退出(前提 你的密码更改过了) 数据库的基本操作 1、显示所有的数据库 2、创建数据库 3、删除数据库 4、选择数据库 在数据库中对表进行操作 1、查看当前数据库中的表 2、在数据库中…

如何在算家云搭建Qwen2(智能对话)

一、Qwen2简介 Qwen2 是由阿里云通义千问团队研发的新一代大型语言模型系列&#xff0c;它在多个方面实现了技术的飞跃和性能的显著提升。以下是对 Qwen2 的详细介绍&#xff1a; GitHub - QwenLM/Qwen2: Qwen2 is the large language model series developed by Qwen team, …

GD32 Flash读写与存储数据操作,亲测可用

这里写自定义目录标题 联系作者请加一、GD32 Flash特性二、Flash读写操作1. Flash读取操作2. Flash写入操作三、注意事项四、其他方法联系作者请加 如有技术问题及项目需求请加作者微信! 一、GD32 Flash特性 存储空间划分:GD32的Flash存储空间通常分为主存储块和信息块。主存…

SpringBoot学习(5)(springboot整合mybatis)

目录 1、整合mybatis基本介绍 &#xff08;1&#xff09;spring整合mybatis &#xff08;2&#xff09;springboot整合mybatis 2、案例&#xff08;根据用户id&#xff0c;返回用户所有信息&#xff09; &#xff08;1&#xff09;新建数据库连接、数据库、表。插入值 &a…

探索MongoDB的Python之钥:pymongo的魔力

文章目录 探索MongoDB的Python之钥&#xff1a;pymongo的魔力背景&#xff1a;为什么选择pymongo&#xff1f;简介&#xff1a;pymongo是什么&#xff1f;安装&#xff1a;如何将pymongo纳入你的项目&#xff1f;基础用法&#xff1a;五个核心函数介绍1. 连接到MongoDB2. 选择数…

【Spring Boot 3】【Web】自定义过滤器

【Spring Boot 3】【Web】自定义过滤器 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费…

【数据分享】2000-2022年我国省市县三级的逐日O3数据(免费获取\excel\shp格式)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000-2022年的省市县三级的逐日PM2.5数据、2013-2022年的省市县三级的逐日CO数据、2013-2022年的省市县三级的逐日SO2数据、2008-2022年我国省市县三级的逐日NO2数据和2000-2022年我国省市县三级…

ubuntu20.04(wsl2)测试 arcface 人脸识别(计算特征向量)

1. 参考博客和代码、模型仓库&#xff1a; 1.1. 【C随记】collect2: error: ld returned 1 exit status错误分析与解决 1.2. Visual Studio 2022新建 cmake 工程测试 tensorRT 自带样例 sampleOnnxMNIST 1.3.报错&#xff1a;ModuleNotFoundError: No module named ‘ten…

基于tesseract实现文档OCR识别

导入环境 导入必要的库 numpy: 用于处理数值计算。 argparse: 用于处理命令行参数。 cv2: OpenCV库&#xff0c;用于图像处理。 import numpy as np import argparse import cv2设置命令行参数 ap argparse.ArgumentParser() ap.add_argument("-i", "--imag…

视频集中存储智能边缘计算网关软硬一体机智能边缘计算网关应用场景

在信息化飞速发展的今天&#xff0c;数据处理的速度和效率直接影响到各行各业的运作和发展。传统的云计算模式虽然强大&#xff0c;但在面对实时性和带宽要求越来越高的应用场景时&#xff0c;往往显得力不从心。此时&#xff0c;智能边缘计算网关的出现&#xff0c;为我们带来…

长效静态代理IP推荐:天启代理IP的优势与应用

在如今这个互联网的时代&#xff0c;代理IP已成为许多网络活动的必备工具。相比动态代理IP&#xff0c;长效静态代理IP以其稳定性和长时间有效性&#xff0c;成为了许多用户的首选。今天&#xff0c;我们将深入探讨长效静态代理IP的优势&#xff0c;并重点推荐天启代理IP。 什…

Docker compose 安装 ELK

1. 简介 方案概述 我们使用 Filebeat 作为日志收集器&#xff0c;接入到 Redis 队列&#xff0c;然后消费队列中的日志数据流转到 Logstash 中进行解析处理&#xff0c;最后输出到 Elasticsearch 中&#xff0c;再由 Kibana 展示到页面上。我们采用 Elasticsearch 3 节点集群…

web前端-网页

一、网页 1.网页 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”&#xff0c;通常是 HTML格式的文件&#xff0c;它要通过浏览器来阅读。 网页是构成网站的基本元素,它通常由图片、链接、文字、声…

婚宴时扫码查桌号

如何通过关键词查询信息&#xff1f; 在婚宴这一喜庆的时刻&#xff0c;确保每位宾客都能迅速找到自己的座位是至关重要的。为了使这一过程更加流畅和高效&#xff0c;我们特别引入了扫码查桌号服务。以下是详细的操作指南&#xff0c;帮助您快速掌握如何使用此服务&#xff0c…

缓存:浅谈双写导致的数据一致性问题

从理论上来说&#xff0c;给缓存设置过期时间&#xff0c;是保证最终一致性的解决方案。这种方案下&#xff0c;我们对存入缓存的数据设置过期时间&#xff0c;所有的写操作以数据库为准&#xff0c;对缓存操作只是尽最大努力更新即可。也就是说如果数据库写成功&#xff0c;缓…

C++11新增特性:列表初始化(std::initializer_list) decltype、auto、nullptr、范围for

C11新增特性&#xff1a;列表初始化&#xff08;std::initializer_list&#xff09;& decltype、auto、nullptr、范围for 一、C11新增统一初始化方式1.1 新增方式1.2 初始化容器底层原理&#xff08;std::initializer_list&#xff09; 二、新增声明2.1 decltype2.3 auto &…

网络安全服务基础Windows--第10节-FTP主动与被动模式

概述 将某台计算机中的⽂件通过⽹络传送到可能相距很远的另⼀台计算机中&#xff0c;是⼀项基本的⽹络应⽤&#xff0c;即⽂件传送。 ⽂件传送协议FTP &#xff08;File Transfer Protocol&#xff09;是因特⽹上使⽤得最⼴泛的⽂件传送协议。 FTP是⼀个⽼早的⽹络协议&…

VMware 虚拟化平台部分问题和优化措施汇总

本文整理记录了VMware 虚拟化平台部分问题和优化措施。 1、vCLS虚拟机无法启动&#xff1a; 修改办法&#xff0c;参照本人下文&#xff1a; vCLS报错处理&#xff08;缺少功能“MWAIT”&#xff0c;没有与虚拟机兼容的主机&#xff09; 2、优化存储卷的路径选择策略 ESXi…