我需要允许通过 vsftpd 进行广泛的匿名下载访问,但将上传限制在单个路径。除了使用文件系统权限之外,还有其他方法可以做到这一点吗?
尝试锁定文件系统有两个主要问题:
- 它会影响所有用户——这是一个异构系统,因此很难确保每个人都除了FTP 用户有访问权限。
- 它似乎不是分层的——即使我们可以锁定顶级目录,但似乎有人很容易创建一个 FTP 可写的子目录,此时 vsftpd 似乎很乐意允许将内容上传到其中。
现在#2 是更大的问题,所以我们实际上将只读区域安装为只读文件系统,但这会导致自身的问题。
答案1
您可以使用bind
mount 选项将文件系统层次结构中已安装的部分映射/重新安装到其他地方。假设您有一个包含视频的 Samba 共享和一个包含图片库的 Samba 共享,并且您想将它们作为只读 FTP 下载提供。
mkdir -p /var/ftp/Videos /var/ftp/Images
mount --bind /share/Videos /var/ftp/Videos
mount --bind /share/Images /var/ftp/Images
然后将这些文件系统设为只读:
mount -o remount,ro /var/ftp/Videos
mount -o remount,ro /var/ftp/Images
文件系统权限保持不变,但视频和图像下的所有内容现在都是只读的。因此,FTP 用户不太可能访问具有权限的子目录drwx------
,但 FTP 用户也无法在具有权限的子目录中进行写入drwxrwxrwx
。
绑定挂载不采用选项,因此要实现只读挂载需要重新挂载,因此我认为您不能使用 fstab 来使其持久,而需要编写脚本。
接下来设置上传目录:
mkdir -p /var/ftp/Upload
chmod 700 /var/ftp/Upload
chown ftp.ftp /var/ftp/Upload
然后正确配置 vsftpd 以进行匿名下载,并将匿名 FTP 用户 chroot() 到 /var/ftp。我已经有一段时间没有这样做了,但大致如此,未经测试:
# /etc/vsftpd/vsftpd.conf
listen=YES
#The following directives prevent local users from logging in and enables anonymous access respectively.
local_enable=NO
anonymous_enable=YES
#The following directive enables write access to the ftp server’s filesystem.
write_enable=Yes
anon_upload_enable=Yes
# Sets the root directory for anonymous connections.
anon_root=/var/ftp
当然,还有很多相关选项可以包括在内。
答案2
你可以通过 proftpd 轻松获得你想要的东西
<VirtualHost anonymous.example.net>
ServerName "ANONYMOUS"
Protocols ftp
Port 21
DefaultRoot /var/ftp/pub/
<Anonymous /var/ftp/pub/>
User ftp
Group ftp
UserAlias anonymous ftp
MaxStoreFileSize 100 Mb user ftp
<Directory /var/ftp/pub/>
<Limit RMD MKD XMKD XRMD>
DenyAll
</Limit>
</Directory>
</Anonymous>
</VirtualHost>