Entendendo as permissões especiais do Linux
Estava fazendo algumas alterações no meu sistema quando precisei alterar minha senha de usuário. Como estou utilizando um Linux, abri o terminal e digitei o comando para alterar a senha:
Um amigo, que compartilha meu computador, pediu para eu alterar a senha dele também. Só que quando executei o comando para alterar a senha recebi essa mensagem de erro:
Eu não consegui alterar a senha dele utilizando apenas o comando passwd
. Para isso, eu preciso utilizar o sudo
para executar o comando como superusuário:
Bem, faz sentido já que um usuário só pode alterar a própria senha e o superusuário tem todas as permissões no sistema, logo, pode alterar a senha de qualquer um.
Mas, mesmo assim, fui checar como estão as permissões deste programa. Então eu pedi para o Linux listar (ls
) para mim este arquivo com as informações sobre as permissões (-l
).
ls -l /usr/bin/passwd
Se olharmos as permissões deste arquivo veremos que tem uma letra diferente das que estamos habituados a olhar.
O que significa essa letra s
(-rws
)? Será que ela indica que o dono do arquivo é o superusuário (root
)?
Conhecendo o SUID
Se listarmos outros arquivos cujo o superusuário é o dono, vemos que essa letra não aparece.
Essa letra é chamada de SUID (Set User ID). Ela é uma propriedade para arquivos executáveis do sistema.
Quando um programa é executado, o dono deste processo é o usuário que executou o programa. Porém, com arquivos com a propriedade SUID, esse comportamento é um pouco diferente.
Quando executamos um arquivo com a propriedade SUID, o usuário dono do arquivo é também o usuário dono do processo em execução.
Isso faz sentido quando pensamos no comando passwd
. Apenas o superusuário tem permissão para editar o arquivo /etc/shadow
, que é o local onde ficam armazenadas as senhas atuais de cada usuário.
Então, quando executamos o passwd
, na verdade estamos executando o comando como superusuário, por isso, conseguimos alterar a senha do nosso próprio usuário.
Legal, mas se eu quiser criar um arquivo e atribuir nele o SUID?
Da mesma forma que atribuímos as permissões de leitura, escrita e execução, podemos atribuir a propriedade SUID.
Por exemplo, eu criei um script para atualizar o sistema operacional. Porém, não quero que qualquer usuário consiga executar este script pois apenas o superusuário pode atualizar o sistema. Então vamos colocar o SUID nesse script.
Primeiramente, veremos como estão as permissões desse nosso arquivo:
Nosso arquivo já está com todas as permissões necessárias para ser executado. Precisamos apenas adicionar (+
) a propriedade SUID para esse arquivo (u+s
).
Como estamos modificando as propriedades de uma arquivo, precisamos utilizar o sudo
, ou estar logado como superusuário.
sudo chmod u+s atualiza-sistema
Se listarmos as permissões do nosso arquivo agora, veremos que foi adicionado o s
, indicando que o arquivo contém a propriedade SUID.
Agora, sempre que alguém executar esse script, quem irá "executá-lo" na verdade é o superusuário, ou seja, este será o dono do processo.
Uma coisa legal de mencionar é que a propriedade SUID só tem efeito em arquivos executáveis. Isso não significa que não podemos atribuí-la em diretórios também. Se fizermos isso, ela apenas não terá efeito.
Além do script de atualizar o sistema, temos um script que prepara o ambiente de desenvolvimento. Esse script pertence ao grupo de desenvolvedores, portanto é legal que todos os desenvolvedores possam executar esse script.
A primeiro momento, podemos tentar usar o SUID, porém ela só e aplicada a usuários e não a grupos de usuários. Existe alguma propriedade que se aplica para grupos?
Conhecendo o SGID
Além do SUID, existe também uma opção para grupos. A SGID (Set Group ID). Ela tem o mesmo comportamento que a SUID, porém funciona com grupos.
Sempre que um programa que tiver a propriedade SGID for executado, o grupo dono daquele processo será o mesmo grupo dono do arquivo.
Da mesma forma que a propriedade SUID, os arquivos marcados com a propriedade SGID apresentam um s
nas permissões, porém na parte que corresponde ao grupo.
Então, podemos atribuir uma propriedade SGID nele para que quando ele for executado, o grupo de desenvolvimento seja o dono do processo.
O processo de atribuição é parecido com o da propriedade SUID, porém, ao invés de adicionarmos ao usuário, adicionamos ao grupo (g+s
).
sudo chmod g+s prepara-ambiente
Se listarmos as permissões, veremos que foi acrescentado um s
nas propriedades do grupo.
ls -l prepara-ambiente
A propriedade SGID, ao contrário da SUID, tem efeito sobre diretórios. Mas espera aí, tem como executar um diretório?
Quando colocamos a propriedade SGID em um diretório o que estamos dizendo é: Todos os arquivos e pastas criados dentro desse diretório pertencerão ao mesmo grupo do diretório em que foram criados.
Por exemplo, a equipe de desenvolvimento tem um diretório compartilhado com alguns arquivos.
Como o diretório está marcado com o SGID, todos os arquivos que forem criados dentro dele pertencerão ao grupo desenvolvedores.
Esse atributo é bem legal colocar em diretórios compartilhados, já que toda a equipe poderá criar arquivos e pastas que estarão acessíveis a todos aqueles que pertençam ao grupo.
Como todos do grupo podem mexer nos arquivos de um diretório compartilhado, e se um usuário excluir um arquivo pertencente a outro? Isto pode causar um problema, não é mesmo? Será que existe alguma maneira de resolver isso?
Apresentando o Stick Bit
O Stick Bit é outro tipo de propriedade que podemos atribuir a diretórios. Com essa propriedade ativada, apenas o dono do arquivo pode excluí-lo ou renomeá-lo.
Nosso diretório desenvolvedores, não tem essa propriedade. Para acrescentá-la, podemos dizer para o chmod
acrescentar o Stick Bit (+t
). Para quem acrescentaremos essa propriedade? Para o usuário dono, para o grupo dono, ou para os demais usuários?
Essa propriedade impede que os outros usuários apaguem arquivos que não lhe pertencem então, temos que aplicar essa propriedade aos outros usuários (o
). Mas antes vamos ver como estão as permissões:
sudo chmod o+t desenvolvedores/
Se pedirmos uma lista mostrando as permissões deste diretório, veremos que ele possui uma marcação t
indicando a propriedade Stick Bit:
Além de diretórios, a propriedade Stick Bit pode ser aplicada a arquivos executáveis. Os arquivos que contém essa propriedade, quando são executados, o sistema armazena uma imagem deles na memória (cache).
Dessa forma, sua execução será mais rápida da próxima vez.
Para saber mais
Além da forma simbólica, podemos também utilizar a forma octal para atribuir essas propriedades.
Na forma octal, a propriedade SUID tem valor 4
, a SGID valor 2
e a Stick Bit tem o valor 1
. Para utilizar essa forma, basta colocar esses valores antes das permissões padrões.
Por exemplo, se quisermos atribuir o SGID e o Stick Bit para o diretório desenvolvedores utilizando o modo octal, basta somar os números de suas formas octais (2 + 1):
sudo chown 3775 desenvolvedores/
As permissões e propriedades dos arquivos são muito importantes para quem quer administrar sistemas Linux. Uma das bases do sistema são as propriedades e permissões.
Aqui na Alura, temos uma carreira na certificação LPI Essentials. Nela você aprenderá sobre a filosofia open source, sobre arquivos e diretórios, sobre como buscar ajuda no sistema e muito mais.