状态: 已弃用
本文介绍了不再受支持的 Ubuntu 版本。 如果您当前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:
原因: Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL) and no longer receives security patches or updates. This guide is no longer maintained.
请参阅: 本指南可能仍可用作参考,但可能不适用于其他 Ubuntu 版本。 如果可用,我们强烈建议使用为您正在使用的 Ubuntu 版本编写的指南。 您可以使用页面顶部的搜索功能来查找更新的版本。
介绍
在许多情况下,您可能希望隔离 Linux 系统中的某些应用程序、用户或环境。 不同的操作系统有不同的实现隔离的方法,在Linux中,一个经典的方法是通过chroot
环境。
在本指南中,我们将讨论如何使用 chroot 设置隔离环境,以便在常规操作系统和封闭环境之间建立屏障。 这主要用于测试目的。 我们将讨论您何时可能希望使用该技术,以及何时使用其他解决方案可能是一个更好的主意。 我们将在 Ubuntu 12.04 x86_64 VPS 实例上讨论这些步骤。
大多数系统管理员将受益于知道如何完成一个快速简单的 chroot 环境,这是一项宝贵的技能。
什么是 Chroot 环境?
chroot 环境是一个操作系统调用,它将临时将根位置更改为新文件夹。 通常,操作系统对根目录的概念是位于“/
”的实际根目录。 但是,使用 chroot
,您可以指定另一个目录作为 chroot 期间的顶级目录。
在 chroot
中运行的任何应用程序原则上都无法看到操作系统的其余部分。 同样,受限于 chroot 环境的非 root 用户将无法进一步向上移动目录层次结构。
何时使用 Chroot 环境
这在各种情况下都很有用。 例如,它允许您在与正常操作系统分离的环境中构建、安装和测试软件。 它也可以用作在 64 位环境中运行 32 位应用程序的方法。
通常,您应该将 chroot
视为一种从文件系统子集临时重新创建操作系统环境的方法。 这可能意味着将您的常规实用程序切换到实验版本,它可以让您查看应用程序在未受污染的环境中的行为,它可以帮助您进行恢复操作、引导系统或创建额外的障碍来突破潜在的攻击者。
何时不使用 Chroot 环境
Linux chroot 环境不应单独用作安全功能。 虽然它们可以用作屏障,但它们的隔离程度不足以充当合法的守卫,以阻止攻击者进入更大的系统。 这是由于 chroot 的执行方式以及进程和人员可以脱离环境的方式。
虽然 chroot 环境肯定会为非特权用户带来额外的工作,但它们应该被视为强化功能而不是安全功能,这意味着它们试图减少攻击向量的数量而不是创建完整的解决方案。 如果需要完全隔离,可以考虑更完整的解决方案,比如Linux容器、Docker、vservers等。
设置工具
为了充分利用我们的 chroot 环境,我们将使用一些工具来帮助将一些基本分发文件安装到我们的新环境中。 这使流程更快,并有助于确保我们拥有可用的库和基本的基础包。
一种称为 dchroot
或 schroot
的工具用于管理不同的 chroot 环境。 这可用于在 chroot 环境中轻松执行命令。 dchroot
命令是一个遗留命令,此时实际上是作为 schroot
(大多数系统上更现代的变体)的兼容性包装器实现的。
另一个工具称为 debootstrap
,它将在另一个系统的子目录中创建一个基本操作系统。 这使我们能够快速启动并运行,因为 chroot 环境需要环境中的某些工具和库才能正常运行。
现在让我们安装这两个包。 我们将安装 dchroot
,因为它实际上会拉入 schroot
并让我们可以灵活地使用:
sudo apt-get update sudo apt-get install dchroot debootstrap
现在我们有了合适的工具,我们只需要指定一个我们想要用作环境根目录的目录。 我们将在根目录中创建一个名为 test
的目录:
sudo mkdir /test
正如我们之前所说,现代系统中的 dchroot
命令实际上是作为功能更强大的 schroot
命令的包装器实现的。 为此,我们将使用我们的信息修改schroot
配置文件。
现在让我们以管理权限打开文件:
sudo nano /etc/schroot/schroot.conf
在内部,我们需要创建与我们希望创建的系统相匹配的配置选项。 对于 Ubuntu 系统,我们需要指定版本等。 对于 Debian 系统(schroot
最初来自 Debian)有很好的注释值,这应该给你一个好主意。
我们目前使用的是 Ubuntu 12.04 系统,但假设我们想测试 Ubuntu 13.10 上可用的一些软件包,代号为“Saucy Salamander”。 我们可以通过创建一个如下所示的条目来做到这一点:
[saucy] description=Ubuntu Saucy location=/test priority=3 users=demouser groups=sbuild root-groups=root
保存并关闭文件。
使用骨架操作系统填充 Chroot 环境
现在,在我们的 chroot 目标下安装系统所需要做的就是输入:
sudo debootstrap --variant=buildd --arch amd64 saucy /test/ http://mirror.cc.columbia.edu/pub/linux/ubuntu/archive/
在上述命令中,--variant
标志指定了您要构建的 chroot 类型。 buildd
选项指定它还应该安装包含在 build-essential
包中的构建工具,以便允许它开箱即用地用于软件创建。 您可以通过键入以下内容找到更多选项:
man debootstrap
搜索 --variant
解释。
--arch
指定客户端系统的架构。 如果架构与父架构不同,您还应该传递 --foreign
标志! 之后,您需要再次调用 debootstrap
命令来完成安装,使用如下命令:
sudo chroot /test /debootstrap/debootstrap --second-stage
这将执行实际安装,而第一个命令仅在存在架构差异时下载包。 如果架构不匹配,请不要忘记初始 debootstrap
的 --foreign
标志。
命令中的 saucy
应该与您在 schroot.conf
文件中为配置选择的标题匹配。 /test/
指定目标,URL 是包含您想要的文件的存储库的 url。 这些通常与您在 /etc/apt/sources.list
文件中找到的格式相同。
完成后,您可以通过查看目标目录来查看已下载并安装的所有文件:
ls /test
bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr
如您所见,这看起来就像一个普通的文件系统。 它刚刚在一个非常规的目录中创建。
最终配置和切换到新环境
系统安装完成后,我们需要做一些最终配置,以确保系统正常运行。
首先,我们要确保我们的主机 fstab
知道我们的客户机中的一些伪系统。 在 fstab 的底部添加这样的行:
sudo nano /etc/fstab
proc /test/proc proc defaults 0 0 sysfs /test/sys sysfs defaults 0 0
保存并关闭文件。
现在,我们需要将这些文件系统挂载到我们的客户机中:
sudo mount proc /test/proc -t proc sudo mount sysfs /test/sys -t sysfs
我们还想复制我们的 /etc/hosts
文件,以便我们可以访问正确的网络信息:
cp /etc/hosts /test/etc/hosts
最后,我们可以通过这样的命令进入chroot环境:
sudo chroot /test/ /bin/bash
您将进入新的 chroot 环境。 您可以通过移动到根目录然后键入:
cd / ls -di
如果您返回除 2
之外的任何数字,则您处于 chroot 环境中。 在这个环境中,您可以安装软件,并在不影响主机操作系统的情况下做很多事情(除了占用资源)。
退出 Chroot
要退出 chroot 环境,您只需反转之前配置的一些步骤。
首先,以 root 身份退出 chroot 环境,就像退出任何其他 shell 环境一样:
exit
之后,我们需要卸载我们的 proc 和 sys 文件系统:
sudo umount /test/proc sudo umount /test/sys
如果您不打算定期再次使用它,您也可以从 /etc/fstab
文件中删除附加行。
如果您完全使用此环境,请随意删除存储所有内容的目录:
rm -rf /test/
结论
虽然肯定有像 Docker 这样的其他技术可以提供更完整的隔离,但这些 chroot 环境很容易创建和管理,并且可以在主机操作系统中使用,这有时是有利的。 这是一个很好的工具,而且重量非常轻。
请记住 chroot 有用的情况,并尽量避免使用 chroot 不合适的情况。 Chroot 环境非常适合为不同架构测试和构建软件,而无需完全独立的系统。 在正确的情况下使用它们,您会发现它们为各种问题提供了灵活的解决方案。