Permissões de sistema de arquivos

Normalmente, um sistema de arquivos mantém configurações de permissão para cada item armazenado – geralmente arquivos e diretórios – que concedem ou negam a capacidade de manipular itens do sistema de arquivos. Frequentemente, as configurações permitem controlar o acesso com base em funções como ler, alterar, navegar e executar, e para diferentes usuários e grupos de usuários.

Uma tecnologia bem estabelecida foi desenvolvida para Unix e posteriormente codificada pelo POSIX. Outra tecnologia comum é uma lista de controle de acesso (ACL) com múltiplas variantes implementadas em sistemas de arquivos e uma codificada pelo POSIX. Como o POSIX define tanto a tecnologia mais antiga baseada em Unix quanto as ACLs, a primeira é chamada de permissões POSIX tradicionais para maior clareza, embora não seja um termo muito conhecido.

Uma interface de usuário orientada por permissões adapta a funcionalidade disponível ao usuário com base nas permissões de itens do sistema de arquivos. Por exemplo, a interface pode ocultar opções de menu que não são permitidas com base nas permissões armazenadas para um item.

Exemplos

As permissões de sistema de arquivos foram implementadas de diversas maneiras. Alguns exemplos notáveis são descritos aqui.

O NTFS, presente em muitas versões do Windows, incluindo a atual, utiliza ACLs para fornecer controle de acesso baseado em permissões; as ACLs do NTFS são consideradas poderosas, porém complexas.[1]

Sistemas de arquivos Linux, como ext2, ext3, ext4 e Btrfs, suportam permissões POSIX e ACLs POSIX.1e. Há suporte experimental para ACLs NFSv4 para sistemas de arquivos ext3[2] e ext4.

O FreeBSD suporta ACLs POSIX.1e no UFS e ACLs NFSv4 no UFS e ZFS.[3][4]

O HFS e seu sucessor, o HFS+, conforme implementado nos sistemas operacionais Mac OS Classic, não oferecem suporte a permissões.

O macOS oferece suporte a permissões compatíveis com POSIX, tanto no HFS+ quanto no APFS. A partir da versão 10.4 ("Tiger"), ele também oferece suporte ao uso de ACLs NFSv4, além de permissões compatíveis com POSIX. O Manual de Administração de Serviços de Arquivos do Apple Mac OS X Server versão 10.4+ recomenda o uso apenas de permissões Unix tradicionais, se possível. O macOS também ainda oferece suporte ao atributo "Protected"/"Locked" do Mac OS Classic como o sinalizador "user immutable" no campo de sinalizadores do BSD 4.4.[5]

A Tabela de Alocação de Arquivos (versão original) possui um atributo de somente leitura por arquivo que se aplica a todos os usuários.

O OpenVMS define quatro funções de acesso: leitura, gravação, execução e exclusão, e seleções de usuário: sistema, proprietário, grupo e mundo, onde mundo inclui grupo, que por sua vez inclui proprietário, e sistema seleciona usuários do sistema. Este design é semelhante ao do Unix, com extensões notáveis: função adicional: exclusão e seleção de usuário adicional: sistema.[6] ACLs são suportadas no VMS 4.0 e posteriores.[7]

O suporte a ACLs do Solaris depende do sistema de arquivos utilizado; o sistema de arquivos UFS mais antigo suporta ACLs POSIX.1e, enquanto o ZFS suporta apenas ACLs NFSv4.[8]

O IBM z/OS implementa a segurança de arquivos usando a Instalação de Controle de Acesso a Recursos (RACF)[9]

O sistema de arquivos do AmigaOS, AmigaDOS, suporta um sistema de permissões relativamente avançado para um sistema operacional de usuário único. No AmigaOS 1.x, os arquivos tinham permissões/sinalizadores de Arquivamento, Leitura, Gravação, Execução e Exclusão (conhecidos coletivamente como ARWED). No AmigaOS 2.x e versões superiores, foram adicionadas permissões/sinalizadores de Retenção, Script e Pure.

O sistema operacional OpenHarmony, juntamente com seu ecossistema do lado do cliente no Oniro OS e HarmonyOS com versões HarmonyOS NEXT e também o sistema operacional do servidor OpenEuler baseado em Linux, usa nativamente seu Sistema de arquivos distribuídos Harmony (HMDFS) que oferece suporte ao gerenciador de token de acesso (controle de acesso baseado em funções) e à capacidade da API Core File Kit com gerenciamento de permissão granular, com exceção do OpenEuler.[10]

Permissões POSIX tradicionais

Tradicionalmente, as permissões de arquivo em um sistema de arquivos baseado em Unix são definidas pelo POSIX.1-2017,[11]. Ele especifica três classes (usuário, grupo e outros) que permitem o mapeamento de permissões para usuários e três operações (ler, gravar e executar) que podem ser concedidas ou negadas para cada classe. Quando um arquivo é criado, suas permissões padrão são aquelas acessíveis através do comando umask.

