Executar vs ler bit. Como funcionam as permissões de diretório no Linux?

381

No meu CMS, notei que os diretórios precisam do bit executável ( +x) definido para que o usuário os abra. Por que a permissão de execução é necessária para ler um diretório e como funcionam as permissões de diretório no Linux?

Nick.h
fonte
17
... uh, porque é isso que a bandeira "+ x" é para :)
badp
16
Pense assim: a entrada do diretório contém nomes de arquivos ; portanto, "ler" um diretório está listando os arquivos, "usando" o diretório está acessando os arquivos.
tylerl
7
Com o conjunto de bits de execução do diretório , você pode atravessar sua hierarquia . Como você pertence a "outras" pessoas e só possui o conjunto de bits de execução ( chmod 771 dirOne), não é possível listar o conteúdo do dirOne. MAS se ele contiver um subdiretório "dirTwo" com direitos definidos como ( chmod 774 dirTwo), você poderá listar seu conteúdo!
Stphane 28/05
1
Os futuros visitantes também devem ver perguntas relacionadas no AskUbuntu: askubuntu.com/q/1106822/295286
Sergiy Kolodyazhnyy

Respostas:

352

Ao aplicar permissões a diretórios no Linux, os bits de permissão têm significados diferentes dos arquivos comuns.

  • O bit de leitura ( r) permite ao usuário afetado listar os arquivos no diretório
  • O bit de gravação ( w) permite que o usuário afetado crie, renomeie ou exclua arquivos no diretório e modifique os atributos do diretório
  • O bit de execução ( x) permite que o usuário afetado entre no diretório e acesse arquivos e diretórios dentro
  • O bit fixo ( Tou tse o bit de execução estiver definido para outros) afirma que os arquivos e diretórios dentro desse diretório só podem ser excluídos ou renomeados pelo proprietário (ou raiz)
Chris Down
fonte
25
Ótima resposta, mas acho que a última frase é enganosa. Nenhuma dessas permissões pode ser substituída por arquivo, na verdade. Aqui o "acesso" é um pouco ambíguo: +xno diretório concede acesso aos arquivos inodes através deste diretório específico (nada menos, nada mais, bem ... talvez chdirprecise +xtambém). Para ler ou gravar o conteúdo de um arquivo, o usuário também precisa +r/ +wdeste arquivo, mas essas são permissões distintas (elas não substituem nada).
Stéphane Gimenez
2
A bandeira imutável é sistema de arquivos específico e ele não vai substituir precisamente essas permissões, é por isso que eu acho que a última frase é enganosa :-)
Stéphane Gimenez
1
Eu acho que pode ser útil mencionar a ACL nesta e em outras respostas, pois a aplicação para alguns diretórios pode ser enganosa se considerarmos apenas as informações fornecidas por Chris Down
user907860
4
Parece que esta resposta não menciona o efeito combinado de escrever e executar bits, como a resposta de Baldrick menciona abaixo? ou seja, se você tiver apenas permissão de gravação, mas não permissão de execução, será bastante inútil.
Xji
1
@ StéphaneGimenez " +xno diretório concede acesso aos arquivos inodes" - Parece um bom idiota, mas talvez não conte a história toda? Sem o bit de execução definido em um diretório, você não pode alterar o nome do arquivo de um arquivo nesse diretório. Gostaria de saber por que isso ocorre, porque o nome do arquivo é armazenado em uma entrada de diretório, não em um inode.
Kevin Wheeler
259

Primeiro, pense: O que é um diretório? É apenas uma lista de itens (arquivos e outros diretórios) que vivem dentro. Então: diretório = lista de nomes.

Ler bit = Se definido, você pode ler esta lista. Então, por exemplo, se você tiver um diretório chamado poems:

  • Você pode ls poemse obterá uma lista de itens que vivem nele ( -lnão revelará detalhes!).
  • Você pode usar a conclusão da linha de comando, por exemplo touch poems/so <TAB> poems/somefile.
  • Você não pode criar poemsseu diretório de trabalho (ou seja, cdnele).

Write bit = Se definido, você pode modificar esta lista, ou seja, você pode {adicionar, renomear, excluir} nomes nela. Mas! Na verdade, você pode fazer isso apenas se o bit de execução também estiver definido.

Execute bit = Torne este diretório seu diretório de trabalho, ou seja, cdnele. Você precisa dessa permissão se desejar:

  • acessar (ler, escrever, executar) itens que vivem nele.
  • modificar a própria lista, ou seja, adicionar, renomear, excluir nomes nela (é claro que o bit de gravação deve estar definido no diretório).

