Dockerfile: パスワードなしの秘密鍵を使用してリポジトリをクローンします。エラー: 「認証エージェント」または「read_passphrase: /dev/tty を開けません」

Dockerfile: パスワードなしの秘密鍵を使用してリポジトリをクローンします。エラー: 「認証エージェント」または「read_passphrase: /dev/tty を開けません」

Dockerfile と SSH キー ペアを使用して、GitLab からテスト プロジェクトをクローンしようとしています。ssh-keygen -t rsa -P ""秘密キーにはパスワードが不要で、公開キーは GitLab アカウントで公開されています。

これは誰でも簡単にテストできます。GitLab でアカウントを開き、SSH 公開キーを公開し、クローンする新しい空のプロジェクトを追加するだけです。

Docker がなくても、 を使用すると動作します。Docker がなくても、プロジェクトのクローンも動作します。ssh -i C:\path\to\my\private_key\id_rsa [email protected]

私は Dockerfile に秘密鍵をロードし、最後にそれを削除します。重要ではありませんが、ここでセキュリティ リスクを感じる人のために: クライアントとサーバーの両方で、使用後すぐにキー ペアを削除します。クローン作成時にユーザー アカウントのパスワード エントリを回避しようとするだけです。これは、Dockerfile の実行中には機能しないようで、ログにパスワードが残る可能性があるため、実際のセキュリティ リスクになります。

開始: Dockerfile ディレクトリに移動し、秘密キー「id_rsa」を新しい「.ssh」サブフォルダーに貼り付けます。次に、次の手順を実行します。

docker build -t NEW_IMAGENAME . --build-arg ssh_prv_key="$(cat ./.ssh/id_rsa)"

現在までに動作しているコード:

FROM vcatechnology/linux-mint:18.2
ARG ssh_prv_key
RUN apt-get update && \
    apt upgrade -y && \
    apt-get install -y git  
RUN apt-get install -y openssh-client # openssh-server
RUN mkdir /root/.ssh/
RUN echo "Host *\n  User git\n  HostName gitlab.com\n  AddKeysToAgent yes\n  IdentityFile /root/.ssh/id_rsa" >> /etc/ssh/ssh_config
RUN echo "$ssh_prv_key" > /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa

RUN ssh-keyscan -t rsa -H gitlab.com >> /root/.ssh/known_hosts
RUN ssh -o StrictHostKeyChecking=no [email protected] || true
RUN eval "$(ssh-agent -s)"
RUN chmod 666 /dev/tty

その結果、次のようになります。

docker build -t CONTAINERNAME . --build-arg ssh_prv_key="$(cat /.ssh/id_rsa)"
[+] Building 254.9s (14/17)
 => [internal] load build definition from Dockerfile                                                                                                                                                                                    0.0s
 => => transferring dockerfile: 6.84kB                                                                                                                                                                                                  0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                       0.0s
 => => transferring context: 2B                                                                                                                                                                                                         0.0s
 => [internal] load metadata for docker.io/vcatechnology/linux-mint:18.2                                                                                                                                                                0.8s
 => CACHED [ 1/14] FROM docker.io/vcatechnology/linux-mint:18.2@sha256:0557a4999d43c0c622f3a57c3db5b13536024fb5999ecf4f03c6ffec0e4fdb47                                                                                                 0.0s
 => [ 2/14] RUN apt-get update &&  apt upgrade -y &&  apt-get install -y git                                                                                                                                                          244.3s
 => [ 3/14] RUN apt-get install -y openssh-client # openssh-server                                                                                                                                                                      3.1s
 => [ 4/14] RUN mkdir /root/.ssh/                                                                                                                                                                                                       0.6s
 => [ 5/14] RUN echo "Host *\n  User git\n  HostName gitlab.com\n  AddKeysToAgent yes\n  IdentityFile /root/.ssh/id_rsa" >> /etc/ssh/ssh_config                                                                                         0.6s
 => [ 6/14] RUN echo "$(cat /.ssh/id_rsa)" > /root/.ssh/id_rsa &&     chmod 600 /root/.ssh/id_rsa                                                                                                                                       0.6s
 => [ 7/14] RUN ssh-keyscan -t rsa -H gitlab.com >> /root/.ssh/known_hosts                                                                                                                                                              1.3s
 => [ 8/14] RUN ssh -o StrictHostKeyChecking=no [email protected] || true                                                                                                                                                                  1.6s
 => [ 9/14] RUN eval "$(ssh-agent -s)"                                                                                                                                                                                                  0.6s
 => [10/14] RUN chmod 666 /dev/tty                                                                                                                                                                                                      0.6s

