+
80
-

如何在linux下以沙箱模式运行一个程序?

如何在linux下以沙箱模式运行一个程序?

网友回复

+
0
-

可以使用Jailkit 

Jailkit 实际上是在指定的目录(下文称“监狱”)中,组建了一个小型的、完备的linux环境,涵盖了linux运行所最基础的文件(不包括引导和启动),用户登陆时,使用chroot将根目录设置成“监狱”目录,从而隔离与主机的联系,所做的操作都是在“监狱”中进行。当然,登陆的用户不可以拥有root权限。 以下分三个步骤介绍 Jailkit 的使用 一、安装与部署Jailkit 1、从官网 http://olivier.sessink.nl/jailkit/ 下载最新的Jailkit,安装过程非常简单,完全通用的步骤:解压缩并进入目录、./configure、make、make install。

2、安装完毕,就可以部署Jailkit 路径了(建立“监狱”)。以下操作均使用root用户进行。

a ) mkdir -p /opt/jail && cd /opt/jail 这一步是建立监狱目录,这里选择了在opt中建立监狱,在任何可写的目录中进行皆可。

b)jk_init -v /opt/jail/ jk_lsh basicshell jk_init 是初始化监狱文件,后边的 jk_lsh、basicshell是两个程序集,包含了linux 监狱所需的基础文件,以后如果有需求,也可以逐渐增加其他程序集 二、新增一个用户test,并将用户丢进“监狱”

1、useradd test && passwd test 并输入两次密码。

2、jk_jailuser -j /opt/jail/ -s /bin/bash test 接下来会询问是否拷贝home文件,选择y并回车。 三、验证

1、找一台远程机器,用ssh验证: ssh test@192.168.1.174 

2、或者本地测试也可: su test

登录成功后,此时查看根目录(cd / )即可发现,根目录就是你的/opt/jail ,而原来的本地上的根目录已经不可见,由此,test用户便成功在“监狱”中运行了,你可以给他一些指定的程序集比如ssh、sftp等。 四、备注

1、Jailkit 还有很多其它的功能,这里只是介绍了基础的功能

2、如果登录成功后立即显示 Connection closed,那可能是配置bash出了问题,查看/opt/jail/etc/passwd 文件,看是否有这一行:

test:x:500:500::/home/test:/bin/bash

如果最后一个值为 /usr/sbin/jk_lsh,则将其成上边的形式。

+
0
-

还可以使用linux的命令空间unshare

Mount Namespace 是 Linux 内核实现的第一个 Namespace,从内核的 2.4.19 版本开始加入。它可以用来隔离不同的进程或进程组看到的挂载点。

通俗地说,就是可以实现在不同的进程中看到不同的挂载目录。使用 Mount Namespace 可以实现容器内只能看到自己的挂载信息,在容器内的挂载操作不会影响主机的挂载目录。 下面我们通过一个实例来演示下 Mount Namespace。我们使用一个命令行工具 unshare。unshare 是 util-linux 工具包中的一个工具,

CentOS 7 系统默认已经集成了该工具,使用 unshare 命令可以实现创建并访问不同类型的 Namespace。 首先我们使用以下命令创建一个 bash 进程并且新建一个 Mount Namespace: unshare --mount --fork /bin/bash 执行完上述命令后,这时我们已经在主机上创建了一个新的 Mount Namespace,并且当前命令行窗口加入了新创建的 Mount Namespace。下面我通过一个例子来验证下,在独立的 Mount Namespace 内创建挂载目录是不影响主机的挂载目录的。 执行完上述命令后,这时我们已经在主机上创建了一个新的 Mount Namespace,并且当前命令行窗口加入了新创建的 Mount Namespace。下面我通过一个例子来验证下,在独立的 Mount Namespace 内创建挂载目录是不影响主机的挂载目录的。 首先在 /tmp 目录下创建一个目录。 [root@centos7 centos]# mkdir /tmp/tmpfs 创建好目录后使用 mount 命令挂载一个 tmpfs 类型的目录。命令如下: [root@centos7 centos]# mount -t tmpfs -o size=20m tmpfs /tmp/tmpfs 然后使用 df 命令查看一下已经挂载的目录信息: [root@centos7 centos]# df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 500G 1.4G 499G 1% / devtmpfs 16G 0 16G 0% /dev tmpfs 16G 0 16G 0% /dev/shm tmpfs 16G 0 16G 0% /sys/fs/cgroup tmpfs 16G 57M 16G 1% /run tmpfs 3.2G 0 3.2G 0% /run/user/1000 tmpfs 20M 0 20M 0% /tmp/tmpfs

