如何监禁 fastcgi 服务器(或网络代理服务器)?

如何监禁 fastcgi 服务器(或网络代理服务器)?

如果您有一个 Web 服务器(例如 nginx),您通常会使用 fast-cgi 服务器或另一个应用程序 http 服务器来获取动态内容。这意味着在这两种情况下,Web 服务器进程和 fast-cgi(或应用程序 http 服务器进程 - 在下面称为从属进程)之间都有一个很好的进程分离。

Web 服务器的配置使得 fast-cgi 通过套接字或代理 http 请求。

如果从属进程中存在安全问题,为从属服务器和 Web 服务器创建不同的用户可以保护文件系统位置。

但是如何在 Linux 下进一步限制从属进程呢?

(比如无法上网、发邮件等)

我可以想到以下路线:

  • SELinux
  • Linux 系统命名空间(“容器”、cgroups

在当前发行版(例如 Debian)上最方便的方法是什么?实际操作中又该如何去做呢?有配置示例吗?

答案1

在Ubuntu下,另一种监禁方式是阿帕莫尔

它是基于路径的强制访问控制 (MAC) Linux 安全模块 (LSM)。在 Ubuntu 10.04 中,它默认为选定的服务启用。

文档相当分散。 Ubuntu 文档可以......更好。即便是上游文档没有给出很好的介绍。这参考页状态:

警告:本文档还处于创建的早期阶段,尚未形成任何形式,无法用作参考手册

然而,入门相对容易。 AppAmor 配置文件与可执行路径匹配,例如/var/www/slave/slave.如果没有其他匹配,配置文件的默认规则是拒绝(这很棒)。配置文件拒绝规则始终在允许规则之前匹配。空洞的个人资料否定了一切。

不同二进制文件的配置文件存储在/etc/apparmor.d.apparmor_status显示哪些配置文件处于活动状态、哪些配置文件处于强制模式(良好)或仅处于抱怨模式(仅打印日志消息)。

创建新的配置文件/var/www/slave/slave只是:

aa-genprof /var/www/slave/slave

从另一个终端开始/var/www/slave/slave并执行一个典型的用例。完成后,在上一个终端中按s和。f

现在/etc/apparmor.d包含一个配置文件var.www.slave.slave。如果从属设备进行了一些分叉,则配置文件只会非常稀疏 - 子级的所有访问都将被忽略。

不管怎样,配置文件现在在强制模式下处于活动状态,您可以迭代地触发从属设备中的操作并监视tail -f /var/log/messages违规行为。在另一个终端中,您编辑配置文件并aa-enforce var.www.slave.slave在每次更改后执行。然后日志显示:

audit(1308348253.465:3586):  operation="profile_replace" pid=25186 name="/var/www/slave/slave"

违规行为看起来像:

operation="open" pid=24583 parent=24061 profile="/var/www/slave/slave" 
  requested_mask="::r" denied_mask="::r" fsuid=10004 ouid=10000 name="/var/www/slave/config"

配置文件规则如下:

/var/www/slave/config r,

将允许将来访问。

这一切都非常简单。

AppAmor支持粗粒度的网络规则,例如

network inet stream,

如果没有此规则,则无法访问互联网(包括本地主机),即使用该规则,您可以使用iptables更细粒度的规则(例如,基于从机 uid)。

另一个文档片段包含有关子配置文件对于 PHP 脚本。

var.www.slave.slave 配置文件框架如下所示:

#include <tunables/global>

/var/www/gapapp/gap.wt {

  #include <abstractions/base>

  network inet stream,

  /var/www/slave/config r,
  /var/www/slave/exehelper/foo ix,
  /var/www/slave/db/* rw,

  ...
}

有了这样的配置文件,从站就不能再调用像mail或 之类的实用程序sendmail

答案2

还有另一种方法可以将其监禁:iptables使用所有者匹配扩展!

使用 iptables,可以阻止从属用户的所有进程的传出(OUTPUT)网络流量。这非常容易设置,即很方便。

这意味着通过这个简单的设置,您可以将您的从属进程从文件系统位置和网络中监禁起来。

$ iptables -N slave_chain
$ iptables -A slave_chain -m owner --uid-owner 10004 -p tcp --dport 1:1024 -j REJECT
$ iptables -A slave_chain -m owner --uid-owner 10004 -p tcp -d 127.0.0.1 -j ACCEPT
$ iptables -A slave_chain -m owner --uid-owner 10004 -j REJECT
$ iptables -A OUTPUT -j slave_chain

其中10004是从属用户的uid。从站只需回复代理网络服务器请求。其他所有内容都会被拒绝,例如尝试连接到本地主机端口 25 上的 MTA 以发送垃圾邮件。

请注意,从属设备可以通过mail或等命令发送邮件sendmail(如果可用),即需要进一步监禁 fs 位置(例如 chroot/cgroups),或者必须配置 MTA 以禁止从属用户发出邮件。

答案3

Cgroup 是一种监禁方式。自 2007 年以来,cgroups子系统甚至包含所谓的网络命名空间

目前的配送船Linux 容器用户空间工具lxc-*、命令行工具 ( ) 和示例配置文件的集合。它们还包括一个网络命名空间示例。

不幸的是,Ubuntu 10.04 (LTS)最近的内核更新破坏了网络命名空间

总而言之,有关 lxc 的文档并不那么冗长,您必须深入研究一些示例配置文件。

目前尚不清楚设置无根容器的最佳实践是什么。

相关内容