AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 438892
Accepted
Nils
Nils
Asked: 2012-10-17 03:31:34 +0800 CST2012-10-17 03:31:34 +0800 CST 2012-10-17 03:31:34 +0800 CST

某处有 chroot 构建脚本吗?

  • 772

我即将开发一个小脚本来收集 chroot-jail 的信息。

在我的例子中,这看起来(乍一看)非常简单:应用程序有一个干净的 rpm-install 并且几乎所有文件都安装到 /opt 的子目录中。

我的想法是:

  • 查找所有二进制文件
  • 检查他们的图书馆依赖
  • 将结果记录到列表中
  • 在启动应用程序之前将该列表同步到 chroot-target-directory

现在我想知道 - 是否有任何脚本已经完成了这样的工作(perl/bash/python)?

到目前为止,我只找到了针对单个应用程序的专门解决方案(如 sftp-chroot)。

尽管没关系(恕我直言)-操作系统是 CentOS 5 x86_64 当前的次要版本和补丁级别。

rpm -ql恕我直言,它是否不够通用,因为它只涵盖基于rpm的发行版。上面提到的“全新安装”只是提到软件的文件没有分布在整个文件系统中。所以我的出发点是 - 目前 - 一个find /opt/directory/......几乎可以在任何系统(甚至不是 Linux)上运行。

linux
  • 4 4 个回答
  • 2112 Views

4 个回答

  • Voted
  1. voretaq7
    2012-10-20T13:40:06+08:002012-10-20T13:40:06+08:00

    我建议创建一个模板 chroot 并安装所有你想要的包,就像它是一个普通的操作系统一样。之后,您可以使用典型工具(更新脚本、包管理器等)管理 chroot,并将更新同步到使用该模板构建的每个 chroot。

    这种方法有几个优点。两个大的是你可以使用熟悉的工具管理模板(没有奇怪的箍来升级你的 chroot),如果你有一个 chroot由于某种原因无法更新(比如它需要一些特定版本包),您可以将其排除在rsync升级过程之外并独立管理它,就好像它是一台独立的机器一样,将包标记为“保留”或等效的,这样它就不会被踩踏。

    您的里程(和实施要求)可能会有所不同......

    • 2
  2. Nils
    2012-10-21T12:46:19+08:002012-10-21T12:46:19+08:00

    第一种方法(服务是应用程序本身):在 chroot 中为所有“通常的”二进制文件、库等执行 bind-ro-mount...:

    • /ETC
    • /垃圾桶
    • /usr
    • /库
    • /lib64
    • /变量
    • /home/used_accounts
    • /选择/服务

    现在可以测试服务是否在 chroot 中运行了。令我惊讶的是,我的 HIDS 告诉我在/opt/service的子目录中有一个写入。

    所以我用一个 shell 手动 chroot 到这个并测试了写访问 - 这有效!

    因此,如果没有其他帮助 - RTFM。man mount暗示只读绑定挂载只适用于内核 2.6.26 或更高版本(这里运气不好:CentOS 5 是 2.6.18)。

    另一个缺点:这让潜在的攻击者拥有全套操作系统工具。

    • 0
  3. Nils
    2012-10-25T06:42:21+08:002012-10-25T06:42:21+08:00

    现在这是我的 scipt 目前所在的位置:

    mkchroot.cfg:

    # Configuration file for building a chroot envirnoment with Linux
    #
    # V 1.2 2012-10-24
    #
    # Define which directories to scan for executables
    #  use space to separate directories
    DIRS="/opt/application /opt/bin"
    #
    # Define a number of files to check outside the dirctories set in the DIRS
    # directive above. Use space to separate entries.
    FILES="/bin/sh"
    #
    # Define additional things that should be added to chroot without check.
    # This could be block or char-devices. Use space to separate entries. 
    ADDITIONAL="/dev/urandom /dev/null /var/lock/subsys /var/application"
    #
    # Target chroot-directory
    TARGETDIR=="/var/lib/application"
    #
    # Here goes the list of files that has to be synced to chroot
    FILELIST="/tmp/chroot_files.dat"
    #
    

    mkchroot.sh

    #!/bin/sh
    . /opt/application/mkchroot.cfg
    getlibs ()
    {
      # Parameter1: Name of a file containing files to check
      for b in $(cat ${1})
        do
          ldd $b |grep -v ":"|grep "/"|sed "s/.*>//g; s/ (.*//g"|awk '{print $1}'
      done
    }
    # Main program
    clear
    for f in ${FILELIST}_bin ${FILELIST}_tmp ${FILELIST}_lib ${FILELIST}
      do
        [ -f $f ] && rm $f
    done
    for d in $DIRS
      do
        echo Build filelist for directory $d
        find $d -type f -exec file {} \; 2>/dev/null |grep ELF |cut -d : -f 1 >>${FILELIST}_bin
    done
    for f in $FILES
      do
        echo $f >>${FILELIST}_bin
    done
    echo Find libaries on stage 1
    getlibs ${FILELIST}_bin >>${FILELIST}_tmp
    # Now find indirect libraries until list does not get any longer...
    sort -u ${FILELIST}_tmp >${FILELIST}_lib
    typeset -i LIBNEW="$(wc -l <${FILELIST}_lib )" LIBOLD=0 STAGE=2
    while [ $LIBNEW -ne $LIBOLD ]
      do
        echo Find libaries on stage $STAGE
        let STAGE++
        LIBOLD=$LIBNEW
        cp ${FILELIST}_lib ${FILELIST}_tmp
        getlibs ${FILELIST}_lib >>${FILELIST}_tmp
        sort -u ${FILELIST}_tmp >${FILELIST}_lib
        LIBNEW=$(wc -l <${FILELIST}_lib)
    done
    cp ${FILELIST}_lib ${FILELIST}_tmp
    for e in $ADDITIONAL
      do
        echo $e >>${FILELIST}_tmp
    done
    echo Für chroot zu synchronisierende Dateien:
    GDIRS=$(echo $DIRS |sed "s/ /\\\|/g;")
    grep -v "$GDIRS" ${FILELIST}_tmp |sort -u >${FILELIST}
    cat $FILELIST
    

    仍然存在的问题:我的 chroot 中有 shell 文件。他们可能会引用其他一些二进制文件。

    作为解决方法,这些必须手动放入 $FILES 中。

    • 0
  4. Best Answer
    Nils
    2013-01-17T04:26:39+08:002013-01-17T04:26:39+08:00

    有一组名为jailkit的工具。

    这也适用于 linux。根据它的主页,它被确认可以与

    • 索拉里斯
    • “许多”Linux 发行版
    • 打开BSD
    • FreeBSD
    • 苹果操作系统

    它的依赖项看起来不错:

    • (g) 库
    • Python
    • posix线程
    • 0

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve