Como faço para que um arquivo NÃO seja modificável?

35

Enquanto estiver logado, posso fazer o seguinte:

mkdir foo
touch foo/bar
chmod 400 foo/bar 
chmod 500 foo

Então eu posso abrir o vim (não como root), editar bar, forçar uma gravação w!e o arquivo é modificado.

Como posso fazer com que o sistema operacional não permita nenhuma modificação de arquivo?

ATUALIZAÇÃO 2 de março de 2017

  1. chmod 500 fooé um arenque vermelho: a permissão de gravação em um diretório não tem nada a ver com a capacidade de modificar o conteúdo de um arquivo - apenas a capacidade de criar e excluir arquivos.

  2. chmod 400 foo/barde fato impede que o conteúdo do arquivo seja alterado. Mas isso não impede que as permissões de um arquivo sejam alteradas - o proprietário de um arquivo sempre pode alterar as permissões de seu arquivo (supondo que ele possa acessar o arquivo, isto é, executar permissão em todos os diretórios ancestrais). De fato, strace (1) revela que é isso que o vim (7.4.576 Debian Jessie) está fazendo - o vim chama chmod (2) para adicionar temporariamente a permissão de gravação para o proprietário do arquivo, modifica o arquivo e depois chama chmod ( 2) novamente para remover a permissão de gravação. É por isso que o uso do chattr +iworks - somente o root pode chamar chattr -i. Teoricamente, o vim (ou qualquer outro programa) poderia fazer o mesmo com o chattr e com o chmod em um arquivo imutável, se executado como root.

user2141130
fonte
3
Eu acredito que, vimna verdade , está alterando as permissões e, em seguida, colocando-as de volta.
jordanm
Você não está correndo como root?
Alvin Wong
Alvin, eu faço isso como um usuário não root. Eu editei o post para esclarecer.
user2141130

Respostas:

49

Você pode definir o atributo "imutável" na maioria dos sistemas de arquivos no Linux.

chattr +i foo/bar

Para remover o atributo imutável, use em -vez de +:

chattr -i foo/bar

Para ver os atributos atuais de um arquivo, você pode usar lsattr:

lsattr foo/bar

A página de manual do chattr (1) fornece uma descrição de todos os atributos disponíveis. Aqui está a descrição para i:

   A  file with the `i' attribute cannot be modified: it cannot be deleted
   or renamed, no link can be created to this file  and  no  data  can  be
   written  to  the  file.  Only the superuser or a process possessing the
   CAP_LINUX_IMMUTABLE capability can set or clear this attribute.
jordanm
fonte
3
No Linux, esse sinalizador imutável está disponível em muitos sistemas de arquivos, não apenas no ext2 / 3/4 (pelo menos btrfs, hfsplus, jfs, nilfs2, xfs, ocfs2, ubifs, gfs2, reiserfs AFAICT a partir de uma rápida olhada no código)
Stéphane Chazelas
@StephaneChazelas Vi que o chattrcomando fazia parte do e2fsprogspacote no meu sistema. Por isso fiz essa afirmação. Atualizei a resposta com base no seu comentário.
jordanm
Ele não funciona para links simbólicos :-( Esta solução seria ótimo, porque eu quero evitar que a ligação simbólica pode ser. Accidentaly modificado por qualquer usuário, incluindo raiz.
natenho
Imutável Um sinalizador de inode está correto, não um xattr? sinalizador ioctl para ser mais preciso?
ytpillai
1

Você pode:

  1. Alterar o proprietário do arquivo rootou um usuário fictício recém-criado
  2. Mantenha o grupo correto.
  3. Use chmod 440para permitir a leitura por grupo (que é você).

Se o usuário correto não for o único neste grupo, você deve criar um novo grupo e adicioná-lo somente nele, e usar esse grupo para ele. No entanto, você não é o proprietário do arquivo; portanto, vinão é possível alterar o proprietário do arquivo.

yo '
fonte
3
Se você pode gravar no diretório pai, o vim pode excluir o arquivo e criar um novo (e é o que faz quando você faz :w!). O vim não vai tão longe quanto alterar temporariamente as permissões do diretório. Portanto, manter o diretório não gravável deve ser seguro.
Stéphane Chazelas
0

Para tornar uma árvore de diretórios inteira somente leitura:

cd <directory>
find ./ -print0 | sudo xargs -I {} -0 chattr +i {}

Para torná-lo legível novamente, altere +ipara -i.

Robin A. Meade
fonte