可以看到 /tmp/tmpfs 目录已经被正确挂载。为了验证主机上并没有挂载此目录,我们新打开一个命令行窗口,同样执行 df 命令查看主机的挂载信息: [centos@centos7 ~]$ df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 16G 0 16G 0% /dev tmpfs 16G 0 16G 0% /dev/shm tmpfs 16G 57M 16G 1% /run tmpfs 16G 0 16G 0% /sys/fs/cgroup /dev/vda1 500G 1.4G 499G 1% / tmpfs 3.2G 0 3.2G 0% /run/user/1000 通过上面输出可以看到主机上并没有挂载 /tmp/tmpfs,可见我们独立的 Mount Namespace 中执行 mount 操作并不会影响主机。

为了进一步验证我们的想法,我们继续在当前命令行窗口查看一下当前进程的 Namespace 信息,命令如下: [root@centos7 centos]# ls -l /proc/self/ns/ total 0 lrwxrwxrwx. 1 root root 0 Sep 4 08:20 ipc -> ipc:[4026531839] lrwxrwxrwx. 1 root root 0 Sep 4 08:20 mnt -> mnt:[4026532239] lrwxrwxrwx. 1 root root 0 Sep 4 08:20 net -> net:[4026531956] lrwxrwxrwx. 1 root root 0 Sep 4 08:20 pid -> pid:[4026531836] lrwxrwxrwx. 1 root root 0 Sep 4 08:20 user -> user:[4026531837] lrwxrwxrwx. 1 root root 0 Sep 4 08:20 uts -> uts:[4026531838] 然后新打开一个命令行窗口,使用相同的命令查看一下主机上的 Namespace 信息: [centos@centos7 ~]$ ls -l /proc/self/ns/ total 0 lrwxrwxrwx. 1 centos centos 0 Sep 4 08:20 ipc -> ipc:[4026531839] lrwxrwxrwx. 1 centos centos 0 Sep 4 08:20 mnt -> mnt:[4026531840] lrwxrwxrwx. 1 centos centos 0 Sep 4 08:20 net -> net:[4026531956] lrwxrwxrwx. 1 centos centos 0 Sep 4 08:20 pid -> pid:[4026531836] lrwxrwxrwx. 1 centos centos 0 Sep 4 08:20 user -> user:[4026531837] lrwxrwxrwx. 1 centos centos 0 Sep 4 08:20 uts -> uts:[4026531838] 通过对比两次命令的输出结果,我们可以看到,除了 Mount Namespace 的 ID 值不一样外,其他Namespace 的 ID 值均一致。

通过以上结果我们可以得出结论,使用 unshare 命令可以新建 Mount Namespace,并且在新建的 Mount Namespace 内 mount 是和外部完全隔离的。

+
0
-

docker就可以了。

+
0
-

还可以用Firejail

Firejail是一个SUID(设置所有者用户ID)应用程序,它通过使用Linux命名空间和seccomp-bpf限制不受信任程序的运行环境来减少安全漏洞的暴露。 它使一个进程及其所有后代拥有自己的全局共享内核资源的秘密视图,例如网络堆栈,进程表,挂载表。 Firejail使用的一些功能: Linux名称空间

