Вопрос или проблема
Я создал пользователя в Ubuntu и дал ему доступ по паролю, чтобы он мог войти с помощью ssh, но я хочу ограничить его использование на пользовательскую домашнюю папку, расположенную в:
/var/www/daniel (корневая папка с правильными правами)
/var/www/daniel/home (принадлежит daniel:daniel и имеет права 755)
В
/etc/ssh/sshd_config (я включил внутренний sftp)
Match User daniel
PasswordAuthentication yes
AllowTCPForwarding no
ForceCommand internal-sftp
ChrootDirectory %h
X11Forwarding no
перезапустил службу ssh
затем, когда я пытаюсь войти, я вижу в
auth.log
успешный вход пользователя, но затем сессия завершается с этой ошибкой
Accepted password for daniel ssh2
pam_unix(sshd:session): session opened for user daniel by (uid=0)
systemd-logind[508]: New session 63 of user daniel.
pam_unix(systemd-user:session): session opened for user daniel by (uid=0)
error: /dev/pts/2: No such file or directory
pam_unix(sshd:session): session closed for user daniel
Session 63 logged out. Waiting for processes to exit.
Есть идеи?
ОБНОВЛЕНИЕ
Я выполнил следующее с https://unix.stackexchange.com/questions/160461/chroot-gone-wrong-cant-ssh-with-user:
mount --bind /dev /var/daniel/dev
mount --bind /dev/pts /var/daniel/dev/pts
Ошибка, похоже, исчезла, но меня сразу же выкидывает после аутентификации
Accepted password for daniel
pam_unix(sshd:session): session opened for user daniel by (uid=0)
systemd-logind[508]: New session 130 of user daniel.
systemd: pam_unix(systemd-user:session): session opened for user daniel by (uid=0)
pam_unix(sshd:session): session closed for user daniel
systemd-logind[508]: Session 130 logged out. Waiting for processes to exit.
Проверьте /etc/passwd
.
Обычно домашний каталог пользователя – это /home/USER
, и переменная %h
соответствует пути к файлу /home/daniel
в этом случае.
Также вам нужно указать путь к /bin/bash
или подобной оболочке внутри chroot, если пользователь должен иметь возможность входить через SSH.
Я использую это уже много лет на Ubuntu.
Subsystem sftp /usr/lib/openssh/sftp-server
Match Group sftp
AllowTcpForwarding no
ChrootDirectory %h
ForceCommand internal-sftp
PasswordAuthentication yes
X11Forwarding no
Директория chroot должна принадлежать root и не должна иметь прав на запись для пользователя. Внутренние директории могут быть записываемыми. Это было сделано для того, чтобы избежать наличия домашних файлов, которые могут изменить предзагрузку библиотек. Но вы получите ошибки в auth.log, если это неправильно.
Также вы должны ограничить своего клиента sftp и не открывать обычную ssh сессию с терминалом.
Ответ или решение
При использовании SSH и конфигурации ChrootDirectory для ограничения доступа пользователей, может возникать ряд проблем, как это показано в вашем вопросе. Конкретно, ошибка «/dev/pts/2: Нет такого файла или каталога» указывает на то, что для работы с псевдоустройствами терминала требуется специальная настройка. Давайте детально разберем вашу ситуацию и предложим решение.
1. Основные требования к конфигурации Chroot
При использовании ChrootDirectory, особенно при настройке SFTP, необходимо учитывать следующие аспекты:
-
Права доступа к директории. Корневая директория Chroot должна принадлежать пользователю root и не должна иметь права на запись для пользователя, который является частью Chroot. В вашем случае
/var/www/daniel
должна быть владельцем root и иметь права 755. -
Структура каталогов. Внутри Chroot необходимо создать подкаталоги, которые будут доступны для пользователя. Например, если у вас есть каталог
/var/www/daniel/home
, он должен принадлежать пользователюdaniel
и иметь подходящие права доступа (например, 755).
2. Создание необходимых подкаталогов
Как вы уже делали, вам нужно выполнить команды для монтирования /dev
и /dev/pts
в пределах Chroot. Это решает первую ошибку. Убедитесь в правильности команд:
mkdir -p /var/www/daniel/dev/pts
mount --bind /dev /var/www/daniel/dev
mount --bind /dev/pts /var/www/daniel/dev/pts
3. Изменение конфигурации SSH
Проверьте ваш файл /etc/ssh/sshd_config
. Для правильной работы с SFTP ваша секция должна выглядеть примерно так:
Match User daniel
PasswordAuthentication yes
AllowTcpForwarding no
ForceCommand internal-sftp
ChrootDirectory /var/www/daniel
X11Forwarding no
4. Проверка конфигурации пользователя
Убедитесь, что в файле /etc/passwd
путь к домашнему каталогу пользователя daniel
правильно указывает на ChrootDirectory:
daniel:x:1001:1001::/var/www/daniel/home:/usr/sbin/nologin
Имейте в виду, что если у вас используется internal-sftp
, то для входа через SSH нормального shell-подхода не требуется (вы можете использовать /usr/sbin/nologin
или /bin/false
для предотвращения нормального входа).
5. Проверка прав доступа
После внесения всех изменений необходимо убедиться, что все права доступа установлены правильно:
# Убедитесь, что родительская директория принадлежит root
chown root:root /var/www/daniel
chmod 755 /var/www/daniel
# Убедитесь, что домашняя директория принадлежит пользователю daniel
chown daniel:daniel /var/www/daniel/home
chmod 700 /var/www/daniel/home
6. Перезапуск SSH
После всех изменений не забудьте перезапустить службу SSH:
sudo systemctl restart sshd
Заключение
Если вы все сделали правильно, то ошибка входа должна исчезнуть, и пользователь daniel
сможет успешно войти в систему с помощью SFTP, имея доступ только к своему набору файлов. Если проблемы все еще сохраняются, проверьте системные журналы (/var/log/auth.log
) на наличие каких-либо новых ошибок или подсказок, которые помогут в диагностике.