Где-нибудь есть скрипт сборки chroot?
Я собираюсь разработать небольшой скрипт для сбора информации для chroot-jail.
В моем случае это выглядит (на первый взгляд) довольно просто: приложение имеет чистую rpm-установку и установило почти все файлы в подкаталог /opt.
Моя идея такова:
- Найти все двоичные файлы
- Проверьте их библиотеки-зависимости
- Запишите результаты в список
- Перед запуском приложения выполните rsync этого списка в каталоге chroot-target-directory.
Теперь я задаюсь вопросом - есть ли сценарий, который уже выполняет такую работу (perl/bash/python)?
Пока я нашел только специализированные решения для отдельных приложений (например, sftp-chroot).
Хотя это не имеет значения (imho) - ОС является CentOS 5 x86_64, текущим второстепенным выпуском и уровнем исправлений.
rpm -ql
ИМХО не достаточно универсальный, поскольку он охватывает только дистрибутивы на основе rpm. Упоминание "чистой установки" выше означало лишь то, что файлы программного обеспечения не распределяются по всей файловой системе. Итак, моя отправная точка - на данный момент - find /opt/directory/
... это должно работать практически на любой системе (даже не на Linux).
4 ответа
Существует набор инструментов с именем jailkit.
Это может работать и с Linux. В соответствии с его домашней страницей подтверждено сотрудничество с
- Solaris
- "много" дистрибутивов Linux
- OpenBSD
- FreeBSD
- Mac OS X
Его зависимости выглядят хорошо:
- (Г) Libc
- питон
- Posix темы
Я бы предложил создать шаблон chroot и установить все нужные вам пакеты, как если бы это была обычная ОС. После этого вы можете управлять chroot, используя ваши обычные инструменты (скрипты обновлений, менеджер пакетов и т. Д.), И синхронизировать обновления в каждом chroot, созданном с использованием этого шаблона.
У этого подхода есть несколько преимуществ. Два больших из них: вы можете управлять шаблоном, используя знакомые инструменты (без странных переходов, через которые можно обновить ваш chroot), и если у вас есть один chroot, который по какой-то причине не может быть обновлен (скажем, ему нужна определенная версия пакет) вы можете исключить его из rsync
обновите процесс и управляйте им независимо, как если бы это был автономный компьютер, помечая пакет как "удерживаемый" или эквивалентный, чтобы он не был перегружен.
Ваш пробег (и требования к реализации) могут отличаться...
Первый подход (сервис - это само приложение): выполните bind-ro-mount в chroot для всех "обычных" двоичных файлов, библиотек и т. Д.:
- /так далее
- / бен
- / USR
- / Lib
- / lib64
- / вар
- / главная / used_accounts
- / Опт / услуги
Теперь можно проверить, работает ли служба в chroot. К моему удивлению, мой HIDS сказал мне, что в подкаталоге в /opt/service была запись.
Таким образом, я вручную подключился к этому с помощью оболочки и проверил доступ на запись - что сработало!
Так что если больше ничего не поможет - RTFM. man mount
намекнул, что read-only-bind-mount работает только с ядром 2.6.26 или новее (неудача здесь: CentOS 5 - 2.6.18).
Еще один недостаток: это оставляет потенциального злоумышленника с полным набором инструментов операционной системы.
Вот где сейчас мой скипетт:
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 есть файлы оболочки. Они могут ссылаться на некоторые другие двоичные файлы.
В качестве обходного пути они должны быть помещены вручную в $FILES.