Cómo usar el comando chattr en Linux

Publicado: 2022-06-28
Terminal Linux sobre un fondo de portátil rojo.
fatmawati achmad zaenuri/Shutterstock

Junto con los permisos habituales de lectura, escritura y ejecución de archivos, los archivos de Linux tienen otro conjunto de atributos que controlan otras características del archivo. Aquí se explica cómo verlos y cambiarlos.

Permisos y atributos

En Linux, quién puede acceder a un archivo y qué puede hacer con él está controlado por un conjunto de permisos centrado en el usuario. Ya sea que pueda leer el contenido de un archivo, escribir nuevos datos en el archivo o ejecutar un archivo si es un script o un programa, todo se rige por ese conjunto de permisos. Los permisos se aplican al archivo, pero definen las restricciones y capacidades para diferentes categorías de usuario.

Hay permisos para el propietario del archivo, para el grupo del archivo y para otros , es decir, usuarios que no están en las dos primeras categorías. Puede usar el comando ls con la opción -l (lista larga) para ver los permisos en un archivo o directorio.

Cómo usar el comando chmod en Linux
RELACIONADO Cómo usar el comando chmod en Linux

Para cambiar los permisos, usa el comando chmod . Al menos, puede hacerlo si tiene permisos de escritura para el archivo o si es el usuario raíz.

Podemos ver que los permisos de archivo están centrados en el usuario porque otorgan o eliminan permisos a nivel de usuario. Por el contrario, los atributos de un archivo están centrados en el sistema de archivos. Al igual que los permisos, se establecen en el archivo o directorio. Pero una vez configurados, son los mismos para todos los usuarios.

Los atributos son una colección separada de configuraciones de permisos. Los atributos controlan características como la inmutabilidad y otros comportamientos a nivel del sistema de archivos. Para ver los atributos de un archivo o directorio usamos el comando lsattr . Para establecer los atributos usamos el comando chattr .

Todo lo que siempre quiso saber sobre los inodos en Linux
RELACIONADO Todo lo que siempre quiso saber sobre los inodos en Linux

Los permisos y atributos se almacenan dentro de los inodos . Un inodo es una estructura del sistema de archivos que contiene información sobre los objetos del sistema de archivos, como archivos y directorios. La ubicación de un archivo en el disco duro, su fecha de creación, sus permisos y sus atributos se almacenan dentro de su inodo.

Debido a que los diferentes sistemas de archivos tienen diferentes capacidades y estructuras subyacentes, los atributos pueden comportarse de manera diferente, o ser ignorados por completo, por algunos sistemas de archivos. En este artículo, usamos ext4 , que es el sistema de archivos predeterminado para muchas distribuciones de Linux.

Mirando los atributos de un archivo

Los comandos chattr y lsattr ya estarán presentes en su computadora, por lo que no es necesario instalar nada.

Para verificar los atributos de los archivos en el directorio actual, use lsattr :

 lsattr 

Listado de atributos de archivo para todos los archivos en un directorio

Las líneas discontinuas son marcadores de posición para atributos que no están establecidos. El único atributo que se establece es el atributo e (extensiones). Esto muestra que los inodos del sistema de archivos están usando, o usarán si es necesario, extensiones para apuntar a todas las partes del archivo en el disco duro.

Si el archivo se mantiene en una secuencia contigua de bloques de disco duro, su inodo solo tiene que registrar el primer y el último bloque utilizados para almacenar el archivo. Si el archivo está fragmentado, el inodo debe registrar el número del primer y último bloque de cada parte del archivo. Estos pares de números de bloque de disco duro se denominan extensiones.

