Есть ли где-нибудь скрипт сборки chroot?

Есть ли где-нибудь скрипт сборки chroot?

Я собираюсь разработать небольшой скрипт для сбора информации для chroot-jail.

В моем случае это выглядит (на первый взгляд) довольно просто: приложение имеет чистую установку rpm и установило почти все файлы в подкаталог /opt.

Моя идея такова:

  • Найдите все двоичные файлы
  • Проверьте их библиотечные зависимости
  • Запишите результаты в список.
  • Выполните rsync этого списка в chroot-target-directory перед запуском приложения.

Теперь мне интересно — есть ли какой-нибудь скрипт, который уже выполняет такую ​​работу (perl/bash/python)?

Пока я нашел только специализированные решения для отдельных приложений (типа sftp-chroot).

Хотя это не имеет значения (имхо) - ОС - CentOS 5 x86_64, текущий минорный релиз и уровень патча.

rpm -qlIMHO не является достаточно общим, поскольку он охватывает толькооб/мин-based дистрибутивы. Упоминание "чистой установки" выше было просто для того, чтобы отметить, что файлы программного обеспечения не распределены по всей файловой системе. Поэтому моей отправной точкой является - на данный момент - 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.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
  • OpenBSD
  • FreeBSD
  • Mac OS X

Его зависимости выглядят хорошо:

  • (г)libc
  • питон
  • потоки posix

решение4

Первый подход (служба — это само приложение): выполнить bind-ro-mount в chroot для всех «обычных» двоичных файлов, библиотек и т. д.:

  • /и т. д
  • /bin
  • /usr
  • /lib
  • /lib64
  • /вар
  • /home/используемые_аккаунты
  • /opt/сервис

Теперь это было нормально, чтобы проверить, работает ли служба в chroot. К моему удивлению, мой HIDS сказал мне, что была запись, расположенная в подкаталоге в/opt/сервис.

Поэтому я вручную подключился к нему с помощью оболочки и протестировал доступ на запись — и это сработало!

Так что если ничего не помогает - RTFM. man mountнамекнул, что read-only-bind-mount работает только с ядром 2.6.26 или выше (не повезло: CentOS 5 - это 2.6.18).

Еще один недостаток: это оставляет потенциальному злоумышленнику полный набор инструментов операционной системы.

Связанный контент