总结:alpine linux 3.9.4 的root用户无法使用ssh,除非设置密码,为什么?
我在使用 ssh 和 linux alpine 的普通 root 用户时遇到了奇怪的行为。
设置
我已经创建了一个 ssh-hop docker 容器。
FROM alpine
# add openssh and clean
RUN apk add --update openssh \
&& rm -rf /tmp/* /var/cache/apk/*
# copy sshd config
COPY docker/sshd_config /etc/ssh/
# copy entrypoint script
COPY docker/docker-entrypoint.sh /usr/local/bin
# copy root SSH key
COPY docker/keys/root/id_rsa.pub /root/.ssh/authorized_keys
# copy host identification keys
COPY docker/keys/host /etc/ssh
EXPOSE 22
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["/usr/sbin/sshd","-D"]
所提及的sshd_config
:
Port 22
PasswordAuthentication no
PubkeyAuthentication yes
LogLevel VERBOSE
ChallengeResponseAuthentication no
还有docker-entrypoint.sh
:
#!/bin/sh
#prepare run dir
if [ ! -d "/var/run/sshd" ]; then
mkdir -p /var/run/sshd
fi
echo "Starting sshd"
exec "$@"
在构建 docker 容器之前通过以下方式生成适当的密钥:
echo "Generating root rsa key pair"
ssh-keygen -f docker/keys/root/id_rsa -N '' -t rsa -b 4096
echo "Generating host rsa key pair"
ssh-keygen -f docker/keys/host/ssh_host_rsa_key -N '' -t rsa -b 4096
echo "Generating host ecdsa key pair"
ssh-keygen -f docker/keys/host/ssh_host_ecdsa_key -N '' -t ecdsa
echo "Generating host ecdsa key pair"
ssh-keygen -f docker/keys/host/ssh_host_ed25519_key -N '' -t ed25519
问题
如果我使用 Docker Engine 18.09.6 和 alpine linux 版本 3.9.4 在 Ubuntu Server 18.04 下构建 Dockerfile,并尝试使用 ssh 进入容器,我会收到错误。但 alpine linux 版本 3.8.1 不会出现这种情况ssh [email protected] -i docker/keys/root/id_rsa
ssh: connect to host 127.0.0.1 port 22: Connection refused
解决方案
我发现,只要为 root 用户设置密码(该用户在普通 Alpine 中没有该密码),ssh 进入服务器就可以按预期工作。因此,解决方案是将其添加RUN echo "root:root" | chpasswd
到 Dockerfile 中。
问题
在服务器日志中 sshd 状态userauth_pubkey: disabled because of invalid user [preauth]
。为什么除非设置密码,否则 root 用户对 sshd 无效?
包含完整设置的 Git repo:https://github.com/JSPRH/sshd-docker/tree/c7fdef446b37484589cac546e9192a37440327a7