Permissões de arquivo: chmod, chown e como funcionam

1. Fundamentos das Permissões no Linux

O Linux implementa um modelo de segurança baseado em três categorias de acesso: usuário (user), grupo (group) e outros (others). Cada arquivo ou diretório possui um proprietário (owner), um grupo associado e permissões específicas para cada uma dessas categorias.

Os três tipos básicos de permissão são:
- Leitura (r - read): Permite visualizar o conteúdo do arquivo ou listar o diretório
- Escrita (w - write): Permite modificar o arquivo ou criar/remover arquivos no diretório
- Execução (x - execute): Permite executar o arquivo como programa ou acessar o diretório

Para visualizar as permissões, use o comando ls -l:

$ ls -l
-rwxr-xr-- 1 joao desenvolvedores 1024 Mar 15 10:30 script.sh

Interpretando a saída:
- - indica que é um arquivo regular (d para diretório)
- rwx permissões do dono (joão): leitura, escrita e execução
- r-x permissões do grupo (desenvolvedores): leitura e execução
- r-- permissões de outros: apenas leitura

2. Entendendo os Níveis de Acesso

Dono do arquivo (user): É o proprietário, geralmente quem criou o arquivo. Possui controle total sobre as permissões.

Grupo (group): Permite que múltiplos usuários compartilhem permissões sem expor o arquivo a todos. Por exemplo, uma equipe de desenvolvimento pode ter acesso de escrita a um diretório compartilhado.

Outros (others): Todos os usuários que não são o dono nem pertencem ao grupo. Idealmente, deve ter permissões mínimas por segurança.

$ ls -l /etc/passwd
-rw-r--r-- 1 root root 2545 Mar 15 10:30 /etc/passwd

Aqui, root é dono e grupo, com permissão de leitura/escrita para root e apenas leitura para outros.

3. Modificando Permissões com chmod

Notação Simbólica

Permite adicionar ou remover permissões de forma intuitiva:

# Adiciona execução para o dono
$ chmod u+x script.sh

# Remove escrita do grupo
$ chmod g-w relatorio.txt

# Define permissão exata para outros como apenas leitura
$ chmod o=r dados.csv

# Adiciona todas as permissões para todos
$ chmod a+rwx publico.sh

# Verificando o resultado
$ ls -l script.sh
-rwxr-xr-x 1 joao joao 0 Mar 15 10:30 script.sh

Notação Octal (Numérica)

Cada permissão tem um valor numérico:
- r = 4
- w = 2
- x = 1

As combinações mais comuns:

# 755: dono tem tudo, grupo e outros leitura e execução
$ chmod 755 script.sh
$ ls -l script.sh
-rwxr-xr-x 1 joao joao 0 Mar 15 10:30 script.sh

# 644: dono leitura/escrita, demais apenas leitura
$ chmod 644 index.html
$ ls -l index.html
-rw-r--r-- 1 joao joao 0 Mar 15 10:30 index.html

# 600: apenas dono tem acesso (arquivos sensíveis)
$ chmod 600 senha.txt
$ ls -l senha.txt
-rw------- 1 joao joao 0 Mar 15 10:30 senha.txt

# 700: apenas dono tem acesso total (scripts pessoais)
$ chmod 700 privado.sh

4. Alterando Proprietário e Grupo com chown

O comando chown (change owner) permite modificar o proprietário e grupo de arquivos:

# Mudando apenas o dono
$ sudo chown maria relatorio.txt
$ ls -l relatorio.txt
-rw-r--r-- 1 maria joao 0 Mar 15 10:30 relatorio.txt

# Mudando apenas o grupo (usando :grupo)
$ sudo chown :admin relatorio.txt
$ ls -l relatorio.txt
-rw-r--r-- 1 maria admin 0 Mar 15 10:30 relatorio.txt

# Mudando dono e grupo simultaneamente
$ sudo chown maria:admin relatorio.txt
$ ls -l relatorio.txt
-rw-r--r-- 1 maria admin 0 Mar 15 10:30 relatorio.txt

# Alterando recursivamente em diretórios
$ sudo chown -R maria:admin /home/projeto/

