Manipulando Permissões em Linux com chmod

Uma das características que mais me impressionaram no Linux quando comecei a estudá-lo foi a capacidade de modificar as permissões de acesso a tudo no sistema.

Primeiro, por que achei genial poder customizar cada arquivo do meu sistema operacional com as permissões que eu quisesse e, segundo, porque minha maior queixa no Windows era a impossibilidade de ocultar arquivos ou impedir o acesso a eles sem compactar com senha.

Embora eu já tenha um conhecimento razoável sobre como lidar com as permissões no Linux, encontrei um artigo excelente sobre o assunto quando eu procurava por informações sobre permissões SSUID.

O autor é o Roberto, administrador de redes do Paraná. Reproduzo seu artigo abaixo sem quaisquer alterações e o original pode ser encontrado aqui.


O controle de acesso em arquivos e diretórios é a segurança fundamental para qualquer sistema multi-usuário.

Os sistemas de arquivos nativos do Linux implementam controle de acesso utilizando algumas propriedades dos arquivos/diretórios.

Conteúdo:

1 – Lembrando como as permissões básicas funcionam:
2 – Permissões de Acesso Especiais:
3 – SUID ( Set User ID):
3.1 – Exemplo
3.2 – Comandos
4 – SGID ( Set Group ID ):
4.1 – Exemplo
4.2 – Comandos
5 – Sticky ( Sticky bit):
5.1 – Exemplo
5.2 – Comandos

Obs.: Neste e em outros artigos que eu escrevi a formatação do texto possui os seguintes significados:

– O texto em Negrito assume que se trata de um comando que deve ser digitado.
– O texto em Itálico significa que é a saída de um comando ou conteúdo de um arquivo.
– O “>>>” significa que você deve digitar no interpretador do Python.
– O “#” significa que o comando dever ser executado como usuário “root”.
– O “$” significa que o comando deve ser executado como usuário sem privilégios.

1 – Lembrando como as permissões básicas funcionam:

No Linux há três modelos de controle de acesso básicos: Read, Write e Execution.

Veja um exemplo de permissão básica na figura abaixo:

Permissões Básicas

O Tipo do Objeto significa:

d => diretório
b => arquivo de bloco
c => arquivo especial de caractere
p => canal
s => socket
– => arquivo normal

Já os outros caracteres significam:

r => significa permissão de leitura (read);
w => significa permissão de gravação (write);
x => significa permissão de execução (execution);
– => significa permissão desabilitada.

Explicando um pouco mais:

Leitura (r):
Em arquivos, permite examinar o conteúdo do arquivo.
Em diretórios permite listar conteúdo do diretório.

Escrita (w):
Em arquivos, permite escrever, remover e alterar o arquivo.
Em diretórios, permite criar e remover arquivos dentro do diretório.

Execução (x):
Em arquivos, permite executar um arquivo como um programa.
Em diretório, permite ler e escrever em arquivos dentro do diretório.

Sendo que os três primeiros rwx primeiros pertencem ao Dono do arquivo, e os outros três rwx pertencem ao Grupo e por fim os últimos três rwx pertencem há outros usuários que não fazem parte do grupo.

2 – Permissões de Acesso Especiais:

Mas somente as três permissões básicas (rwx), não dão toda flexibilidade para controlar acesso aos arquivos e diretórios.
Por isso o Linux tem mais três modelos especiais para controle de acesso, chamados suid (set user id), sgid (set group id) e Sticky (Sticky bit).

Veja um exemplo de permissão especial na figura abaixo:

Permissões Especiais

3 – SUID ( Set User ID):

A propriedade SUID é somente para arquivos executáveis e não tem efeito em diretórios.

Nas permissões básicas, o usuário que executou o programa é dono do processo.
Mas, em arquivo executável com a propriedade SUID aplicada, o programa rodará com o ID do dono do arquivo, não com o ID do usuário que executou o programa.
Normalmente o usuário dono do programa executável é também dono do processo sendo executado.
Ou seja, quando um arquivo/programa executável tem o controle de acesso SUID, ele é executado como se ele estivesse iniciado pelo dono do arquivo/programa.

A permissão de acesso especial SUID pode aparecer somente no campo Dono.

3.1 – Exemplo:

Um exemplo para arquivo executável com a propriedade SUID é o arquivo /usr/bin/passwd.
Ou seja, quando executamos o comando passwd com qualquer usuário normal, o processo é executado com ID do usuário root ( como se o usuário root tivesse executado o comando passwd), pois somente o usuário root tem permissão para alterar o arquivo /etc/passwd.

# ls -lah /usr/bin/passwd
-rwsr-xr-x 1 root root 27K 2006-04-03 10:37 /usr/bin/passwd

3.2 – Comandos:

– Aplicando SUID:

Aplicando a propriedade SUID em um arquivo executável utilizando formato simbólico (s):

# chmod u+s programa.sh
# ls -lah programa.sh
-rwsr-xr-x 1 root roberto 0 2006-09-26 22:57 programa.sh

Aplicando a propriedade SUID em um arquivo executável utilizando formato octal (4):

# chmod 4750 programa.sh
# ls -lah programa.sh
-rwsr-x— 1 root roberto 0 2006-09-26 22:57 programa.sh

