# rm-rf.es

chattr y lsattr: control de atributos de ficheros Linux

En otra entrada explicaba cómo hacer que ningún usuario (incluido root) pudiera borrar ficheros en Linux. Para ello hacíamos uso de dos comandos: lsattr y chattr. El primer comando, lsattr permite listar los atributos asignados a los ficheros de un sistema de ficheros Linux, mientras que chattr permite modificar dichos atributos, los cuales que utilizamos como complemento al sistema de ACLs (chmod, chown,setfacl…) permitiendo un control más férreo sobre los archivos del filesystem.

lsattr

El uso de lsattr no tiene demasiado misterio ya que únicamente nos servirá para listar atributos de ficheros y directorios, ejemplo:

$ lsattr -a
------------- ./..
------------- ./.bash_history
------------- ./.
------------- ./prueba.txt
------------- ./.bashrc
------------- ./.bash_profile
------------- ./.ssh
------------- ./.bash_logout

Algunos parámetros del comando que conviene conocer son, por ejemplo, «-a» utilizado en el ejemplo anterior que muestra todos los archivos del directorio, incluidos los ocultos. Si queremos visualizar los atributos de forma recursiva utilizamos -R:

$ lsattr -Ra | more
-----------------e- ./.ike

./.ike:
-----------------e- ./.ike/.
-----------------e- ./.ike/sites

./.ike/sites:
-----------------e- ./.ike/sites/.
-----------------e- ./.ike/sites/..

-----------------e- ./.ike/..
-----------------e- ./.ike/certs

./.ike/certs:
-----------------e- ./.ike/certs/.
-----------------e- ./.ike/certs/..


-----------------e- ./.cisco_mds9000

./.cisco_mds9000:
-----------------e- ./.cisco_mds9000/.
-----------------e- ./.cisco_mds9000/install.log
-----------------e- ./.cisco_mds9000/..

chattr

Para comenzar a asignar atributos haremos uso del comando chattr. A continuación vamos a ver mediante ejemplos algunas de las posibilidades que nos ofrece, las letras que pasamos como parámetro simbolizan los atributos a modificar y el (+) o el (-) si lo añadimos o quitamos. Como parámetros opcionales a chattr podemos pasar que el cambio de atributos sea recursivo (R), verbose (V) y suprimir la salida de errores (f).

Deshabilitar la modificación de la fecha de acceso al fichero (atime)

Con la asignación del atributo ‘A’ conseguimos que cuando se acceda al fichero no se modifique el registro atime. De este modo no quedarán registrada la fecha del último acceso al fichero:

# chattr +A prueba.txt
# lsattr prueba.txt
-------A----- prueba.txt

Comprimir automáticamente el fichero en el disco

Si asignamos el atributo ‘c’ activamos que el fichero se comprima automáticamente en el disco por el kernel. Cuando se lea el fichero se servirá descomprimido:

# chattr +c prueba.txt
# lsattr prueba.txt
--------c---- prueba.txt

Bloquear la modificación o borrado de un archivo

Como veíamos en la entrada que citaba al principio del post sobre evitar que un archivo pueda ser modificado o borrado (incluso por root). Al asignamos el atributo ‘i’ activamos la flag para que el fichero no pueda ser modificado, borrado o renombrado:

# chattr +i prueba.txt
# lsattr prueba.txt
----i-------- prueba.txt

Permitir recuperación de archivo aunque sea eliminado

Asignamos el atributo ‘u’ para que cuando el fichero se borre, sus datos permanezcan guardados y permitan al usuario su recuperación:

# chattr +u prueba.txt
# lsattr prueba.txt
-u----------- prueba.txt

Al eliminar un archivo, sobreescribir con 0 todos sus bloques

Al contrario que con el atributo «u», el atributo «s» implica que cuando un archivo sea borrado, automáticamente los bloques utilizados por el mismo sean sobreescritos con ceros (zeroed):

# chattr +e prueba.txt
# lsattr prueba.txt
-----------------e- prueba.txt

Escribir de forma síncrona a disco cambios en los ficheros

El parámetro «S» implica que cuando un fichero es modificado, los cambios se aplican a disco de forma síncrona y directa. Es lo mismo que tener la flag «sync» en el punto de montaje del filesystem.

# chattr +S prueba.txt
# lsattr prueba.txt
--S---------------- prueba.txt

Y así podríamos seguir con una gran cantidad de distintos atributos. Como siempre, podéis revisarlos en la página man de chattr. Por supuesto, los atributos se pueden asignar a la vez:

# chattr +uiAc prueba.txt
# lsattr prueba.txt
 -u--i--Ac---- prueba.txt
# man chattr
Salir de la versión móvil