Dockerfile 内のこの作業コードの後の最後の手順は次のようになりますが、最初の 3 行のそれぞれでスクリプトがここまで停止します。

RUN ssh-add /root/.ssh/id_rsa
RUN ssh -tti /root/.ssh/id_rsa [email protected]
RUN git clone [email protected]:GITLAB_USERNAME/test.git
RUN rm -r /root/.ssh
  1. RUN ssh-add /root/.ssh/id_rsa最後の作業コードの直後に来る場合:

      => ERROR [11/14] RUN ssh-add /root/.ssh/id_rsa                                                                                                                                                                                         0.6s
     ------
      > [11/14] RUN ssh-add /root/.ssh/id_rsa:
     #14 0.579 Could not open a connection to your authentication agent.
     ------
     executor failed running [/bin/sh -c ssh-add /root/.ssh/id_rsa]: exit code: 2
    

このエラーはCould not open a connection to your authentication agent.有名です。認証エージェントへの接続を開けませんでしたしかし、そのスレッドでは解決できませんでした。

  1. 最後の作業コードの直後に来る場合:RUN ssh -tti /root/.ssh/id_rsa [email protected]

     #14 1.545 Permission denied (publickey,keyboard-interactive).
     ------
     executor failed running [/bin/sh -c ssh -tti /root/.ssh/id_rsa [email protected]]: exit code: 255
    
  2. 最後の作業コードの直後に来る場合:RUN git clone [email protected]:GITLAB_USERNAME/test.git

     #16 0.450 Cloning into 'test'...
     #16 1.466 Permission denied (publickey,keyboard-interactive).
     #16 1.467 fatal: Could not read from remote repository.
     #16 1.467
     #16 1.467 Please make sure you have the correct access rights
     #16 1.467 and the repository exists.
     ------
     executor failed running [/bin/sh -c git clone [email protected]:GITLAB_USERNAME/test.git]: exit code: 128
    