– Retirando SUID:

# chmod u-s programa.sh
# ls -lah programa.sh
-rwxr-x— 1 root roberto 0 2006-09-26 22:57 programa.sh

– Procurando SUID:

Procurando a propriedade SUID em um arquivo executável utilizando formato simbólico (s):

# find /home/roberto -perm u=s
/home/roberto/programa.sh

Procurando a propriedade SUID em um arquivo executável utilizando formato octal (4):

# find /home/roberto -perm -4000
/home/roberto/programa.sh

4 – SGID ( Set Group ID ):

A propriedade SGID tem a mesma função que o SUID para arquivos executáveis.
Mas, a propriedade SGID tem um efeito especial para os diretórios.

Quando SGID é aplicado em um diretório, os novos arquivos que são criados dentro do diretório assumem o mesmo ID de Grupo do diretório com a propriedade SGID aplicado.

A permissão de acesso especial SGID pode aparecer somente no campo Grupo.

4.1 – Exemplo:

Se no diretório /home/roberto tem o grupo casa e tem o SGID habilitado, então todos os arquivos dentro do diretório /home/roberto serão criados com o grupo casa.
Esta é um importante atributo para um equipe, assumindo que todos os arquivos compartinhados devem ter o mesmo grupo.

4.2 – Comandos:

– Aplicando SGID:

Aplicando a propriedade SGID em um diretório executável utilizando formato simbólico (s):

# chmod g+s /home/equipe
# ls -lah /home/equipe
total 0
drwxr-sr-x 2 roberto equipe 48 2006-09-26 23:21 .

Aplicando a propriedade SGID em um diretório executável utilizando formato octal (2):

# chmod 2750 /home/equipe
# ls -lah /home/equipe
total 0
drwxr-s— 2 roberto equipe 48 2006-09-26 23:21 .

– Retirando SGID:

# chmod g-s /home/equipe
# ls -lah /home/equipe
total 0
drwxr-xr-x 2 roberto equipe 48 2006-09-26 23:21 .

– Procurando SGID:

Procurando a propriedade SGID em um diretório executável utilizando formato simbólico (s):

# find /home -perm /g=s
/home/equipe

Procurando a propriedade SUID em um diretório executável utilizando formato octal (2):

# find /home -perm -2000
/home/equipe

5 – Sticky ( Sticky bit):

Em arquivos executáveis, a propriedade Sticky faz com que o sistema mantenha uma imagem do programa em memória depois que o programa finalizar.
Esta capacidade aumenta o desempenho, pois será feito um cache do programa para a memória, e da próxima vez que ele for executado, será carregado mais rápido.

Em diretórios, a propriedade Sticky impede que outros usuários deletem ou renomeam arquivos dos quais não são donos.
Isso normalmente é utilizado para aumentar a segurança, pois o diretório estará em modo append-only ( somente incremente )
Sendo assim, somente o usuário que é Dono do arquivo, poderá deletar ou renomear os arquivos dentro de um diretório com a propriedade Sticky aplicada.

A permissão especial Sticky, pode ser especificada somente no campo outros usuários das permissões de acesso.

5.1 – Exemplo:

No diretório /tmp, todos os usuários devem ter acesso para que seus programas possam criar os arquivos temporários, mas nenhum pode apagar arquivos dos outros.
Então é interessante aplicar a propriedade Sticky no diretório /tmp.

5.2 – Comandos:

– Aplicando Sticky:

Aplicando a propriedade Sticky em um arquivo executável utilizando formato octal (1)

# chmod 1750 programa_pesado.sh
# ls -lah programa_pesado.sh
-rwxr-x–T 1 root root 2,9M 2006-09-26 23:51 programa_pesado.sh

Aplicando a propriedade Sticky em um arquivo executável utilizando formato simbólico (t):

# chmod o+t programa_pesado.sh
# ls -lah programa_pesado.sh
-rwxr-x–T 1 root root 2,9M 2006-09-26 23:51 programa_pesado.sh

Aplicando a propriedade Sticky em um diretório utilizando formato simbólico (t):

# chmod o+t /tmp
# ls -lah /tmp
total 5,0K
drwxrwxrwt 8 root root 264 2006-09-26 23:22 .

Aplicando a propriedade Sticky em um diretório utilizando formato octal (1):

# chmod 1777 /tmp
# ls -lah /tmp
total 5,0K
drwxrwxrwt 8 root root 264 2006-09-26 23:22 .

– Retirando Sticky:

# chmod o-t /tmp
# ls -lah /tmp
total 5,0K
drwxrwxrwx 8 root root 264 2006-09-26 23:22 .

– Procurando Sticky:

Aplicando a propriedade Sticky em um diretório utilizando simbólico (t):

# find /home/roberto/ -perm /o=t
/home/roberto/programa_pesado.sh

Aplicando a propriedade Sticky em um diretório utilizando formato octal (1):

# find /home/roberto/ -perm -1000

/home/roberto/programa_pesado.sh


Uma fonte importante sobre o assunto é o Foca Linux e para ler especificamente sobre chmod, clique aqui.

Agradeço ao Roberto pelo artigo e recomendo que acessem seu blog, vale a pena.

É isso aí, abraço.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s