diff --git a/Rakefile b/Rakefile index 421db00..e1620cf 100644 --- a/Rakefile +++ b/Rakefile @@ -10,9 +10,4 @@ end RSpec::Core::RakeTask.new(:spec) -task :default => %i[clobber compile docker spec] - -desc 'Build docker image for integration test' -task :docker do - sh 'docker build -t libssh-ruby spec' -end +task :default => %i[clobber compile spec] diff --git a/spec/Dockerfile b/spec/Dockerfile deleted file mode 100644 index dbbc2cd..0000000 --- a/spec/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM archlinux:latest - -RUN pacman -Sy --noconfirm openssh - -RUN useradd -m alice && (echo alice:alice | chpasswd) -COPY id_ecdsa id_ecdsa.pub id_ed25519 id_ed25519.pub /home/alice/.ssh/ -RUN cat /home/alice/.ssh/id_ecdsa.pub /home/alice/.ssh/id_ed25519.pub > /home/alice/.ssh/authorized_keys -COPY ssh_host_ecdsa_key ssh_host_ecdsa_key.pub ssh_host_ed25519_key ssh_host_ed25519_key.pub /etc/ssh/ -RUN chmod 600 /home/alice/.ssh/* \ - && chmod 700 /home/alice/.ssh \ - && chown -R alice:alice /home/alice \ - && chmod 600 /etc/ssh/ssh_host_*_key \ - && chmod 644 /etc/ssh/ssh_host_*_key.pub -COPY sshd_config /etc/ssh/sshd_config - -EXPOSE 22 -CMD ["/usr/sbin/sshd", "-D", "-e"] diff --git a/spec/id_ecdsa b/spec/id_ecdsa deleted file mode 100644 index 8162591..0000000 --- a/spec/id_ecdsa +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -MHcCAQEEIM7FVnXtNBdZUFyZr2pf2m4SHFTzAKkd+OwVdb70DOEJoAoGCCqGSM49 -AwEHoUQDQgAEHwfBG6UuuEsKIMQATV7nL3SDglw0jvg2YWbjNc8cxtXk5D4rDAEA -i25eAIZWSemygDu2iPR9Sq8UELLRmlM+0g== ------END EC PRIVATE KEY----- diff --git a/spec/id_ecdsa.pub b/spec/id_ecdsa.pub deleted file mode 100644 index e6c81d6..0000000 --- a/spec/id_ecdsa.pub +++ /dev/null @@ -1 +0,0 @@ -ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBB8HwRulLrhLCiDEAE1e5y90g4JcNI74NmFm4zXPHMbV5OQ+KwwBAItuXgCGVknpsoA7toj0fUqvFBCy0ZpTPtI= eagletmt@reinforce diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 54b1261..067341e 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -6,19 +6,30 @@ require 'libssh' module DockerHelper - IMAGE_NAME = 'libssh-ruby'.freeze + SPAWN_SSHD = <<~'SH' + docker run --detach \ + -e PUBLIC_KEY_FILE=/spec/id_ed25519.pub \ + -e PASSWORD_ACCESS=true \ + -e USER_NAME=alice \ + -e USER_PASSWORD=alice \ + -v ./spec:/spec:ro \ + -v ./spec/sshd_config:/config/sshd/sshd_config.d/99-override.conf:ro \ + --publish-all \ + lscr.io/linuxserver/openssh-server:latest + SH class << self def start - @container_id = IO.popen(['docker', 'run', '--detach', '--publish-all', IMAGE_NAME], &:read) + @container_id = IO.popen(SPAWN_SSHD, &:read) unless $CHILD_STATUS.success? raise 'Cannot start Docker container' end @container_id.chomp! container = JSON.parse(IO.popen(['docker', 'inspect', @container_id], &:read))[0] - @port = container['NetworkSettings']['Ports']['22/tcp'][0]['HostPort'].to_i + @port = container['NetworkSettings']['Ports']['2222/tcp'][0]['HostPort'].to_i wait_for_ready + @host_key = IO.popen(['docker', 'exec', @container_id, 'cat', '/config/ssh_host_keys/ssh_host_ed25519_key.pub'], &:read) end def stop @@ -27,15 +38,17 @@ def stop end end - attr_reader :port + attr_reader :port, :host_key private def wait_for_ready 10.times do - if system('docker', 'run', "--link=#{@container_id}:sshd", IMAGE_NAME, 'ssh', '-i', '/home/alice/.ssh/id_ed25519', '-oStrictHostKeyChecking=no', 'alice@sshd', 'exit', '0', err: File::NULL) - return - end + sleep 1 + return if system('docker', 'exec', @container_id, + 'ssh', '-i', '/spec/id_ed25519', '-oStrictHostKeyChecking=no', '-p2222', 'alice@127.0.0.1', + 'exit', '0', + err: File::NULL) end raise 'Failed to connect to the Docker container' end @@ -89,12 +102,11 @@ def prepare_known_hosts FileUtils.rm_f(absent_known_hosts) File.open(empty_known_hosts, 'w') {} - key = File.read(File.join(__dir__, "ssh_host_#{default_key_type}_key.pub")).slice(/\A[^ ]+ \S+/, 0) File.open(valid_known_hosts, 'w') do |f| - f.puts("[#{host}]:#{DockerHelper.port} #{key}") + f.puts("[#{host}]:#{DockerHelper.port} #{DockerHelper.host_key}") end File.open(invalid_known_hosts, 'w') do |f| - f.puts("[#{host}]:#{DockerHelper.port} #{key.sub('A', 'B')}") + f.puts("[#{host}]:#{DockerHelper.port} #{DockerHelper.host_key.sub('A', 'B')}") end end end diff --git a/spec/ssh_host_ecdsa_key b/spec/ssh_host_ecdsa_key deleted file mode 100644 index df6295e..0000000 --- a/spec/ssh_host_ecdsa_key +++ /dev/null @@ -1,5 +0,0 @@ ------BEGIN EC PRIVATE KEY----- -MHcCAQEEIJrnQdqFTe5KLFZHLBukbsyJoQC8ZpdGNG4F465kDzOKoAoGCCqGSM49 -AwEHoUQDQgAE3nJQbd5yjiVr4excKomOfHdx+LXIaKH2UtkMf5+0C0cPnQdDzuGI -GUd66hn1exWmCi8f2kOa8ir1cmhZkVXGDw== ------END EC PRIVATE KEY----- diff --git a/spec/ssh_host_ecdsa_key.pub b/spec/ssh_host_ecdsa_key.pub deleted file mode 100644 index d30dbd7..0000000 --- a/spec/ssh_host_ecdsa_key.pub +++ /dev/null @@ -1 +0,0 @@ -ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBN5yUG3eco4la+HsXCqJjnx3cfi1yGih9lLZDH+ftAtHD50HQ87hiBlHeuoZ9XsVpgovH9pDmvIq9XJoWZFVxg8= root@dfc2eabdf236 diff --git a/spec/ssh_host_ed25519_key b/spec/ssh_host_ed25519_key deleted file mode 100644 index 81d5436..0000000 --- a/spec/ssh_host_ed25519_key +++ /dev/null @@ -1,7 +0,0 @@ ------BEGIN OPENSSH PRIVATE KEY----- -b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW -QyNTUxOQAAACBVlTLs75G5YS1p2SkAsLg1ig7q1aJdKltGebPgF5YmmQAAAJjPyuYFz8rm -BQAAAAtzc2gtZWQyNTUxOQAAACBVlTLs75G5YS1p2SkAsLg1ig7q1aJdKltGebPgF5YmmQ -AAAEChu81nh6WejgEcKd+oO0Hxg9NMyboexqNlTE05xWBQ51WVMuzvkblhLWnZKQCwuDWK -DurVol0qW0Z5s+AXliaZAAAAEXJvb3RAMzAzNjJiZTVmMDZjAQIDBA== ------END OPENSSH PRIVATE KEY----- diff --git a/spec/ssh_host_ed25519_key.pub b/spec/ssh_host_ed25519_key.pub deleted file mode 100644 index 63686f2..0000000 --- a/spec/ssh_host_ed25519_key.pub +++ /dev/null @@ -1 +0,0 @@ -ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFWVMuzvkblhLWnZKQCwuDWKDurVol0qW0Z5s+AXliaZ root@30362be5f06c diff --git a/spec/sshd_config b/spec/sshd_config index e2fb8c7..4151acc 100644 --- a/spec/sshd_config +++ b/spec/sshd_config @@ -1,9 +1,8 @@ -AuthorizedKeysFile .ssh/authorized_keys - UsePAM yes KbdInteractiveAuthentication yes PasswordAuthentication yes PermitEmptyPasswords no PermitRootLogin no +PerSourcePenalties no PrintMotd no