【Linux 命令】chroot

news2024/11/10 10:27:39

在这里插入图片描述

文章目录

  • 一、背景
  • 二、语法
  • 三、案例
    • 3.1 命令
    • 3.2 系统调用
    • 3.3 查找服务是否存在于 chrooted 监禁内
  • 四、注意事项

chroot 用来在指定根目录运行命令(即指定 / 的位置),不可操作指定目录之外的地方。其是一种非常简单的资源隔离化操作,类似 Linux 的 Mount Namespace,可实现模拟版的 docker。

一、背景

其好处如下:

  • 增强系统安全性,限制用户权利
    经 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性;这个一般是在登录 (login) 前使用 chroot,以此达到用户不能访问一些特定的文件;
  • 建立一个与原系统隔离的系统目录结构,方便用户的开发;
    使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构;在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发;
  • 切换系统的根目录位置,引导 Linux 系统启动以及急救系统等;
    chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘 (initrd) 切换系统的根位置并执行真正的 init;另外,当系统出现一些问题时,我们也可以使用 chroot 来切换到一个临时的系统;

如果一个进程/命令运行在一个不能访问外部根目录文件的已修改环境中,这种修改环境通常被称为监禁目录(jail)或是chroot 监禁,只有特权进程和根用户才能使用 chroot 命令;这通常是很有用的:

  • 将特权分配给无特权的进程,例如 Web 服务或 DNS 服务;
  • 建立测试环境;
  • 不使程序或系统崩溃下,运行旧程序或 ABI 兼容的程序;
  • 系统恢复;
  • 重新安装引导装载程序,例如 Grub 或 Lilo;
  • 密码找回,重置一个已丢失的密码等;

二、语法

在现今的 Linux 上,chroot 既是一个 CLI 工具(chroot(8)),又是一个系统调用(chroot(2));命令语法如下:

chroot [OPTION] NEWROOT [COMMAND [ARGS]...]

# 例如:
chroot /path/to/new/root command
# 或
chroot /path/to/new/root /path/to/server
# 或
chroot [options] /path/to/new/root /path/to/server

# 选项
--userspec=USER:GROUP  # 使用指定的 用户 和 组 (ID 或 名称)
--groups=G_LIST        # 指定补充组 g1,g2,..,gN 
--help     # 显示帮助并退出
--version  # 显示版本信息并退出
  • 目录(dir):指定新的根目录;
  • 指令(command):指定要执行的指令;
    COMMAND 指的是切换 root 目录后需要执行的命令,如果没有指定,默认是 ${SHELL} -i,大部分情况是 /bin/bash;

此外,执行 chroot(8) 需要使用 root 权限;例如,简单地,我们可以这样使用:sudo chroot /path/to/new/root /bin/bash

三、案例

3.1 命令

# 创建对应的新的根目录:
$ J=$HOME/jail
$ mkdir -p $J
$ mkdir -p $J/{bin,lib/x86_64-linux-gnu,lib64,etc,var}

# 将几个必要的命令工具 copy 到 bin/ 下:
$ sudo cp -vf /bin/{bash,ls} $J/bin

# 将步骤 2 中可执行命令依赖的动态库 copy 到 jail/ 下:
$ list=`ldd /bin/ls | egrep -o '/lib.*\.[0-9]'`
$ for i in $list; do sudo cp -vf $i $J/$i; done
$ list=`ldd /bin/bash | egrep -o '/lib.*\.[0-9]'`
$ for i in $list; do sudo cp $i -vf $J/$i; done

# 执行 chroot 命令:
$ sudo chroot $J /bin/bash

bash-4.3# ls
bin  etc  lib  lib64  var
bash-4.3# cd /
bash-4.3# ls
bin  etc  lib  lib64  var
bash-4.3# cd ..
bash-4.3# ls
bin  etc  lib  lib64  var

# 可以看到无论我们如何改变目录,其根目录都被隔离在 $J 中;
# 执行 exit 命令可退出这一环境;

3.2 系统调用

#include <unistd.h>
int chroot(const char *path);
#include <stdio.h>
#include <error.h>
#include <unistd.h>
#include <stdlib.h>

char *const path = "/root/jail"; // 如上文实验所述目录
char *const argv[] = {"/bin/bash", NULL};

int main(void) {
    if (chroot(path) != 0) {
        perror("chroot error");
          exit(1);
    }
    chdir("/");                 // 忽略返回值
    execvp("/bin/bash", argv);  // 忽略返回值
    return 0;
}

编译和运行代码:

$ gcc test_chroot.c -o test_chroot

$ ./test_chroot # 非 root 用户执行命令
chroot error: Operation not permitted

