我如何告诉SELinux在特定的目录下给vsftpd写入权限?

我已经在我的Fedora 12服务器上设置了vsftpd,我想要进行以下configuration。 每个用户都应该可以访问:

  • 他的主目录(/ home / USER);
  • 我为他创build的网页目录(/ web / USER)。

为了达到这个目的,我首先configuration了vsftpd来将每个用户chroot到他的主目录。 然后,我用正确的权限创build/web/USER ,并使用mount --bind /web/USER /home/USER/Web以便用户可以通过/home/USER/Web访问/web/USER

我还打开了SELinux的布尔型ftp_home_dir以便vsftpd被允许写入用户的主目录。

除了当用户尝试上传或重命名/home/USER/Web的文件时,这种方式非常有效,SELinux禁止它,因为还必须对/web/USER进行更改,而SELinux不会将vsftpd权限授予写任何东西到该目录。

我知道我可以通过打开SELinux boolean allow_ftpd_full_accessftpd_disable_trans来解决问题。 我也尝试使用audit2allow来生成一个策略,但是它所做的是生成一个策略,使ftpd可以对public_content_ttypes的目录进行写入访问; 这相当于打开allow_ftpd_full_access ,如果我理解正确的话。

我想知道是否可以将SELinuxconfiguration为允许通过FTP写入特定目录/web/USER及其内容,而不是完全禁用SELinux的FTP控件。

  • vsftp挂在“150这里是目录列表”。
  • 如何学习远程FTP服务器的被动端口范围
  • 设置VSFTP上传文件权限
  • 无法读/写在centos 6.0上的FTP目录vsftpd(空文件夹)
  • 用户locking到特定的目录设置vsftpd
  • 使用FTPS(FTP通过显式TLS / SSL)与主动FTP?
  • 2 Solutions collect form web for “我如何告诉SELinux在特定的目录下给vsftpd写入权限?”

     # semanage fcontext -a -t public_content_rw_t "/myftp/pub(/.*)?" 

    一定要包括(/.*)? 在目录名称的末尾。


    我也尝试使用audit2allow生成一个策略,但是它所做的是生成一个策略,该策略给ftpdtypes为public_content_t的目录写入权限; 这相当于打开allow_ftpd_full_access,如果我理解正确的话

    基本上,是的。 因为SELinux允许用public_content_t标记的目录/文件在不同的服务之间共享。 但是,通过使用sebooleans (或sebool ,更确切地说)来实现进一步的访问控制。

    给予“ftpd完全访问权限”并不意味着赋予权限来执行/读取/写入什么以及在哪里。 SELinux已经为您的系统上的服务指定了策略; 这意味着,如果目录的文件上下文( fcontext )是public_content_t ,则允许ftpd读取文件。 如果目录的fcontext为public_content_rw_t ,则SELinux为ftp服务器提供写入权限; 根据相关的RedHat文档 ,其他服务(如samba,apache等)必须被允许通过布尔对这些目录进行写入权限。 如果您的“本地策略”在标记为public_content_t目录中给予ftpd写入权限,则本质上会剥离一层安全性。 因此,我build议使用public_content_rw_t上下文标记目录,并删除自定义生成的本地策略。

    有关更多信息和详细信息,请参阅SELinux维基页面 。

    让我们把已知的信息总结成一个更好的答案。 您已经提出了一个解决scheme,使用特定的selinux布尔值,或者允许对具有public_content_t任何目录进行写入访问,这对您来说都是不理想的。

    你需要的是确保目录有适当的selinux上下文。 您有path/ home / $ USER / Web和/ web / $ USER,前者用于通过--bind选项安装后者。

    我想到的第一个想法就是在没有mount --bind情况下尝试一下。 我想这将工作FTP访问您的第一次testing,也许你已经试过了。 你需要检查这些文件现在是否可以通过HTTP访问。 如果没有,这意味着你的Apache Userdir不起作用,应该在mount --bind -bind之前修复。 你可能想要在/ web中有这些目录,因为外部存储,对吧?

    我猜这里唯一的问题是/ web / $ USER目录没有像自动为/ home / $ USER / Web一样configuration。 您可以创build另一个目录,如/ home / $ USER / Test,并比较ls -lZ的结果。 你会清楚地看到差异。

    您可以使用chcon来更改上下文,然后检查发生了什么。 这是一个低级别的工具,它不是一个系统的解决scheme,但它可以帮助您快速testing。 你也可以在这里做一些黑魔法,在/ home / $ USER / Web上运行restorecon ,我相信它会正确设置上下文。

    最终的解决scheme是使用semanage fcontext来更改path数据库,以便将正确的上下文也用于/ web以及任何/ web / $ USER, 特别是使/ home / $ USER / Web 上下文 for / web / $ USER作为mount --bind本身就是一个黑魔法。

    修改path数据库之后,不要忘记运行restorecon -r /web ,还可以testingrestorecone -r /home不会中断此操作。 同时检查是否使用正确的上下文创build了new / web / $ USER目录,或者需要restorecon 。 如果您对这种情况不满意,可以configurationrestorecond来监视这些目录并立即修复上下文,但这应该是最后一招。

    一定要记住,selinux本身并不知道path数据库,但是完全依赖于各个文件的安全上下文。

    我现在还没有一个支持selinux的发行版,否则我会给你更多的命令行示例,解决scheme会更加精确。 如果需要的话,我可以稍后用centos / fedora虚拟机进行修复。 现在我看到这个问题是相当古老的。 我被这个答案不足所欺骗,但是我希望它能帮助别人。

    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.