如何使用vnet和ZFS配置FreeBSD Jail

时间:2020-01-09 14:16:58  来源:igfitidea点击:

如何使用vnet安装和配置FreeBSD监狱?
在不使用iocage命令或ezjail命令行工具的情况下,如何使用/etc/jail.conf创建FreeBSD监狱?

说明:Poul-Henning Kamp在FreeBSD 4.x中引入了Jails。

FreeBSD监狱不过是允许对基于FreeBSD的Unix服务器进行分区的操作系统级虚拟化。
这些迷你系统称为监狱(Jail)。
监狱拥有自己的root用户和访问权限。
监狱可以使用网络子系统虚拟化基础架构或共享现有网络。

FreeBSD监狱是提高安全性的有力方法。
通常,您会针对Web服务器,VPN服务器,数据库服务器等服务创建监狱。
该页面显示了如何使用vnet和ZFS配置FreeBSD Jail。
以下说明在FreeBSD 11.2版上进行了测试。

如何使用vnet和ZFS配置FreeBSD Jail

从11.2开始,创建FreeBSD监狱的步骤如下:

  • 编译FreeBSD内核以包含VIMAGE支持
  • 安装JIB和JNG
  • 为basejail创建一个zfs数据集
  • 在主机上配置jail.conf
  • 启用并启动监狱服务

让我们详细了解所有步骤,以使用vnet和ZFS配置FreeBSD Jail。

步骤1.配置/编译vnet内核

您必须编译FreeBSD内核。
您需要启用了VIMAGE的FreeBSD内核。
您必须在/usr/src /目录中安装了FreeBSD src。
使用cp命令,如下所示复制内核配置:

$ sudo cp -v /usr/src/share/examples/jails/VIMAGE /usr/src/sys/amd64/conf/VIMAGE
$ cd /usr/src/

编译:

$ sudo make KERNCONF=VIMAGE kernel

您可以通过传递-j选项来指定make可以一次运行的最大作业数。
例如:

$ sudo make -j 16 KERNCONF=VIMAGE kernel

您必须重新启动FreeBSD框:

$ sudo reboot

验证新的内核版本:

$ uname -v
`FreeBSD 11.2-RELEASE #0: Wed Jul 11 21:35:37 IST 2016 root@nas04:/usr/obj/usr/src/sys/VIMAGE`

安装所需的工具:

$ sudo cp -v /usr/src/share/examples/jails/{jib,jng} /usr/sbin/

步骤2.为监狱创建一个zfs数据集

您需要设置文件系统。
使用zpool命令获取已配置的zfs的列表:

# zpool list

输出示例:

NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
zroot  21.8T  68.7G  21.7T        -         -     0%     0%  1.00x  ONLINE  

为挂载在/jails /上的zroot执行以下zfs命令:

# zfs create -o mountpoint=/jails zroot/jails

接下来创建一个zfs数据集:

# zfs create zroot/jails/fullbasejail

通过访问此页面以及您想要在监狱中使用的FreeBSD的任何其他部分,获取FreeBSD 11.2基本文件。
使用curl命令或wget命令或fetch命令:

# cd /tmp
# wget https://download.freebsd.org/ftp/releases/amd64/11.2-RELEASE/base.txz
# wget https://download.freebsd.org/ftp/releases/amd64/11.2-RELEASE/lib32.txz

使用tar命令解压缩从FreeBSD ftp镜像获取的base.txz和lib32.txz tarball:

# tar -zxvf /tmp/11.2-RELEASE/base.txz -C /jails/fullbasejail
# tar -zxvf /tmp/11.2-RELEASE/lib32.txz -C /jails/fullbasejail

更新您的FreeBSD基本安装

使用freebsd-update命令将更新应用于FreeBSD基本安装:

# freebsd-update -b /jails/fullbasejail fetch install

将系统与已安装发行版的已知良好索引进行比较:

# freebsd-update -b /jails/fullbasejail IDS

输出示例:

Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching metadata signature for 11.2-RELEASE from update5.freebsd.org... done.
Fetching metadata index... done.
Fetching 1 metadata files... done.
Inspecting system... 
done.

步骤3.配置基础监狱

