Sistema de Archivos Virtuales (loop) - Cifrado y ACL

Pre - introducción

Está estructurado en
dos partes, (puesto que originalmente lo publiqué en dos
partes). He intentado que las dos sean perfectamente entendibles de
forma individual, pero aún así la primera parte
probablemente esté más detallada en cuanto a
explicaciones se refiere.



Primera Parte



Introducción

Lo que pretendemos hacer, es
crear un disco en un archivo, es decir
coger un archivo y tratarlo como un disco duro, pudiendolo formatear,
montar etc. De esta manera, vamos a poder tener el disco duro en un
solo archivo, lo cual es muy bueno a la hora de portalo.

Un buen comienzo
sería leerse la documentación de: dd, mount y
mkfs
principalmente. En el texto comentaré los aspectos
más importantes,
aunque como ya he dicho, en la documentación de cada comando
tendremos
información extendida al respecto.

Comenzamos

Como ejemplo, lo que vamos a
hacer es crear un sistema de archivos
de 650 Megas bajo ext3, ¿por qué precisamente 650
Megas? pues para
hacer un backup de nuestras cosas \"confidenciales\" sin más
que grabar
un cd.

Para ello lo primero que vamos
a hacer es crear un archivo de 650 Megas lleno de ceros, para ellos
usamos \'dd\'

    $ dd if=/dev/zero of=disk-image count=1331200

    1331200+0 registros leídos

    1331200+0 registros escritos

    681574400 bytes transferred in 83,937876 seconds (8119986 bytes/sec)

Si os preguntais el por
qué del 1331200, pues la respuesta es que no
teneis más que multiplicarlo por 512, y entonces vereis
claros los 650
Megas (quizás me haya pasado pero como los cds son casi
todos de
700MB... :) ). Los 512
vienen de que es el tamaño de bloque por defecto,
así que si hubierais leido el \'man dd\' lo
sabríais.

Los paranoicos podeis comprobar
que teneis vuestro archivo, el resto
directamente pasamos al siguiente punto, en el cual vamos a formatear
nuestro nuevo \"disco duro\". Y lo vamos a formatear en ext3, para ello
usamos \'mkfs\'. Como vemos a continuación nos va a preguntar
si estamos
seguros de lo que hacemos, puesto que el archivo no es dispositivo de
bloques, logicamente le decimos que si.

    /sbin/mkfs -t ext3 -q disk-image

    disk-image no es un dispositivo especial de bloques.

    ¿Se continúa de todas formas? (s,n) s

Ahora solo no queda montar el
archivo, para poder usarlo como un
disco duro. Como lo vamos a montar en un loopback,
deberíamos comprobar
si tenemos alguno montado (aunque lo lógico es que lo
sepamos), para
verlo miramos en /proc/mounts o con un simple mount nos
debería valer.
Vamos a suponer que no tenemos ningún dispositivo loop, (en
caso de
tener más cambiaríamos el /dev/loop0 por
/dev/loop1 por ejemplo)

    # mount -o loop=/dev/loop0 disk-image /data/loop

Montarlo lo tendremos que hacer
como root, y lo montamos en /data, para lo cual necesitamos tener el
directorio creado.

Si ahora miramos en
/proc/mounts (o con mount) veremos una línea como esta

    /dev/loop0 /data/loop ext3 rw 0 0

Si os ha dado error dicienco
que no existe el fichero /dev/loop0, lo
podeis crear, aunque es posible que el problema sea que no teneis en el
nucleo activado el dispositivo loopback. Así que con un
\'modprobe
loop\', no debería de valer. En caso de no hacerlo, nos
dará un error en
LOOP_SET_FD.

Para dar permisos a un
determinado usuario, llamemosle perico, hacemos:

    # chown -R perico.perico /data/loop

En caso de que querer desmontar
la \"partición\", hacemos uso de umount, y como root hacemos:

    # umount /data/loop

Y si queremos liberar
totalmente el dispositivo loop, usamos losetup
(en la siguiente parte del manual, lo usaremos con otros fines)

    # losetup -d /dev/loop0

Conclusiones

Hemos visto como montar de
forma archivos que se convertirán en
discos duros. Esto mismo se puede extrapolar a montar
imágenes de cd
sin más que añadir -t
iso9660 en la llamada a
mount, para indicar el tipo de sistema de archivos.

En la siguiente parte,
seguiremos con esto mismo, pero usaremos listas de control de acceso
(ACL) y cifrado.



Segunda Parte - (con cifrado y listas de control de acceso)



Introducción

En esta segunda parte, lo que
vamos a hacer es lo que comentábamos
en las conclusiones de la primera, y vamos a ver la potencia
añadida
que nos dan las listas de control de acceso sobre los permisos de
usuario típicos. También vamos a usar cifrado
(con aes) y ext3.

Comenzamos

Necesitamos tener cargados
tanto el módulo loop, como el cryptoloop
como el aes. Podemos cargarlos mediante modprobe, para ello hacemos

    # modprobe aes

    # modprobe loop

    # modprobe cryptoloop

