之前查 LXC – https://benjr.tw/95955 時很多人說,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監獄 (chroot jail或是 chroot prison),剛剛的 chroot 環境必須自己建造而 schroot 則可以是在現有的作業系統下建立一個小型的作業環境給使用者來使用.
- chroot – run command or interactive shell with special root directory
chroot 環境必須自己建造.檔案可以從原系統複製過去,必需的目錄 /bin, /lib, /usr/libroot@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