chroot详解

我是一个刚接触 Linux 和 Unix 的新手。我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密码或修复基于 Linux/Unix的受损坏的环境?

在 Linux和类 Unix 系统下每一个进程/命令的当前工作目录称之为进程/命令的根目录(译注:译者以为此处有误,实际上没有进行过chroot的进程,其根目录是系统的根目录,而不是其工作目录)。你可以使用 chroot 命令改变一个命令的根目录,这最终将会改变当前运行的进程及其子进程的根目录。

如果一个进程/命令运行在一个不能访问外部根目录文件的已修改环境中。这种修改环境通常被称为"监禁目录"(jail)或是"chroot 监禁"。只有特权进程和根用户才能使用 chroot 命令。然而这通常是很有用的: 1.将特权分配给无特权的进程,例如 Web 服务或 DNS 服务。 2.建立测试环境。 3.不使程序或系统崩溃下,运行旧程序或 ABI 兼容的程序。 4.系统恢复。 5.重新安装引导装载程序,例如 Grub 或 Lilo。 6.密码找回,重置一个已丢失的密码等。

用途

chroot 命令 改变其当前目录,并将根目录变为指定目录,然后如果提供了命令则运行命令,也可以运行一个用户的交互式shell的副本(译注:即bash等。)。请注意并不是每一个程序都可以使用 chroot 命令。

语法

基本语法如下: 1.chroot /path/to/new/root command

或者 1.chroot /path/to/new/root /path/to/server

或者 1.chroot [options]/path/to/new/root /path/to/server

chroot 命令实例

在这个例子中,建立了一个"迷你监狱"用来测试一个只有 ls 命令的 Bash shell。首先用 mkdir 命令设定好 jail "监狱" 路径。 1.$ J=$HOME/jail

在 $J 内创建目录: 1.$ mkdir -p $J 2.$ mkdir -p $J/{bin,lib64,lib} 3.$ cd $J

用cp 命令将/bin/bash 和 /bin/ls 复制到 $J/bin/ 路径下: 1.$ cp -v /bin/{bash,ls} $J/bin

将所需库文件拷贝到$J。可以用 ldd 命令找到 bash 所依赖的共享库。 1.$ ldd /bin/bash

输出样例: 1.linux-vdso.so.1=>(0x00007fff8d987000) 2.libtinfo.so.5=>/lib64/libtinfo.so.5(0x00000032f7a00000) 3.libdl.so.2=>/lib64/libdl.so.2(0x00000032f6e00000) 4.libc.so.6=>/lib64/libc.so.6(0x00000032f7200000) 5./lib64/ld-linux-x86-64.so.2(0x00000032f6a00000)

直接拷贝上面输出中的库文件到 $J 目录: 1.$ cp -v /lib64/libtinfo.so.5/lib64/libdl.so.2/lib64/libc.so.6/lib64/ld-linux-x86-64.so.2 $J/lib64/

输出样例: 1.`/lib64/libtinfo.so.5‘ -> `/home/vivek/jail/lib64/libtinfo.so.5‘ 2.`/lib64/libdl.so.2‘->`/home/vivek/jail/lib64/libdl.so.2‘ 3.`/lib64/libc.so.6‘ -> `/home/vivek/jail/lib64/libc.so.6‘ 4.`/lib64/ld-linux-x86-64.so.2‘ -> `/home/vivek/jail/lib64/ld-linux-x86-64.so.2‘

复制 ls 命令所需的库文件到 $J 目录下。用 ldd 命令打印出 ls 命令依赖的共享库: 1.$ ldd /bin/ls

输出样例: 1.linux-vdso.so.1=>(0x00007fff68dff000) 2.libselinux.so.1=>/lib64/libselinux.so.1(0x00000032f8a00000) 3.librt.so.1=>/lib64/librt.so.1(0x00000032f7a00000) 4.libcap.so.2=>/lib64/libcap.so.2(0x00000032fda00000) 5.libacl.so.1=>/lib64/libacl.so.1(0x00000032fbe00000) 6.libc.so.6=>/lib64/libc.so.6(0x00000032f7200000) 7.libdl.so.2=>/lib64/libdl.so.2(0x00000032f6e00000) 8./lib64/ld-linux-x86-64.so.2(0x00000032f6a00000) 9.libpthread.so.0=>/lib64/libpthread.so.0(0x00000032f7600000) 10.libattr.so.1=>/lib64/libattr.so.1(0x00000032f9600000)

