囚禁你的精灵(daemon)进程这样,这些动态连接库就被复制到了牢笼(jail)的/lib目录下,也就是说bin/icecast能够在牢笼中执行了。 不过,这样还不够,在任何的牢笼环境中都建立一个/dev/null设备是一个非常不错的想法: # mkdir dev# mknod -m 666 dev/null c 1 3 这一步要谨慎,并确信你已经正确地建立了设备节点。 许多服务可能需要系统的/etc/localtime文件。最后,我们需要把/etc/localtime文件复制到/usr/local/icecast/etc/目录中,并填加一个到/usr/local/icecast/usr/lib/zoneinfo的符号连接: # mkdir etc# mkdir usr/lib # cp /etc/localtime etc # ln -s /etc/localtime usr/lib/zoneinfo 现在,我们为icecast精灵准备的牢房已经装修的差不多了,里面有如下目录: drwxr-xr-x 2 root root 4096 May 6 14:38 bindrwxr-xr-x 2 root root 4096 May 19 18:43 conf drwxr-xr-x 2 root root 4096 May 19 18:01 dev drwxr-xr-x 2 root root 4096 May 6 14:38 doc drwxr-xr-x 2 root root 4096 May 22 14:41 etc drwxr-xr-x 2 root root 4096 May 19 15:30 lib drwxr-xr-x 2 icecast icecast 4096 May 6 14:41 logs drwxr-xr-x 2 root root 4096 May 19 16:41 static drwxr-xr-x 2 root root 4096 May 6 14:38 templates drwxr-xr-x 3 root root 4096 May 22 14:42 usr 4.3.第三步:为这个精灵建立一个chroot包装 记住:执行chroot需要root权限。 你可能会想,我首先执行/usr/sbin/chroot,然后执行/bin/su,接着执行/bin/icecast,就能够把icecast精灵放到牢笼环境。但是别忘了,一旦执行了/usr/sbin/chroot,你就不能再访问整个文件系统了,也就是你将无法执行su程序了。把su也放到这个牢笼环境中也是可以的,但是其关联文件非常复杂,很难维护,而且su是一个SUID程序,放到了这个环境中,肯定会降低这个环境的安全性。 编写一个简短的C程序,通过这个程序调用必要的jail系统调用,然后执行icecast服务,是一个比较容易的解决方案。这个程序将在这个牢笼之外执行,它需要做以下事情:
有一点要注意:这个程序的权限不能设置setuid/setgid位。我们的目的是以超级用户的权限调用setuid()/setgid()系统调用降低系统的权限,和把程序的权限设置为SUID或者SGID有极大的差别。把程序的SUID/SGID置位表示程序以拥有者的权限运行,通常意味着提高程序运行的权限。 下面我提供一个简化的chroot包装程序。请注意:在实际过程中应该注意对每个系统调用错误的处理。 =================================================#include #include main (argc, argv) { int gidlist[] = {505}; chroot("/usr/local/icecast"); chdir("/"); setgid(505); setgroups(1,gidlist); // also, could use initgroups setuid(505); execl("/bin/icecast","/bin/icecast",NULL); } ================================================= 这里也要注意,不要把这个程序放在后台执行。在这个例子中,我只要修改icecast的配置文件就能够使icecast在后台运行。 现在我们的牢笼已经做好了,只要执行以上的包装程序,就可以把icecast囚禁到里面了:P。上面的包装程序你可以放在任何自己喜欢的位置,只是不要放在/usr/local/icecast目录下就可以了。你也可以在自动启动脚本中加入这个包装程序,以便icecast能够在系统启动是自动运行。 5.那些地方不能用牢笼环境 有些情况下,不太可能实现对精灵进程的禁锢管理。 让我们看一下apache WEB服务器。apache的开发者在开发这个软件时就非常注意其安全问题,httpd进程通常以root权限启动,然后其派生出来的进程都是在比较低的权限(通常是nobody)下处理运行的,就象master/smtpd之间的关系。也就是说,处理客户请求的httpd进程是在c类状态下运行的。 虽然你也可以禁锢Apache WEB服务器,但是在某些情况下,这项工作几乎是无法完成的。例如:在WEB服务器中,你使用了PHP模块,PHP模块的特征极为丰富,其动态连接库极为繁杂,在这种情况下,创建一个牢笼环境就有些得不偿失了。 还有一种情况就是如果精灵进程确实需要对这个文件系统的访问权限,例如postfix的某些组件确实需要root权限把邮件投递到用户的目录。 6.结论 我发现很少有人对实现一个chroot牢笼环境倾注注意力,希望通过这篇文章能够让大家知道禁锢精灵进程的好处,并对大家自己实现牢笼环境有所帮助。 7.参考: (1) Fearnow, Matt. "Lion Worm." SANS Global Incident Analysis Center, April 2001.http://www.sans.org/y2k/lion.htm (2) Radcliff, Deborah. "Stuck in a BIND" Computerworld, February 2001. http://www.itworld.com/Net/4055/CWSTO57547 (3) FreeBSD, Inc. "jail() man page" April 1999. http://www.freebsd.org/cgi/man.cgi?query=jail&sektion=2&apropos=0&manpath=FreeBSD+4.0-RELEASE (4) Burr, Simon. "How to break out of a chroot() jail." January 2001. http://www.bpfh.net/simes/computing/chroot-break.html (5) Wunsch, Scott "Chroot-BIND HOWTO" Linux Documentation Project, September 2000. http://www.linuxdoc.org/HOWTO/Chroot-BIND-HOWTO.html (6) Deatrich, Denice. "How to 'chroot' an Apache tree with Linux and Solaris." February 2001. http://penguin.epfl.ch/chroot.html 上一篇:数据完整性检测工具:Tripwire 下一篇:IDS学习之四——几种分布式攻击的防范 更多相关文章
|
推荐文章
精彩文章
|