GitLab CI: сбой SSH, невозможно аутентифицировать закрытый ключ

Я перешел по этой ссылке, чтобы попытаться подключиться по SSH к моему серверу в Gitlab-CI. Для ключей SSH я зашел на сервер и сгенерировал открытый и закрытый ключи. Закрытый ключ извлекается в переменные окружения GitLab CI/CD.

Шаблон YAML показан ниже, в основном скопирован по ссылке.

    image: docker:19.03.8
      services:
        - docker:19.03.8-dind

    deployment:
      variables:
        ip: <ip-address>
      script:
        - apk add --update openssh-client sshpass
        - eval $(ssh-agent -s)
        - echo "$SSH_PRIVATE_KEY" | ssh-add - > /dev/null
        - mkdir -p ~/.ssh
        - chmod 700 ~/.ssh
        - export SSHPASS=$AWS_PASSWORD
        - sshpass -e ssh -o StrictHostKeyChecking=no -vvv ubuntu@$ip echo testing

Однако я столкнулся с ошибкой при попытке доступа к закрытому ключу.

    debug1: Authentications that can continue: publickey,password
    debug1: Trying private key: /root/.ssh/id_rsa
    debug3: no such identity: /root/.ssh/id_rsa: No such file or directory
    debug1: Trying private key: /root/.ssh/id_dsa
    debug3: no such identity: /root/.ssh/id_dsa: No such file or directory
    debug1: Trying private key: /root/.ssh/id_ecdsa
    debug3: no such identity: /root/.ssh/id_ecdsa: No such file or directory
    debug1: Trying private key: /root/.ssh/id_ed25519
    debug3: no such identity: /root/.ssh/id_ed25519: No such file or directory
    debug1: Trying private key: /root/.ssh/id_xmss
    debug3: no such identity: /root/.ssh/id_xmss: No such file or directory
    debug2: we did not send a packet, disable method
    debug3: authmethod_lookup password
    debug3: remaining preferred: ,password
    debug3: authmethod_is_enabled password
    debug1: Next authentication method: password
    debug3: send packet: type 50
    debug2: we sent a password packet, wait for reply
    debug3: receive packet: type 51
    debug1: Authentications that can continue: publickey,password
    Permission denied, please try again.

Я использую общие бегуны gitlab, если это помогает.

[Обновление]

Забыл добавить, что на сервере, к которому я хочу подключиться, я добавил открытые ключи, которые я сгенерировал id_rsa.pub, в файлы authorized_keys.

[Изменить 1]

Как и было предложено, я добавил известные хосты, используя ssh-keyscan, чтобы скопировать вывод в виде переменной $SSH_KNOWN_HOSTS. Ниже обновленный файл yaml. Однако я столкнулся с той же ошибкой.

    deployment:
      variables:
        ip: <ip-address>
      script:
        - apk add --update openssh-client sshpass
        - eval $(ssh-agent -s)
        - echo "$SSH_PRIVATE_KEY" | ssh-add - > /dev/null
        - mkdir -p ~/.ssh
        - chmod 700 ~/.ssh
        - touch ~/.ssh/known_hosts
        - echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
        - chmod 644 ~/.ssh/known_hosts
        - export SSHPASS=$AWS_PASSWORD
        - sshpass -e ssh -o StrictHostKeyChecking=no -vvv ubuntu@$ip echo testing

person Jake    schedule 18.08.2020    source источник
comment
Вы пробовали stackoverflow.com/questions/52425064/ и superuser.com/questions/1222574/?   -  person DV82XL    schedule 18.08.2020
comment
@DV82XL попробовал ваше предыдущее предложение на SSH_KNOWN_HOST (изменения). Две другие ссылки, которые вы добавили, я тоже пробовал b4. Теперь, чтобы подумать об этом, если я использую метод открытых и закрытых ключей, мне не нужно использовать вход в систему sshpass, не знаю, почему это не работает.   -  person Jake    schedule 18.08.2020
comment
Какова ваша конечная цель? Вы пытаетесь подключиться по SSH к удаленному серверу для запуска команд Linux или сценариев bash? Как насчет брандмауэров или прокси? Вы находитесь в корпоративной сети?   -  person DV82XL    schedule 18.08.2020
comment
цель состоит в том, чтобы запустить сценарий bash на сервере для развертывания моих контейнеров. нет, я не в корпоративной сети. ничего не должно его блокировать, так как я могу нормально использовать ssh/sshpass с моей локальной машины   -  person Jake    schedule 18.08.2020


