Existe algum script de construção chroot em algum lugar?

5

Estou prestes a desenvolver um pequeno roteiro para coletar informações para uma cadeia chroot.

No meu caso, isso parece (à primeira vista) bastante simples: O aplicativo tem uma instalação limpa do rpm e instalou quase todos os arquivos em um subdiretório de / opt.

Minha ideia é:

  • Faça um achado 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 em torno de que já faz um trabalho como esse (perl / bash / python)?

Até o momento, encontrei apenas soluções especializadas para aplicativos únicos (como o sftp-chroot).

Embora não importe (imho) - OS é o lançamento menor e o nível de patch atuais do CentOS 5 x86_64.

rpm -ql IMHO não é genérico o suficiente, já que cobrirá apenas as distribuições baseadas em rpm . A menção da "instalação limpa" acima foi apenas para mencionar que os arquivos do software não estão distribuídos em todo o sistema de arquivos. Então, meu ponto de partida é - no momento - um find /opt/directory/ ... que deve funcionar em praticamente qualquer sistema (mesmo não no Linux).

    
por Nils 16.10.2012 / 13:31

4 respostas

0

Existe um conjunto de ferramentas chamado jailkit .

Isso pode funcionar com o Linux também. De acordo com a sua home page, está confirmado que funciona com

  • Solaris
  • "muitas" distribuições do Linux
  • OpenBSD
  • FreeBSD
  • MacOSX

Suas dependências parecem boas:

  • (g) libc
  • python
  • threads posix
por 16.01.2013 / 13:26
2

Eu gostaria de sugerir a criação de um modelo chroot e a instalação de todos os pacotes que você deseja, como se fosse um sistema operacional normal. Depois disso, você pode gerenciar o chroot usando suas ferramentas típicas (atualização de scripts, gerenciador de pacotes, etc.) e rsync as atualizações em cada chroot construído usando esse modelo.

Existem algumas vantagens nessa abordagem. Os dois maiores são você pode gerenciar o template usando ferramentas familiares (sem estranhos aros para fazer o upgrade do seu chroot), e se você tem um chroot que não pode ser atualizado por algum motivo (digamos ele precisa de uma versão específica de algum pacote), você pode excluí-lo do processo rsync upgrade e gerenciá-lo independentemente como se fosse uma máquina independente, marcando o pacote como "mantido" ou equivalente para que ele não seja pisado.

Sua milhagem (e os requisitos de implementação) podem variar ...

    
por 19.10.2012 / 23:40
0

Agora, este é o lugar onde meu scipt 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 dentro do meu chroot. Eles podem referenciar alguns outros binários.

Como solução alternativa, eles devem ser colocados manualmente em $ FILES.

    
por 24.10.2012 / 16:42
0

Primeira abordagem (serviço é o próprio aplicativo): Faça um bind-ro-mount no chroot para todos os binários "normais", libs, etc ...:

  • / etc
  • / bin
  • / usr
  • / lib
  • / lib64
  • / var
  • / home / used_accounts
  • / opt / service

Agora isso foi ok para testar se o serviço é executado no chroot. Para minha surpresa, meus HIDS me disseram que havia uma gravação localizada em um subdiretório em / opt / service .

Então, eu fiz um chroot manualmente com um shell e testei o acesso de gravação - o que funcionou!

Então, se nada mais ajudar - RTFM. man mount insinuou que uma montagem apenas de bind funciona apenas com o kernel 2.6.26 ou superior (má sorte aqui: o CentOS 5 é 2.6.18).

Outra desvantagem: isso deixa um invasor em potencial com o conjunto completo de ferramentas do sistema operacional.

    
por 20.10.2012 / 22:46