Português do Brasil English
Devin no Facebook  Devin no Twitter  RSS do Site 
Linux    

Permissões


Comentários  14
Visualizações  
50,977

O que vocë precisa saber para controlar quem acessa o que no seu sistema Linux.

Permissões de Acesso

Todo arquivo ou diretório tem, além de seu nome e conteúdo, propriedades que restringem o seu uso. Como o Linux é um sistema operacional multi-usuário, arquivos e diretórios têm de pertencer à um certo usuário e grupo. O diretório /root por exemplo pertence ao usuário root e grupo root. Devido às permissões deste diretório, apenas o usuário dono (root) pode entrar e mexer nele.

Este tipo de funcionalidade é essencial em um sistema multi-usuário real. O comando ls -l mostra uma listagem detalhada dos arquivos do diretório atual e isso inclui suas permissões. Vejamos um exemplo:

$ ls -l
drwxr-xr-x 2 coletivo coletivo 4096 2008-08-29 13:35 apostila

Na parte do comando ls aprendemos que depois do primeiro caracter (tipo de arquivo), os próximos 9 caracteres são uma sequência de permissões. Podemos dizer que temos 3 variações de letras:

  • Letra r – leitura (read)
  • Letra w – escrita (write)
  • Letra x – execução (execute)

Estas três letras se encaixam em 3 campos:

{rwx}{rwx}{rwx}
  • Campo 1: Permissões do usuário dono
  • Campo 2: Permissões do grupo dono
  • Campo 3: Permissões para todos os outros

Sendo assim, o exemplo rwxrwxrwx significa literalmente: O usuário dono pode ler, escrever e executar o arquivo. O grupo dono pode ler, escrever e executar o arquivo. Todos os outros podem ler, escrever e executar o arquivo. Em outras palavras, todos podem fazer tudo no arquivo. O oposto disto seria a combinação “———”.

Vejamos agora o exemplo do diretório apostila:

drwxr-xr-x 2 coletivo coletivo 4096 2008-08-29 13:35 apostila

Neste caso, quando há um “-” no lugar da letra, significa que não há essa permissão. Então podemos ler a linha da seguinte forma: O usuário dono (coletivo) pode ler, escrever e executar. O grupo dono (coletivo) pode ler e executar, mas não pode escrever. Todos os outros podem ler e executar, mas não podem escrever.

Outro exemplo:

$ ls -l /dev/dsp
crw-rw---- 1 root audio 14, 3 2008-08-29 07:57 /dev/dsp

O arquivo /dev/dsp é do tipo “arquivo especial de caracter” (c). O usuário dono (root) pode ler e escrever neste arquivo, mas não pode executá-lo. O grupo dono (audio) pode ler e escrever no arquivo, mas não pode executá-lo. Os outros não podem ler, não podem escrever e nem executá-lo.

Um outro exemplo:

$ ls -l /dev/cdrom
lrwxrwxrwx 1 root root 3 2008-08-29 07:57 /dev/cdrom -> hda

A primeira letra indica que o arquivo /dev/cdrom é um link simbólico para /dev/hda. Isto quer dizer que as permissões estarão sempre rwxrwxrwx e o que vale na verdade são as permissões do arquivo hda:

$ ls -l /dev/hda
brw-rw---- 1 root cdrom 3, 0 2008-08-29 07:57 /dev/hda

Ou seja, tanto para o arquivo /dev/cdrom, quanto para o arquivo /dev/hda: O usuário dono (root) pode ler e escrever, mas não pode executar. O grupo dono (cdrom) pode ler e escrever, mas não pode executar. Todos os outros não podem ler, não podem escrever e nem executá-los.

Modificando os donos

Ao utilizar o ls -l, podemos ver o usuário dono e o grupo dono dos arquivos e diretórios. Se criarmos um arquivo com o usuário coletivo, o usuário dono e o grupo dono serão os do usuário coletivo. Podemos modificar quem é o dono do arquivo através dos comandos chown (change ownership – mudar o usuário dono) e chgrp (change group – mudar o grupo dono), lembrando que apenas o usuário root pode fazer isto.

Utilizando o comando chown para modificar usuário dono e grupo dono:

# ls -l
drwxr-xr-x  4 coletivo coletivo 4096 2008-08-29 13:35 coletivo
# chown root coletivo
# chgrp root coletivo
# ls -l
drwxr-xr-x  4 root  root    4096 2008-08-29 13:35 coletivo