Em um sistema de arquivos baseado em Unix, tudo é um arquivo, até mesmo diretórios e outros arquivos especiais.

Classes

As classes determinam como as permissões são mapeadas para um usuário. As permissões da classe de usuário aplicam-se ao usuário proprietário do arquivo. As permissões da classe de grupo aplicam-se aos usuários do grupo proprietário do arquivo. A classe "outros" aplica-se a outros usuários.

As permissões efetivas são as permissões da classe em que o usuário se enquadra primeiro, dada a ordem: usuário, grupo e depois "outros". Por exemplo, o usuário proprietário tem permissões efetivas da classe de usuário, mesmo que esteja no grupo proprietário.

Operações

As operações que podem ser concedidas ou negadas incluem:

  • Ler concede a capacidade de ler um arquivo. Quando definida para um diretório, essa permissão concede a capacidade de ler os nomes dos arquivos contidos, mas não de ler outras informações sobre eles, como conteúdo, tipo de arquivo, tamanho, propriedade e permissões.
  • Escrever/gravar concede a capacidade de modificar um arquivo. Quando definida para um diretório, essa permissão concede a capacidade de modificar entradas no diretório, o que inclui criar, excluir e renomear arquivos. Isso requer que a permissão de executar também esteja definida; sem ela, a permissão de gravação não tem sentido para diretórios.
  • Executar concede a capacidade de executar um arquivo. Essa permissão deve ser definida para programas executáveis para permitir sua execução. Quando definida para um diretório, essa permissão é interpretada como a permissão de pesquisar – concedendo a capacidade de acessar o conteúdo e os metadados do arquivo se seu nome for conhecido, mas não listar os arquivos no diretório, a menos que a permissão de ler também esteja definida.

O efeito de definir permissões em um diretório, em vez de em um arquivo, é "um dos problemas de permissão de arquivo mais frequentemente mal compreendidos".[12]

Ao contrário dos sistemas baseados em ACL, essas permissões não são herdadas. Arquivos criados dentro de um diretório não têm necessariamente as mesmas permissões que o diretório que os contêm.

Alterando o comportamento de permissões com setuid, setgid e bits fixos

Três atributos adicionais de bit único se aplicam a cada arquivo, relacionados a permissões e armazenados no modo de arquivo juntamente com as permissões.

  • O set user ID, setuid ou modo SUID. Executar um arquivo com esse bit definido resulta em um processo com o ID de usuário definido para o usuário proprietário do arquivo. Isso permite que os usuários sejam tratados temporariamente como root (ou outro usuário).
  • A permissão set group ID, setgid ou SGID. Executar um arquivo com esse bit definido resulta em um processo com o ID de grupo definido para o grupo proprietário do arquivo. Quando aplicado a um diretório, novos arquivos e diretórios criados sob esse diretório herdam seu grupo desse diretório. (O comportamento padrão é usar o grupo primário do usuário efetivo ao definir o grupo de novos arquivos e diretórios, exceto em sistemas derivados do BSD, que se comportam como se o bit setgid estivesse sempre definido em todos os diretórios (ver setuid).)
  • O modo sticky (também conhecido como modo Texto). O comportamento clássico do sticky bit em arquivos executáveis tem sido incentivar o núcleo (kernel) a reter a imagem do processo resultante na memória após o término; no entanto, esse uso do sticky bit agora está restrito a apenas uma minoria de sistemas operacionais do tipo Unix (HP-UX e UnixWare). Em um diretório, a permissão sticky impede que os usuários renomeiem, movam ou excluam arquivos contidos neles, pertencentes a outros usuários que não eles próprios, mesmo que tenham permissão de gravação no diretório. Somente o proprietário do diretório e o superusuário estão isentos disso.

Representação

As permissões são comumente representadas em notação simbólica ou octal.

Notação simbólica

A notação simbólica é usada no formato de saída longa do comando ls -l.

O primeiro caractere da saída, que não é uma permissão (embora esteja próximo às informações de permissão), indica o tipo de arquivo Unix. Os nove caracteres restantes representam as permissões para as classes de usuário, grupo e outros, como grupos de permissões de operação para ler, gravar e executar. Uma operação é negada quando mostrada como um hífen ou concedida quando mostrada como r para ler, w para gravar ou x para executar.

Exemplos:

  • -rwxr-xr-x: o - inicial indica um arquivo regular, os próximos três rwx indicam que a classe de usuário possui todas as permissões e as classes de grupo e outros (ambas r-x) possuem apenas permissões de ler e executar.
  • crw-rw-r--: o c inicial indica um arquivo especial de caracteres, as classes de usuário e grupo (ambas rw-) possuem permissões de ler e gravar, e a classe outros (r--) possue apenas permissões de ler.
  • dr-x------: o d inicial indica um diretório, a classe de usuário (r-x) possui permissões de ler e executar, e as classes de grupo e outros (ambas ---) não possuem permissões.

