Como usar o comando chattr no Linux

Terminal Linux em um fundo de laptop vermelho.
fatmawati achmad zaenuri/Shutterstock

Junto com as permissões usuais de leitura, gravação e execução de arquivos , os arquivos Linux têm outro conjunto de atributos que controlam outras características do arquivo. Veja como vê-los e alterá-los.

Permissões e atributos

No Linux, quem pode acessar um arquivo e o que pode fazer com ele é controlado por um conjunto de permissões centrado no usuário  . Se você pode ler o conteúdo de um arquivo , gravar novos dados no arquivo ou executar um arquivo se for um script ou um programa, tudo é governado por esse conjunto de permissões. As permissões são aplicadas ao arquivo, mas definem as restrições e recursos para diferentes categorias de usuário.

Existem permissões para o  proprietário  do arquivo, para o  grupo  do arquivo e para  outros , ou seja, usuários que não estão nas duas primeiras categorias. Você pode usar o lscomando com a -lopção (lista longa) para ver as permissões em um arquivo ou diretório.

Para alterar as permissões, você usa o chmodcomando . Pelo menos, você pode se tiver permissões de gravação para o arquivo ou se for o usuário root.

Podemos ver que as permissões de arquivo são centradas no usuário porque concedem ou removem permissões no nível do usuário. Por outro lado, os  atributos  de um arquivo são centrados no sistema de arquivos. Assim como as permissões, elas são definidas no arquivo ou diretório. Mas uma vez definidos, eles são os mesmos para todos os usuários.

Atributos são uma coleção separada de configurações de permissões. Atribui características de controle, como imutabilidade e outros comportamentos no nível do sistema de arquivos. Para ver os atributos de um arquivo ou diretório usamos o lsattrcomando. Para definir os atributos usamos o chattrcomando.

Permissões e atributos são armazenados dentro  de inodes . Um inode é uma  estrutura de sistema de arquivos  que contém informações sobre objetos do sistema de arquivos, como arquivos e diretórios . A localização de um arquivo no disco rígido, sua data de criação, suas permissões e seus atributos são armazenados em seu inode.

Como diferentes sistemas de arquivos têm diferentes estruturas e recursos subjacentes, os atributos podem se comportar de maneira diferente — ou ser completamente ignorados — por alguns sistemas de arquivos. Neste artigo, estamos usando ext4 qual é o sistema de arquivos padrão para muitas distribuições Linux.

Recomendado:  5 recursos que os telefones Google Pixel deveriam roubar da Samsung

Olhando para os atributos de um arquivo

Os comandos chattre lsattrjá estarão presentes no seu computador, então não há necessidade de instalar nada.

Para verificar os atributos nos arquivos no diretório atual, use lsattr:

lsattr

Listando atributos de arquivo para todos os arquivos em um diretório

As linhas tracejadas são espaços reservados para atributos que não estão definidos. O único atributo definido é o eatributo (extensões). Isso mostra que os inodes do sistema de arquivos estão usando — ou usarão, se necessário — extensões para apontar para todas as partes do arquivo no disco rígido.

Se o arquivo for mantido em uma sequência contígua de blocos de disco rígido, seu inode só precisa gravar o primeiro e o último bloco usado para armazenar o arquivo. Se o arquivo estiver fragmentado , o inode deve registrar o número do primeiro e do último bloco de cada parte do arquivo. Esses pares de números de bloco de disco rígido são chamados de extensões.

