我已经在 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 等)对这些目录具有写入权限fcontext
public_content_t
public_content_rw_t
RedHat 文档。如果您的“本地策略”授予 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
答案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 虚拟机修复它。现在我发现这个问题相当老了。我被不充分的答案欺骗了,但我希望它仍然能帮助到某些人。