Permissões especiais em Linux: SUID - SGID - Sticky bit
Índice de conteúdo
- Breve referência sobre Permissões
- Permissões especiais
- Permissão especial SUID
- Permissão especial SGID
- 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
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.
- u - user, usuário
- g - group, grupo
- o - others, outros
- r - read, leitura
- w - write, escrita
- x - execute, execução
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.
- 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.
- 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.
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 |
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.
Permissões | Descrição | Output ls -l |
---|---|---|
0 | Sem nenhuma permissão especial | rwxr-xr-x |
4 | Com permissões especiais setgid e sticky bit | rwxr-sr-t |
2 | Com permissão especial setgid | rwxr-sr-x |
1 | Com permissão especial sticky bit | rwxr-xr-t |
3 | Com permissão especial setuid | rwsr-xr-x |
5 | Com permissões especiais setuid e sticky bit | rwsr-xr-t |
6 | Com permissões especiais setuid e setgid | rwsr-sr-x |
7 | Com permissões especiais suid, sgid e sticky bit | rwsr-sr-t |
- Vamos criar um diretório em /home/ com o nome de Historias
- Vamos alterar as permissões de 755 para 775, dando assim ao grupo também a permissão de escrita.
- Vamos criar um grupo de contadores de histórias que terá o nome contadores-de-historias
- Vamos tornar o grupo contadores-de-historias proprietário do diretório Historias criado em /home/
- Vamos criar um novo utilizador, um contador de histórias que terá conthist-1 como nome de utilizador
- Vamos adicionar o utilizador conthist-1 ao grupo contadores-de-historias
1 - Criamos o diretó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
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:
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
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
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.
Permissões | Descrição | Output ls -l |
---|---|---|
3 | Com permissão especial setuid | rws 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).
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.
Aqui podemos ver quem iniciou o processo, comando top, vemos que o processo com id=13605 foi iniciado pelo utilizador root.
Uma forma mais directa de chegarmos a essa informação: comando ps -ef | grep passwd
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.
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.
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
Vamos fazer um teste?
- Vamos testar se o utilizador conthist-1 tem permissão para executar programas com poderes de root.
- Para testar vamos nos logar como conthist-1
- 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.
Agora vamos fazer o seguinte:
- Se o utilizador conthist-1 estiver ainda logado deverá terminar a sessão e logar de novo para que as alterações tenham efeito.
- Adicionamos o utilizador conthist-1 ao grupo wheel.
- Para testar vamos nos logar de novo como conthist-1
- Vamos correr o comando
$ sudo dnf update
como conthist-1
Vamos em primeiro lugar verificar quem se encontra no momento no grupo 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
Nova verificação de quem se encontra no grupo wheel:
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:
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.
Se quisermos remover o utilizador conthist-1 do grupo wheel fazemos assim:
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.
Permissões | Descrição | Output ls -l |
---|---|---|
2 | Com permissão especial setgid | rwxr-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.
Vamos fazer um teste?
- Criaremos um novo utilizador, outro contador de histórias que terá o nome de utilizador de chist-1
- Adicionamos o utilizador chist-1 ao grupo contadores-de-historias
- 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
- O utilizador chist-1 resolve apagar a pasta criada por conthist-1
- O administrador aplica a permissão especial sticky bit no diretório Histórias
- 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.
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:
- Breve referência sobre Permissões
- Permissões especiais
- Permissão especial SUID
- Permissão especial SGID
- 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:
Comentários
Enviar um comentário