无论您是系统管理员还是软件开发人员,保护系统都是每个生产环境的重中之重。保护操作系统免受可疑程序或进程侵害的最佳方法是沙箱(也称为监禁jailing)。
沙盒包括为程序或软件提供一个安全的环境,以便您可以在不损害系统的情况下使用它。通过使用 Linux 内核中可用的任何一种不同方法,它实际上使您的程序与系统的其余部分隔离。
如果系统管理员想要在没有任何损害的情况下测试他们的应用,那么沙盒对他们很有用。沙箱可以帮助您创建与基本操作系统不同的环境。由于 PaaS 和 SaaS 提供商的广泛使用,它已成为一种时尚。那么在linux下有几种方式方法可以实现沙箱沙盒隔离运行软件呢?有6种方式。
一、命名空间namespace
命名空间是 Linux 中可用的功能,用于隔离不同系统资源方面的进程。在内核 4.0 之前有六种类型的命名空间可用。将来还会添加更多。这些是:
mnt(挂载点,文件系统)
pid(进程)
net(网络堆栈)
IPC(系统 V IPC)
uts(主机名)
用户(UID)
Linux 命名空间并不新鲜。第一个是在 2008 年添加到 Linux 中的(Linux 内核 2.6),但它们只在 Linux 内核 3.6 中得到了更广泛的使用,当工作在其中最复杂的时候??用户命名空间 ?? 完成了。Linux 内核使用clone()、unshare()和setns()系统调用来创建和控制命名空间。
新命名空间的创建由clone()系统调用完成,它也用于启动进程。该setns()系统调用增加了一个正在运行的进程,以现有的命名空间。在unshare()调用工作在命名空间中的过程,使主叫方的命名空间中的一员。它的主要目的是隔离命名空间而不必创建新的进程或线程(就像clone()). 你可以直接使用一些服务来获取这些命名空间的特性。CLONE_NEW* 标识符与这些系统调用一起使用来标识命名空间的类型。这三个系统调用使用 CLONE_NEW* 作为 CLONE_NEWIPC、CLONE_NEWNS、CLONE_NEWNET、CLONE_NEWPID、CLONE_NEWUSER 和 CLONE_NEWUTS。命名空间中的进程可能因创建时的唯一 inode 编号而不同。
#ls -al /proc/<pid>/ns
lrwxrwxrwx 1 root root 0 Feb 7 13:52 ipc -> ipc:[4026532253]
lrwxrwxrwx 1 root root 0 Feb 7 15:39 mnt -> mnt:[4026532251]
lrwxrwxrwx 1 root root 0 Feb 7 13:52 net -> net:[4026531957]
lrwxrwxrwx 1 root root 0 Feb 7 13:52 pid -> pid:[4026532254]
lrwxrwxrwx 1 root root 0 Feb 7 13:52 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Feb 7 15:39 uts -> uts:[4026532252]
挂载命名空间
进程查看原始系统挂载点以外的不同挂载点。它创建一个与不同进程相关联的单独文件系统树,从而限制它们对根文件系统进行更改。
PID命名空间
PID 命名空间将进程 ID 与主 PID 层次结构隔离开来。PID 命名空间内的进程可以与它外部的进程具有相同的 PID,即使在命名空间内,您也可以使用不同的 init 和 PID 1。
UTS 命名空间
在 UTS(UNIX 分时系统)命名空间中,一个进程可以拥有与主系统不同的一组域名和主机名。它使用 sethostname() 和 setdomainname() 来做到这一点。
IPC 命名空间
这用于进程间通信资源隔离和 POSIX 消息队列。
用户命名空间
这隔离了命名空间内的用户和组 ID,允许在命名空间中具有与主机中相同的 UID 或 GID。在您的系统中,非特权进程可以创建他们拥有完全特权的用户命名空间。
网络命名空间
在这个命名空间内,进程可以有不同的网络堆栈,即不同的网络设备、IP 地址、路由表等。
Linux 中可用的沙盒工具使用此命名空间功能来隔离进程或创建新的虚拟环境。一个更安全的工具将是使用最大命名空间进行隔离的工具。现在,让我们谈谈沙盒的不同方法,从软隔离到硬隔离。
二、chroot
chroot是 Linux 中最古老的沙箱工具。它的工作与 mount 命名空间相同,但它实现得更早。chroot将进程的根目录更改为任何chroot目录(如 / chroot)。由于根目录是文件系统层次结构的顶部,应用程序无法访问高于根目录的目录,因此与系统的其余部分隔离。这可以防止chroot内的应用程序以免干扰计算机上其他地方的文件。要在旧的基于 SystemV 的操作系统中创建隔离环境,您首先需要将所有必需的包和库复制到该目录。出于演示目的,我正在运行 ??ls?? 在 chroot 目录中。
首先,创建一个目录以将进程的文件系统设置为 root:
<em>#mkdir /chroot</em>
接下来,在其中创建所需的目录。
<em>#mkdir /chroot/{lib,lib64,bin,etc}</em>
现在,最重要的步骤是复制可执行文件和库。要在chroot 中获取 shell ,您还需要/bin/bash。
#cp -v /bin/{bash,ls} /chroot/bin
要查看此脚本所需的库,请运行以下命令:
#ldd /bin/bash
linux-vdso.so.1 (0x00007fff70deb000)
libncurses.so.5 => /lib/x86_64-linux-gnu/libncurses.so.5 (0x00007f25e33a9000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f25e317f000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f25e2f7a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f25e2bd6000)
/lib64/ld-linux-x86-64.so.2 (0x00007f25e360d000)
#ldd /bin/ls
linux-vdso.so.1 (0x00007fff4f8e6000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9f00aec000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9f00748000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9f004d7000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9f002d3000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9f00d4f000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9f000b6000)
现在,这些文件复制到LIB或lib64目录的/ chroot的要求。
一旦您复制了所有必要的文件,就可以进入chroot 了。
#sudo chroot /chroot/ /bin/bash
系统将提示您在虚拟环境中运行一个 shell。在这里,除了 ls 之外,您没有什么可以运行的,但是它已经将这个进程的根文件系统更改为/chroot。
要获得功能更全面的环境,您可以使用debootstrap实用程序来引导基本的 Debian 系统:
#debootstrap --arch=amd64 unstable my_deb/
它将下载一个最小系统以在chroot下运行。您甚至可以使用它在 64 位系统上测试 32 位应用程序或在安装前测试您的程序。要获得进程管理,将proc挂载到chroot,并使ho...
点击查看剩余70%
网友评论0