允许 vsftpd 用户仅上传到单个目录

允许 vsftpd 用户仅上传到单个目录

我需要允许通过 vsftpd 进行广泛的匿名下载访问,但将上传限制在单个路径。除了使用文件系统权限之外,还有其他方法可以做到这一点吗?

尝试锁定文件系统有两个主要问题:

  1. 它会影响所有用户——这是一个异构系统,因此很难确保每个人都除了FTP 用户有访问权限。
  2. 它似乎不是分层的——即使我们可以锁定顶级目录,但似乎有人很容易创建一个 FTP 可写的子目录,此时 vsftpd 似乎很乐意允许将内容上传到其中。

现在#2 是更大的问题,所以我们实际上将只读区域安装为只读文件系统,但这会导致自身的问题。

答案1

您可以使用bindmount 选项将文件系统层次结构中已安装的部分映射/重新安装到其他地方。假设您有一个包含视频的 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>

相关内容