Я собираюсь разработать небольшой скрипт для сбора информации для chroot-jail.
В моем случае это выглядит (на первый взгляд) довольно просто: приложение имеет чистую rpm-install и установило почти все файлы в подкаталог / opt.
Моя идея:
Теперь мне интересно - есть ли какой-нибудь сценарий, который уже выполняет такую работу (perl / bash / python)?
Пока нашел только специализированные решения для одиночных приложений (например, sftp-chroot).
Хотя это не имеет значения (imho) - ОС - это CentOS 5 x86_64 текущей минорной версии и уровня исправлений.
rpm -ql
ИМХО недостаточно общий, так как он будет охватывать только об / минна основе дистрибутивов. Упоминание о «чистой установке» выше было просто упоминанием о том, что файлы программного обеспечения не распределяются по всей файловой системе. Итак, моя отправная точка - на данный момент - find /opt/directory/
... это должно работать практически в любой системе (даже не в Linux).
Я бы посоветовал создать шаблон chroot и установить все нужные вам пакеты, как если бы это была обычная ОС. После этого вы можете управлять chroot с помощью обычных инструментов (скрипты обновления, диспетчер пакетов и т. Д.) И синхронизировать обновления с каждым chroot, созданным с использованием этого шаблона.
У этого подхода есть несколько преимуществ. Два основных: вы можете управлять шаблоном, используя знакомые инструменты (без каких-либо странных обручей, через которые можно было бы обновить свой chroot), и если у вас есть один chroot, не могу быть обновленным по какой-то причине (скажем, ему нужна определенная версия какого-то пакета), вы можете исключить его из rsync
обновите процесс и управляйте им независимо, как если бы это была отдельная машина, помечая пакет как «удерживаемый» или эквивалентный, чтобы он не был нарушен.
Ваш пробег (и требования к реализации) могут отличаться ...
Первый подход (сервис - это само приложение): выполните bind-ro-mount в chroot для всех «обычных» двоичных файлов, библиотек и т. Д.:
Теперь это было нормально, чтобы проверить, работает ли служба в chroot. К моему удивлению, мой HIDS сообщил мне, что в подкаталоге в / opt / service.
Итак, я вручную переключился на это с помощью оболочки и протестировал доступ для записи - и это сработало!
Так что если ничего не помогает - RTFM. man mount
намекнул, что монтирование привязки только для чтения работает только с ядром 2.6.26 или выше (неудача здесь: CentOS 5 - это 2.6.18).
Еще один недостаток: это оставляет потенциальному злоумышленнику полный набор инструментов операционной системы.
Есть набор инструментов под названием тюремщик.
Это может работать и с Linux. Согласно его домашней странице подтверждено сотрудничество с
Его зависимости выглядят хорошо:
Вот где сейчас находится мой сценарий:
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.