我如何告诉 SELinux 授予 vsftpd 在特定目录中的写访问权限?

我如何告诉 SELinux 授予 vsftpd 在特定目录中的写访问权限?

我已经在 Fedora 12 服务器上设置了 vsftpd,并且希望进行以下配置。每个用户都应该有权访问:

  • 他的主目录(/home/USER);
  • 我为他创建的 Web 目录 (/web/USER)。

为了实现这一点,我首先配置了 vsftpd,让每个用户 chroot 到他们的主目录。然后,我创建了/web/USER具有正确权限的 ,并使用mount --bind /web/USER /home/USER/Web,以便用户可以/web/USER通过 进行访问/home/USER/Web

我还打开了 SELinux 布尔值,ftp_home_dir以便允许 vsftpd 在用户的主目录中写入。

这种方法运行良好,但当用户尝试上传或重命名 中的文件时/home/USER/Web,SELinux 会禁止此操作,因为更改也必须对 进行/web/USER,并且 SELinux 不允许 vsftpd 向该目录写入任何内容。

我知道我可以通过打开 SELinux 布尔值allow_ftpd_full_access或 来解决问题ftpd_disable_trans。我也尝试使用 audit2allow 来生成策略,但它所做的是生成一个策略,授予 ftpd 对 类型目录的写访问权限public_content_t;如果我理解正确的话,这相当于打开allow_ftpd_full_access

我想知道是否可以配置 SELinux 以允许 FTP 对特定目录/web/USER及其内容进行写访问,而不是完全禁用 SELinux 的 FTP 控制。

答案1

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

(/.*)?请确保在目录名称末尾包含。


我还尝试使用 audit2allow 来生成策略,但它所做的是生成一项策略,授予 ftpd 对 public_content_t 类型目录的写访问权限;如果我理解正确的话,这相当于打开 allow_ftpd_full_access

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

授予“ftpd 完全访问权限”并不意味着授予它执行/读取/写入任何内容和位置的权限。SELinux 已为系统上的服务指定了策略;这意味着,如果目录的文件上下文 ( ) 为,ftpd则允许读取文件。如果目录的 fcontext 为,则 SELinux 向 ftp 服务器授予写入权限;根据相关规则,必须通过布尔值允许其他服务(如 samba、apache 等)对这些目录具有写入权限fcontextpublic_content_tpublic_content_rw_tRedHat 文档。如果您的“本地策略”授予 ftpd 在标记为 的目录中的写入权限public_content_t,则它实际上剥夺了一层安全性。因此,我建议使用上下文标记目录public_content_rw_t,并删除您自定义生成的本地策略。

欲了解更多信息和详情,请参阅SELinux 维基页面

答案2

尝试这个:

setsebool -P allow_ftpd_full_access on

如果这是 SELinux 的错,那么有几个 SELinux 布尔值值得一看。

最好的开始是:getsebool -a | grep ftp

你会看到类似

allow_ftpd_anon_write --> 关闭 allow_ftpd_full_access --> 打开 allow_ftpd_use_cifs --> 关闭 allow_ftpd_use_nfs --> 关闭 ftp_home_dir --> 打开 ftpd_connect_db --> 关闭 httpd_enable_ftp_server --> 关闭 tftp_anon_write --> 关闭

并非所有这些都与 vsftpd 相关,例如 >httpd_enable_ftp_server 用于运行 FTP 的 Apache,而 tftp_anon_write 用于 >tftpd。我先从以下开始:

setsebool -P allow_ftpd_full_access on setsebool -P ftp_home_dir on

来源: https://www.centos.org/forums/viewtopic.php?t=8129

答案3

让我们将已知信息总结为一个更好的答案。您已经陈述了一个解决方案,使用特定的 selinux 布尔值或允许对任何目录进行写访问,但这public_content_t两种方法对您来说都不理想。

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

我想到的第一个想法是尝试不使用mount --bind。我猜这对您的第一次测试的 FTP 访问有用,也许您已经尝试过了。您需要检查这些文件现在是否可以通过 HTTP 访问。如果不行,则意味着您的 Apache Userdir 不起作用,在使用 之前应该先修复它mount --bind。您可能希望将这些目录放在 /web 中,因为有外部存储,对吗?

我猜这里唯一的问题是 /web/$USER 目录的配置方式与 /home/$USER/Web 的自动配置方式不同。您可以创建另一个目录(如 /home/$USER/Test)并比较ls -lZ它们的结果。您会清楚地看到差异。

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

最终的解决方案是使用semanage fcontext改变路径数据库以使用正确的上下文,包括 /web 以及任何 /web/$USER 和尤其拥有 /home/$USER/Web 上下文相同至于 /web/$USERmount --bind本身就有点黑魔法。

更改路径数据库后,不要忘记继续运行restorecon -r /web,最好也测试一下restorecone -r /home是否破坏了它。还要检查是否使用正确的上下文创建了新的 /web/$USER 目录或restorecon是否需要。如果您对这种情况不满意,您可以配置restorecond以监视这些目录并立即修复上下文,但这应该是最后的手段。

永远记住,selinux 本身不知道路径数据库,而仅仅使用相应文件的安全上下文。

我手头上没有支持 selinux 的发行版,否则我会给你更多的命令行示例,解决方案会更精确。如果需要,我可以稍后用 centos/fedora 虚拟机修复它。现在我发现这个问题相当老了。我被不充分的答案欺骗了,但我希望它仍然能帮助到某些人。

相关内容