BOMBOLOM.COM

(linux) Introdução às Permissões do Linux

As permissões dos ficheiros e directorias são algo tão básico na administração de sistemas linux/unix que muitas vezes não são adequadamente discutidas e estudas. Sem querer escrever um tratado sobre o assunto, vou da forma mais sucinta e completa possível descrever os usos comuns do sistema de permissões e ownership.

Permissões

Se listarmos o conteúdo de uma directoria pode-nos aparecer qualquer coisa como:

$ ls -l
total 12
-rw-r--r-- 1 helder users    0 2007-09-20 19:31 a
-rw-r--r-- 1 helder users    0 2007-09-20 19:31 b
-rw-r--r-- 1 helder users    0 2007-09-20 19:31 c
drwxr-xr-x 2 helder users 4096 2007-09-20 19:31 C
drwxr-xr-x 2 helder users 4096 2007-09-20 19:31 D
drwxr-xr-x 2 helder users 4096 2007-09-20 19:31 E

Temos em cada coluna:
Permissões Links Utilizador Grupo Tamanho Data Modificação Nome do ficheiro
-rw-r--r--1helderusers02007-09-20 19:31a
-rw-r--r--1helderusers02007-09-20 19:31b

O campo das permissões é composto por 10 flags:
Grupo directoria Utilizador Grupo Outros
-rw-r--r--

O campo da directoria pode ter vários valores:

Uma directoria aparece:

drwxr-xr-x 2 helder users 4096 2007-09-20 19:31 E

E um ficheiro:

-rw-r--r-- 1 helder users    0 2007-09-20 19:31 c

Para este artigo apenas nos interessam os primeiros dois valores, isto é, sabermos quando temos uma directoria ou ficheiro.

Os bits do Utilizador são as permissões que se aplicam apenas ao utilizador dono do ficheiro e apenas a ele, neste caso as permissões são aplicadas ao utilizador "helder".

Os bits do Grupo são as permissões que se aplicam a todos os utilizadores que pertençam ao grupo do ficheiro, neste caso "users".

Finalmente o grupo de bits dos Outros identifica as permissões que se aplicam a todos os utilizadores que: i) não são o utilizador dono do ficheiro e ii) não pertencem ao grupo do ficheiro (dai "outros").

As permissões de cada grupo de links podem ser:
Leitura Escrita Execução
r w x
read write execute

Notar que se se tratar de uma directoria o bit de execução indica se o utilizador pode mudar para essa directoria.

Para além destes três grupos de bits, existe um quarto que não é representado da mesma forma, trata-se de um campo também de três bits:

Para encontrarmos os ficheiros que estão SUID ou SGID, pode-se usar o comando:

# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls -lg {} \;

Mudar Permissões

As permissões mudam-se com o comando chmod. A sintaxe do ficheiro na sua forma mais simples é:

chmod [OPÇÕES] [MODO] [FICHEIRO(S)]

O modo pode ser indicado da seguinte forma: [ugoa...][[+-=][rwxXstugo...]...][,...]. Trocando isto por miúdos temos que:

  1. Indicar que grupo de permissões estamos a mudar:
    • u - utilizador;
    • g - grupo;
    • o - outros;
    • a - todos os grupos de permissões (all).
  2. Indicar se queremos ligar ou desligar os bits das permissões:
    • + - ligar a permissão;
    • - - desligar a permissão;
    • = - fazer com que as permissões seguintes sejam únicas.

      Quando usamos '-' ou '+' vamos mudar apenas os bits indicados. Por exemplo se tivermos para as permissões do utilizador 'rwx' e com o chmod aplicarmos o modo 'u-x' o resultado final será 'rw-'. Se usarmos o '=' por exemplo com 'u=w', então se as permissões iniciais do utilizador fossem 'rwx' como no exemplo anterior, iriamos obter '-w-'.

  3. Indicar quais os bits de cada grupo que queremos mudar:
    • r - leitura (read);
    • w - escrita (write);
    • x - execução (execute);
    • s - ligar o SUID ou SGID conforme seja aplicado ao utilizador ou ao grupo;
    • t - ligar o Sticky bit, apenas tem efeito se aplicado ao grupo de bits dos outros;
    • u - atalho para as permissões do utilizador;
    • g - atalho para as permissões do grupo;
    • o - atalho para as permissões do outros;
    • X - ligar o bit de execução apenas se se tratar de uma directoria, ou se o ficheiro já for executável para o utilizador (é útil quando queremos dar permissão de execução de directoria recursivamente sem tornar os ficheiros normais executáveis).

Podemos ainda separar por virgulas vários modos.

Exemplos

Se tivermos o seguinte ficheiro:

$ ls -l 
-rw-r--r-- 1 helder teste     7 2007-09-20 20:57 TESTE

E considerando sempre que as permissões iniciais são as mostradas podemos:

Para mudar permissões recursivamente em várias directorias, pode-se usar a opção '-R', por exemplo:

$ chmod -R g+X ~/public_html

Permissões em Octal

O modo das permissões também pode ser indicado utilizando três ou quatros digitos em octal.

Para os grupos de bits do utilizador, grupo e outros o mapeamento é feito da seguinte forma:
Read
Ler
Write
Escrever
eXecute
eXecutar
Octal
0000
0011
0102
0113
1004
1015
1106
1117

Notar que o número '1' corresponde apenas a termos ligado o bit de execução, o '2' o bit de escrita e o '4' de leitura. Se fixarmos isto é fácil de ver que para termos um grupo com 'rw-' basta somar 4 + 2 = 6, ou se for 'r-x' então temos 4 + 1 = 5, ou 'rwx' 4 + 2 + 1 = 7!