5. Permissões Especiais: SetUID, SetGID e Sticky Bit

SetUID (4000)

Permite executar um arquivo com os privilégios do proprietário:

# Exemplo: /usr/bin/passwd precisa de acesso root para alterar senhas
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Mar 15 10:30 /usr/bin/passwd

# Ativando SetUID em um script
$ chmod u+s script_especial.sh
$ ls -l script_especial.sh
-rwsr-xr-x 1 root root 0 Mar 15 10:30 script_especial.sh

SetGID (2000)

Em arquivos: executa com privilégios do grupo. Em diretórios: novos arquivos herdam o grupo do diretório:

# Ativando SetGID em diretório compartilhado
$ chmod g+s /compartilhado
$ ls -ld /compartilhado
drwxrwsr-x 2 root equipe 4096 Mar 15 10:30 /compartilhado

Sticky Bit (1000)

Protege arquivos em diretórios compartilhados: apenas o dono pode deletar seus arquivos:

# /tmp já possui sticky bit ativo
$ ls -ld /tmp
drwxrwxrwt 10 root root 4096 Mar 15 10:30 /tmp

# Ativando sticky bit manualmente
$ chmod +t /diretorio_compartilhado

6. Permissões em Diretórios vs. Arquivos

As permissões funcionam de forma diferente em diretórios:

# Permissão de leitura em diretório: permite listar conteúdo
$ chmod 444 documentos/
$ ls documentos/
ls: cannot open directory 'documentos/': Permission denied

# Permissão de execução em diretório: permite acessar arquivos
$ chmod 100 documentos/
$ ls documentos/
ls: cannot open directory 'documentos/': Permission denied
$ cat documentos/arquivo.txt
cat: documentos/arquivo.txt: Permission denied

# Combinação correta: leitura + execução (500)
$ chmod 500 documentos/
$ ls documentos/
arquivo.txt
$ cat documentos/arquivo.txt
Conteúdo do arquivo

# Para criar/remover arquivos: leitura + execução + escrita (700)
$ chmod 700 documentos/
$ touch documentos/novo.txt

Boas práticas para diretórios:

# Diretório público: 755 (drwxr-xr-x)
chmod 755 /publico/

# Diretório privado: 700 (drwx------)
chmod 700 /privado/

# Diretório compartilhado com grupo: 750 (drwxr-x---)
chmod 750 /compartilhado/

7. Boas Práticas e Segurança

Princípio do Menor Privilégio

Evite chmod 777 a todo custo. Ele dá acesso total a qualquer usuário do sistema:

# NUNCA faça isso
$ chmod 777 script.sh

# Prefira permissões específicas
$ chmod 750 script.sh  # dono total, grupo leitura/execução, outros sem acesso

Usando umask para Definir Permissões Padrão

O umask define quais permissões serão removidas automaticamente:

# Verificando umask atual
$ umask
0022

# Calculando permissões: 666 - 022 = 644 (arquivos) e 777 - 022 = 755 (diretórios)
$ touch novo_arquivo.txt
$ ls -l novo_arquivo.txt
-rw-r--r-- 1 joao joao 0 Mar 15 10:30 novo_arquivo.txt

# Definindo umask mais restritivo
$ umask 0077
$ touch arquivo_seguro.txt
$ ls -l arquivo_seguro.txt
-rw------- 1 joao joao 0 Mar 15 10:30 arquivo_seguro.txt

Verificando Permissões com stat e find

# Usando stat para detalhes completos
$ stat script.sh
  File: script.sh
  Size: 0           Blocks: 0          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 1234567     Links: 1
Access: (0755/-rwxr-xr-x)  Uid: ( 1000/    joao)   Gid: ( 1000/    joao)

# Encontrando arquivos com permissões perigosas
$ find /home -perm 777 -type f
/home/usuario/arquivo_inseguro.txt

# Encontrando arquivos sem permissão para outros
$ find /home -perm /o=w -type f
/home/usuario/script_executavel.sh

Lembre-se: permissões corretas são fundamentais para a segurança do sistema. Sempre aplique o menor privilégio necessário para cada usuário ou grupo.

Referências