Um jeito mais simples de fazer a mesma coisa, em um comando só, seria:

# chown root.root coletivo

O comando chown também modifica o grupo dono, especificado no comando através do grupo precedido por um ponto.

Modificando as permissões

Existem duas maneiras de se modificar as permissões com o comando chmod: a forma extendida e a forma octal. A modificação de permissões pode ser feita contanto que o usuário seja o dono do arquivo. Apenas o usuário root pode modificar as permissões de outros usuários.

Na forma extendida, especificamos u para usuário, g para grupo e o para outros. Exemplo:

$ chmod u=rw,g=rw,o= arquivo
$ ls -l arquivo
-rw-rw---- 1 coletivo coletivo 0 2008-08-29 14:14 arquivo

Desta forma especificamos que o usuário dono (coletivo) pode ler e escrever (u=rw), o grupo dono pode ler e escrever (g=rw) e os outros não podem fazer nada (o=). Podemos também utilizar ao invés do sinal “=”, os sinais de “+” e “-”, para atribuir permissões relativamente. Exemplo:

$ chmod o+r arquivo
$ ls -l arquivo
-rw-rw-r-- 1 coletivo coletivo 0 2008-08-29 14:14 arquivo

Ao invés de especificarmos cada campo (usuário, grupo, outros), pedimos ao chmod que adicionasse apenas a permissão de leitura para os outros (o+r). Agora vamos remover apenas o bit de escrita do grupo dono (g-r):

$ chmod g-w arquivo
$ ls -l arquivo
-rw-r--r-- 1 coletivo coletivo 0 2008-08-29 14:14 arquivo

A forma octal de representação das permissões, apesar de ser mais rápida, requer um pouco mais de raciocínio. Nesta forma, cada tipo de permissão (leitura, escrita e execução) é representado por um número, na seguinte ordem:

  • Número 1 – Execução
  • Número 2 – Escrita
  • Número 4 – Leitura

Pensando em forma binária, a soma dos números nos dará a combinação de atributos desejada. Por exemplo, o número 3 significa permissão de escrita e execução (1 + 2 = 3). O número 5 significa permissão de leitura e execução (1 + 4 = 5).

Sabendo disto, utilizamos 3 números junto ao comando chmod, cada um especificando os campos de usuário dono, grupo dono e outros:

$ chmod 755 arquivo
$ ls -l arquivo
-rwxr-xr-x 1 coletivo coletivo 0 2008-08-29 14:14 arquivo

O usuário dono (coletivo) pode ler, escrever e executar (1 + 2 + 4 = 7). O grupo dono (coletivo) pode ler e executar (1 + 4 = 5). Os outros podem ler e executar (1 + 4 = 5). Outro exemplo:

$ chmod 644 arquivo
$ ls -l arquivo
-rw-r--r-- 1 coletivo coletivo 0 2008-08-29 14:14 arquivo

O usuário dono (coletivo) pode ler e escrever (2 + 4 = 6). O grupo dono (coletivo) pode apenas ler (4). Os outros podem apenas ler (4). Outro exemplo:

$ chmod 600 arquivo
$ ls -l arquivo
-rw------- 1 coletivo coletivo 0 2008-08-29 14:14 arquivo

Apenas o usuário dono (coletivo) pode ler e escrever (2 + 4 = 6).

Bits especiais

Além das permissões de leitura, escrita e execução, temos também três outros bits especiais de permissões que podemos usar:

SUID

Quando utilizado em um arquivo, faz com que todo usuário que executar este arquivo se transforme no usuário dono do arquivo durante a execução. Isto quer dizer que se um programa estiver com permissão de root e com o SUID ativado, qualquer usuário ao executar este programa, terá privilégios de root.
Este tipo de permissão deve ser sempre evitado. Use apenas quando realmente precisar, pois se um programa do root tiver alguma falha de segurança e estiver com o SUID habilitado, qualquer usuário poderia se tornar o root e conseguir poder total no sistema.

Um exemplo de aplicação que possui (e precisa) de SUID é o /usr/bin/passwd: o comando que muda a senha dos usuários. O arquivo de usuários e senhas do sistema tem permissões para que apenas o root possa ler, mas se um usuário normal quiser mudar a sua senha diretamente, sem a intervenção do usuário root, como ele poderia ler e modificar o arquivo de senhas se as permissões não deixam?

