项目

通用

个人资料

操作

Redmine, Phusion Passenger, Ruby Enterprise Edition, Apache 和 ... SELinux

免责声明:在应用以下详细步骤之前,请确保您理解这些步骤。如果出现问题,我概不负责!!尤其是像安全增强型Linux这样的软件可能会使系统的任何部分出现故障。请确保在可以承担重新安装或能够以其他方式将系统恢复到良好状态的环境中测试此内容。请注意,本文是为CentOS 5.5编写的。其他发行版可能有所不同。话虽如此,这些说明对我个人来说效果良好。

本指南已在以下软件和版本上进行了测试

我不会详细介绍这些项目的安装。前三个项目在自己的网站上都有优秀的文档,后三个项目随操作系统提供。

我想达成的目标

主要的是,当SELinux导致问题时,一般的建议是禁用它。我知道,这确实很麻烦!但它也能提供很多额外的安全性,所以我希望尝试让它继续运行,至少在目标模式下。某些系统可能无法适应这种设置,例如受网页托管软件控制的服务器。在尝试此操作之前,请考虑这些问题。我建议从测试设置开始。

假设

  • 您至少有一些使用例如 chown, chmod, chcon 命令(更改所有者、更改权限、更改SELinux安全标签)的经验。
  • 上述软件已按其网站上描述的默认方式安装。
  • 软件在禁用SELinux或以宽容模式运行时运行良好。
  • 系统上使用的相同用户帐户用于运行Apache、Phusion Passenger和Redmine。如果不是这样,请相应地进行调整。
  • root用户是网站文件的拥有者,apache是组拥有者,这意味着Apache不能随意写入任何文件或目录。如果不是这样,请相应地进行调整。

在执行以下命令之前,您将想要停止Apache,完成后再次启动。

缩写和路径

  • Ruby Enterprise 将被称为 RE,并安装在一些名为 ${RE} 的路径中。
  • Phusion Passenger 将被称为 PP,并安装在一些名为 ${PP} 的路径中。这可能是 RE 下的某个路径,例如 ${RE}/ruby/gems/1.8/gems/passenger-x.x.x。
  • Redmine 将被称为 RM,并安装在一些名为 ${RM} 的路径中。

权限

我们将在这里处理两组不同的权限。首先,是文件系统权限。文件必须可读,可能可写,甚至可以被 web 服务器用户执行。其次,是 SELinux 权限。如果文件系统权限禁止访问,则禁止访问。如果文件系统权限允许访问,则 SELinux 仍然可以根据其自己的规则集禁止访问。

apache 用户运行时带有 SELinux 理解的某个安全标签。基于这个安全标签,某些操作被允许或禁止。例如,SELinux 策略(=规则数据库)说,带有安全标签 httpd_t(=apache)的进程可以监听端口 80。策略还允许它读取标记为 httpd_sys_content_t 的文件。

我们将确保文件系统权限以及 SELinux 权限在需要的地方允许读/写/执行权限,仅使用现有的 SELinux 标签,并且两组权限相互一致。

Ruby 企业版和 Phusion Passenger

基本权限

首先,我们将给 root 用户所有者权限并撤销 REE 文件上的所有执行权限。然后,我们仅恢复目录上的执行权限,以便可以进入。接下来,我们将设置默认的 SELinux 用户和标签,以便 REE 可以正常使用(实际上,您还需要遵循下面的步骤才能使其正常工作)。

  1. 赋予 root 用户所有者权限
    chown -R root:root ${RE}
  2. 撤销所有执行权限,但允许所有者读/写,其他人读访问
    chmod -R u=rw,g=r,o=r ${RE}
  3. 仅恢复目录上的执行权限(注意这里 a+X 中的 X 是一个大写字母 X)
    chmod -R a+X ${RE}
  4. 设置默认的 SELinux 用户和标签
    chcon -R -u system_u -t usr_t ${RE}

现在我们将恢复 REE 系统库上的执行权限,并给它们分配库类型的 SELinux 标签。

  1. 设置所有 "*.so" 文件的执行权限
    find -P ${RE} -type f -name "*.so*" -exec chmod a+x {} \;
  2. 为 "*.so" 文件设置 SELinux 库标签
    find -P ${RE} -type f -name "*.so*" -exec chcon -t lib_t {} \;
  3. 设置 "*.a" 文件的执行权限
    find -P ${RE} -type f -name "*.a" -exec chmod a+x {} \;
  4. 为 "*.a" 文件设置 SELinux 库标签
    find -P ${RE} -type f -name "*.a" -exec chcon -t lib_t {} \;

二进制文件

