CircleCI の SSHホスト鍵検証(初回接続)

SSH のホスト鍵検証については こちら を参照してください。

CircleCI でホスト鍵検証が必要になるタイミング

以下では、リモートホストを github.com と仮定します。

  • checkout ステップ
    • checkout ステップで GitHub からソースコードを取得する際は、GitHub のホスト鍵が適切に扱われるため、通常は github.com のホスト鍵を手動で known_hosts に登録する必要はありません。
  • ssh-keyscan を実行する場合
    • checkout を実行しないジョブで GitHub へ SSH 接続する場合は、明示的に known_hosts へ登録します。
mkdir -p ~/.ssh
ssh-keyscan -H -t ed25519 github.com >> ~/.ssh/known_hosts
chmod 700 ~/.ssh
chmod 600 ~/.ssh/known_hosts

[!IMPORTANT] ssh-keyscan は GitHub のホスト公開鍵を事前に known_hosts へ登録し、ホスト鍵検証による対話確認を回避するために使用します。

より厳密な運用では、取得したホスト鍵が GitHub の公式公開フィンガープリントと一致することを確認することを推奨します。

CI では、確認済みの known_hosts の内容をリポジトリや環境変数などで管理する方法が最も安全です。

[!WARNING] composer config github-oauth.github.com "$OAUTH_TOKEN" は、Composer が GitHub API や HTTPS 経由でパッケージを取得する際の OAuth 認証を設定するものです。

known_hosts の登録や SSH のホスト鍵検証には一切関係ありません。

補足(詳細な説明)

Composer が SSH 接続確認を求めるプロンプト

Dockerfile 内の composer install が、composer.lock に記載された SSH URL のパッケージを取得しようとして発生しました。

対応

  • Dockerfile から composer install を削除しました。
  • CircleCI の build ジョブで生成した vendor/ を、そのままイメージへコピーする構成へ変更して解消しました。

Docker BuildKit のプロンプト

docker build 中に BuildKit が Git リポジトリを SSH 経由で参照する処理で github.com へ接続しようとした際に発生しました。

checkout を実行しないジョブでは known_hosts が準備されていないため、事前にホスト鍵を登録することで解消しました。

対応

mkdir -p ~/.ssh
ssh-keyscan -H -t ed25519 github.com >> ~/.ssh/known_hosts
chmod 700 ~/.ssh
chmod 600 ~/.ssh/known_hosts

この設定により、BuildKit が GitHub へ SSH 接続する際のホスト鍵検証による対話確認が発生しなくなります。

[!NOTE] checkout を省略したジョブでは、known_hosts を自分で準備する必要があります。