minio最新源码编译(处置惩罚安全扫描中跨域访问、.js.map等不安全题目) 版 ...

打印 上一主题 下一主题

主题 1654|帖子 1654|积分 4962

编译前留意事项

   

  • 编译基于tag为RELEASE.2024-06-26T01-06-18Z的版本
  • 处置惩罚安全扫描题目。如:敏感信息泄露、.js.map、跨域访问题目
  • 须要预备两个工程,前端工程console和minio工程, 目次布局处置惩罚:
  1. gowork/
  2. └── src/
  3.     ├── github.com
  4.                     ├── minio/
  5.                             └── minio/
  6.                             └── console/
复制代码
  

  • 若想直接使用处置惩罚后的源码,可以克隆minio仓库举行编译即可,(此中依赖的console已经更换成
    replace github.com/minio/console => gogs.zyjblogs.cn/minio/console v1.6.1-fix
  1. git clone -b RELEASE.2024-06-26T01-06-18Z-fix https://gogs.zyjblogs.cn/minio/minio
复制代码
  

  • 若想直接使用修改后的minio二进制文件,详见蓝奏云链接:
  1. https://zyjblogs.lanzout.com/b02sez6txe
  2. 密码:8i7d
复制代码
  

  • 若想自行修改详见下文。
  console编译

拉取minio的前端工程console

   前端工程在console工程下web-app目次
  1. #github.com上的仓库
  2. git clone https://github.com/minio/console.git
  3. #国内镜像加速仓库 gitcode
  4. https://gitcode.com/gh_mirrors/console/console.git
复制代码
修改package.json

   在build下添加 GENERATE_SOURCEMAP=false关闭sourcemap
  1. "scripts": {
  2.     "start": "PORT=5005 react-scripts start",
  3.     "build": "GENERATE_SOURCEMAP=false react-scripts build",
  4.     "buildistanbulcoverage": "PORT=9090 USE_BABEL_PLUGIN_ISTANBUL=1 react-app-rewired build",
  5.     "test": "react-scripts test",
  6.     "eject": "react-scripts eject",
  7.     "playwright": "PORT=5005 USE_BABEL_PLUGIN_ISTANBUL=1 react-app-rewired start",
  8.     "find-deadcode": "ts-prune -s consoleApi.ts | sh -c '(! grep -v "used in module")'"
  9.   },
复制代码
如修改下图所示:

编译

   安装依赖
  1. #安装依赖
  2. yarn install
  3. #若出现证书问题可以忽略证书
  4. ## linux
  5. export NODE_TLS_REJECT_UNAUTHORIZED=0 && yarn install
  6. ## windows
  7. set NODE_TLS_REJECT_UNAUTHORIZED=0 && yarn install
复制代码
  编译前删除console工程下web-app/build目次
  1. yarn build
复制代码
修改获取不存在文件.js.map时返回文件且内容为index.html内容题目

   console中有一个逻辑是访问不存在静态资源时会返回index.html的内容,由于安全毛病扫描缘故原由访问.js.map文件成功,固然内容为index.html的内容,但是避免这类题目举行如下处置惩罚。
    修改文件 api/configure_console.go
  

  • 导入os库
  1. import (
  2.   "os"
  3.    // 其他库
  4. )
复制代码

  • 添加情况变量MINIO_HTTP_SERVER_INFO
   修改通用的哀求头Server显示的信息(默以为MinIO Console),举行自定义防止文件服务信息被泄露
修改方法FileServerMiddleware
  1. func FileServerMiddleware(next http.Handler) http.Handler {
  2.         return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  3.                 serverInfo := os.Getenv("MINIO_HTTP_SERVER_INFO")
  4.                 if serverInfo == "" {
  5.                         serverInfo = globalAppName
  6.                 }
  7.                 w.Header().Set("Server", serverInfo) // do not add version information
  8.                 switch {
  9.                 case strings.HasPrefix(r.URL.Path, "/ws"):
  10.                         serveWS(w, r)
  11.                 case strings.HasPrefix(r.URL.Path, "/api"):
  12.                         next.ServeHTTP(w, r)
  13.                 default:
  14.                         buildFs, err := fs.Sub(portal_ui.GetStaticAssets(), "build")
  15.                         if err != nil {
  16.                                 panic(err)
  17.                         }
  18.                         wrapHandlerSinglePageApplication(requestBounce(http.FileServer(http.FS(buildFs)))).ServeHTTP(w, r)
  19.                 }
  20.         })
  21. }
复制代码
如修改下图所示:


  • 拦截.js.map
   访问不存在资源且资源为资源为.js.map资源时返回404
