У меня есть Linux-хост с openssh, который позволяет пользователям входить в систему с открытым ключом.

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]:~$

Теперь я создаю файл, /etc/ssh/sshd_config.d/sftp_users.confпринадлежащий root, 0644:

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-тюрьме. Также важно было обнаружить, что chroot требует, чтобы цепочка каталогов была 0755 root полностью вниз, поэтому мне пришлось отсортировать некоторые разрешения.

Его предложение поместить всю конфигурацию в один sshd_configфайл также оказалось полезным. Действительно, после того, как он заработал, перемещение этого блока обратно в файл конфигурации и использование Includeдля его включения завершились неудачно без ошибок. Блок просто не используется. Я использую 8.2:

OpenSSH_8.2p1 Ubuntu-4ubuntu0.1, OpenSSL 1.1.1f  31 Mar 2020

который утверждает, что поддерживает Include(присутствует с 7.3p1 и, по-видимому, совершено 1 февраля 2020 года (до 31 марта 2020 года).

answer

Я вижу эти неотложные проблемы:

  • Порядок директив. Попробуйте поместить 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каталог не может быть доступен для 'other' (последняя цифра в восьмеричном формате 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

Вы можете запустить sshd, работающий на порту 2200, с помощью этой команды:

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]