$ sudo ./test_chroot
bash-4.3#

3.3 查找服务是否存在于 chrooted 监禁内

可通过查看进程的 /proc/<pid>/root 来查看对应进程是否处于 chroot 监禁中;如上文,其 chroot 下 bash 的执行进程为 15768,则有:

$ sudo ls -ld /proc/15768/root
lrwxrwxrwx 1 root root 0 Apr 17 22:47 /proc/15768/root -> /root/jail

可见其根目录已经被修改为 /root/jail;

四、注意事项

从上面的例子看出,chroot 是相当简单的,但是最终可能出现几种不同的问题而结束,例如:

  • 在 jail 中缺失库文件可能直接导致 jail 崩溃;
  • 一些复杂的程序不好被 chroot;
  • 正在运行某一程序的 jail 不能再运行其他程序,不能更改任何文件,也不能”假设”另一个用户的身份;放宽这些限制,会降低你的安全性,请根据具体情况使用chroot;

因此要么尝试真正的jail,例如:FreeBSD提供的,要么用虚拟化解决,比如Linux 下的 KVM;还要注意:

  • 当你升级本地程序时,不要忘记升级已 chroot 的程序;
  • 并非所有程序能够或者应该被 chroot;
  • 任何需要 root 权限操作的程序,对其 chroot 是没意义的,因为通常 root 用户都能脱离 chroot;
  • Chroot 并不一个高招;更多的可以学习如何保护和加强系统的各个部分;

参考:案例
参考:参数

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

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

相关文章

idea 配置docker 进行上传镜像,部署启动容器

前言 在我们开发测试过程中&#xff0c;需要频繁的更新docker镜像&#xff0c;然而默认情况下&#xff0c;docker的2375端口是关闭的&#xff0c;下面介绍如何打开端口。 修改docker配置文件 操作步骤&#xff1a; 1.1、修改配置 登录docker所在服务器&#xff0c;修改docker…

web前端实验5

实 验 报 告 课 程 Web前端应用开发 实验项目 Jquery AJAX编程 成 绩 专业班级 班内序号 指导教师 姓 名 学 号 实验日期 实验目的及要求&#xff1a; &#xff08;1&#xff09; 理解和掌握Jquery AJAX的get方式请求 &#xff08;2&#xff09; 理解和掌握Jquery AJAX的pos…

释放ChatGPT潜能:4款高效插件让你的AI助手更强大

你的ChatGPT页面是什么样的&#xff1f;是这样的吗&#xff1f; 今天我要向大家推荐四款「ChatGPT免费插件」。这些插件是我们在与GPT日常交流中&#xff0c;使用频率最高的四个工具。 一旦安装这些插件&#xff0c;你的GPT将立即变身为「超级ChatGPT」。使用起来更为流畅&am…

BEV+Transformer对无人驾驶硬件体系的巨大改变

摘要&#xff1a; BEVTransformer彻底终结了2D直视图CNN时代&#xff0c;BEVTransformer对智能驾驶硬件系统有着什么样的影响&#xff1f;背后的受益者又是谁&#xff1f; 图片来源&#xff1a;特斯拉 BEVTransformer是目前智能驾驶领域最火热的话题&#xff0c;没有之一&…

【大数据平台开发】【Web框架】001Django框架简介

【大数据平台开发】【Web框架】001Django框架简介 文章目录 【大数据平台开发】【Web框架】001Django框架简介一. Django简介与安装1.1 Django安装1.2 Django简介1.3 框架功能简介 二. Django框架的最小程序2.1 新建工程2.2 修改工程2.3 运行工程2.4 django-admin与manage.py2.…

(二)EalsticSearch 辅助工具 Kibana 介绍与安装

1、什么是 kibana &#xff1f; Kibana 是一个针对Elasticsearch的开源分析及可视化平台&#xff0c;用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana&#xff0c;可以通过各种图表进行高级数据分析及展示。 Kibana让海量数据更容易理解。它操作简单&#xff…

Python高光谱遥感数据处理与机器学习

Python高光谱遥感数据处理与机器学习 第一章、高光谱基础 高光谱遥感简介 什么是高光谱遥感&#xff1f; 高光谱遥感为什么重要&#xff1f; 高光谱遥感与其他遥感技术的区别是什么&#xff1f; 高光谱遥感的历史和发展 高光谱传感器与数据获取 高光谱传感器类型 如何获…

RHCE第五次作业

目录 一、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间 1.创建脚本test1.sh 2.下载邮件服务并执行 3.测试 4.做计划 二、 判断web服务是否运行&#xff08;1、查看进程的方式判断该程序…

Node内置模块 【操作系统os模块】

