Ошибка Libcrypto в контейнере Docker в конвейере Azure DevOps

У меня есть конвейер Azure DevOps, который я использую для Terragrunt CI. Исходные модули Terraform, которые я использую в своем репозитории, хранятся во втором репозитории, поэтому для запуска terragrunt plan вам понадобится ключ SSH. Конвейер выполняет все команды Terragrunt в контейнере Docker, и я добавляю ключи SSH в указанный контейнер, когда он будет построен. Это мой Dockerfile:

FROM devopsinfra/docker-terragrunt:azure-tf-1.5.5-tg-0.50.1

RUN apt-get update
RUN apt-get install -y git

ARG SSH_PRIVATE_KEY

RUN mkdir /root/.ssh/
RUN echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa

RUN touch /root/.ssh/known_hosts
RUN touch /root/.ssh/config
RUN ssh-keyscan -t rsa ssh.dev.azure.com >> /root/.ssh/known_hosts
RUN echo $'Host ssh.dev.azure.com vs-ssh.visualstudio.com \n\
           HostkeyAlgorithms +ssh-rsa \n\
           IdentityFile ~/.ssh/id_rsa \n\
           IdentitiesOnly yes' >> /root/.ssh/config

RUN chmod -R 600 ~/.ssh

Это соответствующая часть моего конвейера ADO:

- task: Docker@1
  displayName: 'Building image'
  inputs:
    command: 'Build an image'
    imageName: 'tg-azure-img'
    arguments: '--build-arg SSH_PRIVATE_KEY = "$(ado-privatekey)"'
- task: Docker@1
  displayName: 'Terragrunt Plan'
  inputs:
     command: 'Run an image'
     imageName: 'tg-azure-img'
     qualifyImageName: false
     volumes: '$(Pipeline.Workspace)/drop:/code'
     envVars: |
       ARM_CLIENT_SECRET=$(edsp-terraform-ci-credential)
       ARM_CLIENT_ID=$(arm-client-id)
       ARM_TENANT_ID=$(arm-tenant-id)
       ARM_SUBSCRIPTION_ID=$(arm-subscription-id)
     workingDirectory: '/code/subscriptions/${{ parameters.workingDirectory }}'
     containerCommand: '/bin/bash run-plan.sh'
     runInBackground: false

Фактическое содержимое закрытого ключа поступает из защищенной группы переменных, ссылка на которую находится в верхней части конвейера. Когда я запускаю конвейер, он работает нормально, пока не доходит до той части, где он работает terragrunt plan, после чего я получаю следующую ошибку:

│ Error: Failed to download module
│ 
│   on main.tf line 1:
│    1: module "blob-storage-account" {
│ 
│ Could not download module "blob-storage-account" (main.tf:1) source code
│ from
│ "git::ssh://[email protected]/v3/myorg/modules:
│ error downloading
│ 'ssh://[email protected]/v3/myorg/modules:
│ /usr/bin/git exited with 128: Cloning into
│ '.terraform/modules/blob-storage-account'...
│ Load key "/root/.ssh/id_rsa": error in libcrypto
│ Permission denied, please try again.
│ Permission denied, please try again.
│ [email protected]: Permission denied (password,publickey).
│ fatal: Could not read from remote repository.
│ 
│ Please make sure you have the correct access rights
│ and the repository exists.
│ 
╵

Мне удалось найти только людей, у которых были подобные проблемы с конвейерами Github, но ни одна из них не касалась Azure DevOps. Решения Github мне не помогли там, где они были применимы. Я пробовал множество различных перестановок команд chmod, я пробовал кучу вещей с форматом закрытого ключа, используя ssh-агент для управления, но ничего не помогло. Есть идеи?

Я уже видел такие error in libcrypto на ключе SSH, когда у закрытого ключа SSH нет надлежащего разрыва строки в конце файла. Возможно, стоит попробовать это еще раз проверить.

β.εηοιτ.βε 06.06.2024 21:56
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
1
146
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Загрузить ключ «/root/.ssh/id_rsa»: ошибка в libcrypto

Я могу воспроизвести ту же проблему при использовании аналогичного файла Docker для настройки ssh.

Причина проблемы может заключаться в том, что когда вы используете переменную Pipeline для передачи закрытого ключа ssh в изображение докера (RUN echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa), ключ отображается как однострочное значение. Неверный формат закрытого ключа.

Чтобы решить эту проблему, вы можете сохранить файл закрытого ключа (id_rsa) в защищенных файлах (Конвейеры -> Библиотеки -> защищенные файлы). Затем вы можете загрузить файл id_rsa в Pipeline и КОПИРОВАТЬ/ДОБАВИТЬ его в образ Docker.

Вот шаги:

Шаг 1. Добавьте файл id_rsa для защиты файлов.

Шаг 2. Измените файл docker, чтобы использовать команду ADD для добавления файла id_rsa в образ docker.

Например: ADD id_rsa /root/.ssh/id_rsa

FROM devopsinfra/docker-terragrunt:azure-tf-1.5.5-tg-0.50.1

RUN apt-get update
RUN apt-get install -y git


RUN mkdir /root/.ssh/
ADD id_rsa /root/.ssh/id_rsa
RUN touch /root/.ssh/known_hosts
RUN touch /root/.ssh/config
RUN ssh-keyscan -t rsa ssh.dev.azure.com >> /root/.ssh/known_hosts
RUN echo $'Host ssh.dev.azure.com vs-ssh.visualstudio.com \n\
           HostkeyAlgorithms +ssh-rsa \n\
           IdentityFile ~/.ssh/id_rsa \n\
           IdentitiesOnly yes' >> /root/.ssh/config

RUN chmod -R 600 ~/.ssh

Шаг 3. В Azure Pipeline вы можете использовать задачу Загрузить безопасный файл , чтобы скачать файл id_rsa, и использовать задачу Копировать файлы, чтобы скопировать файл id_rsa по ТОМУ же ПУТИ, что и файл docker.

Вот образец YAML:

steps:
- task: DownloadSecureFile@1
  displayName: 'Download secure file'
  inputs:
    secureFile: 'id_rsa'

- task: CopyFiles@2
  displayName: 'Copy Files to: $(build.sourcesdirectory)'
  inputs:
    SourceFolder: '$(Agent.TempDirectory)'
    Contents: 'id_rsa'
    TargetFolder: '$(build.sourcesdirectory)/samepathasdockerfile'

- task: Docker@1
  displayName: 'Building image'
  inputs:
    command: 'Build an image'
    imageName: 'tg-azure-img'

- task: Docker@1
  displayName: 'Terragrunt Plan'
  inputs:
     command: 'Run an image'
     imageName: 'tg-azure-img'
     qualifyImageName: false
     volumes: '$(Pipeline.Workspace)/drop:/code'
     envVars: |
       ARM_CLIENT_SECRET=$(edsp-terraform-ci-credential)
       ARM_CLIENT_ID=$(arm-client-id)
       ARM_TENANT_ID=$(arm-tenant-id)
       ARM_SUBSCRIPTION_ID=$(arm-subscription-id)
     workingDirectory: '/code/subscriptions/${{ parameters.workingDirectory }}'
     containerCommand: '/bin/bash run-plan.sh'
     runInBackground: false

В этом случае файл id_rsa будет передан в правильном формате. И Pipeline может работать как положено.

Результат:

Вот и все, спасибо шеф-повару

Gabriel Kelly 07.06.2024 19:25

Другие вопросы по теме