你可以一个个的复制库文件,为了更高效的作业,我们也可以使用bash shell 的循环指令实现: 1.list="$(ldd /bin/ls | egrep -o ‘/lib.*\.[0-9]‘)" 2.for i in $list;do cp -v "$i""${J}${i}";done

输出样例: 1.`/lib64/libselinux.so.1‘ -> `/home/vivek/jail/lib64/libselinux.so.1‘ 2.`/lib64/librt.so.1‘->`/home/vivek/jail/lib64/librt.so.1‘ 3.`/lib64/libcap.so.2‘ -> `/home/vivek/jail/lib64/libcap.so.2‘ 4.`/lib64/libacl.so.1‘ -> `/home/vivek/jail/lib64/libacl.so.1‘ 5.`/lib64/libc.so.6‘->`/home/vivek/jail/lib64/libc.so.6‘ 6.`/lib64/libdl.so.2‘ -> `/home/vivek/jail/lib64/libdl.so.2‘ 7.`/lib64/ld-linux-x86-64.so.2‘ -> `/home/vivek/jail/lib64/ld-linux-x86-64.so.2‘ 8.`/lib64/libpthread.so.0‘->`/home/vivek/jail/lib64/libpthread.so.0‘ 9.`/lib64/libattr.so.1‘ -> `/home/vivek/jail/lib64/libattr.so.1‘

最后,chroot 到你的新jail: 1.$ sudo chroot $J /bin/bash

尝试浏览一下 /etc 或 /var: 1.# ls / 2.# ls /etc/ 3.# ls /var/

改变了根目录的 bash 和 ls 程序现在被监禁在$HOME/$J这个特殊目录中,而且不能再访问外部的目录树,这个目录可以看做是它们的"/"(root)目录。如果配置正确的话,这会极大增强安全性。我通常用这种技术锁定以下的应用程序。 1.Apache - Red Hat / CentOS: Chroot Apache 2 Web Server 2.Nginx - Linux nginx: Chroot (Jail) Setup 3.Chroot Lighttpd web server on a Linux based system 4.Chroot mail server. 5.Chroot Bind DNS server 等等

如何退出 chroot 监禁呢?

键入 exit 即可 1.$ exit

上述会话样例如下:

Animated gif 01: Linux / Unix: Bash Chroot ls Command Demo

Gif 动画01: Linux / Unix: Bash Chroot ls 命令演示

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

你可以用下面两个命令[轻松的找出 Postfix 邮件服务是否已经 chrooted]: 1.pid=$(pidof -s master) 2.ls -ld /proc/$pid/root

从基本Linux服务中输出样例: 1.lrwxrwxrwx.1 root root 0Mar911:16/proc/8613/root ->/

PID 8613 指向了 / (root) 也就是说这个程序的根目录并没有被改变或是被 chroot。这个方法非常的快速而又直接,不需要打开配置文件。下面是从已经 chroot 的 ngnix 服务中得到的另一个例子: 1.pid=$(pidof -s master) 2.ls -ld /proc/$pid/root

输出样例: 1.lrwxrwxrwx 1 nginx nginx 0Mar911:17/proc/4233/root ->/nginxjail

程序的根目录已经改为 /nginxjail。

Ubuntu 14.04 下载、安装、配置的相关知识 http://www.linuxidc.com/Linux/2014-04/100370.htm

Ubuntu 14.04系统下载地址:http://www.linuxidc.com/Linux/2014-04/100352.htm

Windows 7下硬盘安装Ubuntu 14.04图文教程 http://www.linuxidc.com/Linux/2014-04/100983.htm

更多Ubuntu相关信息见Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2

本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-05/102130.htm linux 本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2014-05/102130.htm

时间: 2024-11-07 01:45:22

chroot详解的相关文章

Rsync 服务部署与参数详解

