Nesta aula, você aprenderá sobre o sistema de permissões de arquivos do Linux, essencial para controlar acesso a arquivos e diretórios em sistemas multiusuário. O modelo rwx define permissões de leitura, escrita e execução para três categorias de usuários: proprietário, grupo e outros. Comandos como chmod, chown, chgrp e umask permitem modificar essas permissões de forma flexível. Entender esses conceitos é fundamental para administração de sistemas e segurança.

Dominar permissões é crucial para garantir que apenas usuários autorizados possam ler, escrever ou executar arquivos, prevenindo acessos indevidos e mantendo a integridade do sistema.

Modelo rwx

O modelo rwx representa três tipos de permissão: r (read/leitura), w (write/escrita) e x (execute/execução). Cada permissão é atribuída a três grupos: proprietário (user, u), grupo (group, g) e outros (others, o). A ordem é sempre: proprietário, grupo, outros. Exemplo: rwxr-xr-- significa proprietário com todas as permissões, grupo com leitura e execução, outros apenas leitura.

Em diretórios, a permissão de execução (x) permite acessar o diretório (entrar nele com cd) e listar conteúdo se também houver permissão de leitura. A permissão de escrita (w) em diretório permite criar, renomear ou deletar arquivos dentro dele. É importante notar que para deletar um arquivo, é necessário ter permissão de escrita no diretório, não no arquivo em si.

Exemplo de visualização com ls -l:

$ ls -l /home/user/documento.txt
-rw-r--r-- 1 user group 1234 Jan 1 10:00 /home/user/documento.txt

O primeiro caractere '-' indica arquivo regular (d para diretório, l para link simbólico). Os próximos nove caracteres são as permissões: rw- (proprietário: leitura e escrita), r-- (grupo: leitura), r-- (outros: leitura).

chmod (octal e simbólico)

O comando chmod (change mode) altera as permissões de um arquivo ou diretório. Existem duas formas de especificar as permissões: modo octal e modo simbólico.

Modo octal: cada permissão é representada por um número: r=4, w=2, x=1. A soma desses valores para um grupo (proprietário, grupo, outros) forma um dígito octal (0-7). Assim, um número de três dígitos (ex.: 755) define as permissões completas. Exemplo: 755 = proprietário: 4+2+1=7 (rwx), grupo: 4+0+1=5 (r-x), outros: 4+0+1=5 (r-x).

$ chmod 755 script.sh
$ ls -l script.sh
-rwxr-xr-x 1 user group 0 Jan 1 10:00 script.sh

Modo simbólico: usa letras para especificar quem (u/g/o/a), operador (+/-/=) e permissões (r/w/x). Exemplos:

  • chmod u+x arquivo – adiciona execução para o proprietário
  • chmod g-w arquivo – remove escrita do grupo
  • chmod o=r arquivo – define outros como somente leitura
  • chmod a+rx arquivo – adiciona leitura e execução para todos
$ chmod u+x,g-w,o=r script.sh
$ ls -l script.sh
-rwxr--r-- 1 user group 0 Jan 1 10:00 script.sh

É possível combinar operadores separados por vírgula. O modo simbólico é mais intuitivo para alterações parciais.

chown e chgrp

O comando chown (change owner) altera o proprietário de um arquivo ou diretório. Apenas o superusuário (root) pode alterar o proprietário. Sintaxe: chown [opções] usuário[:grupo] arquivo. Exemplo:

$ sudo chown maria documento.txt
$ ls -l documento.txt
-rw-r--r-- 1 maria grupo 1234 Jan 1 10:00 documento.txt

Para alterar também o grupo, use chown maria:adm documento.txt. Se apenas o grupo for alterado, pode-se usar chown :adm documento.txt.

O comando chgrp (change group) altera apenas o grupo de um arquivo ou diretório. Qualquer usuário pode alterar o grupo de um arquivo que possui para um grupo do qual seja membro. Sintaxe: chgrp [opções] grupo arquivo. Exemplo:

$ chgrp desenvolvedores projeto/
$ ls -ld projeto/
drwxr-xr-x 2 user desenvolvedores 4096 Jan 1 10:00 projeto/

Use a opção -R para aplicar recursivamente em diretórios: chown -R maria:adm /home/maria/.

umask

O comando umask (user mask) define as permissões padrão para novos arquivos e diretórios criados pelo usuário. A máscara é um valor octal que subtrai permissões do valor base (666 para arquivos, 777 para diretórios). Por exemplo, umask 022 resulta em permissões 644 (rw-r--r--) para arquivos e 755 (rwxr-xr-x) para diretórios. O valor padrão geralmente é 022 ou 002.

Para visualizar o umask atual: umask (exibe em octal) ou umask -S (exibe em modo simbólico). Para alterar: umask 027. A alteração é válida apenas para a sessão atual; para torná-la permanente, adicione o comando no arquivo ~/.bashrc ou ~/.profile.

