Ich versuche, ein Testprojekt von GitLab mithilfe eines Dockerfiles und eines SSH-Schlüsselpaars zu klonen: ssh-keygen -t rsa -P ""
. Der private Schlüssel ist passwortlos, der öffentliche Schlüssel wird im GitLab-Konto veröffentlicht.
Dies kann von jedem anderen schnell getestet werden. Öffnen Sie einfach ein Konto bei GitLab, veröffentlichen Sie Ihren öffentlichen SSH-Schlüssel und fügen Sie ein neues leeres Projekt zum Klonen hinzu.
Ohne Docker funktioniert es mit . Ohne Docker funktioniert auch das Klonen des Projekts.ssh -i C:\path\to\my\private_key\id_rsa [email protected]
Den privaten Schlüssel lade ich in das Dockerfile und lösche ihn am Ende. Nicht wichtig, aber für alle, die hier ein Sicherheitsrisiko sehen: Ich lösche das Schlüsselpaar direkt nach der Verwendung, sowohl auf dem Client als auch auf dem Server. Ich versuche lediglich, beim Klonen die Passworteingabe für das Benutzerkonto zu umgehen, da dies während der Ausführung eines Dockerfiles nicht zu funktionieren scheint und das eigentliche Sicherheitsrisiko darstellen würde, da das Passwort in den Logs verbleiben könnte.
Start: Gehen Sie in das Dockerfile-Verzeichnis und fügen Sie den privaten Schlüssel „id_rsa“ in einen neuen Unterordner „.ssh“ ein. Dann:
docker build -t NEW_IMAGENAME . --build-arg ssh_prv_key="$(cat ./.ssh/id_rsa)"
Bisher funktionierender Code:
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
Was dazu führt:
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
Die letzten Schritte nach diesem funktionierenden Code im Dockerfile wären dann folgende, wobei die ersten drei Zeilen jeweils das Skript bis hierhin stoppen:
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
Es
RUN ssh-add /root/.ssh/id_rsa
kommt direkt nach dem letzten funktionierenden Code:=> 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
Der Fehler Could not open a connection to your authentication agent.
ist bekannt, sieheEs konnte keine Verbindung zu Ihrem Authentifizierungsagenten hergestellt werden.. Aber ich konnte es mit diesem Thread nicht lösen.
Es kommt direkt nach dem letzten funktionierenden Code:
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
Es kommt direkt nach dem letzten funktionierenden Code:
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
Daher benötigt ssh offensichtlich das „ssh-add“, das den privaten Schlüssel zum „ssh-agent“ hinzufügt, um den privaten Schlüssel auf dem Client überhaupt zu kennen, und ich vermute, es benötigt das auch, um ssh den Weg zum Server mitzuteilen.ssh -tti /root/.ssh/id_rsa [email protected]
Wenn (das -T vermeidet
RUN ssh -Tvvv [email protected]
Pseudoterminal wird nicht zugewiesen, da stdin kein Terminal ist) kommt direkt nach dem letzten funktionierenden Code (dies wird im finalen Dockerfile nicht benötigt, es dient nur zur Kontrolle):=> 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
Ich habe schon vieles probiert, konnte den Fehler aber bisher nicht beheben read_passphrase: can't open /dev/tty: No such device or address
. Die Datei existiert, sonst könnte ich ihre Rechte nicht mit auf 666 ändern chmod 666 /dev/tty
. Ich vermute, dass nur für die Eingabe eines leeren Passworts ein Terminal erforderlich ist.
Was muss geändert werden, um ein Repo von GitLab mit einem passwortlosen SSH-Schlüsselpaar unter Verwendung nur einer Docker-Datei zu klonen?
Wenn dies nicht in nur einer Docker-Datei möglich ist, wäre eine Docker-Compose-Datei ein akzeptierter Workaround. Dies ist jedoch nicht die bevorzugte Antwort.
BEARBEITET: Der benötigte Pfad und die Datei können beim Blick in den Container gefunden werden.
(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
Der letzte Befehl zeigt die id_rsa und die known_hosts.
d3cbc35351fd / # cd root/.ssh;ls
id_rsa known_hosts
Und wenn ich innerhalb des Containers laufe, werde ich nach dem Passwort gefragt: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
Dies ist ein Versuch mit "", "" und dem einfachen Drücken der Eingabetaste, alle funktionieren nicht.
Wenn ich SSH weder im Dockerfile noch im Container des Dockerfile-Images verwenden kann, frage ich mich, ob das Klonen eines Repo aus einem Dockerfile oder Container überhaupt möglich ist. Ich vermute, dass das Unterdrücken der Kennworteingabe der nächste große Schritt zur Lösung dieses Problems sein wird, aber selbst das löst das Problem möglicherweise nicht vollständig, da ich bereits vergeblich versucht habe, ein leeres Kennwort in den Container einzugeben.
Antwort1
Wenn Sie den privaten Schlüssel aus Sicherheitsgründen im Image entfernen möchten oder weitere Informationen benötigen, lesen SieVerwenden von SSH-Schlüsseln im Docker-Containermit einer ausführlicheren Antwort.
Der Hauptfehler entsteht durch die
echo "$ssh_prv_key" > /root/.ssh/id_rsa
die einen falsch formatierten ssh_prv_key als eine Zeile übergibt, obwohl der private Schlüssel mehrere Zeilen benötigt. Die Idee stammt vonPrivaten Schlüssel zum SSH-Agenten in der Docker-Datei hinzufügendas deutet darauf hinGitlab CI/Docker: ssh-add fragt ständig nach der Passphrase.
--> Verwenden Sie daher nicht RUN echo ...
für den privaten Schlüssel, sondern COPY ...
!!!
Ein weiterer kleiner Fehler ist , was nicht funktioniert, aberRUN ssh -o StrictHostKeyChecking=no [email protected] || true
beide
RUN echo "Host *\n\t StrictHostKeyChecking no" >> /etc/ssh/ssh_config
Und
RUN ssh-keyscan -t rsa -H gitlab.com >> /root/.ssh/known_hosts
arbeiten und das gleiche Ziel erreichen, wählen Sie nur eines von beiden.
ssh-agent
Ein weiterer Schritt besteht darin , und zu löschen ssh-add
. Beide sind nur erforderlich, wenn Siehabenein Passwort, siehePrivaten Schlüssel zum SSH-Agenten in der Docker-Datei hinzufügen.
Das funktioniert jetzt.
Das Dockerfile sieht wie folgt aus:
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
So erstellen Sie das Image aus der Docker-Datei:
Gehen Sie in das Verzeichnis der Docker-Datei.
Fügen Sie Ihren privaten Schlüssel „id_rsa“ (oder welchen Namen Sie auch immer haben, ändern Sie dann natürlich den Code) in einen neuen Unterordner „/.ssh/“ ein (oder fügen Sie ihn in das Dockerfile-Verzeichnis ein und ändern Sie den Code in
COPY id_rsa /root/.ssh/id_rsa
).Start (Vergessen Sie nicht den "." am Ende, das ist der Build-Kontext):
docker build -t test .
Antwort2
Der SSH-Agent funktioniert im Build-Prozess nicht wie erwartet, aber Sie brauchen ihn überhaupt nicht.
Ich baue ein Minimalbeispiel, das funktioniert
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>
Antwort3
In meinem Fall read_passphrase: can't open /dev/tty: No such device or address
wurde der Fehler dadurch verursacht, dass SSH nach der Erlaubnis fragte, einen neuen Host hinzuzufügen.diese Antwortzu Ihrer SSH-Konfiguration hinzufügen
StrictHostKeyChecking no
Falls Ihr SSH-Client dies unterstützt, verwenden Sie aus Sicherheitsgründen accept-new
anstelle von .no