Ключи ssh внутри облачной сборки

Я пытаюсь создать службу, которая будет работать в контейнере, подключаться к удаленному хосту по ssh и удаленно выполнять несколько команд. Этот сервис будет построен и запущен в облачной сборке. Прямо сейчас я застрял с попыткой внедрить ключи SSH в контейнер - сборка завершается с ошибкой:

Step #2 - "run replication command": Load key "/root/.ssh/id_rsa": invalid format

Мои ключи были созданы с помощью ssh-keygen, поэтому они, вероятно, правильные. Кажется, есть какая-то проблема с ключами SSH, но я понятия не имею, что не так. Что я уже пробовал:

  1. Поскольку это продолжение этой проблемы, я уже пробовал ввод ключей через менеджер секретов на этапе сборки. Этот не удалось, потому что строитель отказывается выполнять замены должным образом и передает имя переменной вместо значения (то есть у меня есть секретная переменная env с именем PRIVATE, и когда я ссылаюсь на нее как $$PRIVATE, строитель устанавливает значение $PRIVATE, что мне не нужно);
  2. Я пробовал создавать секреты по-разному:
    • echo $(cat container_private_key.pem) | gcloud secrets create private-key --data-file=-
    • echo -n <secret value here> | gcloud secrets create private-key --data-file=-
    • gcloud secrets create private-key --data-file=container_private_key.pem
      Ничего из этого не работает, облачная сборка по-прежнему жалуется на недопустимый формат. Пробовал добавлять/удалять новую строку в конце файла, не помогло.
  3. Я также пробовал вставлять ключи как с заголовками, так и без них, но это не дало положительного эффекта.

Прямо сейчас ключи вводятся следующим образом:

mkdir -p /root/.ssh && chmod 0700 /root/.ssh && echo $CONTAINER_PRIVATE_KEY > /root/.ssh/id_rsa && \
    echo $CONTAINER_PUBLIC_KEY > /root/.ssh/id_rsa.pub && chmod 400 /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa.pub

Как видите, значения берутся из переменных окружения, и эти переменные на самом деле содержат ключи, я попытался повторить их. Я предполагаю, что проблема каким-то образом связана с искажением ключей на каком-то этапе между моим компьютером, секретным менеджером и повторением значений из переменных среды, но я не могу понять, где именно это может произойти.

Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги &lt;ul&gt; и &lt;li&gt; для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
0
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я немного покопался и обнаружил, что моя гипотеза о том, что ключи SSH в какой-то момент искажаются, была верна. Проиллюстрированная проблема:

  1. Я отправляю секрет в Secret Manager в виде файла (здесь нет проблем, кажется, что файл загружается в исходном виде);
  2. На мой секрет ссылаются и экспортируют его как переменную среды в Cloud Build, и именно здесь все становится плохо. Где-то в этом месте ключ лишается всех специальных непечатаемых символов, и SSH на следующем шаге будет считать его искаженным ключом;
  3. Значение успешно входит в файл, но, поскольку оно имеет неверный формат, SSH все равно и не будет использовать ключ.

Итак, чтобы обойти эту проблему, я сделал следующее: Я закодировал свои ключи в base64 на своем хост-компьютере и расшифровал их в самый последний момент. Обратите внимание на звонки base64

mkdir -p /root/.ssh && chmod 0700 /root/.ssh && echo "$CONTAINER_PRIVATE_KEY" | base64 --decode > /root/.ssh/id_rsa && \
    echo "$CONTAINER_PUBLIC_KEY" | base64 --decode > /root/.ssh/id_rsa.pub && chmod 400 /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa.pub

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