Ответы (1)


Я не уверен насчет sshpass, так как обычно использую открытые/закрытые ключи. Вот пример задания, которое я бы настроил для запуска команд SCP/SSH на удаленных серверах:

deploy:
  stage: deploy
variables:
  hostname: app-dev
before_script:
  # optional step if you decide to use a hostname instead of IP address
  - cp -f ./network/etc/hosts /etc/hosts
  # Setup SSH
  - which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )
  - eval $(ssh-agent -s)
  - ssh-add <(cat $SSH_PRIVATE_KEY)
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - ssh-keyscan $HOSTNAME >> ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts
script:
  # Copy files and execute commands
  - scp ./scripts/install_package.sh root@$HOSTNAME:/tmp/deploy
  - ssh root@$HOSTNAME "/tmp/deploy/install_package.sh && exit"

Перед запуском конвейера необходимо сделать следующее:

  1. Сгенерируйте пары ключей ssh, используя ssh-keygen. Не используйте парольную фразу. Открытый ключ заканчивается на .pub, закрытый ключ не имеет расширения.
  2. SSH на удаленный сервер, скопируйте содержимое открытого ключа в ~/.ssh/authorized_keys
  3. Скопируйте содержимое вашего закрытого ключа в GitLab Переменные файловой среды с именем SSH_PRIVATE_KEY
  4. Если вы используете переменную среды $HOSTNAME, определите переменную в конвейере и добавьте IP-адрес/имя хоста в файл /etc/hosts в контейнере конвейера. В противном случае просто используйте IP-адрес.
person DV82XL    schedule 18.08.2020
comment
спасибо за помощь ~ для ssh-keygen, где мне его сгенерировать? локальная машина? или удаленный сервер, к которому я хотел подключиться? Я сделал последнее раньше - person Jake; 18.08.2020
comment
@Jake ssh-keygen — это инструмент командной строки, часть OpenSSH, который поставляется с Windows и доступен для Linux. Все, что имеет значение, это 2 выходных ключа (текстовые файлы), поэтому не имеет значения, где вы его запускаете. Я обычно запускаю его в Windows. - person DV82XL; 18.08.2020
comment
о, хорошо, я подумал, что это имеет значение, потому что открытый ключ содержит имя хоста в конце - person Jake; 18.08.2020
comment
@Jake Я обычно генерирую ключ на своем личном ноутбуке, который копирует мое личное имя хоста, чтобы другие люди в моей команде знали, что я создал ключ в author_keys. Не должно иметь значения. Какую ошибку вы получите, когда попробуете этот подход? - person DV82XL; 18.08.2020
comment
Спасибо! удалось заставить его работать ~ спасибо за ваше терпение за то, что помогли мне с моими вопросами: D - person Jake; 19.08.2020
comment
@ Джейк Спасибо за выбор моего ответа ... в чем проблема? Пожалуйста, поделитесь, чтобы другие могли получить пользу, даже если это что-то совершенно обыденное (особенно если). Удачи с проектом! - person DV82XL; 19.08.2020
comment
Кажется, я каким-то образом пропустил добавление авторизованных ключей на сервер... видимо, я поместил их не на тот сервер~ :x, но, по крайней мере, теперь у меня есть более четкое представление о том, как Ssh работает в Gitlab с вашей помощью. - person Jake; 19.08.2020
comment
Обязательно добавьте разрыв строки в конце переменной type file в пользовательском интерфейсе GitLab. - person Roel4811; 16.12.2020