page counter next up previous contents
Next: php 執行 shell 指令 Up: CHROOT Previous: CHROOT 功用   Contents   DYWANG_HOME

建立 chroot 系統

  1. chroot 指令來自 coreutils 套件,系統預設已安裝。
  2. 由 php 網頁執行 chroot 到建立的系統,所以先安裝 php。
    [root@kvm5 script]# yum install php
    
  3. 建立要 chroot 的目錄。
    [root@kvm5 ~]# mkdir /var/www/script
    
  4. 切換目錄到 /var/www/script
    [root@kvm5 ~]# cd /var/www/script
    
  5. 先查看 Linux 系統根目錄下幾個主要目錄的 SELinux Contexts。
    [root@kvm5 script]# ls -Zd /{root,bin,dev,etc,home,lib64,proc,tmp,usr,var}
    lrwxrwxrwx. root root system_u:object_r:bin_t:s0       /bin -> usr/bin
    drwxr-xr-x. root root system_u:object_r:device_t:s0    /dev
    drwxr-xr-x. root root system_u:object_r:etc_t:s0       /etc
    drwxr-xr-x. root root system_u:object_r:home_root_t:s0 /home
    lrwxrwxrwx. root root system_u:object_r:lib_t:s0       /lib64 -> usr/lib64
    dr-xr-xr-x. root root system_u:object_r:proc_t:s0      /proc
    dr-xr-x---. root root system_u:object_r:admin_home_t:s0 /root
    drwxrwxrwt. root root system_u:object_r:tmp_t:s0       /tmp
    drwxr-xr-x. root root system_u:object_r:usr_t:s0       /usr
    drwxr-xr-x. root root system_u:object_r:var_t:s0       /var
    
  6. 建立新 Linux 系統主要目錄。
    [root@kvm5 script]# mkdir -p {root,dev,etc,home,proc,tmp,usr/{bin,lib64},var}
    [root@kvm5 script]# ln -s usr/bin bin
    [root@kvm5 script]# ln -s usr/lib64 lib64
    
  7. 查看新建立的目錄 SELinux Contexts,都是 httpd_sys_context
    [root@kvm5 script]# ls -Z .
    lrwxrwxrwx. root root unconfined_u:object_r:httpd_sys_content_t:s0 bin -> usr/bin
    drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 dev
    drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 etc
    drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 home
    lrwxrwxrwx. root root unconfined_u:object_r:httpd_sys_content_t:s0 lib64 -> usr/lib64
    drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 proc
    dr-xr-x---. root root unconfined_u:object_r:httpd_sys_content_t:s0 root
    drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 tmp
    drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 usr
    drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 var
    
  8. semanage 新增這些新建立目錄的 SELinux Contexts。
    [root@kvm5 script]# for i in bin etc proc tmp usr var
    > do
    > semanage fcontext -a -t ${i}_t `pwd`/$i
    > done
    [root@kvm5 script]# semanage fcontext -a -t admin_home_t `pwd`/root
    [root@kvm5 script]# semanage fcontext -a -t lib_t `pwd`/lib64
    [root@kvm5 script]# semanage fcontext -a -t home_root_t `pwd`/home
    [root@kvm5 script]# semanage fcontext -a -t device_t `pwd`/dev
    
  9. restorecon 恢復這些新建立目錄的 SELinux Contexts。
    [root@kvm5 script]# restorecon -Rv .
    
  10. 查看新建立目錄的 SELinux Contexts,已符合系統要求。
    [root@kvm5 script]# ls -Z .
    lrwxrwxrwx. root root unconfined_u:object_r:bin_t:s0   bin -> usr/bin
    drwxr-xr-x. root root unconfined_u:object_r:device_t:s0 dev
    drwxr-xr-x. root root unconfined_u:object_r:etc_t:s0   etc
    drwxr-xr-x. root root unconfined_u:object_r:home_root_t:s0 home
    lrwxrwxrwx. root root unconfined_u:object_r:lib_t:s0   lib64 -> usr/lib64
    drwxr-xr-x. root root unconfined_u:object_r:proc_t:s0  proc
    drwxr-xr-x. root root unconfined_u:object_r:tmp_t:s0   tmp
    drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0   usr
    drwxr-xr-x. root root unconfined_u:object_r:var_t:s0   var
    
  11. 複製 bin 下需要的執行檔,維持原檔案的 SELinux Context。
    [root@kvm5 script]# cp --preserve=context \
    /bin/{awk,bash,cat,echo,env,grep,mount,sed,sh} bin
    [root@kvm5 script]# cp --preserve=context \
    /usr/bin/{perl,php,python,tee,timeout,tr} usr/bin
    
  12. 複製函式庫,一樣維持 SELinux Context。
    [root@kvm5 script]# cp -a --preserve=context -a /usr/{lib64,lib,libexec} usr/
    
  13. 先查看 null,zero,random,urandom 等 characters 的 major,minor numbers。
    [root@kvm5 script]# stat -c 'major: %t minor: %T' \
    /dev/{null,zero,random,urandom}
    major: 1 minor: 3
    major: 1 minor: 5
    major: 1 minor: 8
    major: 1 minor: 9
    
  14. 建立 character device node。
    [root@kvm5 script]# mknod -m 666 dev/null c 1 3
    [root@kvm5 script]# mknod -m 666 dev/zero c 1 5
    [root@kvm5 script]# mknod -m 666 dev/random c 1 8
    [root@kvm5 script]# mknod -m 666 dev/urandom c 1 9
    
  15. 新增 SELinux 策略,讓 dev 目錄下的所有 character device node 的 SELinux Context type 都正確。
    [root@kvm5 script]# cd dev
    [root@kvm5 dev]# ls
    null  random  urandom  zero
    [root@kvm5 dev]# for i in $(ls)
    > do
    > semanage fcontext -a -t ${i}_device_t `pwd`/$i
    > done
    
  16. restorecon 恢復 dev 目錄下四個 character devices 的 SELinux Contexts。
    [root@kvm5 dev]# restorecon -v *
    
  17. 查看 dev 目錄下四個 character devices 的 SELinux Contexts,已符合需求。
    [root@kvm5 dev]# ls -Z
    crw-rw-rw-. root root unconfined_u:object_r:null_device_t:s0 null
    crw-rw-rw-. root root unconfined_u:object_r:random_device_t:s0 random
    crw-rw-rw-. root root unconfined_u:object_r:urandom_device_t:s0 urandom
    crw-rw-rw-. root root unconfined_u:object_r:zero_device_t:s0 zero
    [root@kvm5 dev]# for i in $(ls)
    > do semanage fcontext -a -t ${i}_device_t `pwd`/$i
    > done
    
  18. Linux 系統的目錄 /tmp 是所有用戶都可寫入讀取,且設定特殊權限 Set sticky bit。
    [root@kvm5 dev]# cd ..
    [root@kvm5 script]# chmod 1777 tmp
    [root@kvm5 script]# ll -Zd tmp/
    drwxrwxrwt. root root unconfined_u:object_r:tmp_t:s0   tmp/
    
  19. chroot 切換根目錄到 /var/www/script,進入到新建的系統
    [root@kvm5 script]# chroot /var/www/script
    bash-4.2#
    
  20. 在新系統執行 touch 產生一個空檔案,因新系統中沒有 touch 指令,所以出現 command not found。
    bash-4.2# touch aaa
    bash: touch: command not found
    
  21. exit 回來原系統。
    bash-4.2# exit
    exit
    [root@kvm5 script]#
    



De-Yu Wang 2020-05-19