• 使用 docker-compose 部署 golang 的 Athens 私有代理


    go中私有代理搭建

    前言

    最近公司的代理出现问题了,刚好借这个机会来学习下,athens 如何构建私有代理

    为什么选择 athens

    私有化代理的选取标准无非就是下面的几点

    1、托管私有模块;

    2、排除对公有模块的访问;

    3、存储公有模块;

    athens 的特点:

    Athens 首先可以配置访问私有仓库;

    Athens 的会存储每次拉取的包,如果该模块之前没有通过 athens,athens 会向目标地址请求数据,在返回给客户端的时候,会存储该模块到存储中,这样实现了 go mod download永远只会发生一次;

    Athens 处理存储的策略为仅追加,一个模块被保存,它就永远不会改变,即使开发人员对 tag 进行了强推,那么也不会被删除;

    Athens 也可以配置下载策略,过滤一些有安全隐患的包。

    Athens 支持 disk, mongo, gcs, s3, minio, 外部存储/自定义,不过一般建议使用 disk。

    使用 docker-compose 部署

    官方网站已经,提供了通过 docker 和 二进制部署的方案,这里秉着好记性不如烂笔头的原则,这里自己也做了记录

    配置私有仓库的认证信息

    通过 .netrc 文件来配置,里面可以放自己的私有仓库的地址,以及用户,密码认证信息

    # cat .netrc
    machine gitlab.test.com login test-name password test-pass
    

    有几个私有仓库,配置几个就可以了

    配置下载模式

    通过 The download mode (下载模式配置策略)是现在 ATHENS 中比较推崇的,之前通过 Filtering modules(过滤模式)的方法,目前已经被弃用了。

    来看下如何配置

    # DownloadMode defines how Athens behaves when a module@version
    # is not found in storage. There are 4 options:
    # 1. "sync" (default): download the module synchronously and
    # return the results to the client.
    # 2. "async": return 404, but asynchronously store the module
    # in the storage backend.
    # 3. "redirect": return a 301 redirect status to the client
    # with the base URL as the DownloadRedirectURL from below.
    # 4. "async_redirect": same as option number 3 but it will
    # asynchronously store the module to the backend.
    # 5. "none": return 404 if a module is not found and do nothing.
    # 6. "file:<path>": will point to an HCL file that specifies
    # any of the 5 options above based on different import paths.
    # 7. "custom:<base64-encoded-hcl>" is the same as option 6
    # but the file is fully encoded in the option. This is
    # useful for using an environment variable in serverless
    # deployments.
    # Env override: ATHENS_DOWNLOAD_MODE
    DownloadMode = "sync"
    

    通过环境变量 ATHENS_DOWNLOAD_MODE 可指定,也可以修改指定的 config.dev.toml来配置,默认是 sync

    ATHENS_DOWNLOAD_MODE 可指定的内容:

    1、通过 file:<path>指定一个 hcl 文件,里面可以对不同的仓库,设置下载模式;

    2、通过 custom:<base64-encoded-hcl> 指定一个 base64 编码的 HCL 文件;

    3、指定具体的全局策略,sync, async, none, redirect, or async_redirect,这是一个全局的设置,上面的两种是可以定制策略组的。

    来看下具体的下载模式

    • sync: 通过 同步从 VCS 下载模块 go mod download,将其持久化到存储中,并立即将其返回给用户。请注意,这是默认行为;

    • async:向客户端返回 404,并异步下载 module@version 并将其持久化到存储中;

    • none:返回 404 并且什么也不做;

    • redirect:重定向到上游代理(例如proxy.golang.org),之后什么也不做;

    • async_redirect:重定向到上游代理(例如proxy.golang.org)并异步下载 module@version 并将其持久化到存储中;

    下面看下配置策略的 hcl 文件

    # cat download.hcl  
    
    downloadURL = "https://goproxy.cn"
    
    mode = "async_redirect"
    
    download "gitlab.test.com/*" {
        mode = "sync"
    }
    

    部署

    这里使用 docker-composer 部署

    version: '2'
    services:
      athens:
        image: gomods/athens:v0.11.0
        restart: always
        container_name: athens_proxy
        ports:
          - "3000:3000"
        volumes:
          - ./.netrc:/root/.netrc
          - ./athens-storage:/var/lib/athens
          - ./download.hcl:/root/download.hcl
        environment:
          - ATHENS_NETRC_PATH=/root/.netrc
          - ATHENS_STORAGE_TYPE=disk
          - ATHENS_DISK_STORAGE_ROOT=/var/lib/athens
          - ATHENS_GOGET_WORKERS=100
          - ATHENS_DOWNLOAD_MODE=file:/root/download.hcl
          - ATHENS_GONOSUM_PATTERNS=gitlab.test.com
    

    ATHENS_GONOSUM_PATTERNS:配置为私库地址,配置的仓库地址,不会进行安全向校验。

    go 处于安全性考虑,为了保证开发者的依赖库不被人恶意劫持篡改,所以引入了 GOSUMDB 环境变量来设置校验服务器

    当你在本地对依赖进行变动(更新/添加)操作时,Go 会自动去这个服务器进行数据校验,保证你下的这个代码库和世界上其他人下的代码库是一样的。如果有问题,会有个大大的安全提示。当然背后的这些操作都已经集成在 Go 里面了,开发者不需要进行额外的操作。

    对于我们的私有仓库,去公共安全校验库校验,肯定是不能通过校验的,我们可以通过 ATHENS_GONOSUM_PATTERNS 这个环境变量来设置不做校验的代码仓库, 它可以设置多个匹配路径,用逗号相隔。

    启动 docker-compose up -d

    客户端设置代理 export GOPROXY=http://xxxx:3000

    这样就能使用我们的代理服务了

    因为选择的 ATHENS_STORAGE_TYPE 为 disk,athens 服务会在拉取资源包的同时,也会下载资源包到配置的 ATHENS_DISK_STORAGE_ROOT 中。

    使用秘钥的方式认证私有仓库

    上面通过 .netrc 的方式来认证私有仓库,因为账号密码是铭文的总归不太好,可以使用秘钥的方式来认证

    1、配置秘钥

    首先查看电脑有没有秘钥

    # cd .ssh
    # ls
    id_rsa		id_rsa.pub
    

    没有的话通过下面的命令的生成

    # ssh-keygen -t rsa -C "youremail@example.com"
    

    邮箱换成自己的,一路回车即可

    然后将 id_rsa.pub 公钥的内容添加到自己的私有仓库中,如何添加自己 google 吧,比较简单

    2、配置 HTTP 与 SSH 重写规则
    # cat gitconfig 
    [url "ssh://git@gitlab.test.com"]
            insteadOf = https://gitlab.test.com
    
    3、配置 SSH 来绕过主机 SSH 键验证
    # cat config 
    Host gitlab.test.com
    Hostname gitlab.test.com
    StrictHostKeyChecking no
    IdentityFile /root/.ssh/id_rsa
    

    将上面配置的认证信息,映射到容器中即可

    version: '2'
    services:
      athens:
        image: gomods/athens:v0.11.0
        restart: always
        container_name: athens_proxy
        ports:
          - "3000:3000"
        volumes:
          - ./athens-storage:/var/lib/athens
          - ./download.hcl:/root/download.hcl
          - ./gitconfig:/root/.gitconfig
          - ./ssh-keys:/root/.ssh
        environment:
          - ATHENS_STORAGE_TYPE=disk
          - ATHENS_DISK_STORAGE_ROOT=/var/lib/athens
          - ATHENS_GOGET_WORKERS=100
          - ATHENS_DOWNLOAD_MODE=file:/root/download.hcl
          - ATHENS_GONOSUM_PATTERNS=gitlab.test.com
    

    这样即可实现秘钥的认证了

    需要注意私钥的权限,刚开始没注意,执行报了下面的错误

            @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
            @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            Permissions 0644 for '/root/.ssh/id_rsa' are too open.
            It is required that your private key files are NOT accessible by others.
            This private key will be ignored.
            Load key "/root/.ssh/id_rsa": bad permissions
            git@gitlab.test.com: Permission denied (publickey).
            fatal: Could not read from remote repository.
    
    

    看报错就可推断出,是权限太大了,需要私钥文件不能被其他人所访问。

    修改权限就可以了

    ssh-keys # chmod 600 id_rsa
    

    具体的 demo 地址,可参见athens私有代理部署

    参考

    【介绍 ATHENS】https://gomods.io/zh/intro/
    【download】https://github.com/gomods/athens/blob/main/docs/content/configuration/download.md
    【athens构建golang私有代理】https://github.com/boilingfrog/Go-POINT/blob/master/golang/go_environment/athens构建golang私有代理.md
    【使用 docker-compose 部署 golang 的 Athens 私有代理】https://github.com/boilingfrog/Go-POINT/blob/master/golang/go_environment/athens构建golang私有代理.md

  • 相关阅读:
    软件加密系统Themida应用程序保护指南(一):应用信息界面
    SpringBoot @TransactionalEventListener&JavaMailSender使用
    关于Mac配置逆向工程
    【LeetCode】2.两数相加
    CAS 机制的实现原理分析
    501. 二叉搜索树中的众数
    汇凯金业:黄金5g工艺是什么意思
    PID控制算法介绍及使用举例
    python/php/java/nodejs网上租车vue+elementui汽车租赁系统
    【面试刷题】——什么是面向过程 什么是面向对象
  • 原文地址:https://www.cnblogs.com/ricklz/p/16200508.html