容器因 Linux 上的 Docker 而广受欢迎,但还有更早的实现,包括 FreeBSD 上的监狱系统。在 FreeBSD 术语中,容器被称为“监狱”。监狱系统最早在 2000 年的 FreeBSD 4.0 中发布,并且此后一直在不断改进。虽然 20 年前它主要用于大型服务器,但现在你可以在树莓派上运行它。
监狱 vs. Linux 上的容器
在 FreeBSD 上,容器开发的路径与 Linux 非常不同。在 FreeBSD 上,容器化在 90 年代后期被开发为一种严格的安全功能,用于虚拟主机,并且其灵活性在多年来不断增长。限制容器的计算资源不是最初概念的一部分;这是后来添加的。
当我 2001 年开始在生产环境中使用监狱时,这非常痛苦。我必须准备自己的脚本来自动化与它们的工作。
在 Linux 方面,容器化有很多尝试,包括 lxc。
Docker 为容器带来了普及性、可访问性和易用性。现在 Linux 上有很多其他工具(例如,我更喜欢在我的笔记本电脑上使用 Podman)。而 Kubernetes 允许你在真正大规模的情况下使用容器。
Bastille 是 FreeBSD ports 中可用于管理监狱的几种工具之一。它与 Docker 或 Podman 类似,允许你大规模创建和维护监狱,而不是手动操作。它有一个模板系统,可以自动在监狱中安装和配置应用程序,类似于 Dockerfile。它还支持高级 FreeBSD 功能,如 ZFS 或 VNET。
在树莓派上安装 FreeBSD
在树莓派上安装 BSD 与安装 Linux 非常相似。你从 FreeBSD 网站下载压缩镜像,并使用 dd
命令将其写入 SD 卡。你也可以使用专用的镜像写入工具;有很多工具可用于所有操作系统 (OS)。使用命令行下载和写入镜像:
wget https://download.freebsd.org/ftp/releases/arm64/aarch64/ISO-IMAGES/13.0/FreeBSD-13.0-BETA1-arm64-aarch64-RPI.img.xz
xzcat FreeBSD-13.0-BETA1-arm64-aarch64-RPI.img.xz | dd of=/dev/XXX
这会将最新的 64 位树莓派主板可用的 beta 镜像写入;如果你使用其他树莓派主板或想使用其他版本,请查看下载页面。将 XXX
替换为你的 SD 卡的设备名称,这取决于你的操作系统以及卡如何连接到你的机器。我故意没有使用设备名称,这样如果你只是盲目地复制和粘贴说明,你就不会覆盖任何内容。我这样做了,并且很幸运地拥有我笔记本电脑的最新备份,但这不是一次愉快的经历。
写入 SD 卡后,将其放入你的树莓派并启动它。首次启动比平时稍长;我怀疑分区大小正在调整为 SD 卡的大小。过一会儿,你将在一个古老的基于文本的屏幕上收到熟悉的登录提示。用户名是 root,密码与用户名相同。SSH 服务器默认启用,但不要担心;root 用户无法登录。将密码更改为其他内容仍然是一个好主意。网络通过 DHCP 为以太网连接自动配置(我没有测试 WiFi)。
在系统上配置 Bastille 的最简单方法是通过 SSH 连接到树莓派,并复制和粘贴本文中的命令和配置。你有几个选项,具体取决于你对行业最佳实践的关注程度,或者是否愿意将其视为测试系统。你可以选择在 SSHD 配置中启用 root 登录(可怕,但这是我最初的做法)或创建一个可以远程登录的普通用户。在后一种情况下,请确保该用户是“wheel”组的成员,以便它可以使用 su -
成为 root 并使用 Bastille
root@generic:~ # adduser
Username: czanik
Full name: Peter Czanik
Uid (Leave empty for default):
Login group [czanik]:
Login group is czanik. Invite czanik into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh bash rbash git-shell nologin) [sh]: bash
Home directory [/home/czanik]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username : czanik
Password : *****
Full Name : Peter Czanik
Uid : 1002
Class :
Groups : czanik wheel
Home : /home/czanik
Home Mode :
Shell : /usr/local/bin/bash
Locked : no
OK? (yes/no): yes
adduser: INFO: Successfully added (czanik) to the user database.
Add another user? (yes/no): no
Goodbye!
第五行将用户添加到 wheel 组。请注意,你的系统上可能有一个不同的 shell 列表,并且 Bash 不是基础系统的一部分。在添加用户之前安装 Bash
pkg install bash
PKG 需要在首次运行时进行自举,因此这次调用命令需要更长的时间。
开始使用 Bastille
使用 FreeBSD 基础系统中的工具管理监狱是可能的,但不是很方便。使用像 Bastille 这样的工具可以大大简化它。它不是基础系统的一部分,所以安装它
pkg install bastille
你可以从命令的输出中看到,Bastille 没有外部依赖项。它是一个 shell 脚本,依赖于 FreeBSD 基础系统中的命令(稍后在解释模板时我会注意到一个例外)。
如果你想在启动时启动你的容器,请启用 Bastille
sysrc bastille_enable="YES"
从一个简单的用例开始。许多人使用容器在不同的容器中安装不同的开发工具,以避免冲突或简化他们的环境。例如,没有哪个理智的人想在一个全新的系统上安装 Python 2,但你可能偶尔需要运行一个古老的脚本。因此,为 Python 2 创建一个监狱。
在创建你的第一个监狱之前,你需要引导一个 FreeBSD 版本并配置网络。只需确保你引导的版本与主机正在运行的版本相同或更旧。例如
bastille bootstrap 12.2-RELEASE
它下载并将此版本解压到 /usr/local/bastille
目录结构下。
可以使用 Bastille 以多种不同的方式配置网络。一种在任何地方(在你的本地机器和云端)都有效的方法是使用克隆接口。这允许监狱使用不干扰外部网络的内部网络。配置并启动此内部网络
sysrc cloned_interfaces+=lo1
sysrc ifconfig_lo1_name="bastille0"
service netif cloneup
通过这种网络设置,监狱中的服务无法从外部网络访问,也无法访问外部网络。你需要从主机的外部接口转发端口到监狱,并启用网络地址转换 (NAT)。Bastille 与 BSD 的 PF 防火墙 集成以完成此任务。以下 pf.conf
配置 PF 防火墙,以便 Bastille 可以动态地向防火墙添加端口转发规则
ext_if="ue0"
set block-policy return
scrub in on $ext_if all fragment reassemble
set skip on lo
table <jails> persist
nat on $ext_if from <jails> to any -> ($ext_if)
rdr-anchor "rdr/*"
block in all
pass out quick modulate state
antispoof for $ext_if inet
pass in inet proto tcp from any to any port ssh flags S/SA modulate state
你还需要启用并启动 PF 才能使这些规则生效。请注意,如果你通过 SSH 连接工作,启动 PF 将终止你的连接,你将需要重新登录
sysrc pf_enable="YES"
service pf restart
创建你的第一个监狱
要创建一个监狱,Bastille 需要一些参数。首先,它需要你正在创建的监狱的名称。这是一个重要的参数,因为你将始终通过其名称来引用监狱。我选择了最著名的匈牙利监狱的名称,用于最精英的罪犯,但在现实生活中,监狱名称通常指的是监狱的功能,例如 syslogserver
。你还需要设置你正在使用的 FreeBSD 版本和互联网协议 (IP) 地址。我使用了一个随机的 10.0.0.0/8
IP 地址范围,但如果你的内部网络已经使用了该范围内的地址,那么使用 192.168.0.0/16
可能是一个更好的主意
bastille create csillag 12.2-RELEASE 10.17.89.51
你的新监狱应该在几秒钟内启动并运行。它是一个完整的 FreeBSD 基础系统,没有任何额外的软件包。因此,在监狱内安装一些软件包,例如我最喜欢的文本编辑器
root@generic:~ # bastille pkg csillag install joe
[csillag]:
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):
New packages to be INSTALLED:
joe: 4.6,1
Number of packages to be installed: 1
The process will require 2 MiB more space.
442 KiB to be downloaded.
Proceed with this action? [y/N]: y
[csillag] [1/1] Fetching joe-4.6,1.txz: 100% 442 KiB 452.5kB/s 00:01
Checking integrity... done (0 conflicting)
[csillag] [1/1] Installing joe-4.6,1...
[csillag] [1/1] Extracting joe-4.6,1: 100%
你可以同时安装多个软件包。安装 Python 2、Bash 和 Git
bastille pkg csillag install bash python2 git
现在你可以在你新创建的监狱中开始工作了。它没有安装任何网络服务,但你可以通过其控制台访问它
root@generic:~ # bastille console csillag
[csillag]:
root@csillag:~ # python2
Python 2.7.18 (default, Feb 2 2021, 01:53:44)
[GCC FreeBSD Clang 10.0.1 (git@github.com:llvm/llvm-project.git llvmorg-10.0.1- on freebsd12
Type "help", "copyright", "credits" or "license" for more information.
>>>
root@csillag:~ # logout
root@generic:~ #
使用模板
前面的示例手动在监狱中安装了一些软件包。手动设置监狱并不好玩,即使 Bastille 使其变得容易。模板使这个过程更加容易;它们类似于 Dockerfile,但概念并不完全相同。你像 FreeBSD 版本一样引导 Bastille 的模板,然后将它们应用于监狱。当你应用模板时,它将安装必要的软件包并根据需要更改配置。
要使用模板,你需要在主机上安装 Git
pkg install git
例如,要引导 syslog-ng
模板,请使用
bastille bootstrap https://gitlab.com/BastilleBSD-Templates/syslog-ng
创建一个新的监狱,应用模板,并将外部端口重定向到它
bastille create alcatraz 12.2-RELEASE 10.17.89.50
bastille template alcatraz BastilleBSD-Templates/syslog-ng
bastille rdr alcatraz tcp 514 514
要测试监狱中的新服务,请使用 telnet 连接到主机的 514 端口,并输入一些随机文本。在你的监狱中使用 tail
命令查看你刚刚输入的内容
root@generic:~ # tail /usr/local/bastille/jails/alcatraz/root/var/log/messages
Feb 6 03:57:27 alcatraz sendmail[3594]: gethostbyaddr(10.17.89.50) failed: 1
Feb 6 04:07:13 alcatraz syslog-ng[1186]: Syslog connection accepted; fd='23', client='AF_INET(192.168.1.126:50104)', local='AF_INET(0.0.0.0:514)'
Feb 6 04:07:18 192.168.1.126 this is a test
Feb 6 04:07:20 alcatraz syslog-ng[1186]: Syslog connection closed; fd='23', client='AF_INET(192.168.1.126:50104)', local='AF_INET(0.0.0.0:514)'
由于我是 syslog-ng 的布道者,我在我的示例中使用了 syslog-ng 模板,但还有更多可用的模板。查看 Bastille 模板 的完整列表以了解它们。
下一步是什么?
我希望这篇文章能启发你尝试在你的树莓派上使用 FreeBSD 和 Bastille。这篇文章的信息足以让你入门;要了解 Bastille 的所有酷炫功能,例如审计你的监狱中的漏洞和更新其中的软件,请查阅 文档。
1 条评论