Permissões especiais em Linux: SUID - SGID - Sticky bit

head-post-image, sticky bit

Índice de conteúdo

  1. Breve referência sobre Permissões
  2. Permissões especiais
  3. Permissão especial SUID
  4. Permissão especial SGID
  5. Permissão especial sticky bit

Faremos uma referência à forma mais comum de atribuir permissões no Linux e, de seguida, abordaremos a atribuição de permissões especiais.

Nota Introdutória

As permissões especiais SUID, SGID e Sticky Bit são funcionalidades avançadas do Linux que permitem um controlo mais granular sobre o acesso e a execução de ficheiros e diretórios. Compreender estas permissões é crucial para a segurança e a gestão eficiente de sistemas multiutilizador, possibilitando a implementação de políticas de acesso flexíveis e a proteção contra modificações não autorizadas. Ao longo deste post, exploraremos em detalhe cada uma destas permissões especiais, ilustrando a sua aplicação e os seus efeitos práticos através de exemplos.

Breve referência a Permissões

Existem duas formas principais de atribuir permissões, e neste blogue encontrará dois artigos sobre o assunto. Caso tenha interesse, pode consultá-los.
  1. Permissões em Directórios e Ficheiros em Linux - Forma Simbólica
  2. Permissões em Linux - Forma Numérica

Permissões Simbólicas

As permissões são consideradas simbólicas quando os níveis de utilizadores e as permissões são representados por letras.

As letras u, g e o referem-se ao nível de utilizador.
  • u - user, usuário
  • g - group, grupo
  • o - others, outros
As letras r, w e x referem-se às permissões atribuídas a cada nível de utilizador.
  • r - read, leitura
  • w - write, escrita
  • x - execute, execução
Permissões em forma simbólica

Permissões Numéricas

As permissões de ficheiro no Linux são numéricas quando utilizam a forma octal de representação, variando de 0 a 7.

Na forma numérica, as permissões são representadas por três dígitos. Cada dígito, da esquerda para a direita, corresponde respetivamente ao utilizador, ao grupo e a outros. Por exemplo, a permissão 755 concede permissão de leitura, escrita e execução ao utilizador, permissão de leitura e execução ao grupo de utilizadores, e permissão de leitura e execução aos outros. A permissão 750 mantém as mesmas permissões para o utilizador e para o grupo, mas retira todas as permissões aos outros.

As letras 4, 2 e 1 referem-se às permissões atribuídas a cada nível de utilizador. Podem-se criar permissões combinadas somando estes números.
  • 4 - read, leitura
  • 2 - write, escrita
  • 1 - execute, execução
  • 0 - retira permissões
  • 3 = 2 + 1 = escrita + execução
  • 5 = 4 + 1 = leitura + execução
  • 6 = 4 + 2 = leitura + escrita
  • 7 = 4 + 2 + 1 = leitura, escrita e execução

Permissões especiais

As permissões especiais representam um quarto nível de acesso, além de utilizador, grupo e outros, e são uma forma de controlar o acesso a ficheiros e diretórios. São chamadas de permissões especiais porque permitem privilégios adicionais sobre o conjunto de permissões padrão.

Existem três permissões especiais:
  • Set User ID (setuid) - quando aplicada a um ficheiro executável, permite que o ficheiro seja executado com as permissões do utilizador proprietário, em vez das permissões do utilizador que o executa. O Setuid funciona a nível de utilizador e tem grande utilidade na execução de programas que requerem privilégios elevados, como o sudo.
  • Set Group ID (setgid) - pode também ser aplicada a um arquivo executável a nível do grupo proprietário e permite que um ficheiro seja acedido com as permissões do grupo ao qual pertence, em vez das permissões do utilizador que o acede. Isto é útil para partilhar ficheiros entre utilizadores que fazem parte do mesmo grupo.
  • Sticky bit - impede que os utilizadores removam ou modifiquem ficheiros num diretório, a menos que tenham permissões de escrita nesse diretório. Isto é útil para proteger ficheiros importantes, como o /tmp.
