
Estoy a punto de desarrollar un pequeño script para recopilar información para una cárcel chroot.
En mi caso, esto parece (a primera vista) bastante simple: la aplicación tiene una instalación rpm limpia e instaló casi todos los archivos en un subdirectorio de /opt.
Mi idea es:
- Haz una búsqueda de todos los binarios.
- Verifique sus dependencias de biblioteca
- Registre los resultados en una lista.
- Realice una sincronización rsync de esa lista en el directorio chroot-target antes de iniciar la aplicación.
Ahora me pregunto: ¿existe algún script que ya haga ese trabajo (perl/bash/python)?
Hasta ahora sólo encontré soluciones especializadas para aplicaciones individuales (como sftp-chroot).
Aunque no importa (en mi humilde opinión), el sistema operativo es CentOS 5 x86_64, versión menor actual y nivel de parche.
rpm -ql
En mi humilde opinión, no es lo suficientemente genérico, ya que solo cubrirárpmDistribuciones basadas en La mención anterior de "instalación limpia" fue solo para mencionar que los archivos del software no se distribuyen en todo el sistema de archivos. Así que mi punto de partida es, por el momento, un find /opt/directory/
... que debería funcionar en casi cualquier sistema (incluso en Linux).
Respuesta1
Sugeriría crear una plantilla chroot e instalar todos los paquetes que desee como si fuera un sistema operativo normal. Después de eso, puede administrar el chroot usando sus herramientas típicas (scripts de actualización, administrador de paquetes, etc.) y sincronizar las actualizaciones en cada chroot creado usando esa plantilla.
Este enfoque tiene algunas ventajas. Los dos más importantes son que puedes administrar la plantilla usando herramientas familiares (sin obstáculos extraños que pasar para actualizar tu chroot), y si tienes un chroot queno poderactualizarse por algún motivo (por ejemplo, necesita una versión particular de algún paquete), puede excluirlo del rsync
proceso de actualización y administrarlo de forma independiente como si fuera una máquina independiente, marcando el paquete como "retenido" o equivalente para que no se actualice. ser pisoteado.
Su kilometraje (y requisitos de implementación) pueden variar...
Respuesta2
Ahora aquí es donde está mi guión en este 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 aún existe: hay archivos shell dentro de mi chroot. Podrían hacer referencia a otros binarios.
Como solución alternativa, estos deben colocarse manualmente en $FILES.
Respuesta3
Hay un conjunto de herramientas llamadokit de cárcel.
Esto también puede funcionar con Linux. Según su página de inicio está confirmado que trabaja con
- Solaris
- "muchas" distribuciones de Linux
- OpenBSD
- FreeBSD
- Mac OS X
Sus dependencias se ven bien:
- (g)libc
- pitón
- hilos posix
Respuesta4
Primer enfoque (el servicio es la aplicación en sí): haga un bind-ro-mount en el chroot para todos los binarios, bibliotecas, etc. "habituales":
- /etc
- /papelera
- /usr
- /lib
- /lib64
- /var
- /inicio/cuentas_usadas
- /optar/servicio
Ahora bien, estaba bien probar si el servicio se ejecuta en el chroot. Para mi sorpresa, mi HIDS me dijo que había una escritura ubicada en un subdirectorio en/optar/servicio.
Así que hice un chroot manualmente en esto con un shell y probé el acceso de escritura, ¡lo cual funcionó!
Entonces, si nada más ayuda, RTFM. man mount
insinuó que un montaje de enlace de solo lectura solo funciona con el kernel 2.6.26 o superior (mala suerte aquí: CentOS 5 es 2.6.18).
Otro inconveniente: esto deja al atacante potencial con el conjunto completo de herramientas del sistema operativo.