我正在用C语言编写HTTP服务器守护程序(有某些原因),并使用systemd单元文件对其进行管理。
我正在重写一个20年前设计的应用程序,大约在1995年。他们使用的系统是先创建chroot,然后设置setuid,再执行标准过程。
现在,在我之前的工作中,通常的策略是永远不要以root用户身份运行任何进程。您为此创建一个用户/组并从那里运行。当然,系统确实以root身份运行某些东西,但是我们无需root即可完成所有业务逻辑处理。
现在,对于HTTP守护程序,如果不在应用程序内部chroot的话,我可以在没有root的情况下运行它。那么,永远不要以root用户身份运行该应用程序是否更安全?
从一开始就以mydaemon-user身份运行它是否更安全?而不是使用root启动,chroot,然后将setuid设置为mydaemon-user?
似乎其他人已经错失了你的观点,这不是为什么要使用更改的根源(当然您已经很清楚地知道了这一点),或者当您还清楚地知道在以下情况下运行时,可以采取什么措施来限制恶魔?非特权用户帐户;但是为什么要在应用程序内部执行此操作。实际上,有一个相当重要的例子。
考虑httpd
Daniel J. Bernstein的publicfile包中dæmon程序的设计。它要做的第一件事是将root更改为通过命令参数被告知要使用的根目录,然后将特权授予在两个环境变量中传递的非特权用户ID和组ID。
Dæmon管理工具集具有专用工具,可用于更改根目录以及删除非特权用户和组ID。杰里特·帕佩(Gerrit Pape)的特权chpst
。我的nosh工具集具有chroot
和setuidgid-fromenv
。洛朗·贝科特(Laurent Bercot)的s6具有s6-chroot
和s6-setuidgid
。韦恩·马歇尔(Wayne Marshall)的《 Perp》有runtool
and runuid
。依此类推。实际上,它们都具有M. Bernstein自己的daemontools工具集,setuidgid
并且具有先例。
人们会认为可以从httpd
这种专用工具中提取功能并使用它们。然后,按照您的设想,服务器程序的任何部分都不会以超级用户特权运行。
问题是,作为直接结果,必须要做更多的工作来设置更改后的根,这会带来新的问题。
就伯恩斯坦而言httpd
,根目录树中唯一的文件和目录就是要发布到全世界的文件和目录。有没有别的树都没有。而且,没有理由在该树中存在任何可执行程序映像文件。
但移动的根目录改变了成链加载程序(或systemd),突然在节目图像文件httpd
,任何共享库,它的负荷,并且在任何特殊的文件/etc
,/run
以及/dev
该程序加载或C运行时库访问在程序初始化(你可能会发现相当令人吃惊,如果你truss
/ strace
C或C ++程序),也必须存在在改变根。否则httpd
无法链接到,也不会加载/运行。
请记住,这是一个HTTP(S)内容服务器。它可能会在更改后的根目录中提供任何(世界可读)文件。现在,这包括诸如共享库,程序加载器以及操作系统的各种加载器/ CRTL配置文件的副本之类的内容。而且,如果某种程度上(偶然的)手段使内容服务器有权写东西,那么受到威胁的服务器可能会获得对httpd
自身甚至系统的程序加载器的程序映像的写访问权。(请记住,你现在有两个平行套/usr
,/lib
,/etc
,/run
,和/dev
目录,以保持安全。)
httpd
更改根目录并本身放弃特权的情况都不是这种情况。
因此,您交易了少量的特权代码,这很容易审核,并且可以在httpd
程序开始时以超级用户特权运行;用于在更改后的根目录中大大扩展文件和目录的攻击面。
这就是为什么它不像在服务程序外部执行所有操作那样简单。
请注意,这仍然是其内部功能的最低限度httpd
。所有这一切做的事情,如看在用户ID和组ID投入摆在首位的环境变量操作系统的帐户数据库的代码是外部httpd
程序,在简单的独立审计的命令,如envuidgid
。(当然它是一个UCSPI工具,所以它不含有的代码的相关TCP端口(一个或多个)或接受连接上听,它们是如命令的域tcpserver
,tcp-socket-listen
,tcp-socket-accept
,s6-tcpserver4-socketbinder
,s6-tcpserver4d
,等。)
httpd
。公共文件。cr.yp.to.httpd
。丹尼尔·伯恩斯坦(Daniel J. Bernstein)的软件合而为一。软件。乔纳森·德·博因·波拉德(Jonathan de Boyne Pollard)。2016年。gopherd
。丹尼尔·伯恩斯坦(Daniel J. Bernstein)的软件合而为一。软件。乔纳森·德·博因·波拉德(Jonathan de Boyne Pollard)。2017。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句