![仅具有特定文件夹访问权限的 SFTP 用户 - 拒绝创建文件的权限](https://linux22.com/image/1604543/%E4%BB%85%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E6%96%87%E4%BB%B6%E5%A4%B9%E8%AE%BF%E9%97%AE%E6%9D%83%E9%99%90%E7%9A%84%20SFTP%20%E7%94%A8%E6%88%B7%20-%20%E6%8B%92%E7%BB%9D%E5%88%9B%E5%BB%BA%E6%96%87%E4%BB%B6%E7%9A%84%E6%9D%83%E9%99%90.png)
因此,我尝试创建一个只能访问我public_html
文件夹内特定文件夹的用户。我已成功创建用户,并且可以登录。一开始,我在登录时遇到了一些麻烦,因为文件夹必须由 root 拥有,然后 sftp 用户才能进行 sftp。
因此我遵循了以下指南:https://serverfault.com/questions/584986/bad-ownership-or-modes-for-chroot-directory-component- 指示我将文件夹的所有权更改为根用户。
完成此操作后,我可以成功登录,但是,登录后,我无法添加文件或在此文件夹内执行任何操作,因为它归 root 所有。
我尝试创建一个组,并将 root 用户和 sftp 用户添加为该组的成员,但这也不起作用。
我的解决方法是使用 root 用户在 sftp 文件夹内创建另一个目录,然后将所有权更改为 sftp 用户,但这对我来说似乎太过黑客,而且还在树结构中添加了另一个文件夹,而我并不喜欢这样。
有什么想法可以允许 sftp 用户对文件夹具有写访问权限,而 root 仍为所有者?
答案1
一些 Stack Exchange 网站上有很多关于此类事情的讨论。但万一这不是重复的……
在我的 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)上传或下载。