
Estou prestes a desenvolver um pequeno script para coletar informações para um chroot-jail.
No meu caso, isso parece (à primeira vista) muito simples: o aplicativo possui um rpm-install limpo e instalou quase todos os arquivos em um subdiretório de /opt.
Minha ideia é:
- Faça uma descoberta de todos os binários
- Verifique suas dependências de biblioteca
- Registre os resultados em uma lista
- Faça um rsync dessa lista no diretório chroot-target antes da inicialização do aplicativo
Agora eu me pergunto - existe algum script que já faça esse trabalho (perl/bash/python)?
Até agora encontrei apenas soluções especializadas para aplicativos únicos (como sftp-chroot).
Embora isso não importe (imho) - o sistema operacional é o CentOS 5 x86_64, versão secundária atual e nível de patch.
rpm -ql
IMHO não é genérico o suficiente, pois cobrirá apenasrpmdistribuições baseadas em . A menção à “instalação limpa” acima foi apenas para mencionar que os arquivos do software não são distribuídos por todo o sistema de arquivos. Portanto, meu ponto de partida é - no momento - um find /opt/directory/
... que deve funcionar em quase todos os sistemas (até mesmo no Linux).
Responder1
Eu sugeriria criar um modelo chroot e instalar todos os pacotes desejados como se fosse um sistema operacional normal. Depois disso, você pode gerenciar o chroot usando suas ferramentas típicas (scripts de atualização, gerenciador de pacotes, etc.) e sincronizar novamente as atualizações em cada chroot criado usando esse modelo.
Existem algumas vantagens nesta abordagem. Os dois grandes são que você pode gerenciar o modelo usando ferramentas familiares (sem obstáculos estranhos para atualizar seu chroot) e se você tiver um chroot quenão podeser atualizado por algum motivo (digamos que ele precise de uma versão específica de algum pacote), você pode excluí-lo do rsync
processo de atualização e gerenciá-lo de forma independente, como se fosse uma máquina autônoma, marcando o pacote como "retido" ou equivalente para que não ser pisoteado.
Sua milhagem (e requisitos de implementação) podem variar...
Responder2
Agora é aqui que meu script está no momento:
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
Problema que ainda existe: Existem arquivos shell no meu chroot. Eles podem fazer referência a alguns outros binários.
Como solução alternativa, eles devem ser colocados manualmente em $FILES.
Responder3
Existe um conjunto de ferramentas chamadokit de prisão.
Isso também pode funcionar com Linux. De acordo com sua página inicial está confirmado para trabalhar com
- Solaris
- "muitas" distribuições Linux
- OpenBSD
- FreeBSD
- Mac OS X
Suas dependências parecem boas:
- (g)libc
- Pitão
- tópicos positivos
Responder4
Primeira abordagem (o serviço é o próprio aplicativo): Faça um bind-ro-mount no chroot para todos os binários, libs, etc. "usuais"...:
- /etc
- /bin
- /usr
- /lib
- /lib64
- /var
- /home/contas_usadas
- /optar/serviço
Agora, tudo bem testar se o serviço é executado no chroot. Para minha surpresa, meu HIDS me disse que havia uma gravação localizada em um subdiretório em/optar/serviço.
Então eu fiz o chroot manualmente com um shell e testei o acesso de gravação - que funcionou!
Então, se nada mais ajudar - RTFM. man mount
sugeriu que uma montagem de ligação somente leitura funciona apenas com o kernel 2.6.26 ou superior (azar aqui: CentOS 5 é 2.6.18).
Outra desvantagem: isso deixa um invasor em potencial com o conjunto completo de ferramentas do sistema operacional.