Permissão é um conceito importantíssimo, principalmente para garantir a segurança do sistema contra acessos indevidos a arquivos importantes. Será mostrado nesta seção como são definidas as permissões em um sistema Linux.
Todo arquivo do sistema pertence a um dono e a um grupo, podendo pertencer somente a um usuário ou fazer parte de um grupo de vários usuários. Estes dois parâmetros (dono do arquivo e grupo ao qual o arquivo pertence) é que determinam as permissões do arquivo, por quem o arquivo foi criado, que permissões foram dadas pelo dono, quem poderá acessá-lo e a forma de acesso de que irão dispor todos aqueles que fizerem operações com o arquivo, entre outros. Vamos descrever brevemente como interpretar estas informações.
No Linux a implementação de permissões é feita para três grupos de usuários. São esses grupos: o dono do arquivo[6], o grupo de trabalho ao qual o arquivo pertence e, finalmente, os demais usuários que não se encaixam nos dois grupos anteriores. Esses dados podem ser visualizados através do comando ls -l e modificado através dos comandos chown, que muda o dono do arquivo e também o seu grupo; o comando chgrp é usado para mudar apenas o grupo do arquivo[7].
Como os dados são tratados como arquivos, mesmo que sejam apenas indicadores para dispositivos (por exemplo, /dev/mouse), as permissões fazem com que se possa proibir determinado usuário ou grupo de usuários de acessar algum recurso específico da máquina, como por exemplo recursos de áudio ou o acesso a um drive de disquetes. No entanto, o superusuário pode acessar qualquer arquivo ou dispositivo, independente de suas permissões.
Quando um arquivo é criado ele recebe certos valores de propriedade, como o UID do dono (normalmente o criador do arquivo), o valor de propriedade do grupo GID (geralmente o grupo a que o dono pertence quando o arquivo é criado) e outros valores de permissão de acesso derivados dos valores associados ao valor umask do dono, no momento da criação. Estes valores umask são definidos geralmente no arquivo /etc/profile com os seguintes valores:
Para o superusuário:
# umask 022 |
Para os demais usuários do sistema:
# umask 002 |
A umask funciona retirando permissões, ou seja, a permissão padrão do sistema seria 666, mas com um valor de 022, no caso do superusuário, teríamos 644 (666-022=644), o que significa que quando um arquivo for criado pelo superusuário ele vai ter suas permissões inicias em -rw-r-r--, permitindo escrita e leitura para o dono do arquivo e somente leitura ao grupo ao qual ele pertence e para os demais usuários do sistema. Já no caso dos usuários comuns do sistema, todo arquivo iniciará sua vida com permissões 664 (666-002=664), o que significa leitura e escrita para o dono e para o grupo (no formato absoluto será -rw-rw-r--) e aos outros usuários do sistema permite apenas leitura.
Pode-se verificar, através do exemplo abaixo, que existem vários dados importantes utilizados para identificar as características de um arquivo. Veja o Exemplo 2.1. Informações Sobre um Arquivo:
Exemplo 2.1. Informações Sobre um Arquivo
$ ls -l teste -rw-rw-r-- 1 aluno projeto 71815 2004-04-02 15:52 teste |
O primeiro bit do campo -rw-rw-r-- determina o seu tipo, pois tudo em um sistema Linux é tratado como se fosse arquivo, incluindo os diretórios, links e dispositivos do sistema. Os principais tipos e seus significados são:
-: atributo de arquivo.
d: quando se trata de um diretório.
l: o arquivo é um link simbólico.
b: dispositivos de bloco.
c: dispositivos de caractere.
s: trata-se de um socket, atribuído para arquivos de comunicação e memória.
t: sticky bit.
Sticky bit é um bit utilizado tanto para arquivos como para diretórios no Linux. Se for habilitado para um arquivo executável, enviará uma mensagem para que o kernel mantenha o código carregado em uma área de troca[8], mesmo depois de terminada a execução do arquivo. Isto causa uma melhora de desempenho, pois caso o arquivo venha ser executado novamente, ele já estará na área de troca.
Se o sticky bit for habilitado em um diretório, um usuário não terá privilégios para renomear ou apagar arquivos de outros usuários neste diretório, somente terá acesso aos seus próprios documentos. Porém, se as permissões forem modificadas o usuário poderá ter acesso aos documentos de outros usuários também.
O restante do campo indica as permissões para cada grupo. Os tipos de permissões para arquivos são:
r: leitura (copiar, imprimir, visualizar).
w: escrita (mover, apagar, modificar).
x: execução (programas, scripts, diretórios).
-: sem permissão.
E para os diretórios:
r: permite que você liste o conteúdo do diretório.
w: permite que você crie, altere a apague arquivos no diretório.
x: permite que você efetue buscas no diretório.
-: sem permissões para o diretório.
Estas permissões podem ser aplicadas para:
u: o dono do arquivo (user).
g: um grupo de usuários ao qual o arquivo pertence (group).
o: todos os usuários que não estão incluídos em nenhuma das duas categorias anteriores (others ou outros).
a: as permissões para todos (u+g+o).
O campo com o número 1 pode ter dois significados. Se for um arquivo, este número indica quantos hard links estão sendo apontados para ele, e neste caso, existe apenas um só: o arquivo apontando para ele mesmo. Se for um diretório, indica quantos subdiretórios existem (incluindo o . e o ..). A seguir, os campos aluno e projeto mostram o nome do usuário e do grupo no qual o arquivo se encontra. Caso o usuário dono do arquivo ou o seu grupo não estejam adicionados ao sistema, serão visualizados os números de UID (User Identification) e GID (Group Identification) do arquivo.
Enfim, os últimos campos indicam o tamanho do arquivo, a data e o horário em que ele foi pela última vez modificado e o nome do arquivo.
O dono do arquivo tem total controle sobre todos os seus parâmetros a qualquer hora; se um usuário não for o dono do arquivo mas pertencer ao grupo, poderá acessá-lo mas não poderá restringir ou permitir acessos ao arquivo.
Se o usuário tem permissões de escrita no diretório e tentar apagar um arquivo que não tenha permissão de escrita, o sistema perguntará se ele confirma a exclusão do arquivo apesar do modo leitura. Caso tenha permissões de escrita no arquivo, o arquivo será apagado por padrão sem mostrar nenhuma mensagem de erro. Por outro lado, mesmo que se tenha permissões de escrita em um arquivo mas não se tenha permissões de escrita em um diretório, a exclusão do arquivo será negada.
Isto mostra que é levada mais em consideração a permissão de acesso do diretório do que as permissões dos arquivos e subdiretórios que ele contém. Esta característica é muitas vezes ignorada por muitas pessoas e expõe o sistema a riscos de segurança. Imagine o problema que algum usuário que não tenha permissão de escrita em um arquivo mas que a tenha no diretório pode causar em um sistema mal administrado.
Para modificar permissões em grupos e arquivos utiliza-se os comandos chown e chgrp. Observe o Exemplo 2.2. Mudando o Dono e o Grupo de um Arquivo:
Exemplo 2.2. Mudando o Dono e o Grupo de um Arquivo
$ l arquivo
-rw-rw-r-- dono grupo arquivo
$ chown prop arquivo
$ l arquivo
-rw-rw-r-- prop grupo arquivo
$ chgrp users arquivo
$ l arquivo
-rw-rw-r-- dono users arquivo
$ chown dono.grupo arquivo
$ l arquivo
-rw-rw-r-- dono grupo arquivo
O exemplo anterior é apenas fictício, mas observe a seqüência em que os comandos foram aplicados até restaurar o arquivo ao seu estado original. As mudanças aplicadas em diretórios também podem ser feitas recursivamente, ou seja, alterando todos os arquivos e diretórios contidos no diretório. Para isso, basta usar os comandos chown e chgrp com o parâmetro -R.
Além destas permissões, existe uma permissão especial que permite que usuários possam executar arquivos de outros donos, com as permissões destes últimos. É o chamado o suid bit[9]. Veja o Exemplo 2.3. Utilizando o SUID que mostra um exemplo de como o suid bit pode ser utilizado:
Com esta linha de comando, o arquivo teste.sh pode ser executado por qualquer usuário (parâmetro a - all), utilizando as permissões do dono do arquivo.
![]() | Nota |
|---|---|
Além da identificação do usuário para a execução de um arquivo, esta identificação pode ser configurada também para um grupo de usuários (SGID). Veja a página de manual do comando chmod para mais detalhes (man chmod). | |
Note, portanto, que o sistema Linux representa praticamente tudo na forma de arquivos, o que agiliza a localização e a manutenção de problemas, além de manter um padrão entre todas as distribuições Linux.