限制安全入侵的影响systemd指令

三个星期前,我写的systemd服务沙盒和安全强化101:介绍了Linux的安全功能由管理服务流程systemd

本周,我将探讨如何使用由提供的更高级的安全特性systemd。在继续阅读本文之前,您需要阅读101引言。

上周,Qualys的研究人员披露了OpenSMTPD中的一个远程代码执行(RCE)漏洞:一个开源电子邮件服务器。这似乎是一个合适的时间,以确保您已经锁定了这项服务。它将作为本教程的示例服务。

OpenSMTPD的大多数部分被设计为在非特权进程中运行。然而,这是一个“最坏的情况是”正如吉勒斯·切哈德(Gilles Chehade)所说的那样。该漏洞允许攻击者使用完整的管理特权执行远程命令。远程执行的任意代码猖獗运行是你最不想看到的事情,你的电子邮件服务器。

我是一个OpenSMTPD用户,我的服务器被此漏洞积极的目标。在该漏洞被公开数小时后,有希望的攻击者积极地试图利用它。老实说,我没有做好我的工作,也没有拿到那份工作smtpd在我的系统上运行的服务。纯粹的狗屎运保护我的系统不被利用。

沙箱是所有关于限制服务的权限,访问和能力,它不能只是什么期待它执行任何选项的点。要阻止意外的行为,你需要收集它是如何预计工作的详细知识。

我会用一些最复杂的安全指令首先启动。这些可以使最影响您的系统安全。

我建议你申请指令每次一个彻底测试你的服务如预期仍然执行在应用完每一个之后。

限制功能

Linux内核功能是每个进程的线程安全策略,控制对特定内核特性的访问。您可以通过仅将服务限制为预期功能来提高安全性并减少入侵的影响。

可用的能力集中列出功能(7)手册页

如果你不知道那么你的服务需要什么样的能力在这里是如何去解决它。你会注意到,手册页列出了系统调用(如chroot (2))。如果您正在保护一个开源程序服务,那么您可以通过它的源代码定位和搜索这些特定的系统调用。

或者,你可以尝试删除所有功能,并看到服务是否以及如何失败。明确设置CapabilityBoundingSet =指令没有删除所有功能。

我熟悉OpenSMTPD的架构,所以我知道它需要哪些功能。我已经为我的OpenSMTyabo亚博体育下载PD实例设置了以下列出的允许功能systemd.service:

CapabilityBoundingSet = CAP_SYS_CHROOT CapabilityBoundingSet = CAP_SETUID CapabilityBoundingSet = CAP_SETGID CapabilityBoundingSet = CAP_CHOWN CapabilityBoundingSet = CAP_DAC_READ_SEARCH CapabilityBoundingSet = CAP_NET_BIND_SERVICE AmbientCapabilities =

OpenSMTPD运行作为root用户和非特权产卵子进程中一个最小的根目录下。它需要改变根目录的能力(chroot),并分配这些进程的用户和组身份(UID/GUID)。最后,进程需要监听几个有特权的网络端口(端口低于1024)。

我们不希望任何这些子进程(或者任何妥协的过程中从进程产生)的继承这些功能。甲损害过程可以例如潜在地接管(端口80和443)的作用作为网络服务器。

设置AmbientCapabilities选项,以防止任何子进程继承父进程的功能。

允许放盘系统调用

我们还可以阻止或允许列表特定的系统调用(系统调用)或系统调用的集合。这提供了比内核能力集的更精细的控制。

systemd.exec (5)手册页包含了一些预定义的系统调用集。

@系统服务就是这样的一个集合。它包含一些服务使用的公共系统调用。它明显地删除了重新引导系统、干扰交换内存和更改系统时钟的能力。很少有服务需要这些功能。

我给自己定了以下允许列表的yabo亚博体育下载系统调用的OpenSMTPD的:

SystemCallFilter = @系统服务SystemCallFilter = @安装SystemCallErrorNumber = EPERM

OpenSMTPD需求@安装为了使用chroot

限制对文件系统的访问

Linux内核可以改变的过程是如何看待的文件系统。这可能是一种强有力的方式来限制一个妥协的过程中访问和造成多大的损害它可能会导致你的系统。

您可以防止它读成/ tmp目录(临时文件)的其他进程或读写的/ dev(硬件设备包括磁盘)。您还可以以只读方式挂载整个文件系统。

最后这个能力可以帮助防止恶意代码在系统上运行,从让你的系统上的持续立足点。

下面的配yabo亚博体育下载置完成了上述所有工作:

PrivateTmp =真PrivateDevices =真ProtectHome =真ProtectSystem =严格

然而,OpenSMTPD电子邮件服务器将没有多大用处给任何人如果不能在磁盘上的任意位置书写。它需要访问一些特定的目录存储的运行信息,状态,和您的电子邮件OpenSMTPD存储所有的这些东西下的不同点/ VAR

属性可以覆盖特定路径的只读文件系统限制ReadWritePaths指示。但是,您可以让事情更通过创建一个假的临时文件系统,只映射所需的目录,将其固定。这将充当读写路径的允许列表。

