Как использовать OverlayFS для защиты корневой файловой системы?

Не уверен, откуда вы берете свой файл-рукоятку или конечную цель. Проверяли ли вы, что использование pfiles для сбора данных из таблицы proc дает то, что вы ищете?

7
12.10.2016, 21:52
2 ответа

Esta respuesta se basa en mi propia experiencia, pero no con dispositivos integrados. Tal vez sea útil para otras personas que tropiecen con esta configuración --. Debe adaptarla a sus circunstancias específicas, o al menos, con suerte, aprender una o dos cosas de ella.

Un método simple es secuestrar el lugar donde se monta el sistema de archivos raíz (en initramfs; de lo contrario, secuestrar el proceso init)y montar la superposición allí, luego continuar como de costumbre. Si lo monta sin initramfs, no olvide mover todos los sistemas de archivos virtuales (, p. /procy/sys)en su secuencia de comandos antes de pasar el control al initnormal.

Si no desea un initramfs, entonces la solución vinculada de Mathieu Maret sobre cómo se hace en raspberry debería funcionar. Básicamente, anula el proceso/script initcon el suyo propio a través de una línea de comando al kernel. Digamos que crea el script en el sistema de archivos raíz en /sbin/init-overlay, luego necesita agregar init=/sbin/init-overlaya los parámetros de arranque del kernel de la configuración de su gestor de arranque.

El script init-overlaypuede hacer cualquier cosa antes de pasar el control a init, en este caso monta la superposición en otro directorio y luego chrooten él.


Una forma posible de hacerlo con initramfs es simplemente secuestrar el script /initdentro de initramfs después del punto en que monta el sistema de archivos raíz. Por ejemplo, supongamos que desea tener una raíz superpuesta, pero también acceso a los puntos de montaje originales, en /run/rootfs/roy/run/rootfs/rw(siendo el primero la raíz de solo lectura -, siendo el último las modificaciones realizadas, elupperdir)después de que el sistema esté en funcionamiento. También asumiré que la unidad que arranca su sistema tiene un archivo root.squashfsque contiene el sistema de archivos raíz de solo lectura -y desea montarlo. Supongamos que también desea acceder a esta unidad, por comodidad, en /media/driveo similar, una vez que el sistema esté en funcionamiento.

La razón por la que secuestramos el script initramfs es porque esto nos ofrece más flexibilidad en el proceso que usar algunos parámetros prefabricados que terminan ejecutando comandos de script predeterminados de todos modos. Por lo tanto, debe editar la configuración de arranque para pasar al kernel la información de que el sistema de archivos "raíz" es en realidad el que se encuentra root.squashfs, ya que lo montaremos más adelante.

Un comando típico con syslinux.cfgen una partición VFAT sería (cambiar el UUID si es necesario):

label linux
    linux vmlinuz
    append root=UUID=ABCD-1234 rootfstype=vfat rootflags=ro,umask=022,quiet ro quiet splash
    initrd initrd.img

Esto supone que colocará el root.squashfsen la partición VFAT, lo que podría no ser ideal (lo que necesita especificar como root= arriba es la partición o el sistema de archivos que contiene el root.squashfso similar,como el sistema de archivos raíz real si no desea que esté comprimido ). Sin embargo, lo explico suponiendo que lo coloque en la partición de arranque. No sé qué tipo de sistema integrado ejecuta, así que tendrá que usar su propio juicio aquí.

Primero tendrá que extraer el initramfs en algún lugar de /tmp para poder modificar su script /init. No olvide hacerlo comoroot(superusuario )para conservar la propiedad correctamente antes de que lo empaquemos de nuevo. Probablemente pueda escribir todo el guión después de entender cómo se puede hacer. Por ejemplo, descomprímalo en /tmp/initramfspara editarlo:

mkdir /tmp/initramfs 2>/dev/null; (cd /tmp/initramfs && zcat /initrd.img | sudo cpio -idmv)