Esta é a lista dos atributos mais usados.

  • a : Anexar apenas. Um arquivo com este atributo só pode ser anexado. Ele ainda pode ser gravado, mas apenas no final do arquivo. Não é possível sobrescrever nenhum dos dados existentes no arquivo.
  • c : Comprimido. O arquivo é compactado automaticamente no disco rígido e descompactado quando é lido. Os dados gravados nos arquivos são compactados antes de serem gravados no disco rígido.
  • R : Sem atime atualizações . O atimeé um valor em um inode que registra a última vez que um arquivo foi acessado.
  • C : Sem cópia na gravação. Se dois processos solicitarem acesso a um arquivo, eles poderão receber ponteiros para o mesmo arquivo. Eles só recebem sua própria cópia exclusiva do arquivo se tentarem gravar no arquivo, tornando-o exclusivo para esse processo.
  • d : Sem despejo. O comando Linux dumpé usado para gravar cópias de sistemas de arquivos inteiros na mídia de backup. Este atributo faz dumpignorar o arquivo. Ele é excluído do backup.
  • D : Atualizações de diretório síncronas. Quando esse atributo é ativado para um diretório, todas as alterações nesse diretório são gravadas de forma síncrona — ou seja, imediatamente — no disco rígido. As operações de dados podem ser armazenadas em buffer.
  • e : Formato de extensão. O eatributo indica que o sistema de arquivos está usando extensões para mapear o local do arquivo no disco rígido. Você não pode alterar isso com chattr. É uma função da operação do sistema de arquivos.
  • e : Imutável. Um arquivo imutável não pode ser modificado, incluindo renomeação e exclusão. O usuário root é a única pessoa que pode ativar ou desativar esse atributo.
  • s : Exclusão segura. Quando um arquivo com esse conjunto de atributos é excluído, os blocos de disco rígido que continham os dados do arquivo são substituídos por bytes contendo zeros. Observe que isso não é respeitado pelo ext4sistema de arquivos.
  • S : Atualizações síncronas. As alterações em um arquivo com seu Sconjunto de atributos são gravadas no arquivo de forma síncrona.
  • u : A exclusão de um arquivo que tem seu uatributo definido faz com que uma cópia do arquivo seja feita. Isso pode ser benéfico para a recuperação de arquivos se o arquivo foi removido por engano.
Recomendado:  Como alternar entre Farenheit e Celsius no seu iPhone

Alterando os atributos de um arquivo

O chattrcomando nos permite alterar os atributos de um arquivo ou diretório. Podemos usar os operadores +(set) e -(unset) para aplicar ou remover um atributo, semelhante ao chmodcomando e permissões.

O chattrcomando também possui um  =operador (somente conjunto). Isso configura os atributos de um arquivo ou diretório apenas para os atributos especificados no comando. Ou seja, todos os atributos  não  listados na linha de comando não estão  definidos .

Configurando o atributo Append Only

Vamos definir o atributo append-only em um arquivo de texto e ver como isso afeta o que podemos fazer com o arquivo.

sudo chattr +a arquivo de texto.txt

Configurando o atributo append only em um arquivo de texto

Podemos verificar se o bit somente de acréscimo foi definido usando lsattr:

lsattr arquivo-texto.txt

Listando os atributos de um arquivo de texto

A letra “ a” indica que o atributo foi definido. Vamos tentar sobrescrever o arquivo. Redirecionar a saída para um arquivo com um único colchete angular “ >” substitui todo o conteúdo do arquivo pela saída redirecionada.

Nós pré-carregamos o arquivo de texto com algum texto de espaço reservado lorem ipsum .

cat arquivo-texto.txt

Texto de espaço reservado em um arquivo de texto

Vamos redirecionar a saída lspara o arquivo:

ls -l > arquivo-texto.txt
sudo ls -l > arquivo-texto.txt

Tentando substituir um arquivo de texto somente anexado

A operação não é permitida, mesmo que usemos o sudocomando .

Se usarmos dois colchetes angulares “ >>” para redirecionar a saída, ela será anexada aos dados existentes no arquivo. Isso deve ser aceitável para nosso arquivo de texto somente anexado.

sudo ls -l >> arquivo-texto.txt

Redirecionando a saída para o final de um arquivo de texto

Voltamos ao prompt de comando sem nenhuma mensagem de erro. Vamos espiar dentro do arquivo para ver o que aconteceu.

cat arquivo-texto.txt

Examinando o conteúdo de um arquivo de texto

A saída redirecionada de lsfoi adicionada ao final do arquivo.

Novos dados anexados a um arquivo de texto somente anexado

