UNIX: Permissões de acesso em arquivos
Definições básicas
O UNIX possui um sistema de controle de acesso ao sistema de arquivos seguindo o paradigma de Listas de Controle de Acesso (ACL - Access Control Lists). A cada arquivo ou diretório são associados:
- Um usuário proprietário (owner). Normalmente é quem criou o arquivo.
- Um grupo proprietário. Normalmente é o grupo primário de quem criou o arquivo, mas este pode mudá-lo para outro grupo do qual ele também faça parte.
- Permissões de acesso definidas para o usuário, o grupo e outros usuários (terceiros).
As permissões definidas para os arquivos são:
- Leitura, permitindo acesso ao conteúdo do arquivo.
- Escrita, permitindo modificar o conteúdo do arquivo.
- Execução, permitindo executar o arquivo (caso seja um executável ou script).
As permissões definidas para os diretórios são similares:
- Leitura, permitindo acesso ao conteúdo do diretório (listar os arquivos presentes).
- Escrita, permitindo modificar o conteúdo do diretório (criar ou apagar arquivos).
- Execução, permitindo entrar no diretório, ou atravessá-lo.
Pode-se afirmar que um arquivo é protegido contra leituras ou modificações por suas próprias permissões, e contra apagamentos ou renomeações pelas permissões do diretório onde ele se encontra.
Consultando permissões
As permissões de acesso a arquivos e diretórios podem ser consultadas através de uma listagem de diretório longa, usando o comando ls -l
(ou seu alias ll
). Uma listagem típica seria:
-rw-r--r-- 1 maziero users 4068 mar 26 21:09 02.html drwx------ 5 maziero users 1024 set 5 1998 Desktop/ drwx------ 4 maziero users 1024 jan 26 1998 administ/ drwxr-xr-x 2 maziero users 1024 set 13 1998 axhome/ drwx------ 2 maziero users 1024 set 7 1998 bin/ -rw-r----- 1 maziero users 4956 mar 26 20:34 descricao.html drwx------ 11 maziero users 1024 jan 14 10:52 diversos/ drwx------ 2 maziero users 1024 jan 26 1998 ensino/ drwx------ 2 maziero users 1024 jan 26 1998 extensao/ drwx------ 3 maziero users 1024 mar 8 1998 formacao/ drwx------ 4 maziero users 13312 fev 23 20:49 icons/ drwx------ 2 maziero users 1024 ago 5 1998 mail/ drwx------ 2 maziero users 1024 jul 3 1998 nsmail/ drwx------ 2 maziero users 1024 out 13 19:22 pesquisa/ drwx------ 8 maziero users 1024 nov 24 1997 public_html/ drwx------ 10 maziero users 1024 mar 25 21:28 raytrace/ drwx------ 3 maziero users 1024 set 28 23:03 sistema/ drwxr-xr-x 3 maziero users 1024 mar 26 21:07 testes/ drwx------ 5 maziero users 1024 out 17 1997 tex/ -rw------- 1 maziero users 9718 ago 2 1998 wood.gif
Vamos analisar melhor os caracteres das colunas iniciais da listagem de diretório apresentada acima.
As entradas de diretório em um sistema UNIX têm seu tipo indicado pelo primeiro caractere da listagem de diretório longa. Os tipos de entradas mais frequentes são:
-
: arquivo normald
: diretóriol
: link simbólico (atalho)b
: dispositivo (mapeado em/dev/
) orientado a blocos (como os discos rígidos)c
: dispositivo (mapeado em/dev/
) orientado a caracteres (como modems e portas seriais)s
: socket mapeado em arquivo (para comunicação entre processos)p
: FIFO ou Named Pipe (outro meio de comunicação entre processos)
Os demais caracteres representam os direitos de acesso do usuário (user), do grupo (group) e de terceiros (others), em grupos de três caracteres:
r
: permissão de leitura (read).w
: permissão de escrita (write).x
: permissão de execução (eXecute).-
: indica que o respectivo direito está negado.s
: bits SUID e SGID setados (veremos mais tarde).
Vejamos um exemplo:
-rw-r----- 1 maziero users 4956 mar 26 20:34 descricao.html
A linha de listagem acima indica que:
- A entrada corresponde a um arquivo normal (o primeiro caractere é
-
). - O proprietário do arquivo
descricao.html
é o usuáriomaziero
. - O proprietário possui direito de leitura e escrita sobre o arquivo, mas não de execução.
- O arquivo também pertence ao grupo
users
. - O grupo possui apenas direito de leitura sobre o arquivo.
- Outros usuários (terceiros) não possuem nenhum direito de acesso ao arquivo.
O comando chmod
Este comando permite alterar as permissões dos arquivos e diretórios. Somente o proprietário de um arquivo pode alterar suas permissões, mesmo que o grupo ou outros possuam direitos de escrita sobre o arquivo. O comando chmod tem a seguinte sintaxe:
chmod
[opções] permissões arquivo(s)
A definição das permissões pode ser feita de forma simbólica ou octal. A forma simbólica é a mais simples e por isso a mais usada por debutantes. A forma octal é no entanto mais empregada, sobretudo em scripts antigos. Neste texto vamos nos restringir à forma simbólica. As permissões na forma simbólica têm a seguinte sintaxe:
[u g o a] [+ - =] [r w x u g o X]
As letras do primeiro grupo indicam de quem as permissões devem ser alteradas:
u
: o usuário, proprietário do arquivo.g
: o grupo proprietário do arquivo.o
: outros (terceiros)a
: todos (all)
Os símbolos do segundo grupo indicam como os direitos devem ser alterados:
+
: os direitos indicados devem ser adicionados-
: os direitos indicados devem ser suprimidos=
: os direitos devem ser ajustados ao valor indicado
Finalmente, as letras do terceiro grupo indicam que permissões devem ser alteradas:
r
: permissão de leituraw
: permissão de escritax
: permissão de execução (ou acesso ao diretório)X
: permissão de execução, caso algum membro (u
,g
,o
) já a possuau
: usar as permissões já atribuídas ao usuário proprietáriog
: usar as permissões já atribuídas ao grupo proprietárioo
: usar as permissões já atribuídas a outros
Vejamos alguns exemplos:
chmod o-w *.c
: retira de terceiros a permissão de escrita sobre todos os arquivos C no diretório corrente.
$ ls -l -rw-rw-rw- 1 maziero prof 523 Mar 27 08:51 main.c -rwxrwxrwx 1 maziero prof 2321 Mar 25 09:37 funct.c $ chmod o-w *.c $ ls -l -rw-rw-r-- 1 maziero prof 523 Mar 27 08:51 main.c -rwxrwxr-x 1 maziero prof 2321 Mar 25 09:37 funct.c
chmod go-rwx ~/*
: retira do grupo e de terceiros todas as permissões (leitura, escrita, execução) sobre todos os arquivos do diretóriohome
.
$ ls -l -rw-rw-rw- 1 maziero prof 523 Mar 27 08:51 main.c -rwxrwxrwx 1 maziero prof 2321 Mar 25 09:37 funct.c -rw-r--r-- 1 maziero prof 75643 Mar 27 08:56 main.o $ chmod go-rwx ~/* $ ls -l -rw------- 1 maziero prof 523 Mar 27 08:51 main.c -rwx------ 1 maziero prof 2321 Mar 25 09:37 funct.c -rw------- 1 maziero prof 75643 Mar 27 08:56 main.o
chmod u+w,go=r *.txt
: dá ao usuário permissão de escrita e ajusta ao grupo e outros somente permissão de leitura sobre os arquivos*.txt
do diretório corrente. Observe que as permissões podem ser agrupadas usando vírgulas:
$ ls -l -r--rw-rw- 1 maziero prof 2386 Mar 27 08:51 readme.txt -rwxrwxrw- 1 maziero prof 12875 Mar 25 09:37 instal.txt $ chmod u+w,go=r *.txt $ ls -l -rw-r--r-- 1 maziero prof 2386 Mar 27 08:51 readme.txt -rwxr--r-- 1 maziero prof 12875 Mar 25 09:37 instal.txt
O comando chmod
possui uma opção interessante (-R
), que permite atribuir permissões de maneira recursiva, ou seja, nos conteúdos dos subdiretórios. Assim, a melhor maneira de proteger seu diretório home
dos olhares indiscretos de membros do seu grupo e de terceiros é executar o seguinte comando:
chmod -R go-rwx ~
O uso do comando chmod
em modo octal é similar ao modo simbólico, embora mais difícil. As expressões de permissão são substituídas por valores octais representando as permissões desejadas. Assim, se desejarmos atribuir as permissões rwxr-x---
a um arquivo teste.c
, devemos considerar que rwxr-x---
-> rwx
r-x
---
-> 111 101 000 (binário) -> 7 5 0 (octal) -> 750. Desta forma, o comando a executar é:
chmod 750 teste.c
A definição de permissões em modo octal é bem menos flexível que a notação simbólica, mas ainda muito usada, por ser aceita em todos os sistemas Unix, mesmo os mais antigos. Além disso, sua compreensão é importante para o uso do comando umask
.
O comando umask
O comando umask
permite definir uma máscara padrão de permissões para a criação de novos arquivos e diretórios. A sintaxe desse comando usa a notação octal, para definir as permissões a suprimir nos novos arquivos e diretórios, a partir das permissões máximas. Vejamos um exemplo:
r w x r - x - - -
-> permissões desejadas para os novos arquivos
- - - - w - r w x
-> permissões a suprimir
0 0 0 0 1 0 1 1 1
-> permissões a suprimir, em binário (000, 010 e 111)
0 2 7
-> máscara de permissões, em octal
Assim, o comando umask 027
permite definir a máscara desejada (rwxr-x---
). Normalmente esse comando é usado nos arquivos de configuração do shell, e nos scripts de instalação de aplicações.
Os comandos chown e chgrp
O comando chown
permite a mudança do usuário proprietário de um arquivo. Somente o superusuário pode fazê-lo. O comando chgrp
permite a permite a mudança do grupo proprietário de um arquivo. Somente o superusuário (root) e o usuário proprietário do arquivo podem fazê-lo. O proprietário só pode mudá-lo para um grupo ao qual ele também pertença.
Exemplos:
$ ls -l drw------- 2 maziero prof 0 Mar 27 08:51 dir1 $ chown joao dir1 $ ls -l drw------- 2 joao prof 0 Mar 27 08:51 dir1 $ chgrp labin dir1 $ ls -l drw------- 2 joao labin 0 Mar 27 08:51 dir1
O comando newgrp
Permite ao usuário mudar seu grupo principal para outro grupo ao qual ele também pertença. Todos os arquivos e diretórios criados a partir dessa mudança pertencerão ao novo grupo, e não mais ao grupo primário do usuário. Por exemplo:
$ mkdir dir1 $ ls -l drw------- 2 maziero prof 0 Mar 27 08:51 dir1 $ newgrp larsis $ mkdir dir2 $ ls -l drw------- 2 maziero prof 0 Mar 27 08:51 dir1 drw------- 2 maziero larsis 0 Mar 27 08:52 dir2
Para voltar ao grupo primário basta executar exit
. Para saber a quais os grupos primário e secundários do usuário basta executar o comando id
.
Exercícios
- Crie a seguinte estrutura de diretórios na sua area HOME:
~/infraComp/aula01 |__ /aula02 |__ /exercicios |__ /aula03 |__ /aula04 |__ /aula05
- Em cada diretório acima crie um arquivo chamado DATA, utilizando o comando
touch
. - Altere as permissões de acesso de seu diretório HOME para que somente você e os usuários do seu grupo tenham acesso de leitura e execução, e você tenha acesso de leitura, escrita e execução.
- Crie um diretório
$HOME/mydir
e ajuste suas permissões de forma que seus colegas consigam criar um arquivo nele. Crie um arquivo com seu nome no diretório correspondente do seu vizinho. - Qual a diferença no resultado da execução dos dois comandos abaixo?
cp teste teste.bak mv teste teste.bak
- Qual a diferença entre executar e ler um diretório (permissões r e x)?
- Qual a diferença entre executar e ler um arquivo (permissões r e x)?
- Você conseguiria mudar o nome de seu próprio diretório home? Por que?
- Crie um arquivo
teste
com os direitos de acessorw-rw-rw-
, e indique como usar o comandochmod
para alterar seus direitos de acesso para:rw-rw-r--
r-xr-xr-x
rw-r--r--
r--------
- Execute o comando
umask
para que novos arquivos criados no sistema tenham as permissões de acesso definidas a seguir, e teste as máscaras definidas criando novos arquivos (comandotouch
) e diretórios (comandomkdir
). Finalmente, explique por que razão as permissões dos arquivos não coincidem com as esperadas, mas as dos diretórios sim.rw-rw-r--
r-xr-xr-x
rw-r--r--
r--------
- Crie dois diretórios
d1
ed2
, com permissões respectivasr--r--r--
er-xr-xr-x
, e compare as possibilidades de acesso em ambos. É possível listar o conteúdo de ambos, estando fora deles? É possível entrar em ambos?