文章目录 &#x1f31f;前言&#x1f31f;os模块&#x1f31f;使用&#x1f31f;属性&#x1f31f;方法&#x1f31f;获取操作系统临时目录&#x1f31f;获取操作系统主机名&#x1f31f;获取操作系统CPU架构&#x1f31f;识别操作系统平台&#x1f31f;获取操作系统发行版本&a…

MPLS VPN 实验

目录 MPLS VPN 实验 拓扑图 实验目的 基础配置 R2 R3 R4 公网部分配置IGP&#xff08;ospf&#xff09; R2 R3 R4 激活MPLS R2 R3 R4 VRF创建 R2 R4 将接口画入VRF空间 R2 R4 配置接口IP地址 R2 R4 站点1基本配置 站点2基本配置 通过静态路由在CE和…

【SPSS】两独立样本的极端反应检验和两配对样本的非参数检验详细操作教程(附案例实战)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

链式二叉树的查找,遍历(递归实现)等接口的实现

目录 前言: 一&#xff1a;二叉树的建立 (1)本文采用的二叉树表示方法 (2)手动建立一颗二叉树 二&#xff1a;二叉树的遍历 (1)二叉树的三种遍历方式 (2)分治思想 (3)前序遍历 (4)中序遍历 (5)后序遍历 三&#xff1a;求二叉树的节点和高度(深度) (1)求二叉树节点 ①…

python+vue 餐饮食品安全监管投诉平台

系统主要包括个人中心、用户管理、餐饮类型管理、餐饮企业管理、案例类型管理、案例展示管理、法规分类管理、法律法规管理、在线投诉管理、查处信息管理、系统管理等功能模块。 绪论 网站的开发背景&#xff0c;意义和系统状况等&#xff0c;详细讲述了系统的用处&#xff0c;…

基于构效关系模型的药物设计(QSAR)

基于构效关系模型的药物设计&#xff08;QSAR&#xff09; 定量构效关系&#xff08;QSAR&#xff0c;Quantitative Structure-Activity Relationship&#xff09;分析是指利用理论计算和统计分析工具来研究系列化合物结构&#xff08;包括二维分子结构、三维分子结构和电子结…

Latex数学公式排版

文章目录 Latex使用最佳方式&#xff1a;读官方文档Latex中的字符数学公式排版1.引入宏包:2.公式排版基础3.数学符号(1).希腊字母(2).指数,上下标,导数(3).分式和根式(4).关系符(5).算符(6).巨算符(7).箭头 Latex使用 最佳方式&#xff1a;读官方文档 The not so short intro…

案例分析:真实案例对“引用类型”的思考

在一个风和日丽的早上&#xff0c;我刚坐到工位上&#xff0c;正准备美美的享受早餐时&#xff0c;我的测试小兄弟杨过火急火燎的来找我说&#xff1a;“小米&#xff0c;不好了&#xff0c;运营童鞋反馈&#xff0c;咱们商城小程序金刚区的新店专区&#xff0c;新开的店铺无法…

mac上 qt与mysql的连接问题

经过两天的折磨和挣扎&#xff0c;将Mac上QT与mysql数据库链接问题的解决做一个梳理&#xff0c;以防忘记&#xff0c;并供他人借鉴&#xff1b; 环境版本&#xff1a;Mac10.14&#xff0c;MySQL5.7.24&#xff0c;Qt5.14.2 首先我重新下载安装了Qt&#xff08;安装了源码&am…

Hadoop课程笔记

Hadoop笔记 nn和sn的区别 nn有inprogress&#xff0c;sn没有&#xff0c;隔一段时间sn会拉取nn上的fsi和edits进行合并然后返回给nnnn和dn 序列化和反序列化 当需要将内存中对象从一个服务器传输到另一个服务器的时候&#xff0c;将内存中的对象写进磁盘&#xff08;序列化&am…

python知识点总结(国家一级假勤奋大学生整理)

python知识点总结 0. 持续更新~1. print不加end自动加回车自动换行2. eval()提取值3. 三双引号字符串中可以包含换行符&#xff0c;制表符以及其他特殊字符4. 字符串不能修改5. 用in 或 not in判断字串是否在母串中6. 网上做题print慎用‘&#xff0c;’会产生不该有的空格7. i…

职场规则实录(不要成全别人,恶心自己)

即使我们因为做出某种决定失去了某些东西,但这并不一定意味着这个决定是错误的。相反,很多时候,即使我们面临诸多风险,我们也要冒险去做出决定,因为在这种风险中可能存在着丰富的机会和收获。就像投资一样,就算我们的投资并没有获得预期的收益,但这并不代表这个投资是错…