Os direitos de acesso

Dezembro 2016


Os direitos de acesso



Prefácio

O uso por usuários, grupos ou outros bem como as permissões acordadas depende de cada configuração, da estratégia de funcionamento estipulada pelo administrador de seu sistema e de suas necessidades.

Neste artigo você encontrará uma breve apresentação dos direitos que o sistema GNU/Linux utiliza bem como os comandos que o usuário pode acionar.

Generalidades

No sistema GNU/Linux tudo é arquivo, incluindo os arquivos especiais que designam os periféricos. Linux divide os arquivos em diversas categorias :

Os repertórios
Os arquivos ordinários, (programas, arquivos de configuração, arquivos de dados, etc...)
Os arquivos especiais (tipo bloco ou caráter)
O sistema do arquivo sob GNU/Linux é organizado em uma arborescência, sem a necessidade de mencionar o nome do disco ou da partição para ter acesso.

Os direitos

No sistema GNU/Linux, atribui-se direitos para três identidades à todos os arquivos :

O proprietário - é o usuário que criou o arquivo ou usuário que root designou como proprietário.
O grupo (que não é necessariamente o grupo do proprietário)
Os outros (que não fazem parte do grupo)
O comando ls -l nos permite exibir os direitos de um arquivo sob GNU/Linux.

Para cada identidade (veja acima), existem 3 direitos de aceso :


r - read (o direito de leitura)
w - write (o direito de escrita)
x - execute (o direito de executar)

A exibição dos direitos é representada por uma cadeia (corrente) de 9 caracteres, precedida de um caráter, representando um tipo de arquivo.

Estes 9 caracteres, agrupados 3 por 3 (rwx rwx rwx), definem os direitos das três identidades (proprietário, grupo e os outros).

Para cada direito existente tem uma letra r,w ou x (veja acima) e se um direito não existir utiliza-se o hífen (sem confundir com o primeiro hífen que significa - um arquivo regular).
Significação  Símbolo  Proprietário      Grupo     Outros  
______________________________________________________________________
Arquivo regular -
repertório d
periférico caráter c
periférico bloco b r w x r w x r w x
link simbólico l
tubo nomeado p
socket local s
______________________________________________________________________


Exemplo :

-rwxr-x---

O que significa :

que trata-se de um arquivo regular (o primeiro caráter é um hífen -)
que o proprietário tem todos os direitos (ReadWriteExecute então lerEscreverExecutar)
que os membros do grupo tem os direitos de Ler (o 1° caráter é r) e Executar (o 3° caráter é x), mas eles não tem o direito de Escrever (o 2° caráter é um hífen -)
que os outros não tem nenhum direito, nem de escrever, nem de ler, nem de execução (os três são caracteres hifens -)

Os direitos especiais

O Sticky bit

O Sticky bit é um direito cujo comportamento é diferente para os arquivos executáveis e para os repertórios. Ele corresponde à letra tou à número até 1000. Se os direitos de execução não são posicionados é a letra T que corresponde.

Os arquivos executáveis - o programa ficará na memória para execução posterior.

Os repertórios - sticky bit é posicionado em um repertório, somente o proprietário poderá suprimir os arquivos (é o caso dos repertórios /tmp e /var/tmp sob GNU/Linux)

Exemplo:
$ ls -l / | grep tmp;ls -l /var | grep tmp 
drwxrwxrwt 12 root root 1024 2006-07-22 14:18 tmp
drwxrwxrwt 4 root root 4096 2006-07-22 10:23 tmp
2 a afixagem dos direitos para /tmp et /var/tmp.
Note-se que o último caráter na suite dos 9 para os direitos é um t e não um x ou um hífen

Os direitos de endossar

SetUID et SetGID

Os direitos de endossar no GNU/Linux são representados pela:

letra s (se o direito x está posicionado)
letra S (se o direito x não está posicionado)

Numericamente, os direitos são representados da seguinte maneira:

4000 - para o endossar da identidade do proprietário
2000 - para o endossar da identidade do grupo

O comportamento dos direitos de endossar.


Para os arquivos programa ou executável

SUID = 4000 - o processo tem os direitos do proprietário do programa executado
SGID = 2000 - O processo tem os direitos do grupo do programa executado

Para os repertórios

SGID = 2000 - Os arquivos que se encontram no repertório pertencem ao grupo do repertório.

Os direitos de endossar são muito importantes para a segurança.