您刚刚为快速部署配置了一个基础监狱。
可以克隆basejail创建新的监狱:

# zfs snapshot zroot/jails/[email protected]

列出快照:

zfs list -t snapshot

最后,从zfs快照中创建一个名为rsnapshot的新监狱:

# zfs send -R zroot/jails/[email protected] | zfs receive zroot/jails/rsnapshot

如何配置基本的监狱设置

您需要确保您的监狱在rc.conf中具有正确的时区,dns服务器,主机名,ip地址和其他内容。
请注意,您需要位于/jails/rsnapshot /目录中(根据您的设置调整路径):

# cd /jails/rsnapshot

通过在/jails/rsnapshot /中创建一个名为etc/resolv.conf的文件来设置dns:

# vi etc/resolv.conf

追加以下内容(根据您的设置设置dns名称服务器):

nameserver 192.168.2.254
nameserver 192.168.2.18

在vim/vi文本编辑器中保存并关闭文件。
使用ln命令为FreeBSD监狱设置时区(我正在设置为IST):

# ln -v usr/share/zoneinfo/Asia/Kolkata etc/localtime
`etc/localtime => usr/share/zoneinfo/Asia/Kolkata`

接下来,您需要在/jails/rsnapshot /中设置rc.conf:

# vi etc/rc.conf

示例设置:

# jail hostname #
host_hostname="rsnapshot"
 
# jail ip address and routing #
ifconfig_ng0_rsnapshot="inet 192.168.2.30 netmask 255.255.255.0"
defaultrouter="192.168.2.254"
 
# Start or stop services #
cron_flags="$cron_flags -J 15"
sendmail_enable="NONE"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
syslogd_flags="-c -ss"
ipv6_activate_all_interfaces="NO"
sshd_enable="YES"

保存并关闭文件。

如何在主机上配置jail.conf

如下编辑或创建/etc/jail.conf:

# vi /etc/jail.conf

追加以下配置:

rsnapshot {
        host.hostname = "rsnapshot";   # hostname
        path = "/jails/rsnapshot";     # root directory
        exec.clean;
        exec.system_user = "root";
        exec.jail_user = "root";
        # ##########################################################################  
        # netgraph/vnet config info
        # ng0 is my vnet
        # idb1 is my physical network interface connected to the LAN (use ifconfig)
        # jng is located in /usr/sbin/
        # rsnapshot is my jail name
        # ##########################################################################  
        vnet; 
        vnet.interface = "ng0_rsnapshot";               # vnet interface(s)
        exec.prestart += "jng bridge rsnapshot igb1";   # bridge interface(s)
        exec.poststop += "jng shutdown rsnapshot";      # destroy interface(s)
 
        # Standard stuff
        exec.start += "/bin/sh /etc/rc";
        exec.stop = "/bin/sh /etc/rc.shutdown";
        exec.consolelog = "/var/log/jail_rsnapshot_console.log";
        mount.devfs;          #mount devfs
        allow.raw_sockets;    #allow ping-pong
        devfs_ruleset="5";    #devfs ruleset for this jail
        mount.devfs;
}

保存并关闭文件。

开启监狱服务

# sysrc jail_enable=YES

创建/etc/devfs.rules

# vi /etc/devfs.rules

如下所示追加或编辑文件,以允许/dev/tun在监狱中访问(请参阅/etc/defaults/devfs.rules):

[devfsrules_jail_rsnapshot=5]
add include $devfsrules_hide_all
add include $devfsrules_unhide_basic
add include $devfsrules_unhide_login
add path 'tun*' unhide
add path zfs unhide

保存并关闭文件。

启动jail服务

# service jail start
# service jail status

如何登录jail

要列出正在运行的监狱,请运行:

# jls

使用jid或jailname如下

# jexec 1
# jexec rsnapshot

使用pw命令添加新用户:

# pw useradd -n Hyman -G wheel -s /bin/tcsh -m -d /home/Hyman
# passwd Hyman

更新或安装软件包

# pkg update && pkg upgrade
# pkg install most

验证网络:

# ifconfig
# sockstat -4
# ping -c 2 theitroad.local

请注意,tun0是我在FreeBSD监狱中运行的OpenVPN NIC,而ng0_rsnapshot是jail的NIC。