FreeBSD & Jail(3) inetd_flags="-wW -a 192.168.0.123" 将系统本身的syslogd 运行加上 -ss 选项,避免这个syslog启动监听端口;修改/etc/rc.conf 加上 syslogd_flags="-ss" (对$jailhome/etc/rc.conf也如法炮制) 在jail内创建一个空的/etc/fstab,在rc.conf里面去掉网卡地址的绑定,这样在jail系统在启动的时候不会抱怨。 为了实际运行这个jail系统,还需要为jail提供一个可以连接的IP地址,这个地址可以与实际环境同一个子网,也可以处于另外一个子网中。 tester# ifconfig fXP0 192.168.0.123 netmask 0xffffffff alias (这里为网卡fxp0绑定了一个别名,准备提供服务。) 所有这些东西都执行完了以后,可以有几个方法把jail系统启动起来,一个是在jail外面运行 tester# jail $jailhome jailed.system.box $jail_IP_ADDR /bin/sh $jailhome/etc/rc 一个是单纯把ssh/telnetd这样一些提供远程访问的服务在jail内启动起来: tester# jail $jailhome jailed.system.box $jail_IP_ADDR /bin/sh $jailhome/bin/inetd -wW -a $jail_IP_ADDR 然后从外面登录系统,运行、配置jail系统环境,或者手工启动需要的应用服务。 如果打算运行一个用于生产环境的jail系统的话,推荐使用第一种方法,并且把启动jail的命令放到(实际环境的)/etc/rc.local脚本里面去,这样jail系统可以有比较完备,与实际机器相类似的环境。 这样一个jail系统就算构造完成并且可以正常运作,加上在实际环境里面定期的严格的备份,安全检查与审计,就可以得到一个很不错的安全系统。一般的scriptkids已经无法对你的系统构成实际威胁,即使是某些与黑帽子走得很近的人在漏洞公开之前得到实际的攻击脚本,并且进入你的系统,他也只能在jail里面活动,而且你可以知道他什么时候进入和离开系统,做了什么。这样你可以很轻松的恢复系统和防范下一次未知的攻击。 在jail系统的管理上面有几个问题需要注意: 1. jail里面的帐号、密码是跟实际系统不同的,但是在jail之外ps或者查看jail目录树内的文件时,那些jail内部的uid会被看成外部的 uid,因此最好把jail里面的/etc/adduser.conf进行修改,把他们的uid起始号码放大,比如:uid_start="5000",这样当你在jail外部进行文件、进程管理的时候不至于误会文件或者进程的宿主。 2. jail内的任何活动,其能力都受到了限制。比如top/vmstat这样的东西都不能使用,mknod,dd等等这样需要访问直接硬件的东西也无法工作。所以在jail内监控系统运行状态也比较难。 3. 当想要远程关闭jail系统的时候,可以有两种方法,一是进入jail之后kill -TERM -1 或者 kill -KILL -1 ,这样向所有该jail内的进程发送SIGTERM或者SIGKILL信号,也可以在jail里面运行/etc/rc.shutdown来关闭jail。如果是本地想要关闭jail倒是简单,只要把所有带有J标记的进程干掉就可以了。 4. 一个系统可以运行多个jail,各个jail之间无法互相干涉,如果在jail外面使用 tester# jail $jailhome jailed.system.box $jail_IP_ADDR /path/to/application 这种方式运行某个应用程序,下一次试图通过运行 tester# jail $jailhome jailed.system.box $jail_IP_ADDR /bin/csh 这种方式获得的jail过的shell来管理该应用程序将会失败。因为这时是两个各自独立的jail,互相不能干涉。为了能对jail系统内进程灵活地进行管理,推荐在jail里面除开应用软件之外,再启动telnetd或者sshd之类的服务,这些服务此时与应用程序运行在同一个jail里面,就可以通过远程登入系统后获得与那些应用程序在同一个jail内的shell。