Итак, я пытаюсь создать пользователя, который имеет доступ только к определенной папке внутри моей public_html
папки. Я успешно создал пользователя и могу войти в систему. У меня были некоторые проблемы со входом в систему в начале, потому что папка должна была принадлежать root, прежде чем пользователь sftp мог выполнить sftp.
Поэтому я следовал этому руководству:https://serverfault.com/questions/584986/bad-ownership-or-modes-for-chroot-directory-component- с указанием изменить владельца папки на root.
После этого я могу успешно войти в систему, однако после входа я не могу добавлять файлы или делать что-либо в этой папке, так как она принадлежит пользователю root.
Я попробовал создать группу и добавить пользователя root и пользователя sftp в качестве членов этой группы, но это тоже не сработало.
Я решил обойти эту проблему, создав еще один каталог внутри папки sftp, используя пользователя root, а затем изменив владельца на пользователя sftp, но мне это кажется слишком хакерским и дополнительно добавляет еще одну папку в древовидную структуру, что мне не очень нравится.
Есть идеи, как разрешить пользователю sftp доступ на запись в папку, при этом root останется владельцем?
решение1
На нескольких сайтах обмена стеками много разговоров об этом. Но если это не дубликат...
В моем CentOS 7, когда вы используете ChrootDirectory для ограничения пользователя каталогом, этот каталог должен принадлежать root и не может разрешить запись любому другому пользователю ни по разрешениям, ни по FACL. Вы можете настроить символическую ссылку, но пользователь sftp не сможет перейти по ней, если он/она ограничен каталогом. Поэтому вам придется сделать это.
Создать пользователя
useradd ftp_user
установить пароль
passwd ftp_user
Настройте разрешения. Его домашний каталог станет его тюрьмой.
chown root:root /home/ftp_user
chmod 0755 /home/ftp_user
Ограничьте пользователя этой зоной сейчас
vi /etc/ssh/sshd_config
Изменить это:
#Subsystem sftp /usr/lib/openssh/sftp-server
к
Subsystem sftp internal-sftp
Добавлять
Match User ftp_user
ChrootDirectory %h
ForceCommand internal-sftp
AllowTCPForwarding no
X11Forwarding no
Сохраните и выйдите из vi.
Не забудьте:
systemctl restart sshd
Теперь мы обманем их. Допустим, у вашего клиента есть веб-сайт, с которым вы собираетесь позволить ему продолжать играть по адресу /var/www/corny_website
Убедитесь, что у него есть разрешения на этот каталог.
setfacl -m u:ftp_user:rwx /var/www/corny_website
setfacl -d -m u:ftp_user:rwx /var/www/corny_website
Теперь вы монтируете его, а не создаете на него символическую ссылку.
mkdir /home/ftp_user/corny_website
mount --bind /var/www/corny_website /home/ftp_user/
Теперь, когда пользователь зайдет по sftps, он не получит эту ошибку о сломанном канале, и он сможет видеть только /home/ftp_user и, что еще важнее, он сможет загружать или скачивать только с /var/www/corny_website, который он видит как /corny_website.