Ahora necesitamos encontrar dónde el script predeterminado monta la raíz. Busque algo como esto en/tmp/initramfs/init(edítelo como root):

maybe_break mount
log_begin_msg "Mounting root file system"
. /scripts/${BOOT}
parse_numeric ${ROOT}
maybe_break mountroot
mountroot
log_end_msg

No tienes que entender cómo funciona esto. Todo lo que necesita entender es que esto monta el sistema de archivos normal que contiene su root.squashfsen un punto de montaje que aparentemente se proporciona a través de la variable de shell ${rootmnt}.

En otras palabras, lo que tenemos en ${rootmnt}en este punto es nuestra partición VFAT (o lo que hayamos especificado a través del root=parámetro de línea de comando ). Este script ahora haría otras cosas, como mover todos los sistemas de archivos virtuales al punto de montaje ${rootmnt}, por lo que debemos asegurarnos de hacer todas nuestras cosas personalizadas después de el código anterior.

Todo lo que tiene que hacer es insertar algo como esto después del código anterior en el/init:

de initramfs
# create some temporary directories under the initramfs's /run
# they will be our mountpoints and such, which will get moved
# by the default script to the actual root filesystem...
mkdir -m 755 /run/rootfs
mount -t tmpfs -o size=90%,mode=755,suid,exec tmpfs /run/rootfs
mkdir -m 755 /run/rootfs/drive /run/rootfs/ro /run/rootfs/rw /run/rootfs/.workdir

# move the original root that was mounted, temporarily
mount -n -o move "${rootmnt}" /run/rootfs/drive

# mount the squashfs and then the overlay to our designated locations
mount -t squashfs -o defaults,ro /run/rootfs/drive/root.squashfs /run/rootfs/ro
mount -t overlay -o lowerdir=/run/rootfs/ro,upperdir=/run/rootfs/rw,workdir=/run/rootfs/.workdir root "${rootmnt}"

# at this point we have our overlay root at ${rootmnt}!
# however, move the drive's filesystem mount to the new root
# this allows it to be accessed afterwards from /media/drive
# NOTE: this assumes you have the /media/drive dir in the root squashfs
mount -n -o move /run/rootfs/drive "${rootmnt}/media/drive"
rm -d /run/rootfs/drive

Eso es todo. La secuencia de comandos continuará como de costumbre, pero con el sistema de archivos raíz como superposición y todas sus partes accesibles después fácilmente. Tenga en cuenta que no verifica errores , eso depende de su propia discreción para agregar los comandos anteriores o para asegurarse de que el módulo overlayesté cargado.

Ahora solo empaca el initramfs:

sudo sh -c 'cd /tmp/initramfs && find. -print0 | cpio --null -ov --format=newc' | gzip -9 > /tmp/initrd.img

Y copie /tmp/initrd.img a su tarjeta SD o donde sea. No olvide colocar root.squashfsen el directorio raíz de la partición VFAT,aunque obviamente eso es fácilmente personalizable y no tienes que hacerlo de esta manera. Esta es solo la forma "más fácil" con syslinux (e incluso el arranque UEFI ), de ninguna manera la mejor.

Y lo siento, sé que pediste un dispositivo incorporado, pero no sé cómo funciona el proceso de arranque allí, solo estoy usando un ejemplo para x86, pero esa parte es menos importante (solo el syslinux.cfgporción ).

Tenga en cuenta que esto hará que la parte escribible de overlayfssea tmpfs, que no es lo que quería. Sin embargo, se cambia fácilmente , si observa lo anterior, simplemente monte algo más para /run/rootfsen lugar de tmpfs, donde quiera que vayan las escrituras.

4
27.01.2020, 20:17

Одним из решений может быть использование initramfs для монтирования rootfs с overlayfs.

Вы можете посмотреть как это делается на Raspberry Pi

или, если не используется устройство ARM, в пакет overlayrootUbuntu

6
27.01.2020, 20:17

Теги

Похожие вопросы