某處是否有 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,並將更新同步到使用該範本建置的每個 chroot 中。

這種方法有一些優點。兩大問題是您可以使用熟悉的工具來管理模板(升級您的 chroot 時無需跳過任何奇怪的環節),並且如果您有一個 chroot不能由於某種原因進行更新(假設它需要某個套件的特定版本),您可以將其從rsync升級過程中排除並獨立管理它,就像它是一台獨立的機器一樣,將套件標記為“hold”或等效的,這樣它就不會被踩。

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

答案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.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 中。

答案3

有一組工具名為監獄套件

這也適用於 Linux。根據其主頁,已確認與

  • 索拉里斯
  • 「許多」Linux 發行版
  • 開放BSD
  • 自由BSD
  • 作業系統

它的依賴關係看起來不錯:

  • (g)libc
  • Python
  • POSIX 線程

答案4

第一種方法(服務是應用程式本身):在 chroot 中為所有「常用」二進位檔案、函式庫等執行綁定安裝:

  • /ETC
  • /垃圾桶
  • /usr
  • /lib
  • /lib64
  • /var
  • /home/used_accounts
  • /選擇/服務

現在可以測試服務是否在 chroot 中運行了。令我驚訝的是,我的 HIDS 告訴我,有一個寫入位於/選擇/服務

因此,我使用 shell 手動更改根目錄並測試了寫入存取 - 這有效!

因此,如果沒有其他幫助的話 - RTFM。man mount暗示只讀綁定安裝僅適用於核心 2.6.26 或更高版本(這裡運氣不好:CentOS 5 是 2.6.18)。

另一個缺點:這給潛在的攻擊者留下了全套作業系統工具。

相關內容