有什么chroot构build脚本?

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

在我的情况下,这看起来很乍看起来很简单:应用程序有一个干净的rpm安装,几乎所有的文件都安装到/ opt的子目录中。

我的想法是:

  • find所有的二进制文件
  • 检查他们的库依赖关系
  • 将结果logging到列表中
  • 在启动应用程序之前,将该列表的rsync同步到chroot-target-directory中

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

到目前为止,我发现只有单一应用程序的专门解决scheme(如sftp-chroot)。

(imho) – OS是CentOS 5 x86_64目前的小版本和补丁级别。

rpm -ql是恕我直言,不够通用,因为它只会覆盖基于rpm的发行版。 上面提到的“干净安装”只是提到软件的文件并不分布在整个文件系统中。 所以我的出发点是 – 目前 – find /opt/directory/ …几乎适用于任何系统(即使不是Linux)。

我会build议创build一个模板chroot并安装所有你想要的软件包,就像它是一个正常的操作系统。 之后,您可以使用典型工具(更新脚本,软件包pipe理器等)来pipe理chroot,并使用该模板将rsync更新到每个chroot中。

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

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

现在就是我现在的情况:

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。

有一套名为jailkit的工具。

这可能也适用于Linux。 根据它的主页,它被证实与之合作

  • 的Solaris
  • “许多”Linux发行版
  • OpenBSD系统
  • FreeBSD的
  • MacOSX的

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

  • (G)的libc
  • python
  • posix线程

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

  • /等等
  • /箱
  • 在/ usr
  • / lib目录
  • / lib64下
  • / VAR
  • /家/ used_accounts
  • 的/ opt /服务

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

所以我手动chrooted到这个与壳和testing写访问 – 哪些工作!

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

另一个缺点是:这会给潜在的攻击者留下一整套操作系统工具。