💭

Gitlab CI/CDでssh接続できずハマった

2023/05/16に公開

概要

Gitlab CI/CD で ssh 接続を試みたものの、エラーの解消にかなり時間を要しました。
今後同じところでハマらないよう、エラー調査方法も含め残します。

エラー内容

ssh: connect to host 〇〇〇〇〇〇 port 22: Connection timed out

ssh しようとするとタイムアウトになる

原因

変数として登録した秘密鍵に、末尾の改行が含まれていなかった

$ cat id_ed25519
-----BEGIN OPENSSH PRIVATE KEY-----
ああああああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああああああ
あああああああああああああ
-----END OPENSSH PRIVATE KEY-----
 ←ここ!!!

まず GitLab CI/CD で ssh 接続する流れをざっくり

  1. .gitlab-ci.yml で ssh 接続のコマンド記載(ssh-agent 起動など、今回は未使用)
  2. 設定->CI/CD->変数で秘密鍵の登録
    Type は File、保護ブランチで ssh しない場合は Protect variable のチェックを外す
    参考:https://zenn.dev/tusi/articles/062eb24e0a5d36
  3. ssh 接続先のサーバーで、.ssh/authorized_keys に公開鍵の情報を記載する(あれば vim とか)

.gitlab-ci.yml

.gitlab-ci.yml
deploy:
  tags:
    - docker
  image: docker:20.10.2
  before_script:
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - cp $SSH_PRIVATE_KEY ~/.ssh/id_ed25519
    - cp $SSH_HOST_KEY ~/.ssh/known_hosts
    - chmod 600 ~/.ssh/*
  script:
    - ssh ユーザー@ホスト ls -l

結果 yml には問題が無かったが、登録した$SSH_PRIVATE_KEY に問題があった

調査

ssh コマンドに-vvv オプションをつける

ssh を実行する際、

ssh -vvv ユーザー@ホスト

とすることでデバッグモードが有効になり、ログが出力されるようになる。
ssh できない場合の調査には必須のオプション。
-v, -vv, -vvv と重ねる程詳細なログが表示される。

生成鍵末尾の改行

debug1: Trying private key: /root/.ssh/id_ed25519
debug1: key_parse_private2: no end marker

-vvv オプションにより出力されたログでこちらを発見。
「no end marker」から秘密鍵の末尾に何か問題があることを考察。

秘密鍵の確認

.gitlab-ci.yml で変数に登録した秘密鍵を cat で出力し確認。
-----END OPENSSH PRIVATE KEY-----の後ろが改行されず、つながってしまっていることを確認。「no end marker」の原因と判断。

※秘密鍵を cat で出力するのはセキュリティの観点から非推奨。確認後に新たなキーを再生成し登録し直した。

鍵を再生成

ssh-keygen -t ed25519

cat で出力し、今度は末尾の改行までコピー(秘密鍵だけではなく公開鍵も)

まとめ

解消にかなり時間がかかったが、デバッグの方法と対処方法が整理できたので良かった。

GitHubで編集を提案

Discussion