使用GPG加密的凭证(或特定的环境变量),引导clj和s3 wagon私有



在引导wiki中(https://github.com/boot-clj/boot/wiki/S3-Repositories),它指定您可以使用S3作为Maven repo来内联AWS凭据。从安全角度来看,这是次优的,因为我不想检查AWS信用,即使他们的权限有限。

在具有s3 wagon private的leiningen中,您可以通过以下环境变量指定访问密钥和密钥:

{:url "s3p://acme/repo/"
 :username :env
 :passphrase :env} 

或者,从特定的env变量,使用:

{:url "s3p://acme/repo/"
 :username :env/aws_access_key_id
 :passphrase :env/aws_secret_access_key}

或者使用GPG加密的~/.lein/credentials.clj.gpg文件,其中包含:

{:url "s3p://acme/repo/"
 :creds :gpg}

引导中的push任务似乎支持GPG加密凭据以部署到Clojars(https://github.com/boot-clj/boot/wiki/Deploying-with-Boot)在CCD_ 3中。所以,一般来说,引导支持GPG。

当我尝试任何一种环境变量方法时,我都会得到以下错误,表明不支持这种形式的凭据:

java.lang.IllegalArgumentException: No matching ctor found for class org.sonatype.aether.repository.Authentication
                                                 ...                                        
      cemerick.pomegranate.aether/set-authentication  aether.clj:  165
         cemerick.pomegranate.aether/make-repository  aether.clj:  185
cemerick.pomegranate.aether/resolve-dependencies*/fn  aether.clj:  712
...

GPG方法似乎无法获取凭证,并导致S3出现403错误。

我想我可以使用(System/getenv "AWS_ACCESS_KEY_ID")直接读取存储库映射中的env变量,但如果有支持的机制,我宁愿使用支持的机制。如果从安全角度以及在不处理环境变量的情况下设置多个S3 Wagon都能实现这一点,那么GPG加密证书将是我们的理想解决方案。

我在OS X El Capitan上使用最新的Boot(2.4.2)。GPG可以在命令行上成功解密凭据,即使在安静模式下也是如此(gpg --quiet --batch --decrypt ~/.boot/credentials.clj.gpg有效)。将凭据直接放在存储库映射起作用,而相同的credentials.clj.gpg文件从lein起作用。不过我是新手,所以我可能错过了一些显而易见的东西!

请更新到Boot clj 2.5.0,它大大简化了gpg签名和加密。它现在利用gpg二进制文件,并在不进行进一步配置的情况下进行设置。

GPG加密的凭证和环境变量通过内置的configure-repositories!功能得到支持。它接受一个将在存储库映射上操作的函数。只要返回存储库映射,就可以在主体中执行任何操作。

因此,在您的情况下,对于GPG加密凭据:

(configure-repositories!
  (let [creds-file (File. (boot.App/bootdir) "credentials.gpg")
        creds-data (gpg-decrypt creds-file :as :edn)]
          (fn [{:keys [url] :as repo-map}]
             (merge repo-map (creds-data url)))))

对于环境变量:

(configure-repositories!
  (fn [{:keys [url] :as repo-map}]
    (->> (condp re-find url
            #"^https://example.org/repo"
            {:username (get-sys-env "EXAMPLE_USER" :required)
            :password (get-sys-env "EXAMPLE_PASS" :required)}
            #".*" nil)
         (merge repo-map))))

把它放在boot.profile中是个好地方。

有关wiki 的更多信息

相关内容

  • 没有找到相关文章

最新更新