我有一个带有 openssh 的 Linux 主机,允许用户使用公钥登录。
AuthenticationMethods publickey
但现在我有一些用户需要使用 sftp 以文件拖放的形式访问主机。此外,这些用户将使用密码而不是密钥对。
我让所有这些用户都属于该组sftp_users
。
[email protected]:~$ id
uid=1005(an_sftp_user) gid=1007(an_sftp_user) groups=1007(an_sftp_user),1006(sftp_users)
[email protected]:~$ groups
an_sftp_user sftp_users
[email protected]:~$
现在我创建由 root 0644 拥有的文件/etc/ssh/sshd_config.d/sftp_users.conf
:
Match Group sftp_users
X11Forwarding no
AllowTcpForwarding no
AuthorizedKeysCommand /bin/true
AuthenticationMethods keyboard-interactive
PasswordAuthentication yes
ChrootDirectory /sftp-incoming
我这样做的目的是允许组中的用户sftp_users
能够使用密码连接并访问/sftp-incoming
。
实际情况是,我在服务器端看到一条消息,auth.log
仅表示连接已关闭,而在客户端,我看到(使用sftp -v
)它尝试了它找到的证书$HOME/.ssh
(我已为这些测试禁用了 ssh 代理)但从未尝试过密码登录。
确实,有一行是这样的:
debug1: Authentications that can continue: publickey
所以我的匹配结果不满意或未被看到。但我不清楚原因。
有什么建议我哪里做错了吗?
更新
@Gogowitsch 的解决方案在很大程度上回答了这个问题,尤其是注意到sftp-internal
,它位于 openssh 内部,因此不需要二进制文件即可在我的 chroot jail 中使用。同样重要的是发现 chroot 要求目录链从 0755 root 一直向下,因此我必须对一些权限进行排序。
他建议将配置全部放在一个sshd_config
文件中,这也很有帮助。事实上,一旦它开始工作,将该块移回配置文件并使用Include
它包含它就会失败,而不会出现错误。该块根本没有使用。我使用的是 8.2:
OpenSSH_8.2p1 Ubuntu-4ubuntu0.1, OpenSSL 1.1.1f 31 Mar 2020
答案1
我发现以下紧迫问题:
- 指令的顺序。尝试将 放在
Match Group sftp_users
文件的最末尾,/etc/ssh/sshd_server
而不是 中的文件sshd_server.d
。这是因为最后一个AuthenticationMethods
似乎获胜。 - 应该
AuthenticationMethods
包含password
。这显然是允许密码登录的原因。 - 使用该
ChrootDirectory
指令时,您还必须在Match Group sftp_users
块中使用以下行:
这是因为ForceCommand internal-sftp
/sftp-incoming
成为所有命令的文件系统的实际根目录。默认情况下,SSH 服务器尝试运行诸如 之类的二进制文件/usr/lib/openssh/sftp-server
。从 chroot 文件系统的角度来看,可能不存在这样的文件。
可能的话,您还必须运行以下命令来确保该/sftp-incoming
目录不能被“其他”(八进制 0750 中的最后一位数字)访问:
chmod 0750 /sftp-incoming
作为实验设置,我使用了以下内容Dockerfile
:
FROM ubuntu
RUN apt-get update && \
apt-get install -yq openssh-sftp-server openssh-server
# Create two users, first has no password, second has the password "1".
# This will also create the home directory for the sftp user.
RUN echo | adduser only-passwordless-user && \
echo | adduser only-with-password-user --home /sftp-incoming/only-with-password-user && \
echo only-with-password-user:1 | chpasswd && \
addgroup sftp_users && \
adduser only-with-password-user sftp_users
# These are needed so that sshd is happy. Otherwise,
# it likes to say “bad ownership or modes for chroot directory”
RUN mkdir -p -m0755 /var/run/sshd && \
chown root:root /sftp-incoming && \
chmod 0750 /sftp-incoming
RUN echo AuthenticationMethods publickey >> /etc/ssh/sshd_config && \
printf "Match Group sftp_users \n\
ForceCommand internal-sftp \n\
X11Forwarding no \n\
AllowTcpForwarding no \n\
AuthorizedKeysCommand /bin/true \n\
AuthenticationMethods keyboard-interactive password \n\
PasswordAuthentication yes \n\
ChrootDirectory /sftp-incoming \n\
" >> /etc/ssh/sshd_config # cannot be ".d/sftp_users.conf"
# Start a single-connection debug server.
# Remove the -d parameter to make it long-lived but quiet.
ENTRYPOINT /usr/sbin/sshd -d
您可以使用以下命令启动在端口 2200 上运行的 sshd:
docker build . -t ssh-test && docker run -it --name ssh-test -p2200:22 --rm ssh-test bash
要使用 sftp 连接它,请运行以下命令:
sshpass -p1 sftp -P 2200 [email protected]