Caso interessante 1 : se você tiver permissões de gravação + execução em um diretório, pode {excluir, renomear} itens que residem mesmo que você não tenha permissão de gravação nesses itens. (use bit adesivo para evitar isso)

Caso interessante 2 : se você tem permissão de execução (mas não de gravação) em um diretório E você tem permissão de gravação em um arquivo que vive dentro dele, não pode excluir o arquivo (porque envolve removê-lo da lista). No entanto, você pode apagar seu conteúdo, por exemplo, se for um arquivo de texto, você pode usar o vi para abri-lo e excluir tudo. O arquivo ainda estará lá, mas estará vazio.

Resumo:

Ler bit = Você pode ler os nomes na lista.
Write bit = Você pode {adicionar, renomear, excluir} nomes na lista SE o bit de execução também estiver definido.
Executar bit = Você pode tornar este diretório seu diretório de trabalho.

PS: O artigo mencionado por Kusalananda é uma boa leitura.

Baldrick
fonte
17
Pensar no diretório como uma lista torna as coisas mais claras e lógicas.
Trismegistos
20
Ótima resposta, mas muito focada no termo "diretório de trabalho". Preciso do xbit para qualquer acesso a este arquivo: para cat a/b/c/d, eu preciso do xpouco sobre tudo a, be c, mesmo se eu não usá-los como cwd.
glglgl
1
Foi aqui que descobri que você não pode escrever, a menos que seja executável também! O caso 2 também é interessante, ótima resposta!
Mirko
1
Outra observação é que, mesmo se você tiver xpermissão no diretório, se você não tiver xpermissão no arquivo , não poderá realmente "executar" o arquivo. Você pode apenas catisso, por exemplo, mas não pode executar o arquivo em si.
Xji
2
Se você deseja ls -ltrabalhar para uma pasta, precisa de ambas re de xpermissão.
Eric Wang
44

Eu preparei esta tabela com todas as permissões possíveis e seus efeitos práticos.

permissões de diretório linux

(*) Somente nomes de arquivos : outros atributos como tamanho ou data não são acessíveis. Por exemplo, você pode usar a tecla tab para preencher automaticamente, mas não o comando ls.

Algumas reflexões :

  • Com X desabilitado , R e W são praticamente inúteis.
  • Somente o X , desabilitar o RW, fornece uma falsa sensação de segurança, pois você pode ler e gravar cegamente o conteúdo do arquivo e acessar subdiretórios. Você deve ter certeza de que todos os filhos diretos do diretório têm permissões explícitas.
  • Raramente você usará outros valores além de:
    • 0 : sem acesso.
    • 1 : Acesso mínimo permitindo a travessia.
    • 5 : Permite leitura / gravação, mas não altera a estrutura da própria árvore de diretórios.
    • 7 : acesso total.
David
fonte
1
Eu consideraria 5 um valor útil, quando você deseja permitir leitura / gravação, mas não alterando a estrutura da própria árvore de diretórios.
hgiesel
Você está certo. Atualizada!
David
4
Excelente gráfico de resumo. Me faz pensar no que alguém estava pensando em -W-ser funcionalmente equivalente aos ---diretórios. Não é muito intuitivo. É claro que esses tipos de bits de baixo nível geralmente não são.
CivFan 2/17/17
2
Eu testei isso no meu mac, mas com -W-, eu poderia renomear o diretório (em um diretório com um pedaço fixo), mas não com ---. Isso parece ser uma diferença #
cosconconotelotel 15/17
3
@ David, você está faltando a parte pegajosa.
Pacerier
42

Aqui está um bom artigo sobre isso.

Resumo:

Um diretório com seu xconjunto de bits permite ao usuário cd(alterar o diretório) nesse diretório e acessar os arquivos nele.

Detalhes:

  • Read ( r)

    A capacidade de ler os nomes dos arquivos armazenados neste diretório.

  • Write ( w)

    A capacidade de renomear arquivos no diretório, criar novos arquivos ou excluir arquivos existentes, se você também tiver permissões de execução. Se você não tiver permissões de execução, as permissões de gravação não terão sentido.

  • Execute ( x)

    A capacidade de cdentrar neste diretório e acessar os arquivos nesse diretório.

Aqui estão alguns exemplos que devem facilitar a compreensão:

# "Full Access".  Reegen can list, create, delete, rename, delete,
# and stat any files in dir.
# Access to file contents is subject to the permissions
# of the file itself.
# New files can be created, any file can be deleted, regardless of
# file permissions.
drwx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen can do everything in the "Full Access" list except create,
# delete, or rename files in this directory.
dr-x------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen can do everything in the "Full Access" list except list the
# filenames in this directory.  If she suspects there is a file
# named "program" she can list it, but cannot do an 'ls'
# of the directory itself.  She can access any file (file
# permissions permitting) if she knows its name.  She can
# create new files, or rename/delete existing ones.
d-wx------  1 reegen    reegen          4096 Jan 01 2003  dir

# Reegen cannot create or delete any files in this directory.
# She can access any file (permissions permitting) if she
# knows its name already.
d--x------  1 reegen    reegen          4096 Jan 01 2003  dir

Há ainda mais informações no artigo Hacking Linux Exposed .

Kusalananda
fonte
4

No livro de Robert Love , "LINUX System Programming", capítulo 1, seção

insira a descrição da imagem aqui

alhelal
fonte
2

Para qualquer operação que acesse um arquivo ou diretório, ele deve primeiro resolver o caminho para o arquivo ou diretório. A resolução requer que o usuário tenha permissão de execução em todos os diretórios ao longo do caminho, exceto no componente final do caminho. Portanto, para diretórios, você pode pensar que o bit de execução significa "resolvível".

Pegue o caminho /a/b/c.txtcomo exemplo, digamos que o usuário tenha 1) permissão de execução em /e /a; 2) tem permissão de leitura em /a/b; 3) permissão de leitura e gravação /a/b/c.txt.

  • O usuário falhará na leitura (lista) /a, porque não possui permissão de leitura. Mas a resolução do caminho não falha.

  • O usuário será capaz de ler (lista) /a/b, porque o usuário tem permissão de executar /, /ae permissão de leitura /a/b. Observe que, ao ler /a/b, o nome do arquivo c.txté visível, mas os metadados (por exemplo, tamanho do arquivo) e o conteúdo não, porque o nome do arquivo é armazenado no diretório, não no arquivo, mas os metadados são armazenados no inode do arquivo.

  • O usuário vai deixar de ler /a/b/c.txt, porque ao resolver o caminho a partir /de /apara /a/b, ele falha em /a/buma vez que o usuário não tem permissão de execução.

Veja também como um nome de caminho é resolvido para um arquivo .

Dagang
fonte
0

Uma analogia útil é pensar em cada arquivo como um livro e em cada diretório como uma sala onde os livros são mantidos.

Existem regras para poder listar todos os nomes em uma sala: o bit de leitura para diretórios. Regras para remover um livro da sala: o bit de gravação para diretórios. E regras para entrar em uma sala e explorar: o diretório resultante executa o bit.

Essas regras são separadas e diferentes das regras de cada livro. Existem regras para permitir que alguém abra um livro e leia seu conteúdo: o (s) bit (s) de leitura para cada arquivo. Existem regras para modificar o conteúdo de um livro: o (s) bit (s) de gravação para cada arquivo. E para executar um arquivo: o (s) bit (s) de execução para cada arquivo.

Escrevo bit (s) porque existem três bits para cada ação. Há um bit de leitura para o proprietário, um bit de leitura para o (s) grupo (s) e um bit de leitura para todos os outros (outros). Se qualquer um desses três bits estiver definido para um usuário específico, esse usuário terá o bit de leitura ativo. Não importa como isso pouco foi encontrado para ser ativo ou por u Ser ou g rupo ou o ther, tem os mesmos resultados eficazes.

Assim, um usuário pode ter permissão para entrar em uma sala e remover livros da biblioteca, mas não pode ler o conteúdo do mesmo livro.

É por isso que é necessário um bit de leitura para diretórios: controlar quem tem permissão para listar o conteúdo da sala (títulos de livros).

E o bit de execução é usado para controlar quem pode entrar na sala de livros.

Isaac
fonte
-1

O significado de Executar para diretórios é bastante claro. Como não há permissão de desvio, ao contrário do Windows, você deve sobrecarregar alguma coisa. Os designers escolheram Executar, que causa confusão sem fim. Como um responsável pela segurança de computadores que atribui direitos de Execução a algo que você não pretende executar, parece desonesto.

NemoX
fonte
1
A invenção do bit de permissão de execução antecede a invenção do conceito de uma permissão transversal distinta em cerca de duas décadas. A lógica dessa resposta depende de uma linha do tempo histórica que não é nada parecida com a do mundo real e também falha em perceber a existência GENERIC_EXECUTEe o que é.
JdeBP # 03/18