Para representar os atributos setuid, setgid e sticky/text, o caractere na terceira posição de uma classe é modificado; mesmo que essa posição seja apenas para executar e mesmo que esses atributos afetem o arquivo sem levar em conta a classe. O atributo setuid modifica o caractere de executar para a classe de usuário, o atributo setgid modifica o caractere de executar para a classe de grupo e o atributo sticky ou text modifica o caractere de executar para a classe outros. Para setuid ou setgid, x se torna s e - se torna S. Para o atributo sticky ou text, x se torna t e - se torna T. Por exemplo, -rwsr-Sr-t indica um arquivo regular, a classe de usuário tem permissões de ler, gravar e executar; a classe de grupo tem permissão de ler; a classe outros tem permissões de ler e executar; e que tem os atributos setuid, setgid e sticky definidos.

Alguns sistemas apresentam recursos de permissão adicionais:

  • O sufixo + indica uma lista de controle de acesso que pode controlar permissões adicionais.
  • O sufixo . indica que um contexto SELinux está presente. Detalhes podem ser listados com o comando ls -Z.
  • O sufixo @ indica que atributos de arquivo estendidos estão presentes.

Notação octal

As permissões são frequentemente exibidas em notação octal; por exemplo, através do comando stat -c %a. A notação consiste em pelo menos três dígitos. Os três últimos dígitos representam a permissão por classe: usuário, grupo e outros. Se um quarto dígito estiver presente, o mais à esquerda representa os três atributos especiais: setuid, setgid e sticky.

Cada permissão de operação recebe uma posição de bit que, para um dígito octal, é:

  • Ler: esquerda, binário 100, octal 4
  • Escrever/gravar: meio, binário 010, octal 2
  • Executar: direita, binário 001, octal 1

Um valor de permissão de classe é a soma ou, alternativamente, o OR lógico das permissões.

Exemplos:

Simbólico Octal Descrição
---------- 0000 sem permissões
-rwx------ 0700 ler, gravar e executar somente para proprietário
-rwxrwx--- 0770 ler, gravar e executar para proprietário e grupo
-rwxrwxrwx 0777 ler, gravar e executar para proprietário, grupo e outros
-rwxr----- 0740 proprietário pode ler, gravar e executar; o grupo só pode ler; os outros não têm permissões

Grupo privado de usuários

Alguns sistemas divergem do modelo POSIX tradicional de usuários e grupos, criando um novo grupo – um "grupo privado de usuário" – para cada usuário. Assumindo que cada usuário é o único membro de seu grupo privado de usuário, esse esquema permite que uma máscara de usuário (umask) de 002 seja usada sem permitir que outros usuários gravem em arquivos recém-criados em diretórios normais, pois tais arquivos são atribuídos ao grupo privado de usuário que os criou. No entanto, quando o compartilhamento de arquivos for desejável, o administrador pode criar um grupo contendo os usuários desejados, criar um diretório gravável em grupo atribuído ao novo grupo e, mais importante, definir o diretório como setgid. Defini-lo como setgid fará com que os arquivos criados nele sejam atribuídos ao mesmo grupo que o diretório, e a máscara de usuário (umask) de 002 (habilitada pelo uso de grupos privados de usuários) garantirá que outros membros do grupo possam gravar nesses arquivos.[13][14]

Ver também

Referências

  1. «File and Folder Permissions». Microsoft. 9 de dezembro de 2009 
  2. «Native NFSv4 ACLs on Linux». Consultado em 4 de maio de 2010. Arquivado do original em 12 de outubro de 2008 
  3. «NFSv4_ACLs – FreeBSD Wiki» 
  4. «FreeNAS 9.1.1 Users Guide» (PDF). 2013. Arquivado do original (PDF) em 24 de setembro de 2015 
  5. Gite, Vivek (3 de junho de 2010). «Apple OS X: Write Protect File From Command Line» 
  6. «OpenVMS documentation». Consultado em 6 de junho de 2009. Arquivado do original em 5 de março de 2012 
  7. «File Systems: Protection». CS322 Lecture Slides 
  8. «Oracle Solaris ZFS Administration Guide» (PDF). Setembro de 2010 
  9. «IBM Knowledge Center». Arquivado do original em 29 de junho de 2013 
  10. «HarmonyOS Distributed File System Development Guide». Substack. LivingInHarmony Blog. 13 de março de 2024. Consultado em 13 de março de 2024 
  11. «Definitions, 3.175 File Permission Bits». pubs.opengroup.org. 22 de julho de 2018. Consultado em 24 de junho de 2023 
  12. Hatch, Bri (24 de abril de 2003). «Linux File Permission Confusion pt 2». Hacking Linux Exposed. Consultado em 6 de julho de 2011 
  13. Epstein, Brian. «The How and Why of User Private Groups in Unix». security.ias.edu. Institute for Advanced Study Network Security. Consultado em 5 de agosto de 2014. Arquivado do original em 8 de agosto de 2014 
  14. «Red Hat Enterprise Linux 7 System Administrator's Guide, 4.3.4 Creating Group Directories». Red Hat Customer Portal. Red Hat