web-dev-qa-db-ja.com

Docker、SSHキー、known_hosts、authorized_keysの扱い方

Dockerでは、コンテナーが外部システムと通信する必要がある場合に、known_hosts、authorized_keys、およびssh接続を一般的に構成する要件でスコープする方法を教えてください。

たとえば、jenkinsコンテナを実行していて、ジョブのgithubからプロジェクトをチェックアウトしようとしましたが、接続がエラーHost key verification failedで失敗します

これは、コンテナーにログインしてgithubに手動で接続し、プロンプトが表示されたらホストキーを信頼することで解決できます。ただし、すべてを100%自動化する必要があるため、これは適切なソリューションではありません(AnsibleとDockerでCIパイプラインを構築しています)。別の(不格好な)解決策は、実行中のコンテナーにansibleをプロビジョニングすることですが、これにより、事態が複雑になり、保守が難しくなります。 Jenkinsコンテナーにはsshデーモンすらありません。他のホストからコンテナーにsshする方法がわかりません。 3番目のオプションは、sshが構成されている独自のDockerfile拡張jenkinsイメージを使用することですが、これはコンテナーをこの特定の環境にハードコーディングしてロックすることになります。

では、Dockerを使用して外部システムとの接続を管理(および自動化)する正しい方法は何でしょうか。

11
Tuomas Toivonen

信託へ github.comホストを起動またはコンテナーを構築するときにこのコマンドを発行できます:

 ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts

これにより、github公開鍵が既知のhostsファイルに追加されます。

11

これが私のやり方ですが、この解決策が好きかどうかはわかりません。私は、公開鍵のコレクションを持つauthorized_keysを含むプライベートgitリポジトリを持っています。次に、ansibleを使用してこのリポジトリのクローンを作成し、authorized_keysを置き換えます。

- git: repo=my_repo dest=my_local_folder force=yes accept_hostkey=yes

- Shell: "cp my_local_folder/authorized_keys ~/.ssh/"

accept_hostkeyを使用すると、実際にプロセスを自動化できます(もちろん、ソースを信頼しています)。

3
Xavier Alvarez

1つの解決策は、次のオプションを使用してホストのsshキーをドッカーにマウントすることです。

docker run -v /home/<Host user>/.ssh:/home/<docker user>/.ssh <image>

これはgitに対して完全に機能します。

2
Mohammad Azim

すべてがDockerfileで行われている場合は簡単です。私のDockerfileで:

ARG PRIVATE_SSH_KEY

# Authorize SSH Host
RUN mkdir -p /root/.ssh && \
    chmod 0700 /root/.ssh && \
    ssh-keyscan example.com > /root/.ssh/known_hosts && \
    # Add the keys and set permissions
    echo "$PRIVATE_SSH_KEY" > /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa

...do stuff with private key

# Remove SSH keys
RUN rm -rf /root/.ssh/

明らかにプライベートキーを引数として建物(docker-composeビルドまたはdockerビルド)に渡す必要があります。

2
Karl Morrison

これを試してください:ホストにログインしてから:

Sudo mkdir /var/jenkins_home/.ssh/
Sudo ssh-keyscan -t rsa github.com >> /var/jenkins_home/.ssh/known_hosts

Jenkinsコンテナはホームの場所を永続的なマップに設定するため、これをホストシステムで実行すると必要な結果が生成されます。

0
Cyberience