Tabela nº1 - Forma simbólica de atribuir permissões especiais
Permissões Especiais Descrição
chmod u+s nomeFicheiro Adiciona permissão especial SUID
chmod u-s nomeFicheiro Remove permissão especial SUID.
chmod g+s nomeFicheiro Adiciona permissão especial SGID
chmod g-s nomeFicheiro Remove permissão especial SGID
chmod o+t nomeFicheiro Adiciona permissão especial Sticky bit
chmod +t nomeFicheiro Adiciona permissão especial Sticky bit
chmod o-t nomeFicheiro Remove permissão especial Sticky bit
chmod -t nomeFicheiro Remove permissão especial sticky bit
chmod u+s,+t nomeFicheiro Adiciona permissão especial SUID e Sticky bit
chmod g+s,+t nomeFicheiro Adiciona permissão especial SGID e Sticky bit
Tabela nº2 - Forma numérica. A representação octal das permissões especiais de arquivo
Permissões especiais Descrição
0 Remove permissão especial sticky bit
4 Adiciona permissão especial setgid e sticky bit
2 Adiciona permissão especial setgid
1 Adiciona permissão especial sticky bit
Também podemos adicionar 4, 2 e 1 como na forma numérica padrão para permissões
3 Adiciona permissão especial setuid
5 Adiciona permissões especiais setuid e sticky bit
6 Adiciona permissões especiais setuid e setgid
7 Adiciona permissões especiais suid, sgid e sticky bit

Na tabela nº 3 podemos ver a combinação da forma numérica de permissão especial e permissão padrão e como funciona num grupo de 4 dígitos. O primeiro dígito corresponde à permissão especial, o segundo às permissões ao nível do utilizador, o terceiro ao grupo e o quarto aos outros.

Tabela nº 3 - Permissão 755 casos com setuid, setgid e sticky bit
Permissões Descrição Output ls -l
0755 Sem nenhuma permissão especial drwxr-xr-x
4755 Com permissões especiais setgid e sticky bit drwxr-sr-t
2755 Com permissão especial setgid drwxr-sr-x
1755 Com permissão especial sticky bit drwxr-xr-t
3755 Com permissão especial setuid drwsr-xr-x
5755 Com permissões especiais setuid e sticky bit drwsr-xr-t
6755 Com permissões especiais setuid e setgid drwsr-sr-x
7755 Com permissões especiais suid, sgid e sticky bit drwsr-sr-t
Lista de tarefas antes de avançarmos com os exemplos
  1. Vamos criar um diretório em /home/ com o nome de Historias
  2. Vamos alterar as permissões de 755 para 775, dando assim ao grupo também a permissão de escrita.
  3. Vamos criar um grupo de contadores de histórias que terá o nome contadores-de-historias
  4. Vamos tornar o grupo contadores-de-historias proprietário do diretório Historias criado em /home/
  5. Vamos criar um novo utilizador, um contador de histórias que terá conthist-1 como nome de utilizador
  6. Vamos adicionar o utilizador conthist-1 ao grupo contadores-de-historias

1 - Criamos o diretório Historias

Criação do directório historias

2 - Alteramos as permissões de 755 para 775 no diretório Historias

UID e GID do diretório Historias


[administrador@fedora ~]$ ls -ln /home/ | grep Historias
drwxrwxr-x. 1    0  0  36 ago  4 19:06 Historias

3 - Criamos o grupo contadores-de-historias

GID de contadores-de-historias


[administrador@fedora ~]$ cat /etc/group | grep contadores-de-historias
contadores-de-historias:x:1012

4 - Atribuímos ao grupo contadores-de-historias a propriedade do diretório Historias. Veja que antes o grupo proprietário era o grupo root.

UID e GID do diretório Historias


[administrador@fedora ~]$ ls -ln /home/ | grep Historias
drwxrwxr-x. 1    0 1012  36 ago  4 19:06 Historias

5 - Criamos o utilizador conthist-1

Criamos a password para o utilizador conthist-1

Verificamos a existência do utilizador conthist-1

id conthis-1

UID e GID do utilizador conthist-1


[administrador@fedora ~]$ cat /etc/passwd | grep conthist-1
conthist-1:x:1005:1005:contador-de-histórias-1:/home/conthist-1:/bin/bash

Para melhor entendimento de como as coisas se processam, analisemos esta imagem:

Imagem explicando as partes que compõem a identificação do utilizador e o seu grupo no sistema.

Pela imagem vemos que o utilizador tem o nome de conthist-1, tem um UID=1005. Este número é-lhe atribuído no momento em que o utilizador é criado. Também este utilizador já pertence a um grupo com o mesmo nome de utilizador (grupo primário) e tem um GID=1005. O número de ID do grupo não tem que ser necessariamente igual ao número de ID do utilizador nem também o nome do grupo do utilizador. Também o GID do utilizador é criado pelo sistema no momento em que o utilizador é adicionado, a não ser que seja definido pelo Administrador do sistema.

Para vermos este tipo de informação sobre todos os utilizadores do sistema:

$ cat /etc/passwd

Para vermos este tipo de informação sobre um utilizador em especial, neste caso o conthist-1.

$ id conthist-1 ou