Quando o usuário executa o /usr/bin/passwd, o comando está com permissão de SUID, então é como se o usuário virasse o root temporariamente e por isso ele poderá ler o arquivo de senhas. Neste caso, o usuário estaria limitado a fazer apenas o que o programa /usr/bin/passwd permite: mudar senhas.

Vejamos as permissões do exemplo:

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 30968 2008-04-02 20:57 /usr/bin/passwd

Podemos ver que há uma letra incomum nas permissões: o s. Quando o s está no campo de permissões ao usuário dono, quer dizer que está com SUID. Quando o s está minúsculo, indica que além do SUID, o programa também tem permissão de executável (x). Quando em maiúsculo, indica que apenas o SUID está ativo.

Adicionando e removendo o SUID de um arquivo:

$ ls -l arquivo
-rwxr-xr-x 1 coletivo coletivo 0 2008-08-30 12:42 arquivo
$ chmod u+s arquivo
$ ls -l arquivo
-rwsr-xr-x 1 coletivo coletivo 0 2008-08-30 12:42 arquivo
$ chmod u-s arquivo
$ ls -l arquivo
-rwxr-xr-x 1 coletivo coletivo 0 2008-08-30 12:42 arquivo

O SUID funciona apenas em executáveis, não funcionando em scripts shell. Em um script shell, o executável na verdade é o interpretador de comandos (a shell) e não o script. O SUID precisaria ser colocado na shell (o que não é nem um pouco recomendável).

SGID

Para arquivos, funciona como o SUID: quando executado por qualquer usuário, a execução acontece como se o grupo dono fosse o mesmo do arquivo, independente do usuário que estiver executando. Quando utilizado em diretórios, o SGID faz com que todos os arquivos criados tenham como grupo dono o grupo do diretório com o SGID. Isto é bastante usado em diretórios compartilhados.

Quando um arquivo ou diretório está com SGID, o ls -l irá mostrar a letra s (em maiúsculo ou minúsculo, que nem o SUID) na posição do campo do grupo.

Exemplo:

$ ls -ld apostila
drwxr-xr-x 2 coletivo coletivo 4096 2008-08-29 13:35 apostila
$ chmod g+s apostila
$ ls -ld apostila
drwxr-sr-x 2 coletivo coletivo 4096 2008-08-29 13:35 apostila
# cd apostila
# touch teste
# ls -l teste
-rw-r--r-- 1 root coletivo 0 2008-08-30 12:50 teste

Ao configurar o SGID no diretório apostila, o usuário coletivo forçou que qualquer usuário que criasse um arquivo dentro deste diretório o criaria como grupo-dono coletivo. Quando o root criou um arquivo vazio chamado teste, podemos ver que realmente o grupo deste arquivo ficou como coletivo.
O SGID, assim como o SUID, também não funciona diretamente em scripts, apenas em executáveis.

Sticky

Em tempos passados, quando aplicado em um arquivo, dizia ao sistema operacional que a execução deste arquivo não poderia utilizar a memória RAM do sistema, mas isto hoje em dia é completamente ignorado. Quando aplicado em um diretório, faz com que apenas o dono do arquivo e o dono do diretório possam remover o seu conteúdo. Isto é utilizado em diretórios temporários como o /tmp, onde qualquer pessoa pode criar arquivos, mas só podem remover seus próprios arquivos e não os dos outros usuários também.

O Sticky é representado pela letra t no terceiro campo de permissões: outros, no lugar do x. Exemplo:

$ ls -ld /tmp
drwxrwxrwt 11 root root 4096 2008-08-30 07:35 /tmp

Todos os usuários do sistema podem listar o conteúdo, criar, apagar arquivos e entrar no diretório. Porém, como existe o Sticky bit, estes usuários só poderão apagar seus próprios arquivos.

Forma Octal dos Bits Especiais

Vimos as formas extendidas de se configurar os bits especiais. Mas também há a forma octal, que funciona da mesma maneira que os bits de leitura, escrita e execução: cada bit é representado por um número e a soma destes números permite uma combinação de permissões especiais:

  • Número 1 – Sticky
  • Número 2 – SGID
  • Número 4 – SUID

O resultado destes números precedem os outros três números no comando chmod. Exemplo:

$ chmod 4755 arquivo
$ ls -l arquivo
-rwsr-xr-x 1 coletivo coletivo 0 2008-08-30 13:05 arquivo

Além das permissões normais (755), o SUID foi adicionado neste arquivo através do número 4.

