Jail管理器AppJail的使用@FreeBSD

Jail的简介

Jail是FreeBSD操作系统中一个功能强大的安全机制,自FreeBSD 4.X版本起便投入使用,并且随着系统的发展,其功能、效率、稳定性和安全性得到了持续的强化。

Jail基于chroot的概念,通过更改一系列程序的根目录,为程序提供了一个隔离的安全环境,将其与系统的其他部分完全分隔开来。在Jail的环境中运行的程序无法访问其环境之外的任何文件或资源,从而有效防止了潜在的安全威胁。因此,即使一个在Jail环境中运行的服务被攻击者渗透,也不会导致整个系统面临风险。

然而,传统的chroot环境存在诸多限制,它只适用于简单的工作场景,对于需要高度灵活性、复杂性和进阶功能的应用来说并不理想。而且,随着时间的推移,越来越多的方法被发现可以逃离chroot环境,这使得它不再是确保服务安全的最佳方案。

为了克服这些限制,Jail对传统chroot环境的概念进行了多方面的改进。它不仅限制了程序对文件系统的访问,还通过虚拟化技术,实现了对用户、网络子系统等系统资源的隔离。这使得Jail能够提供更精细的控制参数,以调整其对环境资源的访问方式。从某种程度上讲,Jail可以被视为一种操作系统层级的虚拟化技术。

Jail的四个核心要素包括:

  1. 子树状目录:作为进入Jail的起点目录,一旦程序进入Jail,它将无法访问该目录之外的文件系统。
  2. 主机名称:每个Jail都有其独特的主机名称,用于标识和区分不同的Jail环境。
  3. IP地址:为Jail分配一个独立的IP地址,通常是现有网络接口的别名地址。这使得Jail能够独立于主机系统进行网络通信。
  4. 可执行指令:指定在Jail中可执行的程序路径名称。该路径是相对于Jail环境根目录的。

AppJail简介

AppJail是一个基于BSD-3开源许可的框架,它完全采用sh和C语言编写,借助FreeBSD Jail机制创建出隔离、可移植且易于部署的环境,其运行方式与应用程序相似。

该框架的主要目标是简化系统管理员和开发人员的工作流程,通过提供一个统一的接口来实现。此接口融合了FreeBSD的基本工具,自动化了Jail环境的创建和管理流程,使得复杂操作变得简单直接。

AppJail提供了一种高效且直观的方法来处理复杂的系统部署和管理任务。

AppJail手册:AppJail Handbook

 源码:GitHub - DtxdF/AppJail: Simple and easy-to-use tool for creating portable jails.

 安装

使用pkg直接安装

pkg install -y appjail

配置文件在这里:/usr/local/etc/appjail/appjail.conf

如果需要开机启动,需要在/etc/rc.conf文件中加入:appjail_enable=YES

可以使用命令:

sysrc appjail_enable=YES

简单使用

appjail fetch

显示:

appjail fetch
[00:00:00] [ debug ] Running (www): fetch -Rpm -o "/usr/local/appjail/cache/components/amd64/14.1-RELEASE/default/MANIFEST" "https://download.freebsd.org/releases/amd64/14.1-RELEASE"/"MANIFEST"
/usr/local/appjail/cache/components/amd64/14.1        1046  B 5237 kBps    00s
[00:03:24] [ debug ] Done: base.txz

3分半搞定,而且时间显示是灰色的,看着很高级的感觉。

然后快速执行

appjail quick myjail start login

appjail quick myjail start login
[00:00:00] [ debug ] [myjail] quick parameters: start login
 

[00:00:12] [ info  ] [myjail] Done.
[00:00:12] [ debug ] [myjail] Copying /etc/localtime as /usr/local/appjail/jails/myjail/jail/etc/localtime
[00:00:12] [ debug ] [myjail] Copying /etc/resolv.conf as /usr/local/appjail/jails/myjail/jail/etc/resolv.conf
[00:00:12] [ debug ] [myjail] Setting the boot flag to the myjail jail ...
[00:00:17] [ debug ] [myjail] Template generated:
[00:00:17] [ debug ] [myjail]     exec.start: "/bin/sh /etc/rc"
[00:00:17] [ debug ] [myjail]     exec.stop: "/bin/sh /etc/rc.shutdown jail"
[00:00:17] [ debug ] [myjail]     mount.devfs
[00:00:28] [ debug ] [myjail] Locking myjail ...
[00:00:28] [ info  ] [myjail] Starting myjail...

