歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux / Unix:chroot 命令實例講解

Linux / Unix:chroot 命令實例講解

日期:2017/2/28 14:31:29   编辑:Linux教程

我是一個剛接觸 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

上述會話樣例如下:

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

Copyright © Linux教程網 All Rights Reserved