Intento clonar un proyecto de prueba de GitLab usando un Dockerfile y un par de claves SSH: ssh-keygen -t rsa -P ""
. La clave privada no tiene contraseña, la clave pública se publica en la cuenta de GitLab.
Cualquier otra persona puede probar esto rápidamente, simplemente abra una cuenta en GitLab, publique su clave pública SSH y agregue un nuevo proyecto vacío para clonar.
Sin Docker, usando , funciona. Sin Docker, la clonación del proyecto también funciona.ssh -i C:\path\to\my\private_key\id_rsa [email protected]
Cargo la clave privada en el Dockerfile y la elimino al final. No es importante, pero para todos los que ven un riesgo de seguridad aquí: elimino el par de claves directamente después del uso, tanto en el cliente como en el servidor. Solo trato de evitar la entrada de la contraseña de la cuenta de usuario al clonar, ya que eso no parece funcionar durante la ejecución de un Dockerfile y sería un riesgo real para la seguridad, ya que podría dejar la contraseña en los registros.
Inicio: Vaya al directorio Dockerfile, pegue la clave privada "id_rsa" en una nueva subcarpeta ".ssh". Entonces:
docker build -t NEW_IMAGENAME . --build-arg ssh_prv_key="$(cat ./.ssh/id_rsa)"
Código de trabajo hasta ahora:
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
Lo que lleva a:
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
Los últimos pasos después de este código de trabajo en Dockerfile serían los siguientes, aunque cada una de las primeras tres líneas detiene el script hasta ahora:
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
Si
RUN ssh-add /root/.ssh/id_rsa
viene directamente después del último código de trabajo:=> 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
El error Could not open a connection to your authentication agent.
es famoso, ver.No se pudo abrir una conexión con su agente de autenticación. Pero no pude solucionarlo con ese hilo.
Si viene directamente después del último código de trabajo:
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
Si viene directamente después del último código de trabajo:
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
Por lo tanto, ssh obviamente necesita el "ssh-add" que agrega la clave privada al "ssh-agent" para conocer la clave privada en el cliente, y supongo que también necesita que ssh sepa el camino al servidor. .ssh -tti /root/.ssh/id_rsa [email protected]
Si (la -T evita
RUN ssh -Tvvv [email protected]
El pseudoterminal no se asignará porque la entrada estándar no es un terminal) viene directamente después del último código de trabajo (esto no es necesario en el Dockerfile final, es solo una verificación):=> 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
Lo he intentado mucho, pero hasta ahora no he podido solucionar el error read_passphrase: can't open /dev/tty: No such device or address
. El archivo existe; de lo contrario, no podría cambiar sus derechos a 666 usando chmod 666 /dev/tty
. Supongo que se requiere una terminal solo para ingresar una contraseña vacía.
¿Qué cambiar para clonar un repositorio de GitLab con un par de claves SSH sin contraseña, usando solo un Dockerfile?
Si no hay posibilidad de hacer esto en un solo Dockerfile, una solución alternativa aceptada sería un archivo docker-compose; Sin embargo, esta no es la respuesta favorita.
EDITADO: La ruta y el archivo necesarios se pueden encontrar al buscar en el contenedor.
(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
El último comando muestra id_rsa yknown_hosts.
d3cbc35351fd / # cd root/.ssh;ls
id_rsa known_hosts
Y si ejecuto dentro del contenedor, me pide la contraseña: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
Esto es un intento con "", '' y simplemente presionando enter, no funcionan.
Si no puedo usar SSH en el Dockerfile y tampoco en el contenedor de la imagen de ese Dockerfile, me pregunto si es posible clonar un repositorio desde un Dockerfile o contenedor. Supongo que suprimir la entrada de la contraseña será el siguiente gran paso para resolver esto, pero incluso eso podría no resolverlo por completo, ya que ya intenté ingresar una contraseña vacía en el contenedor, sin éxito.
Respuesta1
Si desea deshacerse de la clave privada en la imagen por razones de seguridad, o si necesita más información, consulteUsando claves SSH dentro del contenedor acoplablecon una respuesta más completa.
El error principal es causado por el
echo "$ssh_prv_key" > /root/.ssh/id_rsa
que pasa una ssh_prv_key mal formateada, como solo una línea, aunque la clave privada necesita muchas líneas. La idea es deAgregue una clave privada al agente ssh en el archivo acoplableque insinúaGitlab CI/Docker: ssh-add sigue pidiendo una frase de contraseña.
--> Por lo tanto, no lo use RUN echo ...
para la clave privada; en su lugar, use COPY ...
!!!
Otro pequeño error es que no funciona, peroRUN ssh -o StrictHostKeyChecking=no [email protected] || true
ambos
RUN echo "Host *\n\t StrictHostKeyChecking no" >> /etc/ssh/ssh_config
y
RUN ssh-keyscan -t rsa -H gitlab.com >> /root/.ssh/known_hosts
trabajar y alcanzar el mismo objetivo, elige solo uno de los dos.
Otro paso es soltar ssh-agent
y ssh-add
. Ambos sólo son necesarios siteneruna contraseña, verAgregue una clave privada al agente ssh en el archivo acoplable.
Esto está funcionando ahora.
El Dockerfile tiene el siguiente aspecto:
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
Para crear la imagen desde Dockerfile:
Vaya al directorio del Dockerfile.
Pegue su clave privada "id_rsa" (o el nombre que tenga, luego cambie el código, por supuesto) en una nueva subcarpeta "/.ssh/" (o péguela en el directorio Dockerfile y cambie el código a
COPY id_rsa /root/.ssh/id_rsa
).Comenzar (No olvides el "." al final, que es el contexto de construcción):
docker build -t test .
Respuesta2
El agente ssh no funciona como se esperaba en el proceso de compilación, pero no lo necesita en absoluto.
Construyo una muestra mínima que funciona.
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>
Respuesta3
En mi caso, el error read_passphrase: can't open /dev/tty: No such device or address
se debió a que ssh solicitó permiso para agregar un nuevo host. segúnesta respuestaagregar a su configuración ssh
StrictHostKeyChecking no
En caso de que su cliente ssh lo admita, utilícelo accept-new
en lugar de no
por seguridad.