介绍
在运行可供公众使用的 Web 服务器时,在使您的内容可访问和建立安全配置之间取得平衡可能会变得很困难。 有许多不同的领域应该受到仔细审查。 其中之一是进程隔离和可见性。
一个名为 firejail 的项目试图通过提供一种轻量级的安全容器化机制来帮助这一领域,该机制利用内核命名空间来执行分离策略。 这使得 chroot 环境非常轻量级。
在本指南中,我们将向您展示如何使用 firejail 在它们自己的 chroot 环境中隔离进程。 为了用一个真实的例子来证明这一点,我们将设置两个 chroot 环境,一个带有一个为 WordPress 提供服务的 Nginx Web 服务器,另一个带有一个处理站点数据的 MySQL 数据库。 这两个实例将拥有自己的文件系统和安装,并将通过桥接网络设备进行通信。
先决条件和目标
在本指南中,我们将使用 64 位 Ubuntu 14.04 服务器作为我们的基本安装。 这将允许我们利用预构建的 firejail
包,并允许我们轻松创建 chroot 环境。
为了获得良好的安装基础,请确保您已在此处完成 Ubuntu 14.04 的 初始服务器设置。
我们将在我们的主机系统上设置两个 chroot 环境。 这些实际上是 Debian 稳定环境,之所以选择这些环境,是因为使用我们将使用的 debootstrap
工具对 Debian 环境进行了更好的测试。
我们的主机将配置一个公共 IP 地址,并充当我们将设置为与监狱通信的桥接网络的网关。 被监禁的环境将只能配置为使用桥接接口,并且只能通过主机上的 NAT 规则访问更广泛的互联网。
我们将要配置的三个环境将具有以下属性:
环境 | 公共 IP 地址 | 网桥 IP 地址 |
---|---|---|
主持人 | 192.0.2.1 | 10.10.20.1 |
网络服务器 | (没有任何) | 10.10.20.10 |
数据库服务器 | (没有任何) | 10.10.20.20 |
请注意,上面的红色值应替换为您的主机服务器的公共 IP 地址。 但是,网桥 IP 地址应按原样使用,因为我们将在整个指南中设置此接口和这些地址。
在本指南中,所有命令都将以 root 用户身份执行。
下载并配置主机组件
首先,我们需要将一些我们将要使用的工具下载到我们的服务器上。
首先,我们需要下载firejail程序的.deb
包。 在站点 的 下载页面上找到最新的 .deb
包名称,并将以下 URL 的文件名部分替换为该版本。 下面的 URL 是包的直接下载链接:
cd ~ wget http://downloads.sourceforge.net/project/firejail/firejail/firejail_0.9.8.1_1_amd64.deb
下载文件后,使用 dpkg
安装它:
dpkg -i firejail*
安装 firejail 程序后,我们需要从 Ubuntu 的默认存储库中获取一些额外的软件包。 具体来说,我们需要 debootstrap
工具来帮助我们创建我们的 chroot 文件系统,以及 bridge-utils
这将允许我们创建我们的监狱将用来通信的网桥接口:
apt-get update apt-get install debootstrap bridge-utils
配置网桥接口
在我们开始使用实际的监狱之前,我们将设置桥接网络接口。
我们可以使用 brctl
命令创建新接口,该命令是 bridge-utils
包的一部分。 我们的桥将被称为 br0
:
brctl addbr br0
接下来,我们需要启动界面。 除了激活接口,我们还分配了一个 CIDR 网络范围。 我们的主机服务器将在此接口上具有 10.10.20.1 的地址:
ifconfig br0 10.10.20.1/24
随着接口启动并运行,我们需要告诉内核允许在我们的接口之间进行 IP 转发或路由。 我们可以通过键入以下内容为此会话启用此功能:
echo "1" > /proc/sys/net/ipv4/ip_forward
现在,我们需要设置一个 iptables
规则,允许将发往主机服务器上端口 80 的流量路由到我们将在其中一个监狱中安装的 Web 服务器。 我们的 Web 服务器将在我们的网桥接口上具有 10.10.20.10 的 IP 地址:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 10.10.20.10:80
这会将规则添加到“nat”表中“PREROUTING”链的底部。 当发往 80 端口的 TCP 包命中时,通过网络地址转换将流量重定向到 10.10.20.10
上的 80 端口。
我们还需要设置一系列规则,允许我们的数据库和 Web 服务器查询 Internet,以便它们可以从 WordPress 更新组件。 我们将首先添加一个伪装规则,允许我们的 br0
接口通过我们的主机成功地路由通信:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
然后我们可以通过调整 FORWARD 链中的规则来锁定我们接口之间的通信。
首先,我们应该镜像我们之前建立的 NAT 规则,以便我们可以明确地允许来自端口 80 的流量进入我们的 br0
网络:
iptables -A FORWARD -i eth0 -o br0 -p tcp -m tcp --dport 80 -j ACCEPT
我们还希望允许与我们建立的连接相关的传入流量:
iptables -A FORWARD -i eth0 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT
我们希望允许转发源自 br0
接口的所有流量,以便我们的监狱能够相互通信并与外部世界通信:
iptables -A FORWARD -i br0 -j ACCEPT
最后,我们将删除所有其他转发连接,以便仅允许来自 br0
网络的出站连接进行转发。 本政策的例外情况已在前述规则中确立。
iptables -P FORWARD DROP
现在我们的主机系统配置了桥接接口,它将用于与被监禁的环境进行通信。
创建 Chroot 目录结构
现在,我们准备好创建我们的 chroot 目录结构。
正如我们之前所说,我们的 Web 服务器和数据库服务器将在完全独立的文件系统中运行。 我们将把这两个文件系统保存在一个名为 /jails
的目录中。 现在创建该目录:
mkdir /jails
进入刚刚创建的目录:
cd /jails
现在,我们需要创建将被我们监禁的操作系统使用的文件结构。 为此,我们将使用 debootstrap
工具。 创建此实用程序是为了在现有文件系统中引导 Debian 环境。 它通过从 Debian 存储库中提取软件包并将它们“安装”到正确的位置来实现这一点。
虽然 debootstrap
可用于引导 Ubuntu 环境,但我们将选择稳定的 Debian 安装。 由于该工具是为与 Debian 一起工作而创建的,因此这些环境是该工具经过最充分测试的环境。
我们将把我们的数据库环境安装到一个名为“db”的目录中。 要创建适当的目录结构,并下载和安装必要的包,请键入:
debootstrap --arch=amd64 stable db
现在我们已经在 /jails/db
目录下构建了文件系统,我们可以使用 rsync
将结构复制到我们的 Web 服务器可以使用的另一个目录。 新目录将被称为“www”。 确保注意后面命令中的斜杠 (/)。 这会将第一个目录的 contents 复制到第二个目录中,而不是复制目录本身:
rsync -azvh db/ www
现在,我们有两个 chroot 目录结构,可以与我们的 firejail
程序一起使用。
使用 Firejail 设置 WordPress 数据库
现在我们有了目录结构,我们可以使用 firejail
在我们的 /jails/db
目录结构中创建一个 chroot 环境。
要创建一个 chroot 环境并在其中启动一个 bash 会话,我们只需要指定 chroot 根目录的位置和我们要用于会话的主机名:
firejail --chroot=/jails/db --name=db
Parent pid 17390, child pid 17391 Interface IP Mask Status lo 127.0.0.1 255.0.0.0 UP eth0 192.0.2.1 255.255.255.0 UP eth1 10.128.1.228 255.255.0.0 UP br0 10.10.20.1 255.255.255.0 UP Child process initialized [root@db ~]$
该命令将输出在此 jail 会话中配置的父 pid、子 pid 和接口(此时我们尚未限制或配置接口)。 之后,它会将您放入被监禁的环境中的命令提示符中。
我们需要做的第一件事是更新我们的包数据库并在 chroot 环境中安装 MySQL 服务器。 您可以通过键入:
apt-get update apt-get install mysql-server
在更新过程中,您应该看到正在检查 Debian 存储库。 这是因为我们的 chroot 环境是 Debian 安装。
在安装过程中,系统会要求您选择并确认 MySQL 根帐户的密码。
安装完成后,我们应该通过键入以下命令生成 MySQL 数据目录结构:
mysql_install_db
接下来,使用包含的脚本锁定一些不安全的默认值:
mysql_secure_installation
系统将要求您输入在安装过程中设置的根 MySQL 密码。 之后,系统会询问您是否要更改密码。 如果您对自己的选择感到满意,请选择“否”。 对于其余的提示,只需按 ENTER 以选择默认选项。
创建 WordPress 数据库和用户
接下来,我们要为 WordPress 设置一个单独的数据库。 使用 MySQL root 帐户登录 MySQL 服务器。 出现提示时,输入您为该用户选择的密码:
mysql -u root -p
您将进入 MySQL 提示符。 创建一个新的数据库供 WordPress 使用:
CREATE DATABASE wordpress;
接下来,我们将创建一个用户来从 Web 服务器监狱中使用该数据库。 Web 服务器在网桥接口上的 IP 地址为 10.10.20.10,因此我们需要将此用户与该地址相关联。 为该用户分配一个安全密码。 然后,我们将授予该用户在我们创建的数据库上工作的能力:
CREATE USER 'wordpressuser'@'10.10.20.10' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'10.10.20.10';
现在,我们只需要刷新权限表并退出:
FLUSH PRIVILEGES; exit
修改 MySQL 设置以绑定到网桥地址
接下来,我们需要修改 MySQL 配置文件。 现在用你的编辑器打开它:
nano /etc/mysql/my.conf
该文件被组织成多个部分。 找到像这样开始的部分:
[mysqld]
您应该看到一个名为 bind-address
的指令当前设置为 127.0.0.1
。 我们想启动我们的 MySQL 实例监听桥接接口。 这个jail在那个接口上的地址是10.10.20.20,所以我们应该把它修改成这样:
bind-address = 10.10.20.20
完成后保存并关闭文件。
现在,我们可以停止当前运行的 MySQL 实例并退出这个监狱:
service mysql stop exit
使用 Firejail 设置 WordPress Web 服务器
现在我们的数据库已经配置好了,我们可以继续我们的监狱,它将用于 Web 服务器。 现在使用 firejail 在此监狱环境中启动会话:
firejail --chroot=/jail/www --name=www
我们需要做的第一件事是更新我们的本地包数据库并安装 Nginx Web 服务器和 PHP 组件。 这些是处理动态请求和连接到 MySQL 数据库所必需的:
apt-get update apt-get install nginx php5-fpm php5-mysql
配置 PHP
我们将首先编辑 PHP 处理器的配置文件以禁用可能是安全问题的功能:
nano /etc/php5/fpm/php.ini
在文件中查找 cgi.fix_pathinfo
指令。 它将被注释掉并设置为“1”。 我们需要取消注释并将其更改为“0”:
cgi.fix_pathinfo=0
完成后保存并关闭文件。
配置 Nginx
现在我们需要设置 Nginx 以正确提供 WordPress 文件。 这包括在 /var/www/html
处建立一个新的文档根目录,将 server_name
设置为我们主机系统的公共 IP 地址,以及配置 PHP 处理。
打开默认的 Nginx 配置文件:
vim /etc/nginx/sites-available/default
我们需要进行的更改的摘要如下:
- 取消注释
listen 80
指令以明确指定端口号。 - 将
root
指令的值更改为指向/var/www/html
,我们将保存 WordPress 文件的位置。 - 修改
index
参数以在其他索引文件之前查找index.php
文件。 - 将
server_name
指令的值更改为指向 主机服务器的 IP 地址或域 - 调整
try_files
指令的最后一个值,以在未找到文件或目录时将请求传递给index.php
文件。 它位于location /
块内。 - 取消注释所有错误页面指令以允许错误页面。
- 取消注释
location ~ \.php$
块、包含的fastcgi_split_path_info
指令、fastcgi_pass
socket 行、fastgci_index
和include fastcgi_params
指令,并添加一个try_files
指令,该指令尝试按照给定的请求,否则返回 404。
完成上述更改后,该文件应类似于以下文件(为简洁起见,已删除注释):
server { listen 80; root /var/www/html; index index.php index.html index.htm; server_name 192.0.2.1; location / { try_files $uri $uri/ /index.php?q=$uri&$args; } location /doc/ { alias /usr/share/doc/; autoindex on; allow 127.0.0.1; allow ::1; deny all; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/www; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } }
如果这更容易,您可以粘贴此处显示的全部内容。 您只需调整 server_name
指令以引用您的主机系统的公共 IP 地址或域名。
完成后保存并关闭文件。
下载和配置 WordPress 文件
现在 Nginx 已配置为正确提供文件,我们可以下载、配置和安装它们。
首先切换到 root 用户的主目录并下载最新的 WordPress 压缩包:
cd ~ wget http://wordpress.org/latest.tar.gz
解压 tarball 的内容,创建一个名为 ~/wordpress
的目录:
tar xzvf latest.tar.gz
将示例配置文件复制到将被检查的有效配置文件名:
cd ~/wordpress cp wp-config-sample.php wp-config.php
现在,在文本编辑器中打开新的配置文件:
nano wp-config.php
在内部,我们需要更改与数据库存储关联的值。 我们需要在配置选项中填写我们在 MySQL 数据库中所做选择的详细信息。
除了您应该早先修改为您自己的值的密码字段之外,您可以使用下面显示的值:
/** The name of the database for WordPress */ define('DB_NAME', 'wordpress'); /** MySQL database username */ define('DB_USER', 'wordpressuser'); /** MySQL database password */ define('DB_PASSWORD', 'password'); /** MySQL hostname */ define('DB_HOST', '10.10.20.20');
完成后,保存并关闭文件。
接下来,我们需要创建我们在 Nginx 配置文件中引用的 /var/www/html
目录作为文档根目录。 然后,我们将所有 WordPress 文件复制到该目录中:
mkdir -p /var/www/html cp -r ~/wordpress/* /var/www/html
现在我们可以将文件的所有权授予 Web 用户:
cd /var/www/html chown -R www-data:www-data /var/www/html/*
您的 Web 服务器监狱现已完全配置。 我们可以通过键入以下内容优雅地关闭我们的 Web 服务器和 PHP 进程:
service nginx stop service php5-fpm stop
现在,退出监狱以返回主机服务器会话:
exit
启动监狱
我们现在已经完全配置了我们的监狱。 我们可以使用我们的网桥接口单独启动它们。
首先,我们将启动数据库服务器,因为它更简单。 我们需要像以前一样指定 chroot 根位置。 这一次,我们还要使用--net
参数来指定网桥接口。 我们将把它与 --ip
参数一起使用来指定我们想要给这个监狱的确切地址(10.10.20.20
,如果你从我们的配置中回忆的话)。
我们还将传递 --private
标志以在监狱中挂载新的 /tmp
、/root
和 /home/user
目录。 然后我们需要指定我们想要在监狱中启动的进程,并以“&”结尾将其放入后台。
我们应该启动的进程是 MySQL 服务器进程,也是一个 sleep inf
进程。 这将使监狱无限期地运行,而不是在先前的进程完成时退出。 总的来说,该命令如下所示:
firejail --chroot=/jails/db --private --net=br0 --ip=10.10.20.20 \ "/etc/init.d/mysql start; \ sleep inf" &
监狱将启动,指定的进程将开始按顺序执行。 您可以使用 firejail
的 --list
选项查看此过程的结果:
firejail --list
21913:root:firejail --chroot=/jails/db --private --net=br0 --ip=10.10.20.20 /etc/init.d/mysql 21916:root:bash -c /etc/init.d/mysql start; sleep inf 21970:root:/bin/sh /usr/bin/mysqld_safe 22322:syslog:/usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/ 22323:root:logger -t mysqld -p daemon.error 22409:root:sleep inf
如您所见,进程树可从我们的主机系统获得。 因为我们可以看到 sleep inf
正在运行,并且 MySQL 进程仍在运行,所以我们可以看到 jail 已经完成启动。
对于 Web 服务器监狱,需要相同的基本设置。 我们需要指定 chroot 根位置、桥接接口和分配的实际 IP 地址 (10.10.20.10
) 以及 --private
标志。
在流程列表方面,我们还有很多额外的考虑。 首先,jail 中的 /var/log
目录是在每次启动时动态创建的。 因此,我们的 Nginx 文件中的日志指令指向不存在的位置。 我们可以在尝试启动 Nginx 之前创建这些位置。
此外,Nginx 进程依赖于系统记录器。 我们也将在 Nginx 之前启动 rsyslog
进程。 启动 Nginx 后,我们还需要记住启动我们的 PHP 处理器,它会在必要时将请求传递到数据库监狱。 同样,我们希望以 sleep inf
结束,以便监狱在服务启动的点之后持续存在。
最后,我们启动 Web 服务器监狱的命令将如下所示:
firejail --chroot=/jails/www --private --net=br0 --ip=10.10.20.10 \ "mkdir -p /var/log/nginx; \ touch /var/log/nginx/error.log; \ touch /var/log/nginx/access.log; \ /etc/init.d/rsyslog start; \ /etc/init.d/nginx start; \ /etc/init.d/php5-fpm start; \ sleep inf" &
Web 服务器 jail 可能需要一段时间才能启动,请继续检查 firejail --list
以查看进程是否达到 sleep inf
状态。
现在,如果您在 Web 浏览器中访问主机服务器的公共 IP 地址或域名,您应该会看到 WordPress 初始安装页面:
http://host_server_domain_or_IP
填写适当的值,准备好后单击底部的“安装 WordPress”。 您需要使用新创建的管理帐户登录。 之后,您将被带到 WordPress 仪表板:
如果此处一切正常,则表示安装成功。 我们现在可以努力使这个配置可重复和持久。
制作 Firejail 实例服务
现在我们已经启动并运行了我们的配置,我们要确保我们可以在重新启动后轻松返回这里。 为此,我们有许多领域需要解决。 这些包括:
- 将主机到监狱和监狱到监狱网络配置为在启动时启动。
- 使我们的
iptables
更改持久化。 - 将我们的监狱配置为在主机服务器启动时自动启动。
我们可以立即开始这三个方面。
在启动时为 Jails 配置网络
我们将关注的第一件事是让桥接网络启动并运行。 在我们担心我们的防火墙规则和开始我们的监禁环境之前,这是必需的。
我们需要配置实际的桥接。 要在启动时建立并运行此连接,我们需要修改 /etc/network/interfaces
文件。 现在打开这个文件:
nano /etc/network/interfaces
在内部,您将看到一些部分指示在引导时启动哪些接口,以及描述每个接口的其他行。 首先将 br0
网络附加到第二个 auto
行的末尾,以启动我们将在启动时定义的接口:
auto eth0 eth1 br0
接下来,我们需要设置一个定义接口的部分。 由于这是一个网桥接口,并且不像传统的网桥那样组合两个网络,我们将手动定义我们的接口,这意味着我们将给出配置网络时应该使用的确切命令。
从节标题开始:
iface br0 inet manual
在此,我们将使用 pre-up
、up
、post-down
和 down
指令来定义应在每个阶段运行的命令。 对于 pre-up
和 up
命令,我们要创建网桥,然后像之前手动操作一样启动接口。 运行命令时 $IFACE
将被 br0
动态替换,因此您不应在此处修改它们:
iface br0 inet manual pre-up brctl addbr $IFACE up ifconfig $IFACE 10.10.20.1/24
对于 post-down
和 down
命令,我们只是想反转这些命令。 我们将关闭接口,然后删除网桥:
iface br0 inet manual pre-up brctl addbr $IFACE up ifconfig $IFACE 10.10.20.1/24 down ifconfig $IFACE down post-down brctl delbr $IFACE
我们的 br0
接口现已定义,我们已将其设置为在启动时自动启动。 完成后保存并关闭文件。
设置 IPTables 以允许限制转发到监狱
接下来,我们需要使用我们之前添加的规则设置 iptables。 幸运的是,在 iptables-persistent
包的帮助下,这很简单。
通过键入以下命令安装包:
apt-get install iptables-persistent
在安装过程中将询问您是否要保存当前的 IPv4 和 IPv6 规则集。 在这些提示中选择 yes 以自动保存当前规则集。 这些将在启动时自动重新应用。
如果您需要调整启动时应用的规则,请进行您想要使用的更改,然后键入:
/etc/init.d/iptables-persistent save
当前规则集将被更新。
我们的 iptables 规则现在设置为在服务器启动时恢复。 然而,还有一个我们还没有解决的问题:我们需要确保我们的内核允许转发。
之前,我们将“1”回显到 /proc
伪文件系统中的文件中以启用此功能。 要在下次启动时自动进行此更改,请编辑 sysctl.conf
文件:
nano /etc/sysctl.conf
取消注释以下行:
net.ipv4.ip_forward=1
完成后保存并关闭文件。
创建一个 Upstart 脚本来启动 WordPress 监狱
要将我们的监狱配置为在启动时启动,我们需要创建一个 upstart 脚本。 我们将调用我们的脚本 firejail_wp.conf
。
在文本编辑器的 /etc/init
目录中打开一个具有此名称的文件:
nano /etc/init/firejail_wp.conf
在里面,我们首先填写这个服务的简要说明:
description "WordPress jail"
接下来,我们配置该服务自动启动必须为真的情况。 我们要确保文件系统可用,我们还需要确保 br0
网络已经建立。 如果 br0
网络出现故障,我们的两个 firejail 命令都将失败。
为此,我们将使用 start on
指令以及 local-filesystems
和 net-device-up
说明符来构造我们的起始条件。 我们还将配置我们的脚本以在机器进入重新启动或关闭模式时停止(由任何不是 1-5 的运行级别指示):
description "WordPress jail" start on (local-filesystems and net-device-up IFACE=br0) stop on runlevel [!12345]
最后,我们需要确定启动该服务时将执行的实际命令。 由于服务的运行方式,我们会将 firejail 命令放在外部脚本中,因此我们只需在此处引用脚本名称:
description "WordPress jail" start on (local-filesystems and net-device-up IFACE=br0) stop on runlevel [!12345] exec /startjails.sh
完成后,保存并关闭文件。
现在,我们需要制作我们刚刚引用的实际脚本文件。 使用您的文本编辑器在此位置打开一个文件:
nano /startjails.sh
因为这是一个 bash 脚本,所以从标准的 shebang 调用开始:
#!/bin/bash
接下来,我们将添加两个 firejail 命令,稍作修改。 由于未知原因,当由 upstart 启动时,在监狱环境中运行 Nginx 初始化脚本存在问题。 当由任何其他方法调用时,此问题不存在。
为了解决这个问题,我们将简单地调用 Nginx 可执行文件而不是内部的 jailed init 脚本。 除此之外,这些命令与我们之前使用的完全一样:
#!/bin/bash firejail --chroot=/jails/db --private --net=br0 --ip=10.10.20.20 "/etc/init.d/mysql start; sleep inf" & firejail --chroot=/jails/www --private --net=br0 --ip=10.10.20.10 "mkdir -p /var/log/nginx; touch /var/log/nginx/error.log; touch /var/log/nginx/access.log; /etc/init.d/rsyslog start; /usr/sbin/nginx; /etc/init.d/php5-fpm start; sleep inf" &
还需要一个命令来确保这是一项持续的服务,而不是在监狱启动后立即结束的任务。 我们需要添加 sleep inf
作为脚本的最后一行。 这将允许新贵正确管理服务:
#!/bin/bash firejail --chroot=/jails/db --private --net=br0 --ip=10.10.20.20 "/etc/init.d/mysql start; sleep inf" & firejail --chroot=/jails/www --private --net=br0 --ip=10.10.20.10 "mkdir -p /var/log/nginx; touch /var/log/nginx/error.log; touch /var/log/nginx/access.log; /etc/init.d/rsyslog start; /usr/sbin/nginx; /etc/init.d/php5-fpm start; sleep inf" & sleep inf
完成后,保存并关闭文件。
现在,我们只需要使这个文件可执行,以便 upstart 脚本可以启动它:
chmod +x /startjails.sh
通过这一步,WordPress 被监禁的环境完全配置为在启动时启动。
您可以重新启动主机服务器以尝试此操作:
shutdown -r now
如果一切都已正确配置,您将能够在一切有时间启动后访问您的 WordPress 站点。
结论
本指南只是您可以使用 firejail 之类的工具执行的众多操作之一的示例。 虽然有许多其他方法可以为您的服务器设置隔离组件,但 firejail 是一个很好的解决方案,因为它具有灵活性,并且能够以最少的资源处理如此多的不同场景。