[00:01:27] [ debug ] [myjail] Trying to log in to myjail ...
FreeBSD 14.1-RELEASE (GENERIC) releng/14.1-n267679-10e31f0946d8

Welcome to FreeBSD!

Release Notes, Errata: https://www.FreeBSD.org/releases/
Security Advisories:   https://www.FreeBSD.org/security/
FreeBSD Handbook:      https://www.FreeBSD.org/handbook/
FreeBSD FAQ:           https://www.FreeBSD.org/faq/
Questions List:        https://www.FreeBSD.org/lists/questions/
FreeBSD Forums:        https://forums.FreeBSD.org/

Documents installed with the system are in the /usr/local/share/doc/freebsd/
directory, or can be installed later with:  pkg install en-freebsd-doc
For other languages, replace "en" with a language code like de or fr.

Show the version of FreeBSD installed:  freebsd-version ; uname -a
Please include that output and any error messages when posting questions.
Introduction to manual pages:  man man
FreeBSD directory layout:      man hier

To change this login announcement, see motd(5).
root@myjail:~ # 
1分半,jail从创建到启动就完成了

看下系统:

uname -a
FreeBSD myjail.appjail 14.1-RELEASE FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC amd64

当然现在系统还没有配置好网络,需要进行配置

配置
 

/usr/local/etc/appjail/appjail.conf:

EXT_IF=jext
ON_IF=jext
FREEBSD_VERSION=13.2-RELEASE
FREEBSD_ARCH=amd64
IMAGE_ARCH=amd64
SHORTEN_DOMAIN_NAMES=1
# Remove the # character if you want to use ZFS with AppJail.
#ENABLE_ZFS=1

配置网络

网络方面没有调通。

启动的时候直接配上ip

appjail quick myjail alias=igb0 ip4="192.168.1.120/24" overwrite start

当然网桥没有配置好,所以这里暂时没有成功。

配置网段

执行命令

appjail network add development 192.168.1.0/24

appjail network add development 192.168.1.0/24
[00:00:01] [ debug ] Network information:
[00:00:01] [ debug ]     - ADDRESS=192.168.1.0
[00:00:01] [ debug ]     - NETWORK=192.168.1.0
[00:00:01] [ debug ]     - NETMASK=255.255.255.0
[00:00:01] [ debug ]     - CIDR=24
[00:00:01] [ debug ]     - WILDCARD=0.0.0.255
[00:00:01] [ debug ]     - BROADCAST=192.168.1.255
[00:00:01] [ debug ]     - MINADDR=192.168.1.1
[00:00:01] [ debug ]     - MAXADDR=192.168.1.254
[00:00:01] [ debug ]     - ADDRESSES=254
[00:00:01] [ debug ]     - NAME=development
[00:00:01] [ debug ]     - DESCRIPTION=
[00:00:01] [ debug ]     - GATEWAY=192.168.1.1
[00:00:01] [ debug ] Done.

删除配置网段

appjail network remove -f development

删除之后配置到192.168.3.0网段

appjail network add development 192.168.3.0/24

不过这里没有再配上去,显示报错:

[00:00:00] [ error ] The development network is already created.


 设定jail的虚拟网卡地址

appjail quick myjail \virtualnet="development:myjail" \overwrite \start

查看ip

 appjail network hosts -REj myjail

appjail network hosts -REj myjail
192.168.1.2    development
 可见已经拿到了192.168.1.2网络地址

 ping一下试试

appjail cmd jexec otherjail ping -c4 192.168.1.1

能ping通。 

不过现在因为跟外面的192.168.1.0/24网段冲突,所以还不能上外网,不过至少整个流程基本ok了。

基本操作流程

启动一个已经创建好的jail

 appjail start myjail

登录

 appjail login myjail

登进去之后,可以使用exit退出登录 

 停止jail

appjail stop webapp

 导出jail

 appjail image export -t py -c zstd webapp

执行后显示:

myjail is currently running.
root@fbhost:~ # appjail image export -t pytt -c zstd myjail
[00:00:11] [ info  ] [myjail] Exporting myjail ...
[00:00:11] [ debug ] [myjail] Generating /usr/local/appjail/cache/images/myjail/pytt-amd64-image.appjail ...
[00:00:12] [ info  ] [myjail] Done.
[00:00:12] [ debug ] [myjail] Setting (ajspec): tags: pytt
[00:00:12] [ debug ] [myjail] Setting (ajspec): pytt.arch: amd64
[00:00:12] [ debug ] [myjail] Setting (ajspec): pytt.name: "myjail"
[00:00:12] [ debug ] [myjail] Setting (ajspec): pytt.timestamp.amd64: 1717590767
[00:00:12] [ debug ] [myjail] Setting (ajspec): pytt.sum.amd64: 3b9719c5d5e35d474b07fca8c161ca9ef2f2fa64e8e0f0efe59f28cb3d573f83
[00:00:12] [ debug ] [myjail] Setting (ajspec): pytt.size.amd64: 878988
[00:00:12] [ info  ] [myjail] Saved as /usr/local/appjail/cache/images/myjail/pytt-amd64-image.appjail
文件大小800k 

看看myjail的信息

appjail image metadata info myjail 
Name            :    myjail (pytt)
Build on        :- amd64
Image           :    amd64- SHA256 = 3b9719c5d5e35d474b07fca8c161ca9ef2f2fa64e8e0f0efe59f28cb3d573f83- SIZE = 878988- TIMESTAMP = Wed Jun  5 20:32:47 2024
Installed       :- /usr/local/appjail/cache/images/myjail/pytt-amd64-image.appjail

上传jail到github

# scp \/usr/local/appjail/cache/images/webapp/py-amd64-image.appjail \root@192.168.1.107:/var/mks/makejails/darkhttpd/appdata/AppJail-images/webapp
...
# cp /usr/local/appjail/cache/images/webapp/py-amd64-image.appjail /tmp/imgs/AppJail-images/webapp
# git clone git@github.com:DtxdF/webapp-image
...
# cp /usr/local/appjail/cache/images/webapp/.ajspec webapp-image
# appjail image metadata set -t py -f webapp-image/.ajspec source:amd64="http://localhost:8080/AppJail-images/webapp/py-amd64-image.appjail"
# appjail image metadata set -t py -f webapp-image/.ajspec source:amd64+="http://192.168.1.107:8080/AppJail-images/webapp/py-amd64-image.appjail"
# git -C webapp-image add .ajspec
# git -C webapp-image commit -m 'Add ajspec file'
# git -C webapp-image push
...

 还没看懂这部分,感觉是把img存盘文件设为.ajsped文件上传到github的? 是不能用原名:py-amd64-image.appjail 还是怎么回事? 这部分试验以后再做。

从github导入jail

appjail image import -t py gh+DtxdF/webapp-image

AppJail特有的tiny jail

TinyJails是AppJail的一个功能,用于导出仅包含运行应用程序所需文件的jail。

先创建一个hello.c文件

#include <stdio.h>
#include <stdlib.h>int
main(void)
{
printf("Hello, world!\n");
return EXIT_SUCCESS;
}

生成files.lst 文件,里面只有一句

/usr/local/bin/hello

编译执行

cc -o hello hello.cappjail quick tinyjail
appjail cmd local tinyjail mkdir -p usr/local/bin
appjail cmd local tinyjail mv "$PWD/hello" usr/local/binappjail jail create -I tiny+export="files:files.lst output:hello.appjail compress:xz" tinyjail

cc -o hello hello.c

appjail quick tinyjail
appjail cmd local tinyjail mkdir -p usr/local/bin
appjail cmd local tinyjail mv "$PWD/hello" usr/local/bin


appjail jail create -I tiny+export="files:files.lst output:hello.appjail compress:xz" tinyjail

显示:

appjail jail create -I tiny+export="files:files.lst output:hello.appjail compress:xz" tinyjail
[00:00:00] [ info  ] [tinyjail] Exporting tinyjail as a tiny jail ...
[00:00:00] [ debug ] [tinyjail] (1/2): Checking /usr/local/bin/hello ...
[00:00:00] [ debug ] [tinyjail] (2/2): Ignoring empty line...
[00:00:01] [ debug ] [tinyjail] (1/1): Copying usr/local/bin/hello ...
[00:00:01] [ debug ] [tinyjail] Generating hello.appjail ...
[00:00:01] [ info  ] [tinyjail] Done.
 

