segunda-feira, 7 de agosto de 2023

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 sobre a forma mais comum de atribuir permissões em Linux e de seguida abordaremos a forma de atribuir permissões especiais.

Breve referência sobre Permissões

Há duas formas principais de atribuir permissões, neste blog existem dois artigos que falam sobre isso. Caso seja do teu interesse, dê uma olhada.
  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 dizem-se em modo simbólica quando níveis de usuários e permissões são representados por letras.

A forma u g o para se referir ao nível de utilizador.
  • u - user, usuário
  • g - group, grupo
  • o - others, outros
A forma r w x para se referir à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 em Linux são numéricas quando usam a forma octal de representação de 0 a 7.

Na forma numérica as permissões são representadas por três dígitos, sendo que cada dígito da esquerda para a direita corresponde ao usuário, grupo e outros respectivamente. Ex: a permissão 755 dá permissão de leitura, escrita e execução para o usuário, para o grupo de usuários dá permissão de leitura e execução e para os outros a permissão de leitura e execução. A permissão 750 mantém as mesmas permissões para o usuário e para o grupo mas retira todas as permissões aos outros.

A forma 4 2 1 para se referir às permissões atribuídas a cada nível de utilizador. Pode-se criar permissões combinadas somando esses 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 usuário, grupo e outros e são uma forma de controlar o acesso a arquivos e directó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 usuário proprietário ao invés das permissões do usuário que o executa. Setuid funciona a nível de usuário e tem uma grande utilidade na execução de programas que requerem privilégios elevados, como o sudo.
  • Set Group ID (setgid) - pode ser também aplicada a um arquivo executável a nível do grupo proprietário e permite que um arquivo seja acessado com as permissões do grupo ao qual ele pertence ao invés das permissões do usuário que o acessa. Isso é útil para compartilhar arquivos entre usuários que fazem parte do mesmo grupo.
  • Sticky bit - impede que os usuários removam ou modifiquem arquivos em um diretório, a menos que tenham permissões de escrita no diretório. Isso é útil para proteger arquivos 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 em grupo de 4 dígitos, sendo que o primeiro corresponde à permissão especial, o segundo às permissões ao nível de usuário, 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 directó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 directório Historias criado em /home/
  5. Vamos criar um novo utilizador, um contador de histórias que terá conthist-1 como nome de usuário
  6. Vamos adicionar o usuário conthist-1 ao grupo contadores-de-historias

1 - Criamos o directório Historias

Criação do directório historias

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

UID e GID do directó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 - Atribuimos ao grupo contadores-de-historias a propriedade do directório Historias. Veja que antes o grupo proprietário era o group root.

UID e GID do directório Historias

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

5 - Criamos o usuário conthist-1

Criamos password para o usuário conthist-1

Verificamos a existência do usuário conthist-1

id conthis-1

UID e GID do usuário 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, analizemos esta imagem:

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

Pela imagem vemos que o usuário tem o nome de conthist-1, tem um UID=1005, este número é-lhe atribuido no momento em que o utilizador é criado, também este utilizador já pertence a um grupo com o mesmo nome de usuário (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 usuário nem também o nome do grupo do utilizador. Também o GID do usuário é criado pelo sistema no momento em que o usuário é 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 usuário conthist-1 ao grupo contadores-de-historias

Para adicionar o usuário ao grupo contadores-de-historias:

# usermod -aG contadors-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 usuário conthist-1

Permissão especial SUID

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

Pode-se ver se num determinado arquivo foi aplicado 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 usuário na execução), é uma permissão especial ao nível do usuário.

Tabela nº 4 permissão especial 3755, veja nos bits de permissão a nível de usuário 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 arquivo usamos o comando chmod (change mode) mais a permissão que queremos atribuir mais o nome do arquivo. 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 usuário proprietário.

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

A existência da permissão especial para execução permite com que um usuário 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 usuário 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 usuário. 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 usuário root bem assim como ao grupo root.

Podemos também ver que o usuário administrador tem permissão para executar o ficheiro com poderes do usuário 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 usuário administrador criado no momento da instalação é adicionado a este grupo.

Listando usuários pertencentes ao grupo wheel

Este usuário de nome administrador pode executar comando como root sem usar password do super usuário por se encontrar no grupo wheel.

Nisso podemos depreender que todo o usuário que fizer parte do grupo wheel poderá também executar comando com o mesmo poder do usuário root a não ser que sejam feitas agumas 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 usuário 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 usuário 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 usuário 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 serguinte:

  1. Se o usuário conthist-1 estiver ainda logado deverá terminar a sessão e logar de novo para que as alterações tenham efeito.
  2. Adicionamos o usuário 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 usuário 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 usuário conthist-1 já pode correr o comandos com poder de root.

Como vemos, o usuário conthist-1 já consegue executar comandos com poderes de usuário root sem que seja necessário 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 usuário 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 usuário conthist-1 do grupo wheel fazemos assim:

Removendo o usuário 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 em um arquivo executável, ele permite que o usuário execute o arquivo 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 arquivo seja criado com a propriedade de grupo do proprietário do arquivo. Isso geralmente é usado para diretórios compartilhados, 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 usuário não proprietário do arquivo, durante o período de execução passa a ser o proprietário até ao final da execução, o GID do usuário que executa o arquivo para 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 usuário conthist-1 e criamos um directório com o nome de contos-1

Pela imagem vemos que o directó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 directó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 directório ou ficheiro criado por um elemento do grupo nesse directório passará a ter o GID do grupo.

O usuário 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 usuário proprietário o conthist-1 mas o grupo proprietário já não é conthist-1 como antes, mas sim o grupo proprietário do directó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 directórios em Linux com o objetivo de proteger ficheiros ou directó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 directórios compartilhados por vários usuários, pois permite que apenas o proprietário ou o usuário root crie e edite arquivos em um determinado directório.

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

Vejamos o caso do /tmp

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

O sticky bit é mais usado em directórios compartilhados.

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

Criamos mais um usuário desta vez com o nome chist-1

Adicionamos o usuário, chist-1 ao grupo contadores-de-historias

O usuário chist-1 loga no sistema e cria o directório historia-1 dentro do directório Histórias

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

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

# chmod +t /home/Historias

Tendo o usuário chist-1 tido sucesso ao apagar o directório conto-1 criado por conthist-1, dá comando para apagar o outro directório pertencente ao conthist-1, mas desta vez não consegue porque a permissão especial Sticky bit previne essa acçã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 em Linux muito interessante e oferecem muitas possibilidades. Um leitor me propôs este tema e como já tinha feito dois posts neste blog sobre permissões em Linux, achei esta proposta muito pertinente. Espero que você possa extrair algo de novo neste meu post.

Posts Relacionados:

Í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
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.

Sem comentários:

Enviar um comentário