Recuperar datos / atributos de archivos

Como les va? Hoy vuestro Jedi pseudo-Master les trae algunos consejos y trucos interesantes. Despues de haber charlado con algunos usuarios de GNU/Linux en la ultima reunion de usuarios a la que asisti (cafelug.org.ar), me di cuenta de que todos somos humanos (toda una novedad, sep) , y recorde algunos 'trucos', digamos, que nos pueden llegar a servir para facilitar un poco nuestra vida de administradores. Hoy vamos a aprender la mas simple tecnica de recuperacion de datos, lo que les dara la pauta para seguir investigando en esta area tan interesante y bien remunerada, asi como tambien conocer algunas particularidades del sistema de archivos de GNU/Linux, y de Unix en general.

Recuperación de archivos de texto

Cuantas veces nos paso que estabamos leyendo un email, por ejemplo, con pine y sin darnos cuenta lo eliminamos? Y que me dicen de haber estado progrmando toda la noche, y al querer borrar los backups (los archivos que terminan con ~), le pifiamos al teclado y terminamos con un rm *? Si, a todos alguna vez nos ha pasado. La tecnica que les paso a comentar ahora les va a servir si los datos que visualizaban estuvieron escritos fisicamente en el disco, y no solo en la cache. Digamos, que si el archivo estuvo al menos unos 20 o 30 segundos, podemos estar casi seguros de que lo vamos a recuperar.

Armemos una situacion: Rogelio, de www.rogelio-feliz.com sin querer borro un email con unos datos: claves, direcciones IP, etc. En nuestro caso particular, rogelio es el root, y al darse cuenta que elimino ese archivo, hizo lo siguiente:

1) DETUVO TODA ACTIVIDAD que pueda grabar datos en el disco. O sea, detuvo compilaciones, dejo de grabar archivos con los que estaba trabajando, detuvo el sendmail, todo. Esto es muy importante: una operacion de escritura podria sobreescribir los datos que estamos buscando!

2) Se fijo en que particion estuvo grabado el archivo que elimino. -- En este caso en particular, supongamos que el archivo era /usr/local/claves.txt. Mediante el comando 'df' (disk free, para ver cuantos bloques libres nos quedan en cada particion, asi como tambien en que directorio estan montadas dichas particiones. Un parametro piola: el -m, que muestra las cantidades en megabytes). Como les decia, Rogelio uso el comando 'df'. Asi se dio cuenta que /usr/local/datos esta montado en la particion /dev/hdb2. Si es posible, intenten desmontar esta particion, para que no se produzcan mas escrituras. Si no pueden hacerlo, tengan cuidado con el punto 3.

3) Utilizo el comando 'egrep', que es un grep extendido que nos permite buscar utilizando 'expresiones regulares', que son cadenas que nos permiten hacer busquedas y 'pattern matching' muy poderosos. El archivo de datos tenia pocas lineas, apenas unas 20, y Rogelio recordaba la palabra 'acceso', seguida de algun texto, seguido de la palabra 'SERVIDOR' (en mayusculas). Entonces, utilizo el egrep para buscar esos datos. Pero ustedes diran: Y donde los busca, si el archivo se elimino? - Facil: los busca en la particion en CRUDO. (raw partition). O sea, busca en la particion, pero a bajo nivel, por debajo de 'ext3', o de 'reiserfs'. Justamente: busca 'en crudo'. El comando, entonces, puede ser asi: "egrep -30 'acceso.+SERVIDOR' /dev/hdb2 > /tmp/busqueda Fijense que en este caso estamos redirigidos a /tmp/busqueda, PARA NO ESCRIBIR en la particion /dev/hdb2! - Esto es MUY importante. Recuerden que debemos detener toda actividad de escritura en la particion donde estaban los datos que queremos guardar. El parametro -30 del egrep es para tomar 30 lineas por encima y por debajo de la frase buscada, solo para estar seguros. Si fuera un codigo fuente, podriamos utilizar -10000, por ejemplo.