修改方法wrapHandlerSinglePageApplication
  1. func wrapHandlerSinglePageApplication(h http.Handler) http.HandlerFunc {
  2.         return func(w http.ResponseWriter, r *http.Request) {
  3.                 if r.URL.Path == "/" {
  4.                         handleSPA(w, r)
  5.                         return
  6.                 }
  7.                 w.Header().Set("Content-Type", mimedb.TypeByExtension(filepath.Ext(r.URL.Path)))
  8.                 nfw := &notFoundRedirectRespWr{ResponseWriter: w}
  9.                 h.ServeHTTP(nfw, r)
  10.                 if nfw.status == http.StatusNotFound {
  11.                         // 拦截 .js.map 文件
  12.                         if strings.HasSuffix(r.URL.Path, ".js.map") {
  13.                                 http.NotFound(w, r)
  14.                                 return
  15.                         }
  16.                         handleSPA(w, r)
  17.                 }
  18.         }
  19. }
复制代码
如修改下图所示:

minio编译

拉取minio工程

  1. #github.com上的仓库
  2. git clone https://github.com/minio/minio.git
  3. #国内镜像加速仓库 gitcode
  4. https://gitcode.com/gh_mirrors/mi/minio.git
复制代码
处置惩罚go.mod文件

   添加更换文件中依赖github.com/minio/console为../console
  1. # 若为本地源代码执行下面命令进行处理
  2. go mod edit --replace github.com/minio/console=../console
  3. # 若想使用已经修改完成的console则使用
  4. go mod edit --replace github.com/minio/console=gogs.zyjblogs.cn/minio/console@v1.6.1-fix
复制代码
依赖下载

  1. go clean -modcache
  2. go mod download
  3. go mod tidy
复制代码
修改项目源码


  • 配置crossdomain.xml
   原始minio访问crossdomain.xml可以看到返回xml内容:
  1. <?xml version="1.0"?>
  2. <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"><cross-domain-policy>
  3.     <allow-access-from domain="*" secure="false" />
  4. </cross-domain-policy>
复制代码
  该配置安全扫描为不安全项,须要设置allow-access-from为具体的域名。
现在把它修改为,读取配置的情况变量,然后设置为具体的域名,让其返回类似下面的xml,不能使用*号
  1. <?xml version="1.0"?>
  2. <!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
  3. <cross-domain-policy>
  4.     <allow-access-from domain="*.baidu.com" secure="false" />
  5.     <allow-access-from domain="zyjblogs.cn" secure="false" />
  6. </cross-domain-policy>
复制代码
修改步骤:
(1)修改项目中的internal/config/constants.go文件,参加须要读取情况的名称,具体看修改后源码
   const{}内添加两个情况变量,位置在 86~91行左右。 constants.go
  1. const (
  2.     //.....
  3.    
  4.         // 以下是自定的环境变量参数
  5.         // EnvMinIOAllowAccessFromDomain crossdomain.xml cross-domain-policy
  6.         EnvMinIOAllowAccessFromDomain = "MINIO_ALLOW_ACCESS_FROM_DOMAIN"
  7.         // EnvMinIOServerInfo api 通用的请求头Server显示的信息,进行自定义防止文件服务信息被泄露
  8.         EnvMinIOServerInfo = "MINIO_HTTP_SERVER_INFO"
  9. )
复制代码
如修改下图所示:

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

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

   

  • 更换方法setCrossDomainPolicyMiddleware为如下内容。 位置
  1. func setCrossDomainPolicyMiddleware(h http.Handler) http.Handler {
  2.         // get env MINIO_ALLOW_ACCESS_FROM_DOMAIN
  3.         allowAccessFromDomain := os.Getenv(config.EnvMinIOAllowAccessFromDomain)
  4.         if allowAccessFromDomain == "" {
  5.                 allowAccessFromDomain = "*"
  6.         }
  7.         // logger.Info("MINIO_ALLOW_ACCESS_FROM_DOMAIN=%s", allowAccessFromDomain)
  8.         // 如果配置了多个就需要解析一下
  9.         domains := strings.Split(allowAccessFromDomain, ",")
  10.         allowAccessFrom := crossDomainXMLPrefix
  11.         for _, domain := range domains {
  12.                 // fill string template
  13.                 buffer := &bytes.Buffer{}
  14.                 tmpl, _ := template.New("tmp").Parse(allowAccessFromTemplate)
  15.                 data := struct{ Domain string }{Domain: domain}
  16.                 _ = tmpl.Execute(buffer, data)
  17.                 allowAccessFrom += buffer.String()
  18.         }
  19.         allowAccessFrom += crossDomainXMLSuffix
  20.         // Write to ServeHTTP
  21.         return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  22.                 // Look for 'crossdomain.xml' in the incoming request.
  23.                 if r.URL.Path == crossDomainXMLEntity {
  24.                         // Write the standard cross domain policy xml.
  25.                         w.Write([]byte(allowAccessFrom))
  26.                         // Request completed, no need to serve to other handlers.
  27.                         return
  28.                 }
  29.                 h.ServeHTTP(w, r)
  30.         })
  31. }
