Permissões Especiais no Linux: SetUID, SetGID e Sticky Bit

No sistema Linux, além das permissões convencionais de leitura, escrita e execução, existem três permissões especiais que concedam privilégios adicionais a arquivos e diretórios: SetUID, SetGID e Sticky Bit.

Permissão Nome Completo Descrição
SetUID Set User ID Ao ser aplicado em um executável, faz com que o processo seja executado com os privilégios do proprietário do arquivo, e não do usuário que o invocou. É amplamente utilizado em binários que necessitam de privilégios elevados.
SetGID Set Group ID Quando aplicado a um executável, o processo roda com os privilégios do grupo proprietário. Aplicado a um diretório, faz com que novos arquivos criados dentro dele herdem o grupo do diretório em vez do grupo primário do usuário.
Sticky Bit Bit Adesivo Aplicado a diretórios, garante que apenas o proprietário do arquivo, o proprietário do diretório ou o root possam excluir arquivos dentro desse diretório. É essencial em diretórios compartilhados.

Um caso clássico é o comando passwd, que permite a qualquer usuário alterar sua própria senha:

# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 32648 Aug 10  2021 /usr/bin/passwd

Note que a permissão de execução do proprietário aparece como s em vez de x, indicando a presença do SetUID.

Localizando Arquivos com Permissões Especiais

# Buscar binários com SetUID em /usr/bin
find /usr/bin -perm /u+s

# Localizar diretórios com SetGID no sistema inteiro
find / -type d -perm /g+s

# Encontrar diretórios com Sticky Bit
find / -type d -perm /o+t

Detalhamento do SetUID

  • Se o proprietário já possuir permissão de execução (x), a letra muda para s.
  • Se o proprietário não tiver permissão de execução (-), a letra muda para S maiúsculo.
  • Equivalente numérico: 4 como prefixo (ex: 4644).

Exemplo prático: o comando passwd precisa modificar o arquivo /etc/shadow, que pertence ao root. Sem SetUID, usuários comuns não conseguiriam alterar suas senhas.

1. Verificar a presença do SetUID no binário:

# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 33424 Feb 18  2022 /usr/bin/passwd

2. Remover o SetUID temporariamente:

# chmod 755 /usr/bin/passwd

3. Tentar alterar a senha como usuário comum carlos:

# su - carlos
$ passwd
Changing password for user carlos.
Current password:
New password:
passwd: Authentication token manipulation error

4. Restaurar o SetUID:

# chmod u+s /usr/bin/passwd

5. Testar novamente a alteração de senha:

# su - carlos
$ passwd
Changing password for user carlos.
Current password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

Detalhamento do SetGID

  • Se o grupo tiver permissão de execução (x), a letra muda para s.
  • Se o grupo não tiver permissão de execução (-), a letra muda para S maiúsculo.
  • Equivalente numérico: 2 como prefixo (ex: 2770).

Exemplo prático: criar um diretório compartilhado para uma equipe de desenvolvimento, onde todos os arquivos novos herdem automaticamente o grupo do projeto.

1. Criar o diretório compartilhado:

# mkdir /home/projeto_comum

2. Criar o grupo e ajustar permissões:

# groupadd equipe_dev
# chgrp equipe_dev /home/projeto_comum
# chmod 770 /home/projeto_comum

3. Aplicar o SetGID:

# chmod g+s /home/projeto_comum
# ls -ld /home/projeto_comum
drwxrws---. 2 root equipe_dev 6 Jan  5 04:55 projeto_comum

4. Adicionar o usuário carlos ao grupo:

# gpasswd -a carlos equipe_dev
Adding user carlos to group equipe_dev

5. Criar um arquivo como carlos e verificar a herança do grupo:

# su - carlos
$ touch /home/projeto_comum/dados.txt
$ ls -l /home/projeto_comum/
-rw-rw-r--. 1 carlos equipe_dev 0 Jan  5 05:27 dados.txt

Detalhamento do Sticky Bit

  • Se outros tiverem permissão de execução (x), a letra muda para t.
  • Se outros não tiverem permissão de execução (-), a letra muda para T maiúsculo.
  • Equivalente numérico: 1 como prefixo (ex: 1777).

Exemplo clássico: o diretório /tmp, que precisa ser gravável por todos os usuários, mas onde ninguém deve poder excluir arquivos que não lhe pertencem.

1. Confirmar a presença do Sticky Bit em /tmp:

# ls -ld /tmp
drwxrwxrwt. 16 root root 4096 Jan  5 05:42 /tmp

2. Como usuário maria, criar um diretório em /tmp:

# useradd maria
# su - maria
$ mkdir /tmp/maria_tmp
$ exit

3. Como usuário carlos, tentar remover o diretório criado por maria:

# su - carlos
$ rmdir /tmp/maria_tmp
rmdir: failed to remove '/tmp/maria_tmp/': Operation not permitted

Tags: Linux SetUID SetGID Sticky Bit Permissões de Arquivo

Publicado em 7-10 07:06