文件系统容器

安全过滤器

网络支持

资源分配

有关Firejail功能的详细信息,请参阅官方页面。 如何在Linux中安装Firejail 可以使用git命令从项目的github页面下载最新的软件包来完成安装,如图所示。 linuxidc@linuxidc:~/www.linuxidc.com$ git clone https://github.com/netblue30/firejail.git 正克隆到 'firejail'... remote: Enumerating objects: 23, done. remote: Counting objects: 100% (23/23), done. remote: Compressing objects: 100% (18/18), done. remote: Total 38395 (delta 11), reused 11 (delta 5), pack-reused 38372 接收对象中: 100% (38395/38395), 9.82 MiB | 87.00 KiB/s, 完成. 处理 delta 中: 100% (30820/30820), 完成. linuxidc@linuxidc:~/www.linuxidc.com$ cd firejail linuxidc@linuxidc:~/www.linuxidc.com/firejail$ ./configure && make && sudo make install-strip checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o 如何在Linux中使用Firejail运行应用程序如何在Linux中使用Firejail运行应用程序 如果您的系统上没有安装git,可以使用以下命令安装它: $ sudo apt install git [在 Debian/Ubuntu] # yum install git [在 CentOS/RHEL] # dnf install git [在 Fedora 22+] 安装firejail的另一种方法是下载与Linux发行版相关联的软件包,并使用其软件包管理器进行安装。 可以从项目的SourceForge页面下载文件。 下载文件后,可以使用以下命令安装: $ sudo dpkg -i firejail_X.Y_1_amd64.deb [在 Debian/Ubuntu] $ sudo rpm -i firejail_X.Y-Z.x86_64.rpm [在 CentOS/RHEL/Fedora] 如何在Linux中使用Firejail运行应用程序 您现在可以使用firejail运行应用程序了。 这是通过启动终端并在您希望运行的命令之前添加firejail来实现的。 下面是一个例子: 如何在Linux中使用Firejail运行应用程序如何在Linux中使用Firejail运行应用程序 $ firejail firefox #启动 Firefox网络浏览器

$ firejail vlc # 启动 VLC 播放器 创建安全配置文件 Firejail包含许多针对不同应用程序的安全配置文件,它们存储在: /etc/firejail

如果您从源代码构建项目,则可以在以下位置找到配置文件: # path-to-firejail/etc/

如果您使用了rpm/deb软件包,则可以在以下位置找到安全配置文件: /etc/firejail/

用户应将其配置文件放在以下目录中: ~/.config/firejail

如果要扩展现有安全配置文件,可以使用包含配置文件路径的include,然后添加行。 这应该是这样的: $ cat ~/.config/firejail/vlc.profile include /etc/firejail/vlc.profile

net none

如果您希望限制应用程序访问某个目录,您可以使用黑名单规则来实现这一目标。 例如,您可以将以下内容添加到安全配置文件中: blacklist ${HOME}/Documents

实现相同结果的另一种方法是实际描述您希望限制的文件夹的完整路径: blacklist /home/user/Documents

您可以通过许多不同的方式配置安全配置文件,例如禁止访问,允许只读访问等。如果您有兴趣构建自定义配置文件,可以查看以下firejail说明。 对于想要保护系统的安全用户来说,Firejail是一个很棒的工具。

+
0
-

Cuckoo也可以

Cuckoo是一个开源的自动恶意软件分析系统,我们可以用它来自动运行和分析文件,并可以获取到全面的分析结果,

Cuckoo 可以获取以下类型结果:

1.追踪由恶意软件产生的所有进程执行的调用 2.恶意软件在执行中增删改查情况 3.恶意软件进程的内存输出 4.PCAP包格式的网络流量跟踪 5.在执行软件关键截图 6.机器全部内存输出

Cuckoo模块和可分析样本类型:

• Generic Windows executables • DLL files • PDF documents • Microsoft Office documents • URLs and HTML files • PHP scripts • CPL files • Visual Basic (VB) scripts • ZIP files • Java JAR • Python files • Almost anything else 体系结构

Cuckoo沙箱是由一个中心管理软件组成,处理样本执行和分析。每一个分析都在一个独立的虚拟或者物理机器中启动,Cuckoo主要组件时主机(用于管理软件)和一些客户机(虚拟机或者物理机进行分析)。

在主机中运行沙箱的核心组件,管理分析过程,客户机是隔离环境,恶意样本在其中隔离分析。Cockoo架构如下:

+
0
-

另外 Systemd 也可以

Systemd 提供了大量安全功能,可用于将服务和应用程序彼此隔离,以及与底层操作系统隔离。在很多情况下,systemd提供对 Linux 内核提供的相同机制的轻松访问,这些机制也用于为 Linux 容器创建隔离。为传统应用程序和服务提供容器式隔离的能力非常强大,因为现在可以轻松提高工作负载的安全性和隔离性,而不会产生容器所需的操作影响。值得注意的是,容器采用引发的运营和组织变革确实是健康且值得的。然而,即使在最精通容器的企业中,也有大量传统 Linux 部署将安全性放在首位。正如我们将看到的,这些系统上的工作负载可以从对相应单元文件的一些调整中受益。

一个例子

从 Red Hat Enterprise Linux 8.1 开始,我们添加了一个命令,以便更轻松地参考和检查这些选项的状态: systemd-analyze security [unit]

此命令生成系统如何利用systemd沙箱的快速快照,还可以查看每个单元的单个设置。这种设计使识别可用选项以及在粒度级别查看其使用情况变得简单。

https.service 的 systemd 沙盒状态快照。

此输出systemd-analyze security显示名称、方便的描述和暴露评级,它展示了每个服务的可用安全设置的消耗,并根据服务的隔离程度生成加权的暴露分数。值得注意的是,此工具并不旨在为系统上运行的代码或应用程序提供安全性的整体视图或意见。仅仅因为httpd.service作为UNSAFE默认安装返回并不意味着该服务不安全。 现在我们知道如何查询单位并查看正在使用的控件,让我们看看将这些应用到一个简单的 Web 服务器。这个通用示例可作为其他服务和应用程序的简单起点。 打开安全选项

首先,创建一个 systemd 插件来添加安全选项。对于 Red Hat Enterprise Linux 8,运行: # systemctl edit httpd

或者,如果您愿意,可以手动创建/etc/systemd/system/httpd.service.d/security.conf. 无论您访问文件的方式如何,现在添加: [Service] ProtectSystem=strict ProtectHome=yes PrivateDevices=yes ProtectKernelTunables=yes ProtectKernelModules=yes ProtectControlGroups=yes SystemCallFilter=@system-service SystemCallErrorNumber=EPERM NoNewPrivileges=yes PrivateTmp=yes 对于 Red Hat Enterprise Linux 7,我们可以使用类似的模板: [Service] ProtectSystem=full ProtectHome=yes PrivateDevices=yes NoNewPrivileges=yes PrivateTmp=yes 保存文件并重新启动服务后,该httpd服务将与操作系统的其余部分显着隔离。如果服务受到损害,则突破和随之而来的损坏的可能性会大大降低。 上面的示例是锁定系统上运行的服务、应用程序和单元的一个很好的起点。当然,在将它们推广到整个车队之前,您应该测试这些以确保它们适合您的用例。例如,如果我们想提供来自用户主目录的内容,我们不会包含ProtectHome=yes,而是使用ProtectHome=read-only。另外值得注意的是,将 RHEL 8 中添加的较新选项包含在 RHEL 7 中运行的单元文件中并没有什么坏处。将发出通知消息并忽略该选项。 我们现在可以通过运行来查看正在使用的选项systemd-analyze httpd:

我知道答案,我要回答