4) Ahora solamente debemos tomar el archivo /tmp/busqueda, y sacar de alli todo lo que sea legible. En ese archivo es muy probable que haya datos binarios que no nos importan. Es muy facil realizar esta tarea. Recuerden que Unix se destaco en sus origenes por la potencia de sus pequenios programas, que vinculados entre si lograban realizar tareas de muy alto nivel. (cut, cat, *grep, awk, strings, find, wc, etc). Para tomar el texto legible, con solo utilizar el comando 'strings' nos alcanza, de la siguiente manera: "strings /tmp/busqueda > /tmp/limpio". Ahora la salida la redirigimos a /tmp/limpio. Este archivo solamente nos queda cargarlo en un editor de texto, y buscar nuestra informacion alli.

Vieron? Es bastante simple. El secreto en la mayoria de las tecnicas de recuperacion de datos es trabajar con los datos.... pero a bajo nivel. Si algo se escribio, si no fue sobre-escrito, es probable encontrarlo. A veces quiza no podamos recuperar un archivo entero, pero quiza recuperemos importantes fragmentos. La idea es siempre intentar detener toda actividad de disco, para que las probabilidades de recuperacion aumenten considerablemente.

De todas formas: es bueno tener un backup diario de las cosas con las que estamos trabajando. No quiza de todo el sistema, pero al menos de los archivos que tengan tendencia a cambiar seguido. Por supuesto, esta tecnica es mas facil de aplicar si podemos recordar algo del cotenido del archivo que buscamos. Hay que mantener los ojos abiertos, y la cabeza relativamente despierta :).

Por otra parte, esta es una tecnica simple, probablemente util en sistemas donde no haya actividad de otros usuarios. En un servidor sera bastante dificil utilizarla, especialmente si los datos que queremos buscar residen en particiones con mucha actividad de escritura.

Espero que les sirva!

El atributo de inmutabilidad

Este atributo hace lo que su nombre indica: que un archivo no pueda cambiar. No lo confundan con el modo 'w' que ven en un ls -l!

El proceso seria el siguiente: una vez finalizada la instalacion de nuestro sistema, seria piola poner el atributo de inmutabilidad a los binarios que se encuentran en las siguientes ubicaciones: /bin, /sbin, /usr/bin, /usr/sbin, /usr/lib, y todos los demas de ese estilo, y hacer uso del comando 'chattr +i ARCHIVO', donde ARCHIVO indica a que archivos queremos ponerle el atributo de inmutabilidad. Tambien podriamos utilizarlo con los archivos del nucleo en /boot, e incluso podriamos crear un backup de /etc con tar, por ejemplo, y a ese archivo ponerle este atributo.

La idea de todo esto es limitar el danio que le podemos causar a los archivos importantes cuando trabajamos como root. Acaso no siempre se dice que lo primero que hay que hacer cuando uno instala GNU/Linux es crear un usuario para uno mismo, sin privilegios, e investigar, aprender, etc, con ese usuario en la maxima medida de lo posible? Por algo es :). De esta forma podemos no destruir todo al equivocarnos con un redireccionamiento, o al usar rm -f. Y aunque no lo crean, los ataques de denegacion de servicio o de escalamiento de privilegios pueden ser reducidos al imposible, o casi, ya que muchos de ellos dependen de poder sobreescribir binarios del sistema.

Por supuesto, al actualizar el sistema o instalar nuevos programas se puede llegar a necesitar sobreescribir un archivo protegido, por supuesto. Recomiendo entonces tener un script que ponga los atributos, en general, y otro (o el mismo, con algun parametro), que los elimine. Como para 'proteger' y 'desproteger' entre instalaciones, digamos.

Otros atributo interesante y util es el 'a', que significa 'solo agregar', ('append'). Cuando un archivo tiene este atributo ("chattr +a archivo"), solamente podra ser abierto en modo 'solo agregar'. En lenguaje C, esto se haria con la funcion fopen("archivo", "a"). De esta forma, solamente se pueden agregar datos. Muy util para /var/log/*, no lo creen?

Bueno, de esta forma nos vamos despidiendo hasta el proximo numero. Espero que les hayan resultado utiles o interesantes. Invitamos a todos los miembros de la comunidad GNU/Linux a que nos envien sus comentarios, y participen de los foros del portal www.tectimes.com, donde podran comunicarse con usuarios, lectores y autores de los articulos aqui publicados.