在这里,我们将恢复 REE 二进制文件的执行权限,并设置它们的 SELinux 标签。

  1. 设置 bin 目录下所有文件的执行权限
    find -P ${RE} -type d -name "bin" -exec chmod -R a+x {} \;
  2. bin 目录下的所有文件设置 SELinux 二进制标签
    find -P ${RE} -type d -name "bin" -exec chcon -R -t bin_t {} \;

Apache 模块

接下来,我们将确保 Apache 可以将 Phusion Passenger 作为模块加载。SELinux 包含一个标签用于此目的(httpd_modules_t)。如果没有这个标签在模块上,Apache 将不会被允许将其作为此类加载。Phusion Passenger 依次执行一个名为 ApplicationPoolServerExecutable 的文件,该文件也必须是可执行的。由于它不在 bin 目录中,该文件没有被上面描述的操作标记为可执行。

  1. 允许 Phusion Passenger 运行 ApplicationPoolServerExecutable
    chmod a+x ${PP}/etc/apache2/ApplicationPoolServerExecutable
    chcon -t bin_t ${PP}/etc/apache2/ApplicationPoolServerExecutable
    
  2. 允许 Apache 将 Phusion Passenger 作为模块运行
    chmod a+x ${PP}/etc/apache2/mod_passenger.so
    chcon -t httpd_modules_t ${PP}/etc/apache2/mod_passenger.so
    

关于 Phusion Passenger 的更多信息:临时目录

Passenger 需要一个临时目录,它可以在其中写入。我建议创建一个仅由 PP 使用而不是系统默认的目录,因为我似乎记得即使 SELinux 启用时这也无法正常工作。请参阅文档中的这部分 以获取一些详细信息。

PP 临时目录由 Apache 配置中的 PassengerTempDir 指令设置。在那里设置它,创建目录,并调整权限

chown -R apache:apache ${PP_TEMP_DIR}
chmod -R u=rwX,g=rX,o-rwx ${PP_TEMP_DIR}
chcon -R -u system_u -t httpd_tmpfs_t ${PP_TEMP_DIR}

httpd_tmpfs_t 标签授予乘客模块所需的某些额外权利,例如创建特殊文件,如套接字或 fifos。

到目前为止

您可以将我至今为止描述的步骤下载为bash脚本文件:RubyAndSELinux。请勿直接运行此文件。确保您理解它,并根据您的配置更改顶部附近的文件系统路径。

还有一个脚本,可以使SELinux更改在文件系统重新标记后持久化:RubyAndSEmanage。请注意,这不会更改任何文件系统权限,也不会应用策略。它包含Ruby Enterprise和Phusion Passenger部分中描述的更改,但不包括临时目录部分。要应用策略,请执行

touch /.autorelabel
并重新启动。再次强调,请确保您知道自己在做什么!您可能需要了解一些正则表达式语法,以便将此文件适应您的特定情况。

Redmine

如果您使用这些说明完成了这一部分,那么下一部分将容易理解。

Redmine需要一些目录可写才能正常工作。这些目录包括:${RM}/log、${RM}/tmp、${RM}/files和${RM}/public/plugin_assets。

首先,我们设置基本权限(再次强调,ug+X中的X是大写字母X)

chown -R root:apache ${RM}
chmod -R u=rw,g=r,o-rwx ${RM}
chmod -R ug+X ${RM}
chcon -R -u system_u -t httpd_sys_content_t ${RM}

然后,我们为各个目录应用权限

chown -R apache:apache ${RM}/log
chcon -R -t httpd_log_t ${RM}/log

chown -R apache:apache ${RM}/tmp
chcon -R -t httpd_tmpfs_t ${RM}/tmp

chown -R apache:apache ${RM}/files
chcon -R -t httpd_sys_script_rw_t ${RM}/files

chown -R apache:apache ${RM}/public/plugin_assets
chcon -R -t httpd_sys_script_rw_t ${RM}/public/plugin_assets

您还可以将我描述的第二部分下载为bash脚本文件:RedmineAndSELinux。请勿直接运行此文件。确保您理解它,并根据您的配置更改顶部附近的文件系统路径。

总结

  • Ruby Enterprise Edition的默认安装似乎在*.rb文件上有一些可执行权限,我认为这些权限不应该存在。我们已修复了此问题。
  • Ruby安装中文件的默认SELinux标签已设置为usr_t,库为lib_t,可执行文件为bin_t,Apache模块(Phusion Passenger,即mod_rails)为httpd_modules_t。
  • Phusion Passenger有一个工作目录,可以在此处存储其文件、上传和套接字。
  • Redmine可以写入其日志、文件目录、临时目录和plugin_assets目录。

注意

我建议坚持使用Passenger 2.2.15。
虽然可能使3.0.2正常工作,但它会将拒绝消息填充到审计日志中。

gem uninstall passenger
gem install passenger -v=2.2.15
passenger-install-apache2-module

Sascha Sanches更新 超过12年前 · 3次修订