复制代码
  然后访问对应的所在,即可使用配置的xml。
添加情况变量: MINIO_ALLOW_ACCESS_FROM_DOMAIN=http://localhost,http://127.0.0.1
http://IPORT/crossdomain.xml
  结果如图所示:

(3) 添加功能:自定义相应头Server的信息
   哀求minio接口时,返回的哀求头会返回Server: MinIO ,如许扫描会被针对扫描,须要修改为自定义的信息,例如如许:Server: MyOSS ,如许就可以不会暴暴露文件服务器的信息了。
    直接修改cmd/api-headers.go文件中的setCommonHeaders方法,读取配置情况变量,修改代码如下。可参考api-headers.go第55~59行
  1. func setCommonHeaders(w http.ResponseWriter) {
  2.         // Set the "Server" http header.
  3.         // w.Header().Set(xhttp.ServerInfo, MinioStoreName)
  4.         // Set the "Server" http header.
  5.         serverInfo := os.Getenv(config.EnvMinIOServerInfo)
  6.         if serverInfo == "" {
  7.                 serverInfo = MinioStoreName
  8.         }
  9.         w.Header().Set(xhttp.ServerInfo, serverInfo)
  10.         // Set `x-amz-bucket-region` only if region is set on the server
  11.         // by default minio uses an empty region.
  12.         if region := globalSite.Region(); region != "" {
  13.                 w.Header().Set(xhttp.AmzBucketRegion, region)
  14.         }
  15.         w.Header().Set(xhttp.AcceptRanges, "bytes")
  16.         // Remove sensitive information
  17.         crypto.RemoveSensitiveHeaders(w.Header())
  18. }
复制代码
如修改下图所示:

(4)添加功能:追加安全扫描提示的相应头
   安全扫描提示须要相应头
  1. Referrer-Policy: strict-origin-when-cross-origin
  2. Strict-Transport-Security: max-age=31536000; includeSubDomains
  3. X-Content-Type-Options: nosniff
  4. X-Frame-Options: SAMEORIGIN
  5. X-Permitted-Cross-Domain-Policies: master-only
  6. X-Xss-Protection: 1; mode=block
复制代码
  修改步骤:修改cmd/generic-handlers.go文件的addCustomHeadersMiddleware方法,把缺少的相应头追加上即可,可参考修改后的源码generic-handlers.go第535~557行。
  1. // 追加其他的请求头(安全漏洞提示处理)
  2. header.Set("X-Permitted-Cross-Domain-Policies", "master-only")
  3. header.Set("Referrer-Policy", "strict-origin-when-cross-origin")
  4. header.Set("X-Frame-Options", "SAMEORIGIN")
复制代码
如修改下图所示:

   使用情况变量: export MINIO_HTTP_SERVER_INFO=MyOSS
  结果如图所示:

编译项目

   在minio工程下实行如下命令
参数介绍 go build -ldflags "-s -w" -o 编译后的二进制文件 项目工程目次
在minio工程实行构建命令时,使用.代表当前目次
  1. # window
  2. go build -ldflags "-s -w" -o E:\minio.exe .
  3. # linux
  4. go build -ldflags "-s -w" -o ~/minio .
复制代码
运行文件服务

使用情况变量配置启动参数:
  1. export MINIO_ROOT_USER=minioadmin
  2. export MINIO_ROOT_PASSWORD=minioadmin
  3. #export MINIO_BROWSER=false
  4. export MINIO_API_CORS_ALLOW_ORIGIN="https://*.zyjblogs.cn,https://*example.com"
  5. #新添加的参数
  6. export MINIO_ALLOW_ACCESS_FROM_DOMAIN=*.zyjblogs.cn,*example.com
  7. 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端口启动文件服务:
  1. #!/bin/bash
  2. export MINIO_ROOT_USER=minioadmin
  3. export MINIO_ROOT_PASSWORD=minioadmin
  4. #export MINIO_BROWSER=false
  5. export MINIO_API_CORS_ALLOW_ORIGIN="https://*.zyjblogs.cn,https://*example.com"
  6. export MINIO_ALLOW_ACCESS_FROM_DOMAIN=*.zyjblogs.cn,*example.com
  7. export MINIO_HTTP_SERVER_INFO=MyOSS
  8. nohup ./minio server data > minio.log 2>&1 &
复制代码
检查配置是否生效

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

耶耶耶耶耶

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表