I try to connect to atmoz/sftp within a Docker container, but the public key authentication fails.
I followed atmoz/sftp documentation:
Logging in with SSH keys
Mount public keys in the user's
.ssh/keys/directory. All keys are automatically appended to.ssh/authorized_keys(you can't mount this file directly, because OpenSSH requires limited file permissions). In this example, we do not provide any password, so the user foo can only login with his SSH key.docker run \ -v <host-dir>/id_rsa.pub:/home/foo/.ssh/keys/id_rsa.pub:ro \ -v <host-dir>/id_other.pub:/home/foo/.ssh/keys/id_other.pub:ro \ -v <host-dir>/share:/home/foo/share \ -p 2222:22 -d atmoz/sftp \ foo::1001
Commands
I started the Docker container with:
docker run \
--name sftp \
--volume /home/ubuntu/test_dir:/home/foo/upload \
--volume /home/ubuntu/test_key/gitlab_rsa.pub:/home/foo/.ssh/keys/gitlab_rsa.pub:ro \
--volume /home/ubuntu/test_key/ssh_host_ed25519_key:/etc/ssh/ssh_host_ed25519_key \
--volume /home/ubuntu/test_key/ssh_host_rsa_key:/etc/ssh/ssh_host_rsa_key \
--publish 2222:22 \
-d \
atmoz/sftp \
foo::1000
I try to connect to atmoz/sftp with:
sftp -vvv -i ./test_key/gitlab_rsa -P 2222 -o StrictHostKeyChecking=no -o UserKnownHostsFile=test_key/known_hosts foo@localhost
Logs
Debug logs for the sftp client:
OpenSSH_8.2p1 Ubuntu-4ubuntu0.2, OpenSSL 1.1.1f 31 Mar 2020
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for *
debug2: resolving "localhost" port 2222
debug2: ssh_connect_direct
debug1: Connecting to localhost [127.0.0.1] port 2222.
debug1: Connection established.
load pubkey "./test_key/gitlab_rsa": invalid format
debug1: identity file ./test_key/gitlab_rsa type -1
debug1: identity file ./test_key/gitlab_rsa-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.2
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.4p1 Debian-10+deb9u4
debug1: match: OpenSSH_7.4p1 Debian-10+deb9u4 pat OpenSSH_7.0*,OpenSSH_7.1*,OpenSSH_7.2*,OpenSSH_7.3*,OpenSSH_7.4*,OpenSSH_7.5*,OpenSSH_7.6*,OpenSSH_7.7* compat 0x04000002
debug2: fd 3 setting O_NONBLOCK
debug1: Authenticating to localhost:2222 as 'foo'
debug3: put_host_port: [localhost]:2222
debug3: hostkeys_foreach: reading file "test_key/known_hosts"
debug3: record_hostkey: found key type ED25519 in file test_key/known_hosts:1
debug3: load_hostkeys: loaded 1 keys from [localhost]:2222
debug3: order_hostkeyalgs: prefer hostkeyalgs: ssh-ed25519-cert-v01@openssh.com,ssh-ed25519
debug3: send packet: type 20
debug1: SSH2_MSG_KEXINIT sent
debug3: receive packet: type 20
debug1: SSH2_MSG_KEXINIT received
debug2: local client KEXINIT proposal
debug2: KEX algorithms: curve25519-sha256,curve25519-sha256@libssh.org,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,ext-info-c
debug2: host key algorithms: ssh-ed25519-cert-v01@openssh.com,ssh-ed25519,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,sk-ecdsa-sha2-nistp256@openssh.com,sk-ssh-ed25519@openssh.com,rsa-sha2-512,rsa-sha2-256,ssh-rsa
debug2: ciphers ctos: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
debug2: ciphers stoc: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
debug2: MACs ctos: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: MACs stoc: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: compression ctos: none,zlib@openssh.com,zlib
debug2: compression stoc: none,zlib@openssh.com,zlib
debug2: languages ctos:
debug2: languages stoc:
debug2: first_kex_follows 0
debug2: reserved 0
debug2: peer server KEXINIT proposal
debug2: KEX algorithms: curve25519-sha256,curve25519-sha256@libssh.org,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
debug2: host key algorithms: ssh-ed25519,ssh-rsa,rsa-sha2-512,rsa-sha2-256
debug2: ciphers ctos: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
debug2: ciphers stoc: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
debug2: MACs ctos: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: MACs stoc: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: compression ctos: none,zlib@openssh.com
debug2: compression stoc: none,zlib@openssh.com
debug2: languages ctos:
debug2: languages stoc:
debug2: first_kex_follows 0
debug2: reserved 0
debug1: kex: algorithm: curve25519-sha256
debug1: kex: host key algorithm: ssh-ed25519
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none
debug3: send packet: type 30
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug3: receive packet: type 31
debug1: Server host key: ssh-ed25519 SHA256:pR5V6XXp8Vp+ruBwBU8rUfj4kuxGdrNFi+FM/M1eQ0s
debug3: put_host_port: [127.0.0.1]:2222
debug3: put_host_port: [localhost]:2222
debug3: hostkeys_foreach: reading file "test_key/known_hosts"
debug3: record_hostkey: found key type ED25519 in file test_key/known_hosts:1
debug3: load_hostkeys: loaded 1 keys from [localhost]:2222
debug1: Host '[localhost]:2222' is known and matches the ED25519 host key.
debug1: Found key in test_key/known_hosts:1
debug3: send packet: type 21
debug2: set_newkeys: mode 1
debug1: rekey out after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug3: receive packet: type 21
debug1: SSH2_MSG_NEWKEYS received
debug2: set_newkeys: mode 0
debug1: rekey in after 134217728 blocks
debug1: Will attempt key: ./test_key/gitlab_rsa explicit
debug2: pubkey_prepare: done
debug3: send packet: type 5
debug3: receive packet: type 7
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=<ssh-ed25519,ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521>
debug3: receive packet: type 6
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug3: send packet: type 50
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug3: start over, passed a different list publickey,password,keyboard-interactive
debug3: preferred gssapi-with-mic,publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Trying private key: ./test_key/gitlab_rsa
debug3: sign_and_send_pubkey: RSA SHA256:Rg0jRLSJ4o5xWMRI6lmMWZx//7CKGvhKKcqmyaXVtnA
debug3: sign_and_send_pubkey: signing using ssh-rsa SHA256:Rg0jRLSJ4o5xWMRI6lmMWZx//7CKGvhKKcqmyaXVtnA
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug2: we did not send a packet, disable method
debug3: authmethod_lookup keyboard-interactive
debug3: remaining preferred: password
debug3: authmethod_is_enabled keyboard-interactive
debug1: Next authentication method: keyboard-interactive
debug2: userauth_kbdint
debug3: send packet: type 50
debug2: we sent a keyboard-interactive packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug3: userauth_kbdint: disable: no info_req_seen
debug2: we did not send a packet, disable method
debug3: authmethod_lookup password
debug3: remaining preferred:
debug3: authmethod_is_enabled password
debug1: Next authentication method: password
foo@localhost's password:
Docker logs:
[/usr/local/bin/create-sftp-user] Parsing user data: "foo::1000"
[/entrypoint] Executing sshd
Server listening on 0.0.0.0 port 22.
Server listening on :: port 22.
Connection closed by authenticating user foo 172.17.0.1 port 36992 [preauth]
Research
If I connect to the Docker container (with docker container exec), I can see, that the public key is included in authorized_keys:
root@408f377d3826:/home/foo/.ssh# more authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAhl0ktEgwRreiD8tUsOvOo7pyZBsFRnWI42kEd8c4H0l7s1cyGlaQog5ecH401+2bOxGknY++qIDZPc1UY7JTjSFT/wUYRojmXTKn6F8fXnI+k1q+hbYy6YFEGl9zemn99vmUxSCymdeiVoMnMFzeGYqwM5/Rh8hZOc/tQg+NYlRMXqgOE5lK45y6ZD826/gUrWWraxxzsx
I also checked the private key (above sftp command with changed port and host) on an Ubuntu server and it worked.
After reading Verbose logging I edited /etc/ssh/sshd.config in the Docker container. I uncommented #LogLevel VERBOSE. After restarting I saw an error in the Docker logs:
Failed publickey for foo from [...] port [...] ssh2: RSA SHA256: [...]
Question
How can I connect to atmoz/sftp within a Docker container with public key authentication?