Esta es la lista de los atributos más utilizados.

  • a : Solo agregar. Un archivo con este atributo solo se puede agregar a. Todavía se puede escribir, pero solo al final del archivo. No es posible sobrescribir ninguno de los datos existentes dentro del archivo.
  • c : Comprimido. El archivo se comprime automáticamente en el disco duro y se descomprime cuando se lee. Los datos escritos en los archivos se comprimen antes de escribirse en el disco duro.
  • R : No hay actualizaciones atime . El atime es un valor en un inodo que registra la última vez que se accedió a un archivo.
  • C : Sin copia en escritura. Si dos procesos solicitan acceso a un archivo, se les puede dar punteros al mismo archivo. Solo reciben su propia copia única del archivo si intentan escribir en el archivo, lo que lo hace único para ese proceso.
  • d : Sin volcado. El comando de dump Linux se utiliza para escribir copias de sistemas de archivos completos en medios de copia de seguridad. Este atributo hace que dump ignore el archivo. Se excluye de la copia de seguridad.
  • D : actualizaciones de directorio sincrónicas. Cuando este atributo está activado para un directorio, todos los cambios en ese directorio se escriben sincrónicamente, es decir, inmediatamente, en el disco duro. Las operaciones de datos se pueden almacenar en búfer.
  • e : formato de extensión. El atributo e indica que el sistema de archivos está utilizando extensiones para asignar la ubicación del archivo en el disco duro. No puedes cambiar esto con chattr . Es una función del funcionamiento del sistema de archivos.
  • yo : inmutable. Un archivo inmutable no se puede modificar, incluido el cambio de nombre y la eliminación. El usuario root es la única persona que puede configurar o desactivar este atributo.
  • s : Eliminación segura. Cuando se elimina un archivo con este conjunto de atributos, los bloques del disco duro que contenían los datos del archivo se sobrescriben con bytes que contienen ceros. Tenga en cuenta que esto no es respetado por el sistema de archivos ext4 .
  • S : Actualizaciones síncronas. Los cambios en un archivo con su conjunto de atributos S se escriben en el archivo de forma síncrona.
  • u : Eliminar un archivo que tiene establecido su atributo u hace que se haga una copia del archivo. Esto puede ser beneficioso para la recuperación de archivos si el archivo se eliminó por error.

Cambiar los atributos de un archivo

El comando chattr nos permite cambiar los atributos de un archivo o directorio. Podemos usar los operadores + (establecer) y - (desestablecer) para aplicar o eliminar un atributo, similar al comando y permisos chmod .

El comando chattr también tiene un operador = (solo conjunto). Esto establece los atributos de un archivo o directorio solo en los atributos que se especifican en el comando. Es decir, todos los atributos que no aparecen en la línea de comandos se anulan .

Configuración del atributo de solo añadir

Establezcamos el atributo de solo agregar en un archivo de texto y veamos cómo afecta lo que podemos hacer con el archivo.

 sudo chattr +un archivo de texto.txt 

Establecer el atributo de solo agregar en un archivo de texto

Podemos verificar que el bit de solo agregar se haya establecido usando lsattr :

 lsattr archivo-texto.txt 

Listado de atributos para un archivo de texto

La letra “ a ” indica que se ha establecido el atributo. Intentemos sobrescribir el archivo. Redirigir la salida a un archivo con un solo corchete angular " > " reemplaza todo el contenido del archivo con la salida redirigida.

Hemos precargado el archivo de texto con algo de texto de marcador de posición de lorem ipsum .

 archivo-de-texto-cat.txt 

Texto de marcador de posición en un archivo de texto

Redirigiremos la salida de ls al archivo:

 ls -l > archivo-de-texto.txt
 sudo ls -l > archivo-de-texto.txt 

Intentar sobrescribir un archivo de texto de solo agregar

La operación no está permitida, incluso si usamos el comando sudo .

Si usamos dos corchetes angulares “ >> ” para redirigir la salida, se agrega a los datos existentes en el archivo. Eso debería ser aceptable para nuestro archivo de texto de solo agregar.

 sudo ls -l >> archivo-de-texto.txt 

Redirigir la salida al final de un archivo de texto

Volvemos al símbolo del sistema sin ningún mensaje de error. Echemos un vistazo dentro del archivo para ver qué ha sucedido.

 archivo-de-texto-cat.txt 

Examinar el contenido de un archivo de texto

La salida redirigida de ls se ha agregado al final del archivo.

Nuevos datos agregados a un archivo de texto de solo agregar