Embora possamos anexar dados ao arquivo, essa é a única alteração que podemos fazer nele. Não podemos excluí-lo e nem fazer root.

rm arquivo-texto.txt
sudo rm arquivo de texto.txt

Falha ao excluir um arquivo de texto somente anexado

Configurando o atributo imutável

Se você deseja proteger um arquivo que nunca terá novos dados adicionados a ele, você pode definir o atributo imutável. Isso impede todas as alterações no arquivo, incluindo anexar dados.

sudo chattr +i segundo arquivo.txt
lsattr segundo arquivo.txt

Configurando o atributo imutável em um arquivo de texto

Podemos ver o “ i” indicando que o atributo imutável foi definido. Tendo tornado nosso arquivo imutável, mesmo o usuário root não pode renomeá-lo ( mv), excluí-lo ( rm) ou adicionar dados a ele.

sudo mv segundo arquivo.txt novo-nome.txt
sudo rm segundo arquivo.txt
sudo ls -l >> segundo arquivo.txt

Um arquivo imutável que resiste à mudança

Não confie na exclusão segura no ext4

Como apontamos, alguns sistemas operacionais não suportam todos os atributos. O atributo delete seguro não é respeitado pela extfamília de sistemas de arquivos , incluindo ext4. Não confie nisso para a exclusão segura de arquivos.

Recomendado:  Como adicionar tags de usuário personalizadas ao Reddit

É fácil ver que isso não funciona no ext4. Vamos definir o satributo (exclusão segura) em um arquivo de texto.

sudo chattr +s terceiro arquivo.txt

Configurando o atributo de exclusão segura em um arquivo de texto

O que vamos fazer é descobrir o inode que contém os metadados sobre este arquivo. O inode contém o primeiro bloco de disco rígido ocupado pelo arquivo. O arquivo contém algum texto de espaço reservado lorem ipsum .

Leremos esse bloco diretamente do disco rígido para verificar se estamos lendo o local correto do disco rígido. Vamos excluir o arquivo e ler o mesmo bloco de mergulho mais uma vez. Se o atributo de exclusão segura estiver sendo respeitado, devemos ler os bytes zerados.

Podemos encontrar o inode do arquivo usando o hdparmcomando com a --fibmapopção (file block map).

sudo hdparm --fibmap terceiro arquivo.txt

Encontrando o inode de um arquivo

O primeiro bloco de disco rígido é 18100656. Usaremos o ddcomando para lê-lo.

As opções são:

  • if=/dev/sda : lê a partir do primeiro disco rígido neste computador.
  • bs=512 : Use um tamanho de bloco de disco rígido de 512 bytes.
  • skip=18100656 : Ignora todos os blocos antes do bloco 18100656. Em outras palavras, comece a ler no bloco 18100656.
  • count=1 : Lê um bloco de dados.
sudo dd if=/dev/sda bs=512 pular=18100656 contagem=1

Lendo o primeiro bloco de disco rígido de um arquivo

Como esperado, vemos o texto do placeholder lorem ipsum . Estamos lendo o bloco correto no disco rígido.

Agora vamos deletar o arquivo.

rm terceiro arquivo.txt

Se lermos esse mesmo bloco de disco rígido, ainda poderemos ver os dados.

sudo dd if=/dev/sda bs=512 pular=18100656 contagem=1

Lendo os dados de um bloco de disco rígido usado por um arquivo excluído

Novamente, não dependa disso para exclusão segura em ext4. Existem métodos melhores disponíveis para excluir arquivos para que eles não possam ser recuperados.

Útil, mas use com cuidado

Definir os atributos dos arquivos pode torná-los imunes a desastres acidentais. Se você não pode excluir ou substituir um arquivo, é bastante seguro.

Você pode pensar que gostaria de aplicá-los aos arquivos do sistema e tornar sua instalação do Linux mais segura . Mas os arquivos do sistema precisam ser substituídos periodicamente à medida que as atualizações são emitidas ou as atualizações são aplicadas. Por esse motivo, é mais seguro usar esses atributos apenas em arquivos de sua própria criação.