したがって、ssh は明らかに、クライアント上の秘密鍵を認識するために、秘密鍵を「ssh-agent」に追加する「ssh-add」を必要とし、また、ssh にサーバーへの道を知らせるためにも必要だと思います。ssh -tti /root/.ssh/id_rsa [email protected]

  1. もし(-TがRUN ssh -Tvvv [email protected]stdin は端末ではないため、擬似端末は割り当てられません。) は最後の作業コードの直後に来ます (これは最終的な Dockerfile では必要ありません。単なるチェックです)。

      => ERROR [12/12] RUN ssh -Tvvv [email protected]                                                                                                                                                                                          1.2s
     ------
      > [12/12] RUN ssh -Tvvv [email protected]:
     #16 0.376 OpenSSH_7.2p2 Ubuntu-4ubuntu2.10, OpenSSL 1.0.2g  1 Mar 2016
     #16 0.376 debug1: Reading configuration data /etc/ssh/ssh_config
     #16 0.376 debug1: /etc/ssh/ssh_config line 19: Applying options for *
     #16 0.376 debug1: /etc/ssh/ssh_config line 57: Applying options for *
     #16 0.376 debug2: resolving "gitlab.com" port 22
     #16 0.397 debug2: ssh_connect_direct: needpriv 0
     #16 0.397 debug1: Connecting to gitlab.com [172.65.251.78] port 22.
     #16 0.450 debug1: Connection established.
     #16 0.450 debug1: permanently_set_uid: 0/0
     #16 0.450 debug1: key_load_public: No such file or directory
     #16 0.450 debug1: identity file /root/.ssh/id_rsa type -1
     #16 0.450 debug1: key_load_public: No such file or directory
     #16 0.450 debug1: identity file /root/.ssh/id_rsa-cert type -1
     #16 0.451 debug1: Enabling compatibility mode for protocol 2.0
     #16 0.451 debug1: Local version string SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.10
     #16 0.977 debug1: Remote protocol version 2.0, remote software version OpenSSH_7.9p1 Debian-10+deb10u2
     #16 0.977 debug1: match: OpenSSH_7.9p1 Debian-10+deb10u2 pat OpenSSH* compat 0x04000000
     #16 0.977 debug2: fd 3 setting O_NONBLOCK
     #16 0.977 debug1: Authenticating to gitlab.com:22 as 'git'
     #16 0.977 debug3: hostkeys_foreach: reading file "/root/.ssh/known_hosts"
     #16 0.977 debug3: send packet: type 20
     #16 0.977 debug1: SSH2_MSG_KEXINIT sent
     #16 0.994 debug3: receive packet: type 20
     #16 0.994 debug1: SSH2_MSG_KEXINIT received
     #16 0.994 debug2: local client KEXINIT proposal
     #16 0.994 debug2: KEX algorithms: [email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,ext-info-c
     #16 0.994 debug2: host key algorithms: [email protected],[email protected],[email protected],[email protected],[email protected],ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
     #16 0.994 debug2: ciphers ctos: [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected],aes128-cbc,aes192-cbc,aes256-cbc,3des-cbc
     #16 0.994 debug2: ciphers stoc: [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected],aes128-cbc,aes192-cbc,aes256-cbc,3des-cbc
     #16 0.994 debug2: MACs ctos: [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-sha1
     #16 0.994 debug2: MACs stoc: [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-sha1
     #16 0.994 debug2: compression ctos: none,[email protected],zlib
     #16 0.994 debug2: compression stoc: none,[email protected],zlib
     #16 0.994 debug2: languages ctos:
     #16 0.994 debug2: languages stoc:
     #16 0.994 debug2: first_kex_follows 0
     #16 0.994 debug2: reserved 0
     #16 0.994 debug2: peer server KEXINIT proposal
     #16 0.994 debug2: KEX algorithms: curve25519-sha256,[email protected],ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256,diffie-hellman-group14-sha1
     #16 0.994 debug2: host key algorithms: rsa-sha2-512,rsa-sha2-256,ssh-rsa,ecdsa-sha2-nistp256,ssh-ed25519
     #16 0.994 debug2: ciphers ctos: [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected]
     #16 0.994 debug2: ciphers stoc: [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected]
     #16 0.994 debug2: MACs ctos: [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-sha1
     #16 0.994 debug2: MACs stoc: [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-sha1
     #16 0.994 debug2: compression ctos: none,[email protected]
     #16 0.994 debug2: compression stoc: none,[email protected]
     #16 0.994 debug2: languages ctos:
     #16 0.994 debug2: languages stoc:
     #16 0.994 debug2: first_kex_follows 0
     #16 0.994 debug2: reserved 0
     #16 0.994 debug1: kex: algorithm: [email protected]
     #16 0.994 debug1: kex: host key algorithm: ecdsa-sha2-nistp256
     #16 0.994 debug1: kex: server->client cipher: [email protected] MAC: <implicit> compression: none
     #16 0.994 debug1: kex: client->server cipher: [email protected] MAC: <implicit> compression: none
     #16 1.014 debug3: send packet: type 30
     #16 1.014 debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
     #16 1.182 debug3: receive packet: type 31
     #16 1.185 debug1: Server host key: ecdsa-sha2-nistp256 SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw
     #16 1.186 debug3: hostkeys_foreach: reading file "/root/.ssh/known_hosts"
     #16 1.187 debug3: hostkeys_foreach: reading file "/root/.ssh/known_hosts"
     #16 1.187 debug1: read_passphrase: can't open /dev/tty: No such device or address
     #16 1.188 Host key verification failed.
     ------
     executor failed running [/bin/sh -c ssh -Tvvv [email protected]]: exit code: 255    
    

いろいろ試してみましたが、今のところエラーを解決できませんread_passphrase: can't open /dev/tty: No such device or address。ファイルは存在します。そうでなければ、 を使用して権限を 666 に変更することはできませんchmod 666 /dev/tty。空のパスワードを入力するためだけにターミナルが必要なのだと思います。

1 つの Dockerfile だけを使用して、パスワードなしの SSH キー ペアで GitLab からリポジトリをクローンするには何を変更すればよいですか?

1 つの Dockerfile でこれを行う機会がない場合は、受け入れられる回避策として docker-compose ファイルを使用しますが、これは好ましい答えではありません。

編集済み: コンテナを調べると、必要なパスとファイルが見つかります。

(The start was: docker build -t . --build-arg ssh_prv_key="$(cat ./.ssh/id_rsa)", until the end of the working code only!)
docker run -d -it --name test_bash -d NEW_IMAGENAME:latest
docker exec -it test_bash bash
cd root/.ssh;ls

最後のコマンドは、id_rsa と known_hosts を表示します。

