使用 SSH 服务器设置 Docker 容器?
Setup Docker Container with SSH server?
我想设置一个非常简约的高山 linux docker 容器,具有以下功能:
- 它运行一个 ssh 服务器
- 它通过我选择的 SSH public 密钥进行复制,然后我可以对其进行身份验证
我研究了各种选择,最后决定编写我自己的小型 Dockerfile。
但是,我运行遇到了一些问题。
Dockerfile
FROM alpine:latest
RUN apk update
RUN apk upgrade
RUN apk add openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
ADD authorized_keys /root/.ssh/authorized_keys
ADD entrypoint.sh /entrypoint.sh
RUN chmod 755 /entrypoint.sh
EXPOSE 22
CMD ["/entrypoint.sh"]
entrypoint.sh
#!/bin/sh
/usr/sbin/sshd -D
authorized_keys
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBP8cIHIPgV9QoAaSsYNGHktiP/QnWfKPOeyzjujUXgQMQLBw3jJ1EBe04Lk3FXTMxwrKk3Dxq0VhJ+Od6UwzPDg=
启动容器报错:sshd: no hostkeys available -- exiting
。
我该如何修复我的 Dockerfile,以确保 ssh 服务器 运行 正确并且 authorized_keys 文件在那里。我错过了什么?
为了启动,SSH 守护进程确实需要主机密钥。
这些并不代表您将用于连接到容器的密钥,只是定义此特定主机的密钥。
A host key is a cryptographic key used for authenticating computers in the SSH protocol.
来源:https://www.ssh.com/ssh/host-key
所以你必须为你的主机生成一些密钥,如果你真的不打算使用它们,你可以安全地忽略它们。
可以通过
生成这些密钥
ssh-keygen -A
所以在你的图像中,只需添加一个
RUN ssh-keygen -A
应该做。
作为记录,这是我自己的 sshd
Alpine 图片:
FROM alpine
RUN apk add --no-cache \
openssh \
&& ssh-keygen -A \
&& mkdir /root/.ssh \
&& chmod 0700 /root/.ssh \
&& echo "root:$(openssl rand 96 | openssl enc -A -base64)" | chpasswd \
&& ln -s /etc/ssh/ssh_host_ed25519_key.pub /root/.ssh/authorized_keys
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D", "-e"]
补充说明:
- 我正在重用
ssh-keygen -A
生成的 SSH 密钥,将它们公开在一个卷中,这就是我执行命令的原因:
ln -s /etc/ssh/ssh_host_ed25519_key.pub /root/.ssh/authorized_keys
- 因为这只是一个 Ansible 节点集群实验室,我以
root
用户身份通过 SSH 连接这台机器,这就是我需要非常不安全的原因
echo "root:$(openssl rand 96 | openssl enc -A -base64)" | chpasswd
我想设置一个非常简约的高山 linux docker 容器,具有以下功能:
- 它运行一个 ssh 服务器
- 它通过我选择的 SSH public 密钥进行复制,然后我可以对其进行身份验证
我研究了各种选择,最后决定编写我自己的小型 Dockerfile。 但是,我运行遇到了一些问题。
Dockerfile
FROM alpine:latest
RUN apk update
RUN apk upgrade
RUN apk add openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
ADD authorized_keys /root/.ssh/authorized_keys
ADD entrypoint.sh /entrypoint.sh
RUN chmod 755 /entrypoint.sh
EXPOSE 22
CMD ["/entrypoint.sh"]
entrypoint.sh
#!/bin/sh
/usr/sbin/sshd -D
authorized_keys
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBP8cIHIPgV9QoAaSsYNGHktiP/QnWfKPOeyzjujUXgQMQLBw3jJ1EBe04Lk3FXTMxwrKk3Dxq0VhJ+Od6UwzPDg=
启动容器报错:sshd: no hostkeys available -- exiting
。
我该如何修复我的 Dockerfile,以确保 ssh 服务器 运行 正确并且 authorized_keys 文件在那里。我错过了什么?
为了启动,SSH 守护进程确实需要主机密钥。
这些并不代表您将用于连接到容器的密钥,只是定义此特定主机的密钥。
A host key is a cryptographic key used for authenticating computers in the SSH protocol.
来源:https://www.ssh.com/ssh/host-key
所以你必须为你的主机生成一些密钥,如果你真的不打算使用它们,你可以安全地忽略它们。
可以通过
生成这些密钥ssh-keygen -A
所以在你的图像中,只需添加一个
RUN ssh-keygen -A
应该做。
作为记录,这是我自己的 sshd
Alpine 图片:
FROM alpine
RUN apk add --no-cache \
openssh \
&& ssh-keygen -A \
&& mkdir /root/.ssh \
&& chmod 0700 /root/.ssh \
&& echo "root:$(openssl rand 96 | openssl enc -A -base64)" | chpasswd \
&& ln -s /etc/ssh/ssh_host_ed25519_key.pub /root/.ssh/authorized_keys
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D", "-e"]
补充说明:
- 我正在重用
ssh-keygen -A
生成的 SSH 密钥,将它们公开在一个卷中,这就是我执行命令的原因:ln -s /etc/ssh/ssh_host_ed25519_key.pub /root/.ssh/authorized_keys
- 因为这只是一个 Ansible 节点集群实验室,我以
root
用户身份通过 SSH 连接这台机器,这就是我需要非常不安全的原因echo "root:$(openssl rand 96 | openssl enc -A -base64)" | chpasswd