Использование зашифрованных GPG учетных данных (или определенных переменных среды) с помощью boot-clj и s3-wagon-private

В загрузочной вики (https://github.com/boot-clj/boot/wiki/S3-Repositories), он указывает, что вы можете встроить учетные данные AWS для использования S3 в качестве репозитория Maven. Это неоптимально с точки зрения безопасности, потому что я не хочу проверять учетные данные AWS, даже если у них ограниченные разрешения.

В leiningen с s3-wagon-private вы можете указать ключ доступа и секретный ключ через переменные среды с помощью:

{: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) в $BOOT_HOME/credentials.clj.gpg. Так что в целом boot поддерживает 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, похоже, не может получить учетные данные и приводит к ошибке 403 от S3.

Я мог бы использовать (System/getenv "AWS_ACCESS_KEY_ID") для прямого чтения переменных env на карте репозитория, я полагаю, но я бы предпочел использовать поддерживаемый механизм, если он есть. Учетные данные, зашифрованные с помощью GPG, были бы для нас идеальным решением, если бы этого можно было достичь как с точки зрения безопасности, так и с помощью настройки нескольких вагонов S3 без манипулирования переменными среды.

Я использую последнюю версию Boot (2.4.2) на OS X El-Capitan. GPG может успешно расшифровать учетные данные в командной строке даже в тихом режиме (работает gpg --quiet --batch --decrypt ~/.boot/credentials.clj.gpg). Помещение учетных данных непосредственно в карту репозитория работает, и тот же файл credentials.clj.gpg работает из lein. Я новичок в Boot, поэтому, возможно, я упускаю что-то очевидное!


person no-man-is-an-island    schedule 01.12.2015    source источник


Ответы (1)


Пожалуйста, обновитесь до 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.

Дополнительные сведения см. в вики.

person Daniel Szmulewicz    schedule 17.12.2015