$ grep conthist-1 /etc/passwd
grep em utilizador conthist

6 - Adicionamos o utilizador conthist-1 ao grupo contadores-de-historias

Para adicionar o utilizador ao grupo contadores-de-historias:

# usermod -aG contadores-de-historias conthist-1

Para verificarmos quem se encontra no grupo contadores-de-historias:

# cat /etc/group | grep contadores-de-historias
informações sobre o utilizador conthist-1

Permissão especial SUID

SUID significa definir ID do utilizador na execução. É um tipo especial de permissão de ficheiro que permite a um utilizador executar um programa com as permissões do proprietário do ficheiro, mesmo que o utilizador que executa o programa não tenha essas permissões. É o caso de um utilizador não root executar comandos com poderes como se fosse root do sistema. Isto pode ser útil para programas que precisam de aceder a recursos do sistema ou executar operações privilegiadas.

Pode-se ver se num determinado ficheiro foi aplicada a permissão especial SUID pela existência de um s na posição onde normalmente se encontra a permissão de executar x.

Ex: Ao invés de rwx aparece na forma rws.

SUID (Define ID do utilizador na execução), é uma permissão especial ao nível do utilizador.

Tabela nº 4 permissão especial 3755, veja nos bits de permissão a nível de utilizador no lugar onde normalmente existe um x se encontra um s
Permissões Descrição Output ls -l
3755 Com permissão especial setuid drws r-xr-x

Para alterarmos a permissão de um determinado ficheiro usamos o comando chmod (change mode) mais a permissão que queremos atribuir mais o nome do ficheiro. Neste caso estamos conferindo uma permissão especial 3 junto à permissão 775:

# chmod 3775 nome-do-arquivo

Podemos adicionar também o SUID desta forma:

# chmod u+s nome-do-arquivo

Analisemos o caso do executável passwd.

Neste executável foi aplicada uma permissão de execução especial como se pode verificar pela existência do s na posição onde normalmente se encontra o x no grupo de permissões do utilizador proprietário.

O ficheiro executável pertence ao utilizador root e também ao grupo root

A existência da permissão especial para execução permite com que um utilizador que não seja root do sistema possa alterar a sua palavra-passe mesmo não sendo root, graças ao Set User ID on Execution (SUID).

ls -l em /bin/passwd

Ao darmos o comando passwd, logo de imediato cria-se um novo processo, não precisa redefinir password, isto é só para teste. Abrimos um novo terminal para podermos aceder a esse processo para análise.

Utilização do comando passwd para exemplificação

Aqui podemos ver quem iniciou o processo, comando top, vemos que o processo com id=13605 foi iniciado pelo utilizador root.

Mostra o processo iniciado com o comando passwd usando o comando ps com a opção -ef, evidenciando o executor do processo como sendo o root

Uma forma mais directa de chegarmos a essa informação: comando ps -ef | grep passwd

Mostra o processo iniciado com o comando passwd usando o comando ps com a opção -ef, evidenciando o executor do processo como sendo o root

Vejamos o caso do executável sudo

Pode-se ver pelo comando abaixo onde listamos o ficheiro executável sudo, a existência de um s no espaço do bit correspondente a x no nível de acesso de utilizador. Corresponde à permissão padrão deste executável.

A existência desse s significa que neste executável foi aplicada a permissão especial de execução SUID e isto permite com que um utilizador não root possa correr comandos com os poderes de root.

Pelo output do comando, vemos também que o ficheiro sudo pertence ao utilizador root, bem como ao grupo root.

Podemos também ver que o utilizador administrador tem permissão para executar o ficheiro com poderes do utilizador root por ter sido aplicado o SUID. Isso normalmente é feito no momento da instalação do sistema.

Comando ls -l no Ficheiro executável sudo.

Também no momento da instalação do sistema é criado o grupo wheel e o utilizador administrador criado no momento da instalação é adicionado a este grupo.

Listando utilizadores pertencentes ao grupo wheel

Este utilizador de nome administrador pode executar comandos como root sem usar a password do super utilizador por se encontrar no grupo wheel.

Com isto podemos depreender que todo o utilizador que fizer parte do grupo wheel poderá também executar comandos com o mesmo poder do utilizador root, a não ser que sejam feitas algumas restrições.

Caso de estudo com o utilizador que acabamos de criar conthist-1

$ cat /etc/passwd | grep conthist-1

Vemos pela imagem extraída do /etc/passwd que o conthist-1 tem um UID=1005

Também um grupo com o mesmo nome do utilizador conthist-1 e com o GID=1005

$ grep conthist-1 /etc/group

