====== 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 normal
* ''d'' : diretório
* ''l'' : 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ário ''maziero''.
* 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 leitura
* ''w'' : permissão de escrita
* ''x'' : permissão de execução (ou acesso ao diretório)
* ''X'' : permissão de execução, caso algum membro (''u'', ''g'', ''o'') já a possua
* ''u'' : usar as permissões já atribuídas ao usuário proprietário
* ''g'' : usar as permissões já atribuídas ao grupo proprietário
* ''o'' : 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ório ''home''.
$ 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 acesso ''rw-rw-rw-'', e indique como usar o comando ''chmod'' 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 (comando ''touch'') e diretórios (comando ''mkdir''). 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'' e ''d2'', com permissões respectivas ''r--r--r--'' e ''r-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?