如果您有一个 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 的文档并不那么冗长,您必须深入研究一些示例配置文件。
目前尚不清楚设置无根容器的最佳实践是什么。