在其它机器上,我们可以安装并执行这个tiny jail

appjail jail create -I tiny+import=hello.appjail hello_tinyappjail start hello_tinyappjail cmd jexec hello_tiny hello#Hello, world!

appjail cmd jexec hello_tiny hello
Hello, world!

总结

AppJail是非常好的Jail管理软件。当然由于个人原因,网络这块还没调通,先搁置。

调试

appjail fetch 的时候报错Not Found 

appjail fetch
[00:00:00] [ debug ] Running (www): fetch -Rpm -o "/usr/local/appjail/cache/components/amd64/14.1-BETA3/default/MANIFEST" "https://download.freebsd.org/releases/amd64/14.1-BETA3"/"MANIFEST"
fetch: https://download.freebsd.org/releases/amd64/14.1-BETA3/MANIFEST: Not Found
[00:00:01] [ error ] `fetch -Rpm -o "/usr/local/appjail/cache/components/amd64/14.1-BETA3/default/MANIFEST" "https://download.freebsd.org/releases/amd64/14.1-BETA3"/"MANIFEST"` exits with a non-zero exit status.
现在是14.1-RC ,升级FreeBSD,具体见:使用freebsd-update 升级FreeBSD-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/848463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于包围盒的机械臂防碰撞算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 5.完整工程文件 1.课题概述 基于包围盒的机械臂防碰撞算法。在实际情况中&#xff0c;由于很多对象结构较为复杂&#xff0c;当目标对象与障碍物之间的包围盒相交的时候&#xff0c;而两个物体并不相交。这就需要进一步划…

js 一维数组转多维数组

效果图&#xff1a; //源数组const arrList [{"id": 1,"code": "001","name": "第一个","parentCode": "",},{"id": 2,"code": "00101","name": "第一…

springboot项目中第三方jar包打包进jar包

springboot项目中&#xff0c;如果手动引入了jar包&#xff0c;打包时不会将手动引入的第三方jar包打包进价包里&#xff0c;如何处理&#xff1f; 若第三方的jar包的lib和src同级&#xff0c;则maven打包时默认不会将lib下的jar包打包进jar包&#xff0c;处理方式有两种&#…

Golang | Leetcode Golang题解之第133题克隆图

题目&#xff1a; 题解&#xff1a; func cloneGraph(node *Node) *Node {if node nil {return node}visited : map[*Node]*Node{}// 将题目给定的节点添加到队列queue : []*Node{node}// 克隆第一个节点并存储到哈希表中visited[node] &Node{node.Val, []*Node{}}// 广…

nginx --- 反向代理|负载均衡 | 动静分离

目录 反向代理如何配置 1、反向代理实例一 2、反向代理实例二 ocation 指令说明 Nginx 负载均衡 负载均衡常用算法 应用场景 总结 Nginx实现动静分离 一、什么是动静分离 二、实现方案 三、配置Nginx动静分离 四、验证测试 反向代理如何配置 1、反向代理实例一 实…

视频怎么压缩变小?推荐三个压缩方法

视频怎么压缩变小&#xff1f;在数字时代&#xff0c;视频已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着视频质量的提升&#xff0c;视频文件的大小也随之增加&#xff0c;这给存储和分享带来了不小的挑战。幸运的是&#xff0c;市面上有许多视频压缩软件…

2024首发!会声会影2024旗舰版,专业编辑新体验!

会声会影2024最新旗舰版是一款专业的视频编辑软件&#xff0c;它集成了多种高级功能&#xff0c;为用户带来极致的视频编辑体验。在这篇文章中&#xff0c;我们将详细介绍该软件的功能和特色&#xff0c;帮助用户更好地了解和使用它。 会声会影全版本绿色安装包获取链接&#…

【简单理解化】 内存函数及它的模拟实现

