如果我的应用程序从一开始就可以运行在较低级别,为什么还要使用chroot进行沙箱安全保护?

我正在用C语言编写HTTP服务器守护程序(有某些原因),并使用systemd单元文件对其进行管理。

我正在重写一个20年前设计的应用程序,大约在1995年。他们使用的系统是先创建chroot,然后设置setuid,再执行标准过程。

现在,在我之前的工作中,通常的策略是永远不要以root用户身份运行任何进程。您为此创建一个用户/组并从那里运行。当然,系统确实以root身份运行某些东西,但是我们无需root即可完成所有业务逻辑处理。

现在,对于HTTP守护程序,如果不在应用程序内部chroot的话,我可以在没有root的情况下运行它。那么,永远不要以root用户身份运行该应用程序是否更安全?

从一开始就以mydaemon-user身份运行它是否更安全?而不是使用root启动,chroot,然后将setuid设置为mydaemon-user?

JdeBP

似乎其他人已经错失了你的观点,这不是为什么要使用更改的根源(当然您已经很清楚地知道了这一点),或者当您还清楚地知道在以下情况下运行时,可以采取什么措施来限制恶魔?非特权用户帐户;但是为什么要在应用程序内部执行此操作实际上,有一个相当重要的例子。

考虑httpdDaniel J. Bernstein的publicfile包中dæmon程序的设计。它要做的第一件事是将root更改为通过命令参数被告知要使用的根目录,然后将特权授予在两个环境变量中传递的非特权用户ID和组ID。

Dæmon管理工具集具有专用工具,可用于更改根目录以及删除非特权用户和组ID。杰里特·帕佩(Gerrit Pape)的特权chpst我的nosh工具集具有chrootsetuidgid-fromenv洛朗·贝科特(Laurent Bercot)的s6具有s6-chroots6-setuidgid韦恩·马歇尔(Wayne Marshall)的《 Perp》有runtooland runuid依此类推。实际上,它们都具有M. Bernstein自己的daemontools工具集,setuidgid并且具有先例。

人们会认为可以从httpd这种专用工具中提取功能并使用它们。然后,按照您的设想,服务器程序的任何部分都不会以超级用户特权运行。

问题是,作为直接结果,必须要做更多的工作来设置更改后的根,这会带来新的问题。

就伯恩斯坦而言httpd根目录树中唯一的文件和目录就是要发布到全世界的文件和目录。没有别的树都没有。而且,没有理由在该树中存在任何可执行程序映像文件。

但移动的根目录改变了成链加载程序(或systemd),突然在节目图像文件httpd,任何共享库,它的负荷,并且在任何特殊的文件/etc/run以及/dev该程序加载或C运行时库访问在程序初始化(你可能会发现相当令人吃惊,如果你truss/ straceC或C ++程序),必须存在在改变根。否则httpd无法链接到,也不会加载/运行。

请记住,这是一个HTTP(S)内容服务器。它可能会在更改后的根目录中提供任何(世界可读)文件。现在,这包括诸如共享库,程序加载器以及操作系统的各种加载器/ CRTL配置文件的副本之类的内容。而且,如果某种程度上(偶然的)手段使内容服务器有权东西,那么受到威胁的服务器可能会获得对httpd自身甚至系统的程序加载器的程序映像的写访问权(请记住,你现在有两个平行套/usr/lib/etc/run,和/dev目录,以保持安全。)

httpd更改根目录并本身放弃特权的情况都不是这种情况

因此,您交易了少量的特权代码,这很容易审核,并且可以在httpd程序开始时以超级用户特权运行;用于在更改后的根目录中大大扩展文件和目录的攻击面。

这就是为什么它不像在服务程序外部执行所有操作那样简单。

请注意,这仍然是其内部功能的最低限度httpd所有这一切做的事情,如看在用户ID和组ID投入摆在首位的环境变量操作系统的帐户数据库的代码外部httpd程序,在简单的独立审计的命令,如envuidgid(当然它是一个UCSPI工具,所以它不含有的代码的相关TCP端口(一个或多个)或接受连接上听,它们是如命令的域tcpservertcp-socket-listentcp-socket-accepts6-tcpserver4-socketbinders6-tcpserver4d,等。)

进一步阅读

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Xamarin Profiler从一开始就使应用程序崩溃

如何从一开始就在应用程序中添加vuetify?

为什么在makefile的末尾使用+ =不能工作,但是一开始可以使用?

当我一开始不使用xrange时,为什么未定义xrange?

如果数据库已提供缓存,为什么还要使用应用程序级缓存?

我怎样才能让我的应用程序获得的WebView点击一个链接的URL,就可以进行操作,然后加载它?

计算从一开始到视图变为交互式和可点击的那一刻,Android应用程序的加载时间

在C ++中:如果我们在字符串中添加一些整数,为什么它从一开始就删除了那么多字符?(字符串+整数)

Kubernetes日志-从一开始

如何从一开始就订阅

自动增量从一开始

我的 Web 应用程序在尝试通过域名访问时不起作用,但如果我使用服务器的 IP 后跟一个端口,它就可以工作

为什么一开始的包络曲线是错误的?

为什么我的心跳过程一开始就死了?

为什么我一开始就变得很空字符串

为什么当val_loss从一开始就增加时,我的val_accuracy停滞在0.0000e + 00?

TensorFlow CNN:为什么验证损失从一开始就明显不同并且一直在增加?

为什么我的函数不返回值,但是如果使用print,它就可以工作?

无法将应用程序作为服务启动,但是作为独立进程运行就可以了

: 一开始做什么?

如果从一开始就看不见,这里的地图将不会显示

我正在用python编写一个GUI程序,该程序需要从一开始就以root身份运行,我该如何处理呢?

如何从一开始就进行非贪婪搜索

Maven:为什么不使用pom.xml配置就可以运行mvn checkstyle:checkstyle?

为什么我的数据库列表一开始不显示,而是单击后才显示?

为什么我的神经网络序列模型一开始就达到了 0.9998 的准确度?

角度模态-模态从一开始就显示出来,我无法隐藏它

我怎样才能让容器从一开始就变得健康

我如何从一开始就为场景中的每个按钮调用相同的函数?