是否有一个 chroot 构建脚本?

是否有一个 chroot 构建脚本?

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

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

我的想法是:

  • 查找所有二进制文件
  • 检查它们的库依赖性
  • 将结果记录到列表中
  • 在应用程序启动之前,将该列表 rsync 到 chroot-target-directory 中

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

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

虽然这并不重要(在我看来) - 操作系统是 CentOS 5 x86_64 当前次要版本和补丁级别。

rpm -ql我认为它不够通用,因为它只涵盖转速-基于发行版。上面提到的“全新安装”只是为了说明软件的文件并未分布在整个文件系统中。因此,我的出发点是 - 目前 - 一个find /opt/directory/应该可以在几乎任何系统(甚至不是 Linux)上运行的...

答案1

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

这种方法有几个优点。两个最大的优点是,你可以使用熟悉的工具来管理模板(升级 chroot 时不需要经过奇怪的环节),如果你有一个 chroot,不能由于某种原因而需要更新(比如说它需要某个包的特定版本),您可以将其从rsync升级过程中排除并像管理独立机器一样对其进行管理,将包标记为“保留”或同等级别,这样它就不会被踩踏。

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

答案2

现在,这是我的脚本目前所在的位置:

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命令

#!/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 中。

答案3

有一套工具名为监狱工具

这可能也适用于 Linux。根据其主页,它已确认适用于

  • 索拉里斯
  • “许多” Linux 发行版
  • OpenBSD
  • FreeBSD
  • 苹果电脑

它的依赖关系看起来不错:

  • (g)libc
  • Python
  • posix 线程

答案4

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

  • /ETC
  • /垃圾桶
  • /usr
  • /lib
  • /lib64
  • /var
  • /主页/used_accounts
  • /选择/服务

现在,可以测试服务是否在 chroot 中运行。令我惊讶的是,我的 HIDS 告诉我,在/选择/服务

因此我使用 shell 手动 chroot 到此处并测试了写访问 - 结果成功了!

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

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

相关内容