一些技巧
- 好的,现在创建监狱相当容易和轻松。但是我们怎样才能删除它???
ezjail-admin delete -w testingonly
这将删除监狱目录和相应的配置文件(/etc/fstab.firstjail & /usr/local/etc/ezjail/firstjail)
- 列出当前监狱:
ezjail-admin list
其中 :
D = 目录库(本文创建的同类监狱)
R = 运行或者开始
S = 停止
N = 不运行,因为它被禁用。
停止一个特定的监狱:
/usr/local/etc/rc.d/ezjail.sh stop [jail name]
例如
/usr/local/etc/rc.d/ezjail.sh stop firstjail
- jail 的文件系统实际上存储在 /usr/jails/<hostname>/。
例如 /usr/jails/firstjail/。
因此,我们可以在 /usr/jails/firstjail/etc/sshd_config 中编辑监狱的 ssh 服务器配置文件。
操作系统虚拟化是一种使客户操作系统的多个副本能够在主机操作系统之上运行的技术。
我们为什么要这样做?
- 分区资源在多个客户操作系统之间共享(当前硬件运行多个轻型客户操作系统。
例如 FreeBSD 和 Linux)- 增强安全性(客户操作系统是隔离的,因此入侵客户操作系统会离开其他操作系统安全)- 节省电力和资金(托管机架空间和电力最小化)- 创建环境(应用程序或者操作系统测试、备份、遗留应用程序、管理委派)- 改进服务器管理(虚拟化中的来宾操作系统更容易移动、复制、备份& 消除)
FreeBSD Jail 首次出现在由 Poul-Henning Kamp 引入的 FreeBSD 4.x 中。
Jail 是一种强大的操作系统虚拟化,可实现安全性、成本、管理和灵活性。
由于所有这些优点,jail 的设置和配置有时会非常复杂。
Ezjail 提供了配置和维护 jail 的简单性,而没有让我们动手的复杂性。
Ezjail 是一个控制监狱的框架。
Ezjail 负责处理复杂的部分,并使监狱的设置和维护变得有趣。
Ezjail 是由 Dirk Engling 开发的,感谢 Dirk。
FreeBSD jail 确实有其局限性。
- 资源控制,例如内存和处理器不能分区,它们都被平等地共享。
但是可以通过实现硬盘分区(或者分片)来分离和控制硬盘空间。 - 所有客户操作系统都必须使用与主机操作系统相同的内核版本
下面是如何设置 Ezjail 的简单分步教程。
首先,使用 Portmanager 从 sysutils/ezjail 安装 Ezjail,然后执行以下步骤:
设置和配置
- 更新 ezjail 的环境并将 FreeBSD 的端口树的副本提供给监狱的基础,这将使用 ezjail 链接到新创建的监狱:
ezjail-admin update -ip
(这是为了节省 inode 和空间)
- 使用以下示例准备 rc.conf(主机的):
#The server that host our jails hostname="jailhouse.example.com" defaultrouter="192.168.0.1" ifconfig_em0="inet 192.168.0.10 netmask 255.255.255.0" #interface that the jails will be using ifconfig_rl0="inet 192.168.0.111 netmask 255.255.255.0" #another note, jail can also be setup & configure using alias #For Example ifconfig_em0_alias0="inet 192.168.0.111 netmask 255.255.255.0" #make ezjail services & jails auto start up ezjail_enable="YES"
- 创建监狱:
ezjail-admin create firstjail 192.168.0.111
- 在其配置文件“/usr/local/etc/ezjail/firstjail”中将 FQDN 分配给 jail 的主机名。
例如
export jail_firstjail_hostname="firstjail.example.com
- 启动ezjail服务:
/usr/local/etc/rc.d/ezjail.sh 启动 - 监狱已准备就绪,可以使用监狱的控制台访问。通过以下方式启动监狱的控制台:
ezjail-admin console firstjail
警告
- 在某些情况下,第一次发出“ezjail-admin update -ip”时,会弹出以下错误:
------------------------------------------------------------- >>> Installing everything ------------------------------------------------------------- cd /usr/src; make -f Makefile.inc1 install ===> share/info (install) install -o root -g wheel -m 444 dir-tmpl /usr/jails/fulljail/usr/share/info/dir install:No such file or directory *** Error code 1 Stop in /usr/src/share/info. *** Error code 1 Stop in /usr/src. *** Error code 1 Stop in /usr/src. *** Error code 1 Stop in /usr/src. *** Error code 1 Stop in /usr/src. Error: The command 'make installworld' failed. Refer to the error report(s) above.
问题是 jail 找不到内核源代码。所以,解决这个问题的方法是:
cd /usr/src;make buildworld
- 有些人在获取源时可能会遇到以下错误消息:
cd: can't cd to /usr/src/tools/build/make_check ------------------------------------------------------------- >>> Building an up-to-date make(1) ------------------------------------------------------------- cd: can't cd to /usr/src/usr.bin/make *** Error code 2 Stop in /usr/src. *** Error code 1 Stop in /usr/src.
然后我们必须获取源代码树,但首先,安装端口 devel/subversion :
portmaster -dwv devel/subversion
然后,获取源 treee :
svn co http://svn.freebsd.org/base/stable/9 /usr/src
- 如果 /usr/local/etc/rc.d./ezjail 启动时间过长,可能是 FQDN 造成的。根据以下内容更改监狱 /usr/local/etc/ezjail/firstjail 的配置文件:
export jail_firstjail_hostname="firstjail"
修改为
export jail_firstjail_hostname="firstjail.example.com"
并确保 FQDN 解析。换句话说,参数“export jail_firstjail_hostname”的值必须在FQDN(完全限定域名)中
- 从监狱内部 ping 时,会弹出错误:
ping: socket: Operation not permitted
这是因为监狱不允许访问原始套接字。如果必须这样做,解决方案是:
sysctl security.jail.allow_raw_sockets=1 /usr/local/etc/rc.d/ezjail.sh restart firstjail
** 不建议在 jail 中启用原始套接字,因为 perl/nc 等工具可以与套接字交互,从而引发安全问题。使用其他工具测试连接。例如 nslookup、host、telnet 等
- 使用“ezjail-admin create firstjail 192.168.0.111”创建监狱时,输出末尾会出现警告消息:
Warning: Some services already seem to be listening on all IP, (including 192.168.0.111) This may cause some confusion, here they are: root sshd 902 4 tcp4 *:22 *:* root syslogd 685 7 udp4 *:514 *:*
这是因为主机的服务正在侦听所有 IP 和接口。将错误消息中列出的服务配置为仅侦听预期 IP。例如
在 /etc/ssh/sshd_config 中,指定
ListenAddress 10.10.10.10 ListenAddress 127.0.0.1
以便 ssh 守护进程仅在 10.10.10.10 和 localhost 上侦听
至于 syslogd,在 /etc/rc.conf 中添加/更改参数:
syslogd_enable="YES" # Run syslog daemon (or NO). syslogd_program="/usr/sbin/syslogd" syslogd_flags="-s -b 127.0.0.1" # Flags to syslogd (if enabled).
并执行命令:
/etc/rc.d/syslogd restart
这将使 syslogd 仅在本地主机上侦听。
- 在 jail 中,这是如何停止绑定在网络接口上的各种服务:
- 停止 syslogd 侦听网络接口,将以下内容放入 /etc/rc.conf :
syslogd_enable="YES" syslogd_program="/usr/sbin/syslogd" syslogd_flags="-ss"
- 停止 sendmail 启动,将以下内容放入/etc/rc.conf:
sendmail_enable="NO"
端口树
相同的端口树可以在 jails 和主机系统之间共享,基本系统中的 /usr/ports 链接到 /usr/jails/basejail/usr/ports。
但是监狱会将其视为“/usr/ports”。
即使它是链接的,它也是只读的。
毕竟,jail 的目的是与主机和其他jail 分开,以降低安全风险。
但是,这种设置存在一个问题。
安装编译ports时,需要将临时文件、下载文件和索引文件写入ports目录。
我们需要创建这些目录并告诉端口(在监狱内)使用它而不是(默认的)/usr/ports 目录。
以下是如何配置它:
j=/usr/jails/firstjail mkdir $j/var/ports mkdir $j/var/ports/distfiles mkdir $j/var/ports/packages mount_nullfs -o rw /usr/ports/distfiles $j/var/ports/distfiles
接下来,在 /etc/make.conf 中输入以下几行,以便端口知道创建的目录并使用它:
WRKDIRPREFIX= /var/ports DISTDIR= /var/ports/distfiles PACKAGES= /var/ports/packages INDEXDIR= /var/ports
最后,就像普通的 FreeBSD 机器一样,jail 的端口树也需要更新。
- 通过以下方式更新监狱的端口树:
ezjail-admin update -P
- 在此之后,ssh 到监狱并像往常一样安装软件(例如 apache22)。
无需更新端口树,因为“ezjail-admin -P”会更新它。
监狱是隔离的,监狱内的端口树也是如此。
在 jail 中安装端口不会影响主机系统。
只记得发出命令:
ezjail-admin update -P
更新监狱的端口树。
现在,我们可以继续将最新的软件从ports 安装到jail 中。
控制台 - ssh
由于 jail 是另一个虚拟服务器,我们需要对其进行配置,以便其他系统管理员或者用户可以访问它。
我们将从在其上配置安全shell开始。
- 通过以下方式启动监狱的控制台:
ezjail-admin console firstjail
- 在监狱的控制台中,通过 /etc/rc.conf(监狱的)启用 ssh:
grep ssh /etc/defaults/rc.conf >> /etc/rc.conf
- 使用以下命令启动监狱的 ssh:
/etc/rc.d/sshd start
- 顺便说一下,记得设置监狱的 DNS 和主机名。编辑文件并填写适当的值:
- /etc/resolv.conf
- /etc/hosts