Compreender e Aplicar Permissões Especiais (SUID, SGID, Bit Sticky)
Neste passo, você explorará as permissões especiais no Linux: SUID (Set User ID), SGID (Set Group ID) e o Sticky Bit. Essas permissões fornecem um controle aprimorado sobre a execução de arquivos e o comportamento de diretórios.
As permissões especiais são representadas por um dígito adicional no modo de permissão octal, colocado antes dos três dígitos padrão (proprietário, grupo, outros).
- SUID (Set User ID):
- Valor octal: 4
- Efeito em arquivos: Quando um arquivo executável com SUID é executado, ele é executado com as permissões do proprietário do arquivo, não do usuário que o executou. Isso é comumente usado para programas que precisam de privilégios elevados para realizar certas tarefas, como o comando
passwd (que precisa escrever em /etc/shadow, um arquivo de propriedade do root).
- Na saída de
ls -l: Um s aparece no lugar da permissão x (executar) do proprietário. Se o proprietário não tiver permissão de execução, um S maiúsculo aparece.
- SGID (Set Group ID):
- Valor octal: 2
- Efeito em arquivos: Semelhante ao SUID, mas o executável é executado com as permissões do proprietário do grupo do arquivo.
- Efeito em diretórios: Arquivos e subdiretórios criados dentro de um diretório habilitado para SGID herdam a propriedade do grupo desse diretório, em vez do grupo primário do usuário que os criou. Isso é muito útil para diretórios compartilhados onde todos os arquivos devem pertencer a um grupo específico.
- Na saída de
ls -l: Um s aparece no lugar da permissão x (executar) do grupo. Se o grupo não tiver permissão de execução, um S maiúsculo aparece.
- Sticky Bit:
- Valor octal: 1
- Efeito em arquivos: Nenhum efeito.
- Efeito em diretórios: Os usuários podem criar arquivos no diretório, mas só podem excluir ou renomear arquivos que possuem. Isso impede que os usuários excluam ou movam arquivos de outros usuários em um diretório compartilhado (por exemplo,
/tmp).
- Na saída de
ls -l: Um t aparece no lugar da permissão x (executar) de outros. Se outros não tiverem permissão de execução, um T maiúsculo aparece.
Vamos demonstrar essas permissões especiais.
Exemplo SUID
Criaremos um programa C simples que tenta ler um arquivo restrito.
Primeiro, crie um arquivo que apenas o root pode ler:
sudo touch ~/project/secret_data.txt
sudo chmod 600 ~/project/secret_data.txt
sudo chown root:root ~/project/secret_data.txt
Verifique suas permissões:
ls -l ~/project/secret_data.txt
Saída:
-rw------- 1 root root 0 Jun 6 17:36 /home/labex/project/secret_data.txt
Agora, crie um programa C read_secret.c que tenta ler este arquivo:
nano ~/project/read_secret.c
Cole o seguinte código em read_secret.c:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
FILE *fp;
char buffer[256];
printf("Attempting to read /home/labex/project/secret_data.txt...\n");
fp = fopen("/home/labex/project/secret_data.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return 1;
}
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
printf("Successfully read file.\n");
return 0;
}
Salve e saia do nano (Ctrl+S, Ctrl+X).
Compile o programa:
gcc ~/project/read_secret.c -o ~/project/read_secret
Agora, tente executá-lo como labex:
~/project/read_secret
Você deve ver uma mensagem "Error opening file: Permission denied" (Erro ao abrir o arquivo: Permissão negada), pois labex não tem acesso de leitura a secret_data.txt.
Agora, vamos fazer com que read_secret seja de propriedade do root e definir o bit SUID.
sudo chown root:root ~/project/read_secret
sudo chmod u+s ~/project/read_secret
Verifique as permissões:
ls -l ~/project/read_secret
Saída:
-rwsr-xr-x 1 root root 17704 Jun 6 01:02 /home/labex/project/read_secret
Observe o s no conjunto de permissões do proprietário. Agora, execute o programa novamente como labex:
~/project/read_secret
Desta vez, ele deve ler o arquivo com sucesso (embora esteja vazio, então nenhum conteúdo será impresso, mas a mensagem "Successfully read file." (Arquivo lido com sucesso) indica sucesso). Isso ocorre porque o bit SUID fez com que o programa fosse executado com as permissões do root.
Exemplo SGID (em Diretório)
Vamos criar um diretório compartilhado e um novo grupo.
sudo groupadd shared_group
sudo mkdir ~/project/shared_dir
sudo chown labex:shared_group ~/project/shared_dir
sudo chmod 770 ~/project/shared_dir
Agora, defina o bit SGID em shared_dir:
sudo chmod g+s ~/project/shared_dir
Verifique as permissões:
ls -ld ~/project/shared_dir
Saída:
drwxrws--- 2 labex shared_group 6 Jun 6 01:02 /home/labex/project/shared_dir
Observe o s no conjunto de permissões do grupo.
Agora, crie um arquivo dentro de shared_dir:
touch ~/project/shared_dir/new_file.txt
Verifique a propriedade de new_file.txt:
ls -l ~/project/shared_dir/new_file.txt
Saída:
-rw-r--r-- 1 labex shared_group 0 Jun 6 01:02 /home/labex/project/shared_dir/new_file.txt
Embora o grupo primário de labex seja labex, o new_file.txt herdou a propriedade do grupo shared_group de shared_dir devido ao bit SGID.
Exemplo Sticky Bit
O diretório /tmp é um exemplo clássico de um diretório com o sticky bit definido. Vamos criar um diretório semelhante.
sudo mkdir ~/project/public_upload
sudo chmod 1777 ~/project/public_upload
O 1 em 1777 é o valor octal para o sticky bit. 777 concede permissões completas ao proprietário, grupo e outros.
Verifique as permissões:
ls -ld ~/project/public_upload
Saída:
drwxrwxrwt 2 root root 6 Jun 6 01:02 /home/labex/project/public_upload
Observe o t no conjunto de permissões de outros.
Agora, vamos simular outro usuário criando um arquivo neste diretório. Como só temos o usuário labex, criaremos um arquivo como labex e, em seguida, tentaremos excluí-lo após alterar sua propriedade para root (simulando outro usuário).
Crie um arquivo como labex:
touch ~/project/public_upload/labex_file.txt
Altere sua propriedade para root:
sudo chown root:root ~/project/public_upload/labex_file.txt
Agora, tente excluir labex_file.txt como labex:
rm ~/project/public_upload/labex_file.txt
Você verá um prompt perguntando se deseja remover o arquivo protegido contra gravação e, após confirmar com y, você receberá um erro "Operation not permitted" (Operação não permitida). Isso ocorre porque o sticky bit impede que os usuários excluam arquivos que não possuem dentro desse diretório, embora labex tenha permissão de gravação no diretório public_upload. Somente root ou o proprietário de labex_file.txt (root neste caso) pode excluí-lo.
Para limpar, você precisará de sudo para remover labex_file.txt:
sudo rm ~/project/public_upload/labex_file.txt
Limpeza
Remova os arquivos e diretórios criados e o usuário/grupo:
sudo rm -f ~/project/secret_data.txt ~/project/read_secret.c ~/project/read_secret
sudo rm -rf ~/project/shared_dir ~/project/public_upload
sudo groupdel shared_group