[GitLab]パスフレーズ付きのSSH秘密鍵の追加時に「ssh_askpass: exec(/xxxx): Exec format error」のエラーが出る

事象

GitLabのCI/CDでパスフレーズ付きのSSH秘密鍵を追加する処理で次のエラーが出てしまう。

エラーメッセージ

ssh_askpass: exec(/path/to/passphrase): Exec format error

パスフレーズ付きのSSH秘密鍵追加時にExec format errorが出ている画像

ちなみに実行したCI/CDパイプライン処理内容は以下です。次のssh-addコマンドでパスフレーズ付きのSSH秘密鍵を追加しています。パスフレーズは環境変数SSH_PASSPHRASEに設定していて、/.ssh/tmpにパスフレーズを出力するシェルスクリプトを作成しています。

.gitlab-ci.yml

variables:
  DOCKER_HOST: tcp://docker:2376
  DOCKER_TLS_CERTDIR: "/certs"
  DOCKER_TLS_VERIFY: 1
  DOCKER_CERT_PATH: "/certs/client"
  DOCKER_DRIVER: overlay2
  STAGE_HOST: example.com
  STAGE_USER: ubuntu
  STAGE_PATH: /home/ubuntu/public_html/xxxxx.com
docker-build:
  image: docker:23.0.2-alpine3.17
  services:
    - docker:23.0.2-dind-alpine3.17
  stage: build
  tags:
    - docker
  before_script:
    - docker --version
    - until docker info; do sleep 1; done
    - apk update && apk add openssh-client rsync openssh-askpass
    - eval $(ssh-agent -s)
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
- echo -e "echo ${SSH_PASSPHRASE}" > ~/.ssh/tmp && chmod 700 ~/.ssh/tmp - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | DISPLAY=None SSH_ASKPASS=~/.ssh/tmp ssh-add - - echo "Host *ntStrictHostKeyChecking no" >> ~/.ssh/config
script: - docker-compose run --rm -e NODE_ENV=production -T app npm run build - rsync -rptgDvz --delete -e "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 22" ./build/build/* ${STAGE_USER}@${STAGE_HOST}:${STAGE_PATH}

環境

  • GitLab 16(on Kubernetes)
  • GitLab Runner Executer(Kubernetes)
  • 上記の.gitlab-ci.ymlはDinD環境でのビルド&デプロイ処理をしているものです。

原因

~/.ssh/tmpにパスフレーズを出力するシェルスクリプトを出力するときに、先頭行に#!/bin/shを入れていないのが原因でした。

改善策

次のように~/.ssh/tmpを出力するときの先頭行に#!/bin/shを入れます。

.gitlab-ci.yml

variables:
  DOCKER_HOST: tcp://docker:2376
  DOCKER_TLS_CERTDIR: "/certs"
  DOCKER_TLS_VERIFY: 1
  DOCKER_CERT_PATH: "/certs/client"
  DOCKER_DRIVER: overlay2
  STAGE_HOST: example.com
  STAGE_USER: ubuntu
  STAGE_PATH: /home/ubuntu/public_html/xxxxx.com
docker-build:
  image: docker:23.0.2-alpine3.17
  services:
    - docker:23.0.2-dind-alpine3.17
  stage: build
  tags:
    - docker
  before_script:
    - docker --version
    - until docker info; do sleep 1; done
    - apk update && apk add openssh-client rsync openssh-askpass
    - eval $(ssh-agent -s)
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
# 先頭行に#!/bin/shを追加 - echo -e "#!/bin/sh\n\necho ${SSH_PASSPHRASE}" > ~/.ssh/tmp && chmod 700 ~/.ssh/tmp
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | DISPLAY=None SSH_ASKPASS=~/.ssh/tmp ssh-add - - echo "Host *ntStrictHostKeyChecking no" >> ~/.ssh/config script: - docker-compose run --rm -e NODE_ENV=production -T app npm run build - rsync -rptgDvz --delete -e "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 22" ./build/build/* ${STAGE_USER}@${STAGE_HOST}:${STAGE_PATH}

これで正常にパスフレーズ付きのSSH秘密鍵をコンテナに追加できます。

コメント

コメントを残す

マークダウン形式でコメントを入力できます。

アップロードファイルの最大サイズ: 512 MB。 画像, 音声, 動画, 文書, スプレッドシート, 対話型, テキスト, アーカイブ, コード, その他 をアップロードできます。 Youtube、Facebook、Twitter および他サービスへのリンクは自動的にコメント内に埋め込まれます。 ここにファイルをドロップ

プロフィール背景
Ryosuke
Ryosuke

ITエンジニア & 講師

クラウドネイティブやアーキテクチャ設計の講師として活動しながら、ITエンジニアのDXを推進するために新しい技術やベストプラクティスを常に学び、エンジニアの生産性と開発品質の向上に貢献することを目指しています。猫5匹飼っています。山奥のポツンと一軒家に住んでいて、事務所は海の近くです。