Para o grupo do SUID, SGID e do sticky bit temos:
SUID SGID Sticky bit Octal
0000
0011
0102
0113
1004
1015
1106
1117

Para aplicar os modos usando esta notação temos de compor o número da seguinte forma:
SUID
SGID
Sticky bit
Utilizador Grupo Outros

Notar que este é um número em octal, assim se usarmos apenas um dígito, estamos a assumir que os outros três são nulos (zeros às esquerda...)

Exemplos:

Podemos dizer que este método é absoluto, enquanto que o anterior apenas muda os bits que indicarmos (se não utilizarmos a opção '='). Por outro lado, este método é seguramente mais compacto e fácil de compreender se as modificações que estamos a fazer nas permissões forem complicadas. Julgo que no fim de contas, utilizar uma forma ou outra depende da preferência de cada um...

A opção de recursividade '-R' continua válida usando esta forma de expressar o modo.

Não esquecer de consultar a página de documentação do 'chmod' com:

$ man chmod

Para ver todas as opções disponíveis.

Permissões por omissão

A shell que o utilizador está a usar define as permissões por omissão usadas em novos ficheiros e directorias.

Se estivermos a utilizar a 'Bourne-Again SHell' (bash), que é a usada por omissão na maior parte dos linuxes, podemos usar o comando interno 'umask' da shell para consultar as permissões por omissão:

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

Notar que o bit executável apenas é aplicado a directorias.

Se, por exemplo, não quisermos que os 'outros' tenham acesso a ficheiros criados por nós, basta fazer a umask:

$ umask u=rwx,g=rx,o=
$ touch T2
$ ls -l T2
-rw-r----- 1 helder helder 0 2007-09-20 23:46 T2

Este comando, deve ser incluído nos ficheiros de inicialização da shell (por exemplo no ~/.bashrc, ou ~/.profile, etc...), caso contrário a modificação da máscara perde-se quando fizermos logout da shell.

Como o nome do comando indica, o valor é uma máscara. Se invocarmos o comando, sem nenhum parâmetro, obtemos o valor da máscara em octal:

$ umask
0022

Para obtermos o modo dado por 'umask -S', temos de fazer um ou exclusivo binário. Por exemplo para um valor de 2 para a máscara, temos:

2 = 010
010 XOR 111 = 101 => rx (leitura e execução)

Ornership

A posse de um ficheiro é muito mais simples do que as permissões. Todos os ficheiros e directorias num sistema unix são possuídos por um dado utilizador e pertencem a um dado grupo. Já vimos como podemos determinar o utilizador e o grupo de um ficheiro ou directoria usando o comando 'ls -l'.

A cada utilizador está associado um UID (identificação de utilizador) e a cada grupo um GID, os UIDs e GIDs são simplesmente números definidos nos ficheiros /etc/passwd e /etc/group, respectivamente.

Por exemplo se fizermos:

$ grep sysadm /etc/passwd
sysadm:x:1001:1001:Administrador de Sistemas,,,:/home/sysadm:/bin/bash

Temos que o utilizador 'sysadm' tem como UID 1001, e como GID também 1001.

Este utilizador pertence aos grupos:

$ grep sysadm /etc/group
www-data:x:33:sysadm
sysadm:x:1001:
admin:x:1002:sysadm,director
ntadmin:x:1003:root,sysadm
secretariado:x:1004:sysadm,director,secretaria
tmp:x:1005:sysadm,director,secretaria

É claro que podemos obter toda esta informação fazendo simplesmente:

$ id sysadm
uid=1001(sysadm) gid=1001(sysadm) groups=1001(sysadm),33(www-data),1002(admin),1003(ntadmin),1004(secretariado),1005(tmp)

O utilizador 'sysadm' pode mudar o GID dos seus ficheiros para qualquer grupo de que faça parte, não pode no entanto, mudar nunca o UID. Apenas o utilizador 'root' o pode fazer.

Para mudar a ownership de ficheiros e directorias, usa-se o comando 'chown' com a sintaxe seguinte:

chown [OPÇÕES] [DONO][:[GRUPO]] FICHEIRO(S)...

Se indicarmos apenas o dono do ficheiro, o grupo mantém-se o mesmo. A opção a usar se quisermos mudar recursivamente é '-R'.

Se quisermos mudar apenas o grupo do ficheiro, deve-se usar o comando 'chgrp' com sintaxe idêntica à do 'chmod':

chgrp [OPÇÕES] [GRUPO] FICHEIRO(S)...

Exemplos

Notas

Podemos consultar toda a informação sobre um dado ficheiro usando o comando 'stat', por exemplo:

$ stat TESTE
  File: `TESTE'
  Size: 7               Blocks: 8          IO Block: 4096   regular file
Device: 309h/777d       Inode: 32663       Links: 1
Access: (0640/-rw-r-----)  Uid: ( 1000/  helder)   Gid: ( 1006/   teste)
Access: 2007-09-20 20:57:09.000000000 +0100
Modify: 2007-09-20 20:57:09.000000000 +0100
Change: 2007-09-20 22:54:09.000000000 +0100

Conclusão

O esquema de permissões dos unixes, apesar de simples, permite um grau de flexibilidade bastante grande. Podemos criar a partir destas primitivas esquemas de grande complexidade.

É claro que, sendo os unixes sistemas muito flexíveis, podemos, se disso tivermos necessidade, usar ainda esquemas de listas de controlo de acesso (ACLs), que permitem sistemas ainda mais refinados de permissões. No entanto, em regra, conseguimos implementar as políticas de acesso que quisermos usando apenas as permissões tradicionais.

22.09.2007 | Ler mais | Comentários | Tags ,

Voltar à Página principal | Made with PyBlosxom