• 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 "监狱" 路径。(注意,最好不要在chroot里使用fish shell作为主shell,有问题)

    $ chr=/home/dave/testroot
    $ mkdir -p $chr
    $ mkdir -p $chr/{bin,lib,lib64}
    $ cd $chr
    
    $ cp --parents -v /bin/{bash,touch,ls,rm} $chr
    
    $ list="$(ldd /bin/bash | egrep -o '/lib.*.[0-9]')"
    $ echo $list
    $ for i in $list; do cp -v --parents "$i" "${chr}"; done
    
    $ list="$(ldd /bin/touch | egrep -o '/lib.*.[0-9]')"
    $ for i in $list; do cp -v --parents "$i" "${chr}"; done
    
    $ list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"
    $ for i in $list; do cp -v --parents "$i" "${chr}"; done
    
    $ list="$(ldd /bin/rm | egrep -o '/lib.*.[0-9]')"
    $ for i in $list; do cp -v --parents "$i" "${chr}"; done

    要运行chroot,则:

    $ sudo chroot $chr /bin/bash

    改变了根目录的 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

    查找服务是否存在于 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。

  • 相关阅读:
    JDK1.8中对hashmap的优化
    ShutdownHook作用
    【工作相关】常用Shell命令
    [技术学习]收藏技术博客
    【技术学习】Mongo Administration
    【技术学习】saltstack 笔记(一) --匹配Minion
    【工作相关】个人常用脚本及代码
    【工作相关】常用工具
    【现场问题】add trust cert into JAVA_HOME
    【工作相关】替换Rancher证书
  • 原文地址:https://www.cnblogs.com/welhzh/p/4269319.html
Copyright © 2020-2023  润新知