Exemplo de cálculo: umask 027 (octal) = --- -w- rwx (simbólico). Para arquivos (base 666): 666 - 027 = 640 (rw-r-----). Para diretórios (base 777): 777 - 027 = 750 (rwxr-x---).

$ umask 027
$ touch novo_arquivo
$ mkdir novo_diretorio
$ ls -l
total 0
-rw-r----- 1 user group 0 Jan 1 10:00 novo_arquivo
drwxr-x--- 2 user group 4096 Jan 1 10:00 novo_diretorio

É importante notar que o umask não afeta arquivos já existentes. Para scripts, pode-se usar umask dentro do script para garantir permissões adequadas aos arquivos criados.

Boas práticas e observações finais

Sempre verifique as permissões com ls -l antes e depois de alterações. Use o modo octal para definir permissões exatas e o modo simbólico para ajustes rápidos. Lembre-se de que permissões muito permissivas (ex.: 777) podem ser um risco de segurança. Para diretórios compartilhados, considere usar o sticky bit (chmod +t) para evitar que usuários deletem arquivos de outros. O comando umask deve ser ajustado conforme a política de segurança do ambiente.

Exercícios

  1. Crie um arquivo chamado teste.txt com permissões 644. Altere para que o grupo tenha permissão de escrita, mantendo as demais. Mostre o comando e a saída de ls -l.

    ✓ Resposta:
    $ touch teste.txt
    $ chmod 644 teste.txt
    $ chmod g+w teste.txt
    # ou: chmod 664 teste.txt
    $ ls -l teste.txt
    -rw-rw-r-- 1 user group 0 Jan 1 10:00 teste.txt
  2. Explique o que significa a permissão rwxr-xr-- para um diretório. Quais operações um usuário do grupo pode realizar? E um outro?

    ✓ Resposta: A permissão significa: proprietário (rwx) pode ler, escrever e executar (acessar) o diretório; grupo (r-x) pode ler e executar (listar conteúdo e acessar), mas não pode criar/remover arquivos (sem w); outros (r--) apenas podem ler (listar nomes, mas não podem acessar porque falta execução? Na verdade, para listar o conteúdo é necessário leitura, mas para acessar (cd) é necessária execução. Então outros podem listar mas não podem entrar no diretório. Operações: grupo pode listar e acessar, outros só listar (se tiverem permissão de leitura, mas sem execução não podem acessar; na prática, listar requer leitura, mas acessar requer execução). Portanto, outros podem ver os nomes mas não podem ler ou modificar arquivos dentro (a menos que tenham permissão específica nos arquivos).
  3. Usando o modo simbólico, remova a permissão de execução para outros em um arquivo script.sh que atualmente tem permissões 755. Mostre o comando e o resultado.

    ✓ Resposta:
    $ chmod o-x script.sh
    $ ls -l script.sh
    -rwxr-xr-- 1 user group 0 Jan 1 10:00 script.sh
  4. O que o comando chown :adm arquivo faz? É necessário ser root?

    ✓ Resposta: Altera o grupo do arquivo para 'adm', mantendo o proprietário atual. Não é necessário ser root; o proprietário do arquivo pode alterar o grupo para qualquer grupo do qual seja membro (desde que não seja root, mas pode alterar para grupos que pertence). Se o proprietário não pertencer ao grupo 'adm', a operação falhará. Apenas root pode alterar para qualquer grupo.
  5. Defina um umask que resulte em permissões padrão 640 para arquivos e 750 para diretórios. Mostre o comando e verifique com um exemplo.

    ✓ Resposta: Para arquivos: base 666 - umask = 640 => umask = 26 (octal 026). Para diretórios: base 777 - umask = 750 => umask = 27 (octal 027). Há conflito? Na verdade, o umask é único e aplicado a ambos. Para obter 640 em arquivos e 750 em diretórios, precisamos de um umask que subtraia 26 de 666 (dá 640) e 27 de 777 (dá 750). Isso não é possível com um único valor porque a subtração não é linear. O umask funciona como máscara de bits: cada bit 1 na máscara desabilita a permissão correspondente. O valor 027 em binário: 000 010 111. Para arquivos (666 = 110 110 110), aplicando AND com complemento: 110 110 110 & ~000 010 111 = 110 100 000 = 640? Vamos calcular: ~027 = 111 101 000 (bits invertidos). 666 & ~027 = 110 110 110 & 111 101 000 = 110 100 000 = 640. Para diretórios (777 = 111 111 111) & ~027 = 111 111 111 & 111 101 000 = 111 101 000 = 750. Portanto, umask 027 resulta exatamente em 640 para arquivos e 750 para diretórios. Comando: umask 027. Exemplo:
    $ umask 027
    $ touch arq; mkdir dir; ls -l
    total 0
    -rw-r----- 1 user group 0 Jan 1 10:00 arq
    drwxr-x--- 2 user group 4096 Jan 1 10:00 dir

Referências