- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
chroot最佳实践的
暴露在互联网上的系统要将坏人隔离在外是一个很大的挑战,而且一直更新最新的安全补丁也不太容易。因此,一些聪明的管理员们尝试采用系统的方法来限制可能发生的入侵,这其中一个绝佳的方法就是使用chroot监狱(jail)。chroot监狱极大地限制了应用程序可查看的文件系统范围,拥有更少的系统权限,这些都是为了限制应用程序误操作或者被坏人利用从而对系统造成损害。本文简述一下chroot是如何工作的,并着重讨论一下开发者和管理员能够用到的一些最佳实践来让系统更加安全。
chroot背景
chroot系统调用将当前进程及其子进程的root目录修改到一个特定的路径,通常是在文件系统真正的root目录下的一些受限的子目录中。进程认为新的路径就是系统的“/”,因此我们将这个受限制的环境称为“监狱”。除非一些特殊手段,要从监狱里面逃出来是根本不可能的。
chroot系统调用存在于所有已知的UNIX版本中,它能够为运行的进程创建一个临时根目录,这种方法将一个受限制的文件系统(比如,/chroot/named)作为进程可见的最上层目录。
如何从监狱中逃脱
有一些非常有名的越狱手段,最常用的是在监狱中获取root权限。这种方法用于将程序chroot到了一个子目录,但是却将当前目录留在监狱外面。我们会为各种逃脱手段添加更多地注释--也就意味着会更多地介绍什么是必须被保护的,而不是教你如何越狱--但是这里有一篇整体介绍chroot的好文章。
使用mknod来创建原始磁盘设备,从而可以让你更加随心所欲地操作系统
使用mknod来创建/dev/mem,修改核心内存
寻找一个无意留下的通向监狱外面的硬链接(尽管软链接不能从监狱逃脱,但硬链接可以)
使用ptrace来跟踪在监狱外面的进程。我们能够修改这个程序让它为我们做一些坏事情。
几乎所有的越狱手段都需要root权限。
chroot通用原则
下面的介绍没有先后顺序,也没有站点会用到所有的原则。特别是有一些是应用在源代码层面的,另外一些是给系统管理员用来监禁现有系统的。很多原则可能用起来非常琐碎,因为一个可用的系统有那么多层面可以来加固,但是我们仍然会列举所有能想到的来供你选择。最根本的一个原则是:“有的放矢,对症下药”。我们通常最可能担心远程缓存溢出(remote buffer overflows), 这会让坏人完全地控制CPU:我们所有的步骤都是为了万一发生这种情况如何限制破坏。
在监狱中使用非root用户来运行程序
chroot监狱并非牢不可破的,但并不容易,这需要在监狱中获取root权限,因此我们必须采取措施来降低这种可能性。在监狱中使用非root用户来运行程序,这是我们所知最安全的方法。可能使用root用户启动某些守护进程从而进行一些需要相应权限的操作是必要的(比如说绑定某些序号较小的端口),但是这些程序在完成工作之后必须“放弃”root权限。我们相信这是正确设置监狱最重要的一个因素。
正确地“放弃”权限
我们看到有时候在一些操作系统上,一个程序通过使用“saveduid能够在非root用户和root用户间来回切换,这会被获取root权限的坏人所利用。如果考虑到操作系统的差别,如何正确地设置非常棘手:变数在于setresuid() seteuid(), setreuid(), and setuid()--而且这好像还不算完。如何正确选择取决于你的操作系统。
在这一点上目前最好的资源是Usenix 2002的一篇杰出论文Setuid Demystified, 作者是Hao Chen, David Wagner和Drew Dean: 它切中要害,读者可以参考5.2节“Comparison among Uid-setting System Calls”。
明确地chdir到监狱中
chroot命令本身并不会改变工作目录,因此如果新的根目录在当前目录下的话,应用程序仍然可以访问到外面的资源。在运行chroot之前应用程序应该明确的切换到监狱里的一个目录中:
[plain]?view plaincopy
...??
chdir(dir);??
chroot(dir);??
setXXuid(nonroot);??????//?give?up?root?permissions?correctly.??
...??
这样可以截断一条越狱的小路(但是要提醒的是你必须使用前面提到的一系列setXuid中的正确命令)。另一个chdir和chroot的可选顺序是:
[plain]?view plaincopy
...??
chroot(dir);??
chdir(/);??
...??
二者看起来是等价的。
监狱越小越好
这增强了一些不易发现的弱点的抵抗力。通常这要求开发者在进行chroot之
文档评论(0)