Openyabo亚博体育下载SMTPD的以下配置示例演示了这种方法:

TemporaryFileSystem=/var/ spool/ empty/smtpd TemporaryFileSystem=/var/ spool/clientmqueue BindPaths=/var/spool/lpd BindPaths=/var/spool/mail BindPaths=/var/spool/mqueue BindPaths=/var/spool/smtpd BindPaths=/var/spool/smtpd BindPaths=/var/spool/smtpd BindPaths=/var/mail

现在,你可能想知道如何识别目录上面的列表。这可能是配置中的不同!我将向您介绍的过程/等(配置)目录。

您可以通过阅读可用的文档和源代码来计算所需的目录。然而,这可能需要花费一整天的时间,而且您可能根本不具备必要的编程技能。

最简单的方法是运行软件strace像平常一样使用它。strace可以跟踪和打印文件系统操作的程序进行。更重要的是,它可以打印文件路径的程序交互使用。

下面的命yabo亚博体育下载令启动OpenSMTPD并跟踪与之交互的文件/等目录中。

的/ usr /斌/ strace的-f \ / usr / sbin目录/ smtpd的2>&1 |\ egrep的-o“”/等[^ “] +””

这应该给你你需要创建一个允许列表中的信息。请注意,您必须正常使用程序一段时间,因为它的行为,因此文件操作,可以使用不同的功能时,随时间变化和。

下面是我为我的OpenSMTPD实例提出的配置。

TemporaryFileSystem = /等BindReadOnlyPaths =的/ etc /别名BindReadOnlyPaths =的/ etc /加密策略/ BindReadOnlyPaths = / etc / group中BindReadOnlyPaths = / etc / hosts中BindReadOnlyPaths =的/ etc / opensmtpd / BindReadOnlyPaths =的/ etc / letsencrypt / BindReadOnlyPaths =的/ etc /本地时间BindReadOnlyPaths =的/ etc / nsswitch.conf中BindReadOnlyPaths = / etc / passwd中BindReadOnlyPaths =的/ etc / PKI / BindReadOnlyPaths =的/ etc / resolv.conf的BindReadOnlyPaths = / etc / services中BindReadOnlyPaths =的/ etc /用户

这些路径都符合我们对电子邮件服务的期望。它们都是只读访问。它不能突然改变DNS解析器,干扰cyrpto-library策略,或者改变完全不相关程序的配置。

该系统的持久性配置应该在服务妥协的情况下,仍然相当安全。

您也可以在上面的基础上进行构建,以涵盖其他根级目录。但是,你可能需要考虑一个黑名单。它的生成速度要快得多,你可以在多个不同的服务中共享它。

下面的块yabo亚博体育下载列表限制访问基于壳远程执行漏洞通常调用程序。

InaccessiblePaths =的/ usr /斌/在InaccessiblePaths =的/ usr /斌/ cron的InaccessiblePaths =的/ usr /斌/庆典InaccessiblePaths =的/ usr / bin / sh的InaccessiblePaths =的/ usr /斌/ zsh的InaccessiblePaths =的/ usr /斌/ wget的InaccessiblePaths =的/ usr /斌/卷曲InaccessiblePaths =的/ usr /斌/ SSH InaccessiblePaths =的/ usr /斌/ SCP InaccessiblePaths =的/ usr /斌/蟒InaccessiblePaths =的/ usr /斌/ perl的InaccessiblePaths =的/ usr /本地/

您的电子邮件服务器不太可能有正当理由执行任何程序。无论做很多的其他的服务。

禁止危险的,晦涩的行为

有一对夫妇更安全指令systemd.exec (5)手册页。你可以很可能使所有的大多数服务的下列指示就没有坏的影响你的系统。yabo亚博体育下载(除了第一个指令。)

我建议你让他们一个接一个,并使每一个经过测试服务。

MemoryDe​​nyWriteExecute =真ProtectHostname =真ProtectControlGroups =真ProtectKernelModules =真ProtectKernelTunables =真LockPersonality =真RestrictSUIDSGID =真SystemCallArchitectures =本地

我不会对这些指令进行更详细的讨论。其中一些是不言自明的,但它们都禁止使用很少使用和模糊的功能。您可以在手册页面中找到关于它们的更多信息。

我希望这篇文章提出你的意识的一些安全功能,您可以通过启用systemd。随着时间的推移,相信很多Linux发行将使至少一些指令默认情况下为他们的大部分systemd.service。最终,将达到系统管理员可根据自己的使用更严格的安全政策。

这些指令合并将停止指定的远程执行代码漏洞,受灾OpenSMTPD。但是,关键外卖是,你要努力沙箱长期运行和暴露于Internet的服务。有没有必要为您的Web服务器能够加载内核模块,您的电子邮件服务器更改主机名,或者您的DNS服务器来启动wget和时间表再次发生与任务cron的

你不应该依赖systemd单独保存一天。然而,也可以是安全的,以帮助增加一层保护您的系统在acively利用远程执行代码漏洞的事件。