Vemos pela imagem extraída do /etc/group que o conthist-1 pertence no momento a dois grupos:

Um grupo com o mesmo nome do utilizador conthist-1 e com o GID=1005

Também pertence ao grupo contadores-de-historias com o GID=1012

listando grupos referentes ao usuário conthist-1

Vamos fazer um teste?

  1. Vamos testar se o utilizador conthist-1 tem permissão para executar programas com poderes de root.
  2. Para testar vamos nos logar como conthist-1
  3. Vamos correr o comando $ sudo dnf update como conthist-1

Logamos como conthist-1

$ su - conthist-1

A mensagem que recebemos ao darmos o comando sudo dnf update é: conthist-1 is not in the sudoers file. Portanto, a execução do comando nos é negada.

Não temos até agora permissão de execução de programas como root.

logado como conthist-1

Agora vamos fazer o seguinte:

  1. Se o utilizador conthist-1 estiver ainda logado deverá terminar a sessão e logar de novo para que as alterações tenham efeito.
  2. Adicionamos o utilizador conthist-1 ao grupo wheel.
  3. Para testar vamos nos logar de novo como conthist-1
  4. Vamos correr o comando $ sudo dnf update como conthist-1

Vamos em primeiro lugar verificar quem se encontra no momento no grupo wheel:

cat /etc/group com grep em wheel

Vemos que o único utilizador que se encontra no grupo wheel até agora é o administrador.

Vamos adicionar o conthist-1 ao grupo wheel:

# usermod -aG wheel conthist-1
Adicionando o conthist-1 ao grupo wheel

Nova verificação de quem se encontra no grupo wheel:

Nova verificação de quem se encontra no grupo wheel após termos adicionado o desenvolvedor-1

Pode-se ver que o conthist-1 já se encontra no grupo wheel e agora vamos logar de novo como conthist-1

Agora o conthist-1 vai tentar atualizar o sistema:

O utilizador conthist-1 já pode correr o comandos com poder de root.

Como vemos, o utilizador conthist-1 já consegue executar comandos com poderes de utilizador root sem que seja necessária a palavra-passe do root.

Isto acontece porque o conthist-1 ao correr o comando sudo, o seu UID passa a ser temporariamente o UID do utilizador root que é o dono do ficheiro sudo e desse modo o conthist-1 consegue executar comando com os poderes do dono do ficheiro.

Comando ls -l no Ficheiro executável sudo.

Se quisermos remover o utilizador conthist-1 do grupo wheel fazemos assim:

Removendo o utilizador conthist-1 do grupo wheel

Permissão especial SGID

SGID é um bit de permissão especial que pode ser definido nos grupos. Quando definimos o SGID num ficheiro executável, ele permite que o utilizador execute o ficheiro com as mesmas permissões do grupo. A permissão SGID funciona como a permissão SUID, a única diferença é que o SGID é definido no grupo.

O SGID permite que um ficheiro seja criado com a propriedade de grupo do proprietário do ficheiro. Isto geralmente é usado para diretórios partilhados, que são diretórios criados com a intenção de facultar a permissão de escrita para todos os membros do grupo.

SGID significa definir ID do grupo na execução, quer isto dizer que sendo um utilizador não proprietário do ficheiro, durante o período de execução passa a ser o proprietário até ao final da execução, o GID do utilizador que executa o ficheiro passa a ser durante a execução o GID do grupo proprietário.

Tabela nº 5 permissão 755 caso com setgid
Permissões Descrição Output ls -l
2755 Com permissão especial setgid drwxr-sr-x

Vamos fazer um teste?

Logamos no sistema como utilizador conthist-1 e criamos um diretório com o nome de contos-1

Pela imagem vemos que o diretório foi criado e tem como uid o conthist-1 e como grupo ou gid também o conthist-1

Aplicamos a permissão especial SGID ao diretório Historias.

# chmod g+s /home/Historias

Atenção agora ao s que aparece no espaço onde normalmente se encontra o x ao nível do grupo.

Esse s significa que a permissão especial SGID foi aplicada e que, de agora em diante, todo o diretório ou ficheiro criado por um elemento do grupo nesse diretório passará a ter o GID do grupo.

O utilizador conthist-1 cria uma nova pasta desta vez com o nome de contos-2. Agora podemos ver a diferença relativa ao grupo proprietário da pasta criada. Tem como utilizador proprietário o conthist-1, mas o grupo proprietário já não é conthist-1 como antes, mas sim o grupo proprietário do diretório Historias, que é o grupo contadores-de-historias, pelo que se pode verificar na imagem logo a seguir.

Permissão especial sticky bit

