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.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

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_tiny

appjail start hello_tiny

appjail 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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【面试题】创建两个线程交替打印100以内数字(一个打印偶数一个打印奇数)

阅读导航 一、问题概述二、解决思路三、代码实现四、代码优化 一、问题概述 面试官&#xff1a;C多线程了解吗&#xff1f;你给我写一下&#xff0c;起两个线程交替打印0~100的奇偶数。就是有两个线程&#xff0c;一个线程打印奇数另一个打印偶数&#xff0c;它们交替输出&…

rust学习(字节数组转string)

最新在写数据传输相关的操作&#xff0c;发现string一个有趣的现象&#xff0c;代码如下&#xff1a; fn main() {let mut data:[u8;32] [0;32];data[0] a as u8;let my_str1 String::from_utf8_lossy(&data);let my_str my_str1.trim();println!("my_str len is…

用框架思维学Java:集合概览

集合这个词&#xff0c;耳熟能详&#xff0c;从小学一年级开始&#xff0c;每天早上做操时都会听到这两个字&#xff1a; 高中数学又学习到了新的集合&#xff1a; 那么Java中的集合是什么呢&#xff1f; 一&#xff0c;前言 1&#xff0c;什么是Java集合 数学集合是Java集…

模式识别涉及的常用算法

一、线性回归 1.算法执行流程&#xff1a; 算法的执行流程可以简述如下&#xff1a; 导入必要的库&#xff1a; 导入NumPy库&#xff0c;用于数值计算。导入Matplotlib库&#xff0c;用于数据可视化。导入Pandas库&#xff0c;用于数据处理&#xff08;尽管在这个例子中&#…

【Git】Git 的初识和安装

一、提出问题 不知道你工作或学习时&#xff0c;有没有遇到这样的情况&#xff1a;在编写各种文档时&#xff0c;为了防止文档丢失&#xff0c;更改失误&#xff0c;失误后能恢复到原来的版本&#xff0c;不得不复制出⼀个副本&#xff0c;比如&#xff1a; 设计文档v1设计文…

Python字符串操作详解(超详细)

Python字符串操作详解 目录 Python字符串操作详解一. 字符串创建二. 字符串拼接1. 使用 运算符2. 使用 .join() 方法 三. 字符串索引和切片1. 字符串索引2. 字符串切片3. 字符串长度和负索引4. 字符串不可变性 四. 字符串长度五. 字符串转换六. 查找子字符串七. 字符串替换八.…

xml创建模型组合体

XML创建模型组合体 创建步骤模型准备模型处理模型文件XML编写 效果 创建步骤 模型准备 CAD 提供的原始模型如下&#xff1a; 该模型存在的问题&#xff1a; 单位问题&#xff1a;CAD出图的是 mm 为单位&#xff0c;但是 mujoco 建模这边用的是以 m 为单位的&#xff1b;原点…

二刷算法训练营Day22 | 二叉树(8/9)

目录 详细布置&#xff1a; 1. 235. 二叉搜索树的最近公共祖先 2. 701. 二叉搜索树中的插入操作 3. 450. 删除二叉搜索树中的节点 详细布置&#xff1a; 1. 235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共…

onenet踩坑连接mqtt

一定注意这个version为默认 完整说明https://open.iot.10086.cn/doc/v5/fuse/detail/922 注意这里的的device是名称&#xff0c;不是id,最好产品开发那里就是都是一个名字

华安保险:核心系统分布式升级,提升保费规模处理能力2-3倍 | OceanBase企业案例

在3月20日的2024 OceanBase数据库城市行的活动中&#xff0c;安保险信息科技部总经理王在平发表了以“保险行业核心业务系统分布式架构实践”为主题的演讲。本文为该演讲的精彩回顾。 早在2019年&#xff0c;华安保险便开始与OceanBase接触&#xff0c;并着手进行数据库的升级…

spring boot3登录开发-2(3邮件验证码接口实现)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 上文衔接 接口设计与实现 1.接口分析 2.实现思路 3.代码实现 1.定义验证码短信HTML模板枚举类 2.定义验证码业务接口 3. 验证码业务接口实现 4.控制层代码 4.测试 写…

三、Mapper XML的解析和注册使用

流程&#xff1a; 1.Resources加载MyBatis配置文件生成Reader字符流 2.SqlSessionFactoryBuilder开始引导构建SqlSessionFactory&#xff0c;包括两步&#xff1a; 第一步是在XMLConfigBuilder中使用dom4j解析xml文件&#xff0c;将解析的SQL包装成MappedStatement对象存入Con…

微信小程序-案例:本地生活-首页(不使用网络数据请求)

一、 1.页面效果&#xff1a; 二、 1.新建项目并添加页面 在app.json文件中&#xff1a; "pages": ["pages/home/home","pages/message/message","pages/contact/contact"] 2.配置导航栏效果 在app.json文件中&#xff1a; &quo…

Windows11系统 和Android 调试桥(Android Debug Bridge,ADB)工具安装,app抓取日志内容

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 Android调试桥&#xff08;ADB&#xff09;是一种多功能命令行工具&#xff0c;它允许开发者与连接到计算机上的Android设备进行通信和控制。ADB工具的作用包括但不限于&#xff1a; 安装和卸载应用程序&…

Three.js中的Raycasting技术:实现3D场景交互事件的Raycaster详解

前言 在Web开发中&#xff0c;Three.js是一个极为强大的库&#xff0c;它让开发者能够轻松地在浏览器中创建和展示3D图形。随着3D技术在网页设计、游戏开发、数据可视化等领域的广泛应用&#xff0c;用户与3D场景的交互变得日益重要。而要实现这种交互&#xff0c;一个核心的技…

初识C++ · 反向迭代器简介

目录 前言 反向迭代器的实现 前言 继模拟实现了list和vector之后&#xff0c;我们对迭代器的印象也是加深了许多&#xff0c;但是我们实现的都是正向迭代器&#xff0c;还没有实现反向迭代器&#xff0c;那么为什么迟迟不实现呢&#xff1f;因为难吗&#xff1f;实际上还好。…

点击重置按钮清除el-table排序状态的高亮样式

需求&#xff1a;需要点击按钮的时候&#xff0c;清除掉el-table排序状态的高亮样式 解决方法&#xff1a;table添加ref"tableData",然后使用this.$refs.tableData.clearSort()。 <el-table:data"tableData"style"width: 100%":header-cell-s…

PHP实现抖音小程序用户登录获取openid

目录 第一步、抖音小程序前端使用tt.login获取code 第二步、前端拿到code传给后端 第三步、方法1 后端获取用户信息 第四步、方法2 抖音小程序拿到用户信息把用户信息传给后端 code2Session抖音小程序用户登录后端文档 第一步、抖音小程序前端使用tt.login获取code 前端 …

如何解决chatgpt出现503 bad gateway的问题

昨日&#xff0c;ChatGPT官网挂了&#xff0c;也就是使用web网页端访问的用户&#xff0c;会出现 bad gateway 情况。我们去ChatGPT官方的监控查看&#xff0c;已经展示相关错误。 影响的范围有&#xff1a; 影响了 ChatGPT 所有计划的所有用户。影响包括所有与 ChatGPT 相关…

Ubuntu22.04之解决:emacs无法输入中文问题(二百四十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…