Рейтинг:3

Настройка sftp в Amazon Linux 2 с ключами ssh, разделением пользователей (sftp и ssh), различными портами и ограничениями пользовательского каталога

флаг pk

TDLR: у меня есть Catch 22, где, в зависимости от разрешений на домашний каталог пользователя, я могу заставить работать аутентификацию SSH или ограничения пользовательского каталога, но не то и другое одновременно.

Кстати, я очень хочу запустить свой собственный SFTP-сервер. Пожалуйста, не рекомендуйте мне попробовать сервис AWS Transfer или что-то альтернативное. Спасибо.

Вот соответствующий (измененный по умолчанию) контент в /etc/ssh/sshd_config:

Подсистема sftp внутренний-sftp
Порт 22
Порт 2299
Соответствие группе sftpusers LocalPort 2299
  ChrootDirectory /sftp-данные/%u
  ForceCommand внутренний-sftp
Match Group sftpusers LocalPort 22
  DenyGroups
Совпадение с группой LocalPort 2299 *,!sftpusers
  Запретить пользователей *

Я хочу, чтобы порт 22 работал как обычно ssh, но только для пользователей, не использующих sftp. Для пользователей sftp в группе «sftpusers» я хочу, чтобы порт 2299 функционировал только как sftp, а не ssh. Для не-sftpusers я хочу запретить доступ к порту 2299.

Итак, я создал пользователя «user1» с домашним каталогом /sftp-data/user1 и оболочкой /sbin/nologin. Я создал /sftp-data/user1/.ssh/authorized_keys и заполнил его открытым ключом ssh. /sftp-data принадлежит пользователю root с правами доступа 700. /sftp-data/user1/.ssh и ниже принадлежат user1, а /sftp-data/user1/.ssh/authorized_keys имеет разрешение 600. Право собственности/разрешения /sftp-data/user1 здесь под вопросом. Подробнее ниже.

Я создал группу пользователей sftpusers и добавил пользователя user1 в эту группу. Однако встроенный пользователь ec2, которого вы получаете с AWS, не является членом этой группы. Тестирование с пользователем ec2 прошло отлично: доступ по ssh, порт 22 работал как всегда, но доступа к порту 2299 не было.

Итак, тестирование с пользователем user1 стало интересным. User1 не имеет доступа к порту 22 - это прекрасно! Когда user1 владеет /sftp-data/user1, аутентификация с открытым ключом ssh на порту 2299 проходит успешно, но пользователь немедленно выходит из системы, а это сообщение сохраняется в /var/log/secure:

2 сентября, 19:21:38 ip-192-168-0-25 sshd[10369]: Принят открытый ключ для пользователя 1 с порта <ip-адрес отредактирован> 61110 ssh2: ECDSA SHA256:<share отредактирован>
2 сентября, 19:13:23 ip-192-168-0-25 sshd[9803]: pam_unix(sshd:session): сеанс открыт для пользователя user1 пользователем (uid=0)
2 сентября, 19:13:23 ip-192-168-0-25 sshd[9803]: фатально: неправильное владение или режимы для каталога chroot "/sftp-data/user1" [postauth]
2 сентября, 19:13:23 ip-192-168-0-25 sshd[9803]: pam_unix(sshd:session): сеанс закрыт для пользователя user1

Конечно, это имеет смысл. Chroot требует, чтобы /sftp-data/user1 принадлежал root, права доступа 700. Итак, сделайте это так, и теперь аутентификация sftp (ключ ssh) не работает.

2 сентября, 19:41:00 ip-192-168-0-25 sshd[11693]: ошибка: AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys user1 SHA256: <share redacted> failed, status 22

Кстати, eic_run_authorized_keys — это оболочка, которую AWS использует для стандартной аутентификации ssh, чтобы включить AWS Instance Connect.

Для дополнительного кредита ... если вышеуказанная проблема не является достаточно сложной, можете ли вы придумать схему, в которой я могу предоставить определенным пользователям sftp доступ к определенным каталогам проектов и только к ним, не создавая группу для каждого проекта? Ссылка из домашнего каталога каждого пользователя на каталог проекта была бы потрясающей.

Дополнительная информация, запрошенная @anx:

# получить пароль user1
user1:x:1001:1001::/sftp-data/user1:/sbin/nologin
# namei -l /sftp-data/user1/.ssh/authorized_keys
f: /sftp-данные/user1/.ssh/authorized_keys
dr-xr-xr-x корень корень /
drwxr-xr-x root root sftp-данные
drwx------ root пользователь root1
drwx------ user1 sftpusers .ssh
-rw------- user1 sftpusers author_keys