d3cbc35351fd / # cd root/.ssh;ls
id_rsa  known_hosts

コンテナ内で実行すると、パスワードの入力を求められます。d3cbc35351fd .ssh # ssh -Tvvv [email protected]

Enter passphrase for key '/root/.ssh/id_rsa':
debug2: bad passphrase given, try again...
Enter passphrase for key '/root/.ssh/id_rsa':
debug2: bad passphrase given, try again...
Enter passphrase for key '/root/.ssh/id_rsa':
debug2: no passphrase given, try next key

これは、「」、「」、および Enter キーを押すだけの試行ですが、すべて機能しません。

Dockerfile 内で SSH を使用できず、その Dockerfile イメージのコンテナー内でも SSH を使用できない場合、Dockerfile またはコンテナーからリポジトリをクローンすることはそもそも可能かどうか疑問です。パスワード入力を抑制することが、この問題を解決するための次の大きなステップになると思いますが、コンテナーに空のパスワードを入力しても効果がなかったため、それでも完全には解決しない可能性があります。

答え1

セキュリティ上の理由からイメージ内の秘密鍵を削除したい場合、または詳細情報が必要な場合は、Dockerコンテナ内でSSHキーを使用するより徹底した回答をお願いします。


主なエラーの原因は

echo "$ssh_prv_key" > /root/.ssh/id_rsa

秘密鍵は複数行必要であるにもかかわらず、間違った形式のssh_prv_keyを1行として渡します。このアイデアはdocker ファイルの ssh-agent に秘密鍵を追加するそれは示唆するGitlab CI/Docker: ssh-add がパスフレーズを要求し続ける

RUN echo ...--> したがって、秘密鍵にはを使用せず、代わりにCOPY ...!!!を使用してください。

もう一つの小さなエラーは、動作しないが、RUN ssh -o StrictHostKeyChecking=no [email protected] || true

両方

RUN echo "Host *\n\t StrictHostKeyChecking no" >> /etc/ssh/ssh_config

そして

RUN ssh-keyscan -t rsa -H gitlab.com >> /root/.ssh/known_hosts 

同じ目的を達成するために努力する場合は、2つのうちの1つだけを選択してください。

もう一つのステップは、ssh-agentと を削除することですssh-add。 両方が必要なのは、持っているパスワードについては、docker ファイルの ssh-agent に秘密鍵を追加する

今は動作しています。

Dockerfile は次のようになります。

FROM ubuntu:latest
RUN apt-get update && apt-get install -y git
RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh
COPY /.ssh/id_rsa /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa
RUN ssh-keyscan -t rsa -H gitlab.com >> /root/.ssh/known_hosts
RUN git clone [email protected]:GITLAB_USERNAME/test.git
RUN rm -r /root/.ssh

Dockerfile からイメージを作成するには:

  • Dockerfile のディレクトリに移動します。

  • 秘密鍵「id_rsa」(または任意の名前、もちろんコードを変更してください)を新しいサブフォルダー「/.ssh/」に貼り付けます(または、Dockerfile ディレクトリに貼り付けて、コードを に変更しますCOPY id_rsa /root/.ssh/id_rsa)。

  • 始める (最後に「.」を忘れないでください。これはビルドコンテキストです。):

    docker build -t test .
    

答え2

ssh-agent はビルド プロセスでは期待どおりに動作しませんが、まったく必要ありません。

動作する最小限のサンプルを作成します

FROM ubuntu:latest
ARG ssh_prv_key

RUN apt-get update \
&& apt-get install -y git

RUN mkdir -p /root/.ssh &&  chmod 700 /root/.ssh

RUN echo "$ssh_prv_key" > /root/.ssh/id_rsa && \
    chmod 600 /root/.ssh/id_rsa

# Check if the key was successfully copied
# RUN cat -n /root/.ssh/id_rsa

# Dummy ssh to store the host into known_hosts
# The expected output is something like: 
# Hi <user>! You've successfully authenticated, but GitHub does not provide shell access.
RUN ssh -T -o StrictHostKeyChecking=no [email protected] || true

RUN git clone ssh://[email protected]/<myrepo>

答え3

私の場合、エラーはread_passphrase: can't open /dev/tty: No such device or addresssshが新しいホストを追加する許可を求めることで発生しました。この答えSSH設定に追加する

StrictHostKeyChecking no

SSH クライアントがサポートしている場合は、セキュリティのためにaccept-newの代わりにを使用してください。no

関連情報