docker - 使用 SSH 服务器设置 Docker 容器?

标签 docker ssh containers alpine-linux sshd

我想设置一个具有以下功能的非常简约的 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"]

入口点.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 守护进程确实需要主机 key 。
这些并不代表您将用于连接到容器的 key ,只是定义此特定主机的 key 。

A host key is a cryptographic key used for authenticating computers in the SSH protocol.

来源:https://www.ssh.com/ssh/host-key

因此您必须为您的主机生成一些 key ,如果您真的不打算使用它们,则可以安全地忽略它们。

生成这些 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 key ,将它们公开在一个卷中,这就是我执行命令的原因:
    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
    

关于docker - 使用 SSH 服务器设置 Docker 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65340169/

相关文章:

python - 无法将特定文件复制到 Dockerfile 中的/app

docker - 如何使用标签名称作为正则表达式提取 docker hub 图像

node.js - 如何向Docker容器发送命令?

python - 使用 SSH 时仅在终止时显示 python 脚本的输出?

c++ - 删除结束迭代器是对标准的疏忽还是设计决策?

c++ - 为什么我看到 vector 的大小为零?

Docker:如何将文件从容器中的一个文件夹复制到另一个文件夹?

python - 通过 paramiko 执行长时间运行的命令

linux - 我如何让我的 .bat 文件运行 linux 命令到远程 linux

mysql - 如何在 kubernetes 中禁用 mysql 严格模式?