Ahora, al igual que en la
primera parte, tenemos que crear nuestro
archivo loop, en este caso hay que tener en cuenta que el sistema de
ficheros reiser, ocupa sensiblemente más que ext3. Como
punto de
montaje utilizaremos el mismo que antes, /data/loop.

$ dd if=/dev/urandom
of=disk-image count=1331200

1331200+0 registros leídos

1331200+0 registros escritos

681574400 bytes transferred in 496,822475 seconds (1371867 bytes/sec)

Como podeis ver, esta vez ha
tardado sensiblemente más y es debido a
que en vez de crear un archivo de ceros, lo hemos creado con
números
aleatorios.

Una vez creado el archivo,
vamos a cifrarlo por medio de losetup.

    # losetup -e aes /dev/loop1 ./disk-image

    Contraseña:

Como podemos ver, nos pide una
contraseña, así que escribimos una de la que nos
vayamos a acordar :P

Ahora ya podemos formatear en
reiser. Ojo que no formateamos directamente el archivo.

    # mkfs -t ext3 /dev/loop1

    mke2fs 1.37 (21-Mar-2005)

    Etiqueta del sistema de ficheros=

    Tipo de SO: Linux

    Tamaño del bloque=4096 (bitácora=2)

    Tamaño del fragmento=4096 (bitácora=2)

    83328 nodos i, 166400 bloques

    8320 bloques (5.00%) reservados para el súper usuario

    Primer bloque de datos=0

    6 bloque de grupos

    32768 bloques por grupo, 32768 fragmentos por grupo

    13888 nodos i por grupo

    Respaldo del súper bloque guardado en los bloques:

    32768, 98304, 163840

    Mientras se
    escribían las tablas de nodos i: terminado

    Creando el fichero de transacciones (4096 bloques): hecho

    Escribiendo superbloques y la información contable del
    sistema de ficheros: hecho

    Este sistema de ficheros se
    revisará automáticamente cada 25 meses o

    180 dias, lo que suceda primero. Utilice tune2fs -c o -i para cambiarlo.

Ahora vamos a montar nuestra
particular partición

    # mount -o loop,encryption=aes,acl ./disk-image /data/loop

    Contraseña:

Nos pide la
contraseña que metimos antes.

Vamos a profundizar dentro de
ACL, y vamos a ver como vamos a poder conseguir un mayor control de los
permisos.

Las utilidades
básicas que vamos a usar son getfacl
y setfacl.
Si no las tienes, con un simple apt-get
install acl, ya las
tendríamos instaladas.

Vamos a comprobar si nuestra
partición está montada con la opción
acl (sabemos que si, pero vamos verlo)

    # setfacl -m u:chacal:rwx /data/loop

    #

Veremos que vuelve al prompt
sin ningún problema, en cambio si
hacemos lo mismo en cualquier otro
directorio/partición/archivo, son
tirará un error como este

    setfacl: disk-image: La operación no está
    soportada

Ahora comprobamos con getfacl
que nos devuelve

    # getfacl /data/loop

    getfacl: Removing leading \'/\' from absolute path names

    # file: data/loop

    # owner: root

    # group: root

    user::rwx

    group::rwx

    other::r-x

    default:user::rwx

    default:user:chacal:rwx

    default:group::r-x

    default:mask::rwx

    default:other::r-x

Si intentamos crear algo en la
partción, no nos va a dejar, puesto
que es propiedad de root, así que deberíamos
haber cambiado los
permisos, o añadir al usuario al grupo root, lo cual NO es
buena idea.
Por lo tanto vamos a cambiar los permisos de /data/loop, y en vez de
ser del grupo root, que sea del grupo users.

    # getfacl /data/loop

    getfacl: Removing leading \'/\' from absolute path names

    # file: data/loop

    # owner: root

    # group: users

    user::rwx

    group::rwx

    other::r-x

    default:user::rwx

    default:user:chacal:rwx

    default:group::r-x

    default:mask::rwx

    default:other::r-x

Si ahora probamos, podemos
comprobar que SI tenemos escritura.

Los comando getfacl y setfacl
muestran y manipulan ACLs. Getfacl
examina los ACL para los directorios y archivos, mientras que setfacl
los establece.

Como siempre, recomiendo la
lectura de los man de sendos comandos. Y
dejo para el lector la tarea de probar la potencia de ACL por si mismo.
Como consejo, para verlo realmente cree varios usuarios, y vaya
asignado permisos a uno, a dos ...

Conclusiones

Aquí no hemos
más que indicar como se puede hacer, en manos del
lector queda investigar más en profundidad las posibilidades
que nos
brindan las Listas de Control de Acceso.


Copyright (c) 2005 chacal.

La última
versión de la primera parte la puedes
encontrar aquí

La última
versión de la segunda parte la puedes encontrar aquí

Permission is granted to copy,
distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
published by the Free Software Foundation; with no Invariant Sections,
no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is
included in the section entitled \"GNU
Free Documentation License
\".