Как ограничить доступ через sftp
Материал из База знаний проекта Russian Fedora
Многие задавались вопросом- Как ограничить доступ пользователю через sftp только одной домашней папкой Решение очень простое, работает в openssh начиная с версии 4.9:
Добавляем пользователя
groupadd -r sftpusers useradd tom -g sftpusers
Все возможные ошибки связаны с тем, что неверно выставлены права на ChrootDirectory, либо неверно выставлены владелец
useradd -G sftpusers -s /bin/false -d /home/user1 user1 mkdir /home/user1 chown root.user1 /home/user1 chmod 750 /home/user1
После выполнения этой команды у вас должны быть следующие права на ChrootDirectory:
drwxr-x--- 3 root user1 4096 Май 4 01:16 /home/user1
Т.е записывать в ChrootDirectory пользователь ничего не сможет, поэтому необходимо создать внутри нее еще одну папку /home/user1/files и уже на нее дать необходимые права, например 770 .
Обратите внимание, что /etc/ssh/sshd_config - конфиг сервера, а /etc/ssh/ssh_config - конфигурационный файл клиента!
После этого меняем в /etc/ssh/sshd_config подсистему:
-Subsystem sftp /usr/lib/openssh/sftp-server +Subsystem sftp internal-sftp
Подсистему меняем для того, чтобы когда пользователь оказался в своей директории он мог пользоваться sftp. Если этого не сделать, то внутрь директории необходимо будет положить все файлы, необходимые для работы стандартной оболочки shell ( т.е сам shell, /usr/lib/openssh/sftp-server и наконец некоторые файлы из /dev, как сказано в мануале: "/dev nodes such as null(4), zero(4), stdin(4), stdout(4), stderr(4), arandom(4) and tty(4) devices." )
Далее добавляем в /etc/ssh/sshd_config следующее:
AllowGroups wheel sftponly
Match Group sftpusers
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
После изменений перезапускаем сервер:
service sshd restart
Ошибки, возникают если:
- Writing failed: broken pipe : права на ChrootDirectory отличны от 750
- Couldn't get handle: Permission denied при выполнении команды ls : неверно выставлены владельцы ChrootDirectory
- Couldn't canonicalise: Permission denied при выполнении команды сd: неверно выставлены владельцы ChrootDirectory
- Connection reset by peer Couldn't read packet: Connection reset by peer : права на ChrootDirectory отличны от 750
Поиск ошибок:
Выставляем в /etc/ssh/sshd_config
LogLevel Debug
Рестартуем сервер:
service sshd restart
После этого смотрим в /var/log/secure
http://blog.antage.name/posts/sftp-chroot-%D0%B2-%D0%B4%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D1%8E%D1%8E-%D0%BF%D0%B0%D0%BF%D0%BA%D1%83.html
http://www.gossamer-threads.com/lists/openssh/dev/44657
