openssh,允许某些用户使用密码和有限权限的 sftp

openssh,允许某些用户使用密码和有限权限的 sftp

我有一个带有 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

声称支持Include(自7.3p1显然坚定的于 2020 年 2 月 1 日(2020 年 3 月 31 日之前)。

答案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]

相关内容