Я включил ведение журнала DEBUG для sshd. Используя директиву ChrootDirectory, с /sftp-data/user1, принадлежащим root, и неудачной аутентификацией SSH, я вижу это в /var/log/secure:

debug1: не удалось открыть авторизованные ключи '/sftp-data/user1/.ssh/authorized_keys': разрешение отклонено

ps ясно показывает мне, что root запускает процесс sshd.

флаг pk
@anx спасибо за мысли. Сценарий eic_run_authorized_keys от AWS пытается проверить наличие ключа в метаданных инстанса EC2, чтобы узнать, используется ли EC2 Instance Connect. Этот сценарий указан в файле sshd_config в разделе AuthorizedKeysCommand. На справочной странице говорится: «Если ключ, предоставленный AuthorizedKeysCommand, не может успешно аутентифицировать и авторизовать пользователя, тогда аутентификация с открытым ключом продолжается с использованием обычных файлов AuthorizedKeysFile». Таким образом, он терпит неудачу со статусом 22 в команде curl, возвращающей статус 401. Затем идет обычный процесс с ~user1/.ssh/authorized_keys
флаг pk
В соответствии с предложением @anx я создал более простой вариант, который работает. Рабочий сценарий состоит в том, чтобы удалить директиву ChrootDirectory из sshd_config и user1, владеющего /sftp-data/user1. Это, конечно, не делает то, что я хочу. Чтобы добавить в Chroot, root должен владеть /sftp-data/user1, иначе будет выдано сообщение об ошибке. Как только root становится владельцем этого каталога, аутентификация SSH завершается ошибкой.
Michael Hampton avatar
флаг cz
Какая ошибка была зарегистрирована sshd для этого конкретного набора разрешений?
флаг pk
обновленный вопрос - с этой деталью @MichaelHampton
Michael Hampton avatar
флаг cz
Вашему ChrootDirectory требуется минимальное разрешение на поиск (`a+x`), чтобы непривилегированный пользователь мог спускаться в каталоги более низкого уровня.
флаг pk
@Майкл Хэмптон, ты понял. Создайте ответ, если хотите. Я слишком много читал о том, что на справочной странице говорится о ChrootDirectory: «При запуске сеанса sshd (8) проверяет, что все компоненты пути являются каталогами, принадлежащими root, которые не доступны для записи другим пользователям или группам». Итак, по-видимому, мы узнали, что sshd проверяет файл author_keys, который может быть прочитан как пользователь, пытающийся пройти аутентификацию. Спасибо большое!
Рейтинг:3
флаг cz

Твой ChrootDirectory является /sftp-данные/user1, которым должен владеть root. И это:

# namei -l /sftp-data/user1/.ssh/authorized_keys
f: /sftp-данные/user1/.ssh/authorized_keys
dr-xr-xr-x корень корень /
drwxr-xr-x root root sftp-данные
drwx------ root пользователь root1
drwx------ user1 sftpusers .ssh
-rw------- user1 sftpusers author_keys

Однако в этот момент sshd уже изменил пользователя на user1 и сбросил привилегии, поэтому user1 не может спускаться в каталоги более низкого уровня. Для этого в каталоге необходимо разрешение на поиск (а+х).

chmod a+x /sftp-данные/user1

Теперь user1 может спускаться в подкаталоги и .ssh каталог должен быть читаемым.

Рейтинг:1
флаг ve

Я думаю, что это в первую очередь проблема с правами доступа к папке. я так думаю /sftp-данные/user1/.ssh и каталоги под ним должны принадлежать пользователь1, но похоже, что они принадлежат корень. Попробуйте следующее как корень:

Проверьте открытый ключ в /sftp-данные/user1/.ssh/authorized_keys точно. После этого, я думаю, вам могут понадобиться изменить следующие разрешения:

chmod 700 /sftp-данные/user1/.ssh
chmod 600 /sftp-data/user1/.ssh/authorized_keys
корень chown: sftpusers/sftp-данные
chown -R пользователь1:пользователь1 /sftp-данные/пользователь1/.ssh

Перезапустите SSH, и я думаю, все будет хорошо.

флаг pk
Спасибо за ответ. К сожалению, я уже пробовал эти разрешения. На всякий случай я выполнил предложенные вами команды и нашел тот же результат. Ошибка аутентификации SSH. Я вот думаю, логично, что может отличаться от варианта, где user1 владеет /sftp-data/user1? Может ли быть так, что sshd (работающий от имени пользователя root) не может получить доступ к авторизованным ключам пользователя, потому что он просматривает каталоги?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.