$ chmod 6755 arquivo
$ ls -l arquivo
-rwsr-sr-x 1 coletivo coletivo 0 2008-08-30 13:05 arquivo

Os bits de SUID e SGID foram adicionados neste arquivo (2 + 4 = 6).

$ chmod 3755 apostila
$ ls -ld apostila
drwxr-sr-t 2 coletivo coletivo 4096 2008-08-30 13:05 apostila

Os bits de Sticky e SGID foram adicionados neste diretório (1 + 2 = 3).

Máscara padrão de permissões

Toda vez que criamos um arquivo, não precisamos configurar suas permissões. Esta característica é conhecida pela definição “umask”, a máscara de permissões. O umask é um comando e funciona especificando uma máscara de permissões tanto em uma forma extendida quanto na forma octal, parecido com o comportamento do comando chmod.

Por ser um comando da shell, o umask é definido nos scripts de inicialização dessa shell. No caso do bash, sabemos que o umask é geralmente definido no arquivo /etc/profile. Para visualizar a atual configuração do umask, digite:

$ umask
0022

Agora comece com os valores: 666 para arquivos e 777 para diretórios. O valor das permissões normais (leitura, escrita e execução) do umask subtrai destes valores. Então no caso da umask 0022, os arquivos terão permissão padrão 644 e os diretórios terão 755.

Outra forma mais fácil de entender é utilizando o parâmetro -S:

$ umask -S
u=rwx,g=rx,o=rx

Que significa 755, ou no caso de um arquivo, todos os números -1: 644.


Comentários  14
Visualizações  
50,977


TagsLeia também

Apaixonado por Linux e administração de sistemas. Viciado em Internet, servidores, e em passar conhecimento. Idealizador do Devin, tem como meta aprender e ensinar muito Linux, o que ele vem fazendo desde 1997 :-)


Leia também



Comentários

14 respostas para “Permissões”

  1. Marcelo Augusto Krau disse:

    gostei muito te todo este site …

    aki pude encontrar tudo que procurava..

    aconselho a todos que tiverem duvidas… olhar aki pois… aki tem tudo completo..

    vlw aee… abração!!!!

  2. Rafael F. Moreno disse:

    Muito bom, especialmente para leigos!

    Já adotei para usar em minha aula (com seus créditos, lógico!)

  3. Ricardo Miquinioty disse:

    Parabéns, muito bem explanado, muito útil para as aulas que estou tendo de Linux.

  4. Rafael disse:

    Nossa estou gostando muito do seu site. Como eu sou leigo em Linux… Isto está me ajudando demais….!!!

    Obrigado mesmo!

  5. Erico disse:

    Cara, parabéns!!!

    Muito boa sua explicação, detalhada e sem frescura, mostra exatamente aquilo que procuramos (nós que somos leigos em linux e nos aventuramos de vez em quando)!

    Já adicionei nos meus favoritos!!!

    Abraço

  6. Roni disse:

    Cara, show de bola!!! Parebens e obrigado mesmo pela explicacao

  7. Edu disse:

    Vixe, muito bom msm !!

    Tirou todas minhas dúvidas,,valews

  8. Alexandre disse:

    Muito boas as suas explicações, porém tenho uma dúvida a respeito do que acontece na rede do meu trabalho. Preciso que quando os usuários criarem seus arquivos nos pc's e forem coloca-los no diretórios de rede, esses arquivos não fiquem com o nome do usuário como dono e sim ficar EX:root:financeiro ao invéz de EX: alexandre:financeiro. Eu uso o SGID para manter o grupo, más não sei como resolver o problema para o dono.Pode me dar uma luz? Valeu.

  9. Marcio Carneiro disse:

    Preciso restaurar as permissões originais do Linux, pois acessei diretórios como e mudei algumas permissões.

    Você tem um script para fazer a recuperação das permissões originais?

    Obrigado

  10. Diego disse:

    Perfeito!!! melhor explicação que eu já vi!!

  11. Islan disse:

    Cara, muito obrigado mais uma vez, pois é a segunda vez que rodo toda a internet atras de uma solucao pros meus problemas que surgem, e sempre encontro aqui no teu site. muito obrigado mesmo….

  12. Hugo Luiz disse:

    Lest's go LPI

    Sete ta de parabéns!

  13. Luciano disse:

    Muito bom mesmo, parabéns !! já está nos favoritos como opção ao man, info , whatis, apropos, etc.. hahah

  14. Andre Franklin disse:

    Muito bom o artigo..parabens….

Deixe uma resposta