【问题标题】:Setup Docker Container with SSH server?使用 SSH 服务器设置 Docker 容器?
【发布时间】:2020-12-18 06:59:01
【问题描述】:

我想设置一个非常简约的 alpine linux docker 容器,具有以下功能:

  • 它运行一个 ssh 服务器
  • 它通过我选择的 SSH 公钥进行复制,然后我可以对其进行身份验证

我研究了各种选项,最后决定编写自己的小型 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

授权密钥

ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBP8cIHIPgV9QoAaSsYNGHktiP/QnWfKPOeyzjujUXgQMQLBw3jJ1EBe04Lk3FXTMxwrKk3Dxq0VhJ+Od6UwzPDg=

启动容器会报错:sshd: no hostkeys available -- exiting。 如何修复我的 Dockerfile,以确保 ssh 服务器正常运行并且授权密钥文件在那里。我错过了什么?

【问题讨论】:

  • 您可以尝试使用调试标志启动 sshd:/usr/sbin/sshd -D -ddd 看看是否可以提供任何有用的信息。

标签: docker ssh containers alpine sshd


【解决方案1】:

为了启动,SSH 守护进程确实需要主机密钥。
这些并不代表您将用于连接到容器的密钥,只是定义此特定主机的密钥。

主机密钥是用于验证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:root" | 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:root" | chpasswd
    

【讨论】:

  • 我逐字尝试了这个 Dockerfile,当我以 root 身份使用密码 root 进行 ssh 时,我得到“权限被拒绝”。我可能不清楚你用 ln -s 链接的密钥在做什么。否则,ssh 到服务器是否需要额外的设置?
  • @k-den SSH 守护进程的默认配置是PermitRootLogin prohibit-password。因此,当您可以使用 SSH 密钥进行登录时,这就是阻止您使用用户/密码登录的原因。这实际上是我在 /root/.ssh/authorized_keys 中使用此密钥的原因。为了使用它,我有一个公开私钥的卷,这样我就可以从我的主机或另一个容器中使用该 SSH 密钥登录。
  • 如果你真的想要一个用户/密码登录,你可以在RUN 语句中写一行echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config但请注意,永远不要在任何类型的生产设置中使用它
猜你喜欢
  • 2015-05-10
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多