Rsync 简介 rsync 是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具.Rsync软件适用于unix/linux/windows等多种操作系统平台. 传统的 scp 和 cp 工具拷贝每次均为完整拷贝,而rsync除了可以完整拷贝外,还具备增量拷贝功能.因此,从同步数据的性能及效率上,Rsync工具更胜一筹. 官网地址: 1 https://download.samba.org/pub/rsync/rsync.html 2 # 或者 3 https://

php-fpm的配置详解

php5.3自带php-fpm /usr/local/php/etc/php-fpm.confpid = run/php-fpm.pidpid设置,默认在安装目录中的/var/run/php-fpm.pid,建议开启 error_log = log/php-fpm.log错误日志,默认在安装目录中的/var/log/php-fpm.log log_level = notice错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notic

linux FTP配置详解

一.vsftpd说明: LINUX下实现FTP服务的软件很多,最常见的有vsftpd,Wu-ftpd和Proftp等.Red Hat Enterprise Linux中默认安装的是vsftpd. 访问FTP服务器时需要经过验证,只有经过了FTP服务器的相关验证,用户才能访问和传输文件.vsftpd提供了3种ftp登录形式:  (1)anonymous(匿名帐号) 使用anonymous是应用广泛的一种FTP服务器.如果用户在FTP服务器上没有帐号,那么用户可以以anonymous为用户名,以自己

php-fpm 启动参数及重要配置详解

约定几个目录 /usr/local/php/sbin/php-fpm /usr/local/php/etc/php-fpm.conf /usr/local/php/etc/php.ini 一,php-fpm的启动参数               (具体问题解决要更具具体目录来) 1 2 3 4 5 6 7 8 9 10 11 12 13 #测试php-fpm配置 /usr/local/php/sbin/php-fpm -t /usr/local/php/sbin/php-fpm -c /usr/

【详解】DNS服务工作原理、正反向解析和主从同步

目录: 一.理论部分 二.实验部分 ******************************理论部分*************************************** 正文: 一.什么是DNS服务. DNS服务是互联网的基础性服务之一.全称为Domain Name System(域名系统).DNS是因特网上作为域名和IP地址相互映射的一个分布式数据库,提供将域名转换成对应IP地址的信息条目,能够使用户更方便的通过域名(如baidu.com)去访问互联网,而不用去记住能够被机器直接

CentOS 5,6 系统启动流程详解

一.linux 组成介绍 1.linux 组成: Linux: kernel+rootfs(根文件系统) kernel: 进程管理.内存管理.网络管理.驱动程序.文件系统.安全功能 rootfs: 程序和glibc 库:函数集合, function, 调用接口(头文件负责描述) 过程调用: procedure,无返回值 函数调用: function 程序:二进制执行文件 2.内核设计流派: 单内核(monolithic kernel): Linux 把所有功能集成于同一个程序 微内核(micro

Linux系统DNS详解(BIND)

一.Linux运维实战之DNS基础    DNS服务作为网络的一种基础架构,在网络中有举足轻重的地位.它担负着整个网络用户计算机的名称解析工作.没有正确的名称解析,服务器就无法识别各客户机.我们在日常进行的浏览网页等上网活动,无一例外都在使用DNS服务.*******************************************************************************    DNS的基本知识:        DNS服务器的组成        DNS域名称

Linux中pam认证详解(下)

Linux中pam认证详解(下) 在上一篇中详细的介绍了pam的介绍.pam认证原理.pam认证构成以及pam验证控制类型,下面向大家详细介绍一下常用的pam服务模块,以及pam认证的应用. 一.常用的pam服务模块 下面是Linux提供的PAM模块列表(只是其中一部分),这其中包含模块文件.模块功能描述和相关配置文件,具体如下: pam_access 提供logdaemon风格登录控制 /etc/security/access.conf pam_chroot 提供类似chroot命令的功能 p

Gentoo Linux安装详解--根据官方WiKi整理

1. 前期准备 远程登录: 开启ssh服务: /etc/init.d/sshd start 设置密码: passwd 以便使用putty.ssh client远程登录上传stage等(有时在线下载很慢,而局域网上传很快) 准备磁盘: 分区: fdisk /dev/sda /dev/sda1 : /boot 100M(32-100M) 设启动笔记-a/dev/sda2 : / 20G/dev/sda3 : /home 20G/dev/sda5 : /swap 1G (内存< 512 MB,分区分配