Ao invés de dar o acesso à um arquivo, dá-se o direito de acesso a um comando.
O kernel (ou nódulo), no momento da execução do comando endossa a identidade do proprietário ou do grupo do comando ao invés daquela do usuário que lançou o comando. Então o acesso ao arquivo se faz via o comando e não diretamente.

Quando um usuário se conecta em um sistema, ele detém 2 UID (UserIDentity) e 2 GID (GroupIDentity) : o real e o efetivo.


No momento da execução de um comando os UID e GID são os reais, os efetivos são atribuídos por pedido.

Os direitos de endossar não estão posicionados, então os UID e GID efetivos são idênticos aos UID e GID reais.

Se os direitos de endossar são posicionados então o UID e/ou GID efetivos são aqueles do comando. O que quer dizer que, os UID e GID efetivos são aqueles que controlam os direitos de acesso a um comando.

Para conhecer os arquivos com os direitos de endossar, do seu sistema, digite em um terminal o seguinte código:
# find / -perm -2000 -o -perm -4000 -exec ls -l {} \; 2>/dev/null
Um bom exemplo é o comando crontab. Este comando cria um arquivo no /var/spool/cron/crontabs para o utilizador que executa o comando crontab. O acesso ao repertório /var/spool/cront/crontabs é proibido aos utilizadores salvo ao root .
$ cd /var/spool/cron/crontabs/ 
bash: cd: /var/spool/cron/crontabs/: Permissão recusada
Quando o utilizador lança o comando crontab -e (arquivo para editar /var/spool/cron/crontabs/nom_user), o comando não se executa com o UID e GID real do utilizador mas com o UID e GID afetivo do root.
$ ls -l /usr/bin/crontab 
-rwxr-sr-x 1 root crontab 26872 2004-07-28 22:44 /usr/bin/crontab
Vê-se que o comando crontab é a propriedade do root e que ela faz parte do grupo crontab com o direito SGID.

E, como root, tem o direito de criar no /var/spool/cron/crontabs o arquivo será criado.
# ls -l /var/spool/cron/crontabs/lami20j 
-rw------- 1 lami20j crontab 225 2006-07-22 16:00 /var/spool/cron/crontabs/lami20j
Vê-se que o utilizador lami20j é o proprietário do arquivo e tem direitos de leitura e de escrita. Entretanto seria bom não fazê-lo diretamente.

Os comandos

chmod

O comando chmod (CHangeMODe) permite definir e de mudar os direitos de acesso de um arquivo ou um conjunto de arquivos. Entre os opções do comando chmod (que não são muitos ) vou citar somente dois:


v para verbose (exibição na saída standard STDOUT do resultado do comando)

R tratar os repertórios de maneira recursiva (aplicação do comando da arborescência inteira do repertório em questão)

Existem modos de utilização do comando chmod: de maneira literal e de maneira numérica.


A maneira literal

Se você leu atentamente até aqui, então já pode advinhar adivinhar a maneira literal.
Trata-se da utilização das letras que você já conhece, r, w e x para especificar os direitos desejados. A novidade é que trabalhar também com as letras para designar as identidades que nós falamos acima : o proprietário, o grupo e os outros.

chmod utiliza a notação seguinte :


u - para o proprietário (user)

g - para o grupo (group)

o - para os outros (other)

a - para todos (all)

Uma outra notação será utilizada para atribuir e/ou retirar direitos.


+ (mais) Para atribuir

- (menos) para retirar

= (igual) para fixar o acesso exato

Eis um pequeno esquema de construção para chmod
 identidade Operador Tipo acesso  
_____________________________________
u + r
chmod g - w
o = x
a
_____________________________________
Nós não poderemos imaginar todas as combinações possíveis, mesmo se isto pareça realizável visto o número pouco importante de operadores e dos direitos. O que explica as coisas, é antes o número de usuários, o número de arquivos e sua repartição no (s)disco(s) e não porque conhecemos o número, etc.

Por outro lado algumas regras ajudarão se você se decidir por utilizar o comando chmod.


Diversas identidades e tipos de acesso podem ser utilizados.
Ex: chmod go-wx arquivopara os membros do grupo (g) e os outros (o)retira-se (-) os direitos de escrita (r) e de execução (x).


Diversos conjuntos de operadores e tipos de acesso podem ser utilizados.

Ex : chmod o+r-w arquivo atribui-se o direito de leitura (r) mas retira-se o direito de escrita (w) para os outros (o).

