Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anterior Revisão anterior
Próxima revisão
Revisão anterior
Última revisãoAmbos lados da revisão seguinte
unix:permissoes_em_arquivos [2015/03/10 19:18] – [Permissões de acesso em arquivos] mazierounix:permissoes_em_arquivos [2023/11/16 14:33] maziero
Linha 1: Linha 1:
 +====== 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:
 +
 +<code>
 +-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
 +</code>
 +
 +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:
 +
 +<code>
 +-rw-r----- 1 maziero  users  4956 mar 26 20:34 descricao.html
 +</code>
 +
 +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.
 +
 +<code>
 +$ 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
 +</code>
 +
 +  * ''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''.
 +
 +<code>
 +$ 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
 +</code>
 +
 +  * ''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:
 +
 +<code>
 +$ 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
 +</code>
 +
 +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:
 +
 +<code>
 +chmod  -R  go-rwx  ~
 +</code>
 +
 +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 ''<nowiki>rwxr-x---</nowiki>'' a um arquivo ''teste.c'', devemos considerar que ''<nowiki>rwxr-x---</nowiki>'' -> ''rwx'' ''r-x'' ''<nowiki>---</nowiki>'' -> 111 101 000 (binário) -> 7 5 0 (octal) -> 750. Desta forma, o comando a executar é:
 +
 +<code>
 +chmod 750 teste.c
 +</code>
 +
 +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              '' -> máscara de permissões, em octal
 +
 +Assim, o comando ''umask 027'' permite definir a máscara desejada (''<nowiki>rwxr-x---</nowiki>''). 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:
 +
 +<code>
 +$ ls -l
 +drw-------  2 maziero    prof     Mar 27   08:51 dir1
 +
 +$ chown joao dir1
 +
 +$ ls -l
 +drw-------  2 joao       prof     Mar 27   08:51 dir1
 +
 +$ chgrp labin dir1
 +
 +$ ls -l
 +drw-------  2 joao       labin  0   Mar 27   08:51 dir1
 +</code>
 +
 +===== 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:
 +
 +<code>
 +$ mkdir dir1
 +
 +$ ls -l
 +drw-------  2 maziero    prof     Mar 27   08:51 dir1
 +
 +$ newgrp larsis
 +
 +$ mkdir dir2
 +
 +$ ls -l
 +drw-------  2 maziero    prof     Mar 27   08:51 dir1
 +drw-------  2 maziero    larsis 0   Mar 27   08:52 dir2
 +</code>
 +
 +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: <code>
 +~/infraComp/aula01
 +       |__ /aula02
 +                |__ /exercicios
 +       |__ /aula03
 +       |__ /aula04
 +       |__ /aula05
 +</code>
 +  - 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? <code>
 +cp teste teste.bak
 +mv teste teste.bak
 +</code>
 +  - 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--''
 +    * ''<nowiki>r--------</nowiki>''
 +  - 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--''
 +    * ''<nowiki>r--------</nowiki>''
 +  - Crie dois diretórios ''d1'' e ''d2'', com permissões respectivas ''<nowiki>r--r--r--</nowiki>'' 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?
  
  • unix/permissoes_em_arquivos.txt
  • Última modificação: 2023/11/16 14:33
  • por maziero