本文章谈论memcpy,memcmp,memmove,memset函数 目录 1.memcpy的使用和模拟实现 2.memmove的使用和模拟实现 3.memset的使用 4.memcmp函数的使用 1.memcpy的使用和模拟实现 该函数用于从源内存块复制指定数量的字节到目标内存块 1 void * memcpy ( void * destination, const voi…

【机器学习基础】Python编程01:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

C++ | Leetcode C++题解之第134题加油站

题目&#xff1a; 题解&#xff1a; class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int n gas.size();int i 0;while (i < n) {int sumOfGas 0, sumOfCost 0;int cnt 0;while (cnt < n) {int j (i …

2.1.3 采用接口方式使用MyBatis

实战概述&#xff1a;使用MyBatis的接口方式进行数据库操作 环境准备 确保项目中已经集成了MyBatis框架。 创建用户映射器接口 在net.huawei.mybatis.mapper包中创建UserMapper接口。定义方法findById(int id)用于按编号查询用户。定义方法findAll()用于查询全部用户。定义方法…

嵌入式Linux系统中GPIO应用控制详解

大家好,今天主要和大家分享一下,如何在linux系统上,实现GPIO口的控制,其中GPIO在内核端基本操作如下。 第一:Linux系统中GPIO介绍 GPIO(General-Purpose IO Ports),即通用I0接口.GPIO的使用较为简单,主要分为输入和输出两种功能.GPIO主要用于实现一些简单设备的控制.…

3. 使用tcpdump抓取rdma数据包

系列文章 第1章 多机多卡运行nccl-tests 和channel获取第2章 多机多卡nccl-tests 对比分析第3章 使用tcpdump抓取rdma数据包 目录 系列文章一、准备工作1. 源码编译tcpdump2. 安装wireshark 二、Tcpdump抓包三、Wireshark分析 一、准备工作 1. 源码编译tcpdump 使用 tcpdump…

判断经纬度是否在某个城市内

一、从高德获取指定城市边界经纬度信息 通过apifox操作&#xff1a; 二、引入第三方jar包&#xff1a; maven地址&#xff1a;https://mvnrepository.com/ maven依赖&#xff1a; <dependency><groupId>org.locationtech.jts</groupId><artifactId>…

Xcode中给UIView在xib中添加可视化的属性

给UIView在xib中添加可视化的属性 效果如下图&#xff1a; 可以直接设置view 的 borderColor 、borderWidth、cornerRadius&#xff0c;也可以单独指定view的某个角是圆角。减少了代码中的属性。 完整代码&#xff1a; UIViewBorder.h #import <UIKit/UIKit.h>inter…

NLP(1)-TF-IDF算法介绍

一、TF-IDF算法介绍 TF-IDF&#xff08;term frequency–inverse document frequency&#xff0c;词频-逆向文件频率&#xff09;是一种用于信息检索&#xff08;information retrieval&#xff09;与文本挖掘&#xff08;text mining&#xff09;的常用加权技术。 TF-IDF是一…

(十六)统计学基础练习题十(选择题T451-478)

本文整理了统计学基础知识相关的练习题&#xff0c;共50道&#xff0c;适用于想巩固统计学基础或备考的同学。来源&#xff1a;如荷学数据科学题库&#xff08;技术专项-统计学三&#xff09;。序号之前的题请看往期文章。 451&#xff09; 452&#xff09; 453&#xff09; 4…

Ubuntu安装cuda

文章目录 前言一、安装NVIDIA驱动1.1 过程中的问题1.2 解决方法1.3 重启后出现 perform MOK management 二、安装Cuda2.1 检查是否安装显卡驱动2.2 安装Cuda2.3 验证CUDA是否安装成功 三、配置环境变量---未完2.4 图片居中加调整大学 总结 #pic_center 前言 只是为方便学习&…

如何将本地项目上传到GitHub

在软件开发过程中&#xff0c;将本地项目上传到GitHub是一个非常重要的步骤。它不仅可以帮助你备份代码&#xff0c;还可以让你与团队成员共享和协作开发。本文将详细介绍如何将本地项目上传到GitHub。 前提条件 已安装Git。如果还没有安装&#xff0c;请参考Git官网进行下载…

机器学习_模型评估与选择

在机器学习中&#xff0c;模型评估与选择是至关重要的步骤。这一过程包括评估模型的性能、选择最适合的模型&#xff0c;以及对模型进行优化&#xff0c;以确保在实际应用中达到最佳效果。以下是详细的讲解&#xff1a; 一、模型评估 模型评估的目的是衡量模型在数据上的表现…