Sticky bit é uma permissão especial que se pode aplicar a ficheiros e diretórios no Linux com o objetivo de proteger ficheiros ou diretórios pertencentes a um determinado utilizador de serem apagados, renomeados ou editados por outro utilizador não proprietário dos mesmos. Esta permissão é muito útil quando aplicada a diretórios partilhados por vários utilizadores, pois permite que apenas o proprietário ou o utilizador root crie e edite ficheiros num determinado diretório.

O sticky bit permite ao grupo proprietário de um determinado diretório usufruir de privilégios especiais ao criar novos ficheiros ou diretórios dentro desse mesmo diretório.

Vejamos o caso do /tmp

Para prevenir que um utilizador apague acidentalmente ficheiros dos quais não é proprietário nesse diretório, foi aplicada a permissão especial sticky bit e, assim, só o dono do ficheiro ou o utilizador root têm permissão de apagar. O t minúsculo existente no final do bloco das permissões do /tmp indica que o sticky bit está definido.

O sticky bit é mais usado em diretórios partilhados.

O caso do /tmp e a respectiva permissão especial sticky bit

Vamos fazer um teste?

  1. Criaremos um novo utilizador, outro contador de histórias que terá o nome de utilizador de chist-1
  2. Adicionamos o utilizador chist-1 ao grupo contadores-de-historias
  3. O utilizador contador de histórias chist-1 quer ter uma pasta dentro do diretório Historias onde colocará as suas próprias histórias e cria uma pasta com o nome historia-1
  4. O utilizador chist-1 resolve apagar a pasta criada por conthist-1
  5. O administrador aplica a permissão especial sticky bit no diretório Histórias
  6. Como o utilizador chist-1 teve sucesso ao apagar o diretório criado por conthist-1, tenta apagar o outro diretório, o contos-2

Criamos mais um utilizador desta vez com o nome chist-1

Adicionamos o utilizador, chist-1 ao grupo contadores-de-historias

O utilizador chist-1 loga no sistema e cria o diretório historia-1 dentro do diretório Histórias

O utilizador chist-1 dá comando para apagar a pasta conto-1 criada por conthist-1 dentro do diretório Histórias e consegue apagar o diretório do outro utilizador.

O Administrador aplica a permissão especial Sticky bit no diretório Histórias

# chmod +t /home/Historias

Tendo o utilizador chist-1 tido sucesso ao apagar o diretório conto-1 criado por conthist-1, dá comando para apagar o outro diretório pertencente ao conthist-1, mas desta vez não consegue porque a permissão especial Sticky bit previne essa ação, pelo que se verifica pela mensagem: rm: impossível remover /home/Historias/conto-2: Operação não permitida

Falamos sobre permissões especiais SUID (Set User ID on Execution), SGID (Set Group ID on Execution) e Sticky bit. Falamos sobre forma simbólica e numérica de aplicação de permissões especiais, foram apresentados alguns exemplos que espero tenham servido de algum incentivo ao experimento.

Pessoalmente, acho o tema de permissões especiais no Linux muito interessante e oferece muitas possibilidades. Um leitor propôs-me este tema e, como já tinha feito dois posts neste blogue sobre permissões no Linux, achei esta proposta muito pertinente. Espero que você possa extrair algo de novo neste meu post.

Posts Relacionados:

Nota de Conclusão

Dominar as permissões especiais SUID, SGID e Sticky Bit eleva significativamente a capacidade de administração de sistemas Linux. A correta aplicação destas ferramentas permite otimizar a segurança, a colaboração e a integridade dos dados em ambientes complexos. Os exemplos práticos apresentados visam encorajar a experimentação e aprofundar a compreensão destas poderosas funcionalidades, essenciais para qualquer profissional que trabalhe com sistemas Linux.

Índice de conteúdo:

  1. Breve referência sobre Permissões
  2. Permissões especiais
  3. Permissão especial SUID
  4. Permissão especial SGID
  5. Permissão especial sticky bit

Teste seus conhecimentos!

Curioso para saber o quanto você absorveu sobre permissões especiais? Clique no botão abaixo para fazer um rápido quiz e desafie sua compreensão:

Documentação de apoio
  1. Red Hat Sysadmin
  2. Fedora Project Wiki
Contribuição especial do Google Bard com quem tive muitas conversas sobre o assunto e me ajudou a entender alguns conceitos.

Comentários

Mensagens populares deste blogue

Dominando o Comando history no Linux

Problemas com o Nome de Usuário? Aprenda a Renomeá-lo no Linux

Aliases no Linux: Domine a Linha de Comando com Praticidade e Eficiência