2,137 瀏覽數

Linux – chroot & schroot

之前查 LXC 時很多人說,LXC 有點像是 chroot,所以這邊來看一下什麼是 chroot.一開始我以為 su , sudo 就是 chroot.我們先來看看什麼是 su,sudo.

測試環境為 Ubuntu14.04

  • su 指令
    轉換使用者成為其他使用者或是 root 的身份.
  • sudo 指令
    sudo 主要是用在給非特權使用者有權限去執行 root(特權使用者) 才能執行的指令.

    ben@ubuntu:/root$ su root
    Password: 
    su: Authentication failure
    ben@ubuntu:/root$ sudo su root
    Password: 
    root@ubuntu:~#
    

我們先來看看一般使用者透過 SSH 登入後能看到的環境.

root@ubuntu:~# adduser bens
Adding user `bens' ...
Adding new group `bens' (1001) ...
Adding new user `bens' (1001) with group `bens' ...
Creating home directory `/home/bens' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for bens
Enter the new value, or press ENTER for the default
	Full Name []: BenS
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] y

使用者 bens 透過 SSH 登入資料基本上所有目錄都是看得到的.那有辨法限制嗎?就是透過 chroot.

appledeAir:~ ben$ ssh bens@172.16.15.204
bens@172.16.15.204's password: 
Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 3.16.0-77-generic i686)

bens@ubuntu:~$ ll /
total 100
drwxr-xr-x  22 root root  4096 Sep 17 18:52 ./
drwxr-xr-x  22 root root  4096 Sep 17 18:52 ../
drwxr-xr-x   2 root root  4096 Sep  7 01:57 bin/
drwxr-xr-x   3 root root  4096 Sep 17 18:53 boot/
drwxrwxr-x   2 root root  4096 Jul 30  2015 cdrom/
drwxr-xr-x  16 root root  4240 Nov 14 19:38 dev/
drwxr-xr-x 136 root root 12288 Nov 14 19:49 etc/
drwxr-xr-x   4 root root  4096 Nov 14 19:49 home/

那什麼是 chroot ,網路上大概有兩種做法,chroot 可以針對正在運作的行程與其子行程變更系統的根目錄,變更之後根目錄之外的檔案無法進行存取動作.被稱為 chroot監獄 (hroot jail或是 chroot prison),剛剛的 chroot 環境必須自己建造而 schroot 則可以是在現有的作業系統下建立一個小型的作業環境給使用者來使用.

  • chroot – run command or interactive shell with special root directory
    chroot 環境必須自己建造.檔案可以從原系統複製過去,必需的目錄 /bin, /lib, /usr/lib

    root@ubuntu:~# mkdir /chroot
    root@ubuntu:~# cp -a /bin /chroot
    root@ubuntu:~# cp -a /lib /chroot
    root@ubuntu:~# mkdir /chroot/usr
    root@ubuntu:~# cp -a /usr/lib /chroot/usr
    root@ubuntu:~# chroot /chroot
    bash-4.3# ls
    bin  lib  usr
    bash-4.3# exit
    exit
    

    如果是要限制 SSH 的登入時,需要透過 /etc/pam.d/sshd 設定檔 修改 PAM(Pluggable Authentication Modules) chroot 的支援,再來針對不同的使用者來限制使用者登入的根目錄

    root@ubuntu:~#nano /etc/pam.d/sshd
    session   required      pam_chroot.so  
    

    細節這邊就不討論.

  • schroot – securely enter a chroot environment
    這個做法跟 LXC 就很類似了.schroot 套件需要額外安裝,我們還需要另外一個套件 debootstrap (Bootstrap a basic Debian system) 他主要負責透過網路去下載我們所需的小型的作業環境給登入的使用者來使用.

    root@ubuntu:~# apt-get install schroot debootstrap
    

    下載小型的作業環境需要一點時間所以可以先做,環境我選的是 Ubuntu 14.04 (Trusty).我們需要一個資料夾 /Trusty 來存放 Ubuntu 14.04 環境所需的檔案.

    root@ubuntu:~# mkdir /Trusty
    root@ubuntu:~# debootstrap trusty /Trusty/ 
    I: Retrieving Release 
    I: Retrieving Release.gpg 
    I: Checking Release signature
    I: Valid Release signature (key id 790BC7277767219C42C86F933B4FE6ACC0B21F32)
    I: Validating Packages 
    I: Resolving dependencies of required packages...
    I: Resolving dependencies of base packages...
    I: Checking component main on http://archive.ubuntu.com/ubuntu...
    ....
    I: Base system installed successfully.
    root@ubuntu:~# ls /Trusty
    bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
    boot  etc  lib   media  opt  root  sbin  sys  usr
    
    # debootstrap [OPTION...] SUITE TARGET [MIRROR [SCRIPT]]
    

    [OPTION…]

    –variant=minbase | buildd | fakechroot | scratchbox
    可以不用設定,預設為 base installation.

    • minbase, which only includes essential packages and apt.
    • buildd, which installs the build-essential packages into TARGET.
    • fakechroot, which installs the pack‐ages without root privileges.
    • scratchbox, which is for creating targets for scratchbox usage.

    SUITE

    這邊列出 長期支援版本 (LTS) ,其他版本名稱請上 wiki 查詢 https://zh.wikipedia.org/wiki/Ubuntu

    • Ubuntu 12.04 – Precise
    • Ubuntu 14.04 – Trusty
    • Ubuntu 16.04 – Xenial

    TARGET

    檔案存放的資料夾位置 /Trusty/

    [MIRROR [SCRIPT]]

    下載檔案的位置 http://archive.ubuntu.com/ubuntu/

    還需要去設定 schroot 的設定檔,檔案位置及檔案名稱是 /etc/schroot/schroot.conf

    root@ubuntu:~# nano /etc/schroot/schroot.conf
    [Trusty]
    description=Ubuntu Trusty
    directory=/Trusty
    users=bens
    type=directory
    

    description=Ubuntu Trusty
    說明
    directory=/Trusty
    作業環境的資料夾路徑
    users=bens
    允許使用該作業環境的 使用者清單 (使用者對應到原作業系統),可以使用逗號分隔多個使用者,除了使用者外還可以設定 groups=sbuild (使用者群組清單) 與 root-groups=root (root 使用者群組清單).
    type=directory
    我設定的作業系統環境位於資料夾來執行.

    基本上一個位於 Ubuntu14.04 下的 Ubuntu 14.04 作業環境已經設定完成,在這一個環境所需改的任何東西都不會引響到原作業系統.

    root@ubuntu:~# schroot -c Trusty -u bens
    W: Failed to change to directory ‘/root’: Permission denied
    I: The directory does not exist inside the chroot.  Use the --directory option to run the command in a different directory.
    W: Falling back to directory ‘/home/bens’
    (Trusty)bens@ubuntu:~$ ls /
    bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
    boot  etc  lib   media  opt  root  sbin  sys  usr
    (Trusty)bens@ubuntu:~$ exit
    logout
    root@ubuntu:~# schroot -c Trusty -u root
    (Trusty)root@ubuntu:~# exit
    logout
    

遇過的錯誤訊息,大概都是跟 64-bit 32-bit 相關的,在 debootstrap 時要注意 –arch 的版本,也要確認有 Base system installed successfully 的訊息.

root@ubuntu:~# debootstrap --variant=buildd --arch amd64 trusty /Trusty/ http://archive.ubuntu.com/ubuntu/
.....
W: Failure trying to run: chroot /Trusty mount -t proc proc /proc
W: See /Trusty/debootstrap/debootstrap.log for details
root@ubuntu:~# schroot -c Trusty -u bens
chroot: failed to run command `/bin/bash': Exec format error

發表迴響