As cadeias podem ser combinadas separando-sa por vírgulas.

Ex : chmod u+x,og-w arquivo atribui-se (+) o direito de execução (x) para o proprietário (u) e retira-se (-) os direitos de escrita para os membros do grupo (g) e os outros (o). Atenção!Não tem espaço entre as cadeias separadas por vírgulas.

Para aplicar o comando chmod em um repertório e seu conteúdo (sub-repertórios, arquivos) utiliza-se o comandochmod -R direitos Repertório


Dicas :

Quando a identidade é omitida, o valor a (todos) que será utilizado.

chmod -R +w repertório

O tipo de acesso pode ser omitido se o sinal igual (=) é utilizado para suprimir todos os acessos.

chmod o= arquivo

A maneira numérica
   Proprietário   Grupo     Outros   
__________________________________________________________________
LeituraEscritaExe LeituraEscritaExe LeituraEscritaExe
__________________________________________________________________
400 200 100 40 20 10 4 2 1
Para compreender a utilização do chmod com a maneira numérica um exemplo será esclarecedor.

Exemplo : nós queremos estabelecer para um arquivo os seguintes direitos :

- proprietário

Leitura = escrita = execução = 400 + 200 +100 = 700

- grupo
Leitura + execução = 40 + 10 = 50
- Os outros
Leitura = execução = 4 + 1 = 5
Ao todo temos 700 + 50 + 5 = 755

Agora nós vamos utilizar o resultado obtido com o chmod.
chmod -v 0755 arquivo
ou
chmod 0755 arquivo, mas neste caso o resultado do comando não é afixado na saída standard

Pode-se escrever simplesmente chmod 755 arquivo

Eis aqui um pequeno assistente para calcular os direitos em octal

fr.selfhtml.org/petitsassistants/chmod.htm

Assim, o princípio não é complicado. Estabelecem-se os direitos desejados para cada identidade e faz-se a adição. Para o resto, o chmod se encarrega. Nós vimos assim a maneira numérica de utilizar o comando chmod, eu suponho que você tenha encontrado a resposta para uma questão que pode passar pela sua cabeça

Trata-se da atribuição dos direitos de endossamento dos direitos.

SUID SGID Sticky bit
__________________________
4000 2000 1000
__________________________
Para juntar um direito de endossamento, além dos direitos habituais, você deve inserir no cálculo o ou os direitos de endossamento que você necessitaria.

Tomemos o caso precedente 700 + 50 + 5 = 755. Para agregar o direito de endossamento do grupo escreve-se 2000 + 700 + 50 + 5 = 2755

Lembre-se! Trata-se dos direitos para um comando, o que quer dizer que o direito de execução deve ser posicionado.


Uma idéia é antes registrar os direitos existentes em um arquivo com ls -l ou ls -Rl e em seguida criar um scrip para este arquivo, mas isto complicaria as coisas e à bem da verdade eu nunca necessitei fazê-lo. Outra idéia seria a de salvar com tar para em seguida, no caso em que você perdesse seus direitos, voltar para a configuração de origem.

Em consequência antes de modificar os direito em um arquivo ou uma arborescência dê uma olhadela antes nos direitos já existentes.

umask

O comando umask permite definir os direitos por padrão de um arquivo ou repertório na sua criação. Ou indicar os direitos a retirar no momento de sua criação.

O comando umask, ao contrário do comando chmod (maneira numérica), tem como argumento 3 números, que desta vez representam os direitos que não queremos dar.

$ umask 0022 arquivo


Saaiba que a duração de vida do comando umsk é limitada à sessão shell em andamento.

Para uma duração permanente ver os arquivos de configuração de seu shell. Para o shell bash pode-se utilizar o arquivo ~/.bashrc

Pessoalmente eu não utilizei o comando umask. Fiz somente pequenos testes com o objetivo de compreensão do comando chmod.

A compreensão dos direitos para os arquivos em um sistema GNU/Linux é fortemente ligada à gestão dos utilizadores e grupos.

Além dos direitos que nós vimos acima, no sistema GNU/Linux encontra-se também ACLs (Access Control List) que permitem dar direitos suplementares que nós detalharemos em outro thread. O [/faq/3773-securite-les-access-control-lists-acls securite os access control lists acls).

Tradução feita por Ana Spadari

Veja também :
Este documento, intitulado « Os direitos de acesso »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.