Aunque podemos agregar datos al archivo, ese es el único cambio que podemos hacerle. No podemos eliminarlo y tampoco rootear.

 rm archivo de texto.txt
 sudo rm archivo de texto.txt 

No se puede eliminar un archivo de texto solo para agregar

Configuración del atributo inmutable

Si desea proteger un archivo al que nunca se le agregarán nuevos datos, puede establecer el atributo inmutable. Esto evita todos los cambios en el archivo, incluida la adición de datos.

 sudo chattr +i segundo-archivo.txt
 lsattr segundo archivo.txt 

Establecer el atributo inmutable en un archivo de texto

Podemos ver la " i " que indica que se ha establecido el atributo inmutable. Habiendo hecho que nuestro archivo sea inmutable, incluso el usuario raíz no puede cambiarle el nombre ( mv ), eliminarlo ( rm ) o agregarle datos.

 sudo mv segundo archivo.txt nuevo nombre.txt
 sudo rm segundo archivo.txt
 sudo ls -l >> segundo-archivo.txt 

Un archivo inmutable que se resiste al cambio

No confíe en la eliminación segura en ext4

Como señalamos, algunos sistemas operativos no admiten todos los atributos. La familia de sistemas de archivos ext no respeta el atributo de eliminación segura, incluido ext4 . No confíe en esto para la eliminación segura de archivos.

Es fácil ver que esto no funciona en ext4 . Estableceremos el atributo s (eliminación segura) en un archivo de texto.

 sudo chattr +s tercer archivo.txt 

Configuración del atributo de eliminación segura en un archivo de texto

Lo que vamos a hacer es averiguar el inodo que contiene los metadatos de este archivo. El inodo contiene el primer bloque de disco duro ocupado por el archivo. El archivo contiene algo de texto de marcador de posición de lorem ipsum .

Leeremos ese bloque directamente desde el disco duro para verificar que estamos leyendo la ubicación correcta del disco duro. Eliminaremos el archivo y luego leeremos el mismo bloque de inmersión duro una vez más. Si se respeta el atributo de eliminación segura, deberíamos leer los bytes puestos a cero.

Podemos encontrar el inodo del archivo usando el comando hdparm con la --fibmap (mapa de bloque de archivo).

 sudo hdparm --fibmap tercer archivo.txt 

Encontrar el inodo de un archivo

El primer bloque del disco duro es 18100656. Usaremos el comando dd para leerlo.

Las opciones son:

  • if=/dev/sda : Leer desde el primer disco duro de esta computadora.
  • bs=512 : use un tamaño de bloque de disco duro de 512 bytes.
  • skip=18100656 : Salta todos los bloques antes del bloque 18100656. En otras palabras, comienza a leer en el bloque 18100656.
  • count=1 : Leer un bloque de datos.
 sudo dd if=/dev/sda bs=512 skip=18100656 cuenta=1 

Lectura del primer bloque de disco duro de un archivo

Como era de esperar, vemos el texto de marcador de posición de lorem ipsum . Estamos leyendo el bloque correcto en el disco duro.

Ahora borraremos el archivo.

 rm tercer archivo.txt 

Si leemos ese mismo bloque de disco duro, todavía podemos ver los datos.

 sudo dd if=/dev/sda bs=512 skip=18100656 cuenta=1 

Leer los datos de un bloque de disco duro utilizado por un archivo eliminado

Nuevamente, no dependa de esto para la eliminación segura en ext4 . Hay mejores métodos disponibles para eliminar archivos para que no puedan recuperarse.

RELACIONADO: Cómo eliminar archivos de forma segura en Linux

Útil, pero use con precaución

Establecer los atributos de los archivos puede hacerlos inmunes a desastres accidentales. Si no puede eliminar o sobrescribir un archivo, es bastante seguro.

Puede pensar que le gustaría aplicarlos a los archivos del sistema y hacer que su instalación de Linux sea más segura. Pero los archivos del sistema deben reemplazarse periódicamente a medida que se emiten o se aplican actualizaciones. Por esa razón, es más seguro usar estos atributos solo en archivos de su propia creación.

RELACIONADO: Cómo proteger su servidor Linux con fail2ban