quarta-feira, 30 de dezembro de 2009

Diretórios e Arquivos 3: usuários X permissões (chmod e chown)

No primeiro artigo desta série nós falamos vagamente sobre permissões de acesso a arquivos e pastas, num tópico entitulado como "Proprietário, Permissões e Grupos".

Neste artigo vamos nos aprofundar um pouco mais neste assunto pouco compreendido, mas de suma importância para quem administra um computador baseado em Linux. Vamos falar sobre Grupos de Usuários e as diferentes modalidades de Permissão de Acesso a Arquivos e Diretórios.


Grupos, Usuários e Permissões


O conceito de usuários e permissões é muito importante no openSUSE e deve ser entendido como uma idéia de um sistema central que engloba tudo no Linux.


Grupos

Quando da instalação do openSUSE você deve ter criado ao menos uma conta de usuário. E, desde então, vem utilizando esta conta para fazer login, acessar o openSUSE e rodar seus programas preferidos. E espero que você nunca tenha utilizado a conta do root para fazer login no openSUSE. Nunca!

Ainda que você não tenha se dado conta, um usuário do Linux sempre pertence a um grupo. No openSUSE, todo usuário pertence ordinariamente (por default) a um grupo chamado users.

OBS.: Algumas distribuições Linux criam um grupo com o mesmo nome do usuário, fazendo ele pertencer automaticamente a este grupo.


Por que existem grupos de usuários?

O Linux é um sistema operacional baseado (ou inspirado) no Unix. O Unix é um poderoso sistema operacional que nasceu no que é chamado de "Grande Porte": computadores Main Frame, onde inúmeros usuários trabalham simultâneamente nele.

Imagine um grande banco, com vários diretores, gerentes, caixas e demais funcionários, cada um com atribuições diferentes e permissões diferentes sobre os arquivos e dados no Main Frame. Seria impraticável para um administrador deste servidor configurar as permissões de acesso individualmente.

Através dos grupos, um administrador pode muito mais facilmente fazer estas configurações pois, ao invés de informar individualmente quais usuários podem ter acesso ou não a diretórios e/ou arquivos, ele informa qual grupo.

Assim, ele pode, por exemplo, criar um grupo para os gerentes e fazer com que todo usuário gerente pertença a este grupo. Feito isto, ele pode facilmente configurar determinado diretório de modo que apenas o grupo dos gerentes tenha acesso a ele. Automaticamente, todos os usuários deste grupo passam a ter acesso ao diretório.

Embora você muito provavelmente utilize o openSUSE em tua casa e, mais provavelmente ainda, seja o único usuário, lembre-se que o "motor" do openSUSE é o Kernel do Linux. E o mesmo "motor" usado no openSUSE é utilizado no SUSE Enterprise Server e tantos outros servidores baseados em Linux, geralmente servidores de arquivos.

Mas vamos supor que, além de você, mais de uma pessoa utilize o openSUSE. Acredite, compreender como funcionam os grupos de usuário e como isto facilita a configuração das permissões de acesso a diretórios e arquivos, vai tornar tua vida mais tranquila e segura.


Usuários

Uma conta padrão de usuário no openSUSE restringe-se ao que pode ser feito em sua própria área, dentro da pasta /home. Vimos em artigos anteriores desta série que para cada usuário criado é criado também um diretório dentro de /home, geralmente com o mesmo nome da conta do usuário.

O que o usuário pode ou não fazer em todo o sistema é definido no ato da criação da conta. basicamente, ele tem "plenos poderes" sobre sua "home" e "poderes limitados" sobre todo o resto. Entenda por "poder" o conceito de Permissões.


MEMORIZE: No Linux, tudo (diretórios e arquivos) tem um dono e pertence a um grupo. Vamos repetir: No Linux, tudo (diretórios e arquivos) tem um dono e pertence a um grupo!
Tudo (diretórios e arquivos) dentro da home de um usuário pertence a ele e, por default, tudo o que ele criar em sua home, obviamente, pertencerá a ele. Além disso, também por default, tudo pertencerá ao grupo users.
Embora um usuário de uma conta padrão possa navegar livremente por quase todos os diretórios do sistema, o que ele poderá fazer varia, conforme o diretório e as permissões definidas para ele.

Se ele "visitar" o diretório de outro usuário, por exemplo, poderá ver tudo. E quando falamos ver tudo estamos falando de abrir subdiretórios, arquivos, etc. E embora ele não possa modificar nem apagar coisa alguma, nada o impedirá de copiar os arquivos para a "home" dele e fazer o que quiser com eles depois...

Da mesma forma, se ele "visitar" os diretórios essenciais do sistema, poderá entrar em quase todos, com a certíssima excessão do diretório /root.

Enfim, o que define as permissões do que um usuário pode ou não ter sobre tudo no Linux (diretórios e arquivos) é o grupo a que ele pertence e quais diretórios e arquivos ele é o dono.


Permissões

Entendendo as permissões

Cada arquivo e cada diretório pertence a um usuário. Tudo no Linux pertence a um usuário. Isto é uma "cláusula pétrea na constituição" do Linux!

Além disso, diretórios e arquivos têm três separadas configurações que indicam quem, dentro de todo o sistema Linux, pode ler, escrever e, se o arquivo em questão for um "executável", quem pode "executar" ou rodar (run) o arquivo.

No caso de um diretório, estas configurações servem ainda para dizer quem pode entrar nele. Se você tentar entrar num diretório sobre o qual não tenha permissão de acesso, receberá um "Acesso negado!".

Quando você pede para ver as propriedades de um diretório ou pasta no Dolphin, ele te mostra uma tela em cuja aba "Permissões" podemos ver algo como mostrado na figura abaixo.


Permissões sobre a pasta cawasame

Na figura acima podemos ver de quem é a propriedade da pasta cawasame e podemos ver também as permissões sobre ela.

Pensando alto: "O mundo visual é lindo, maravilhoso, a interface gráfica é uma "mão na roda", blá-blá, mas oculta muita informação. É por isto que os usuários do mundo das janelas tendem a ser tão obtusos!"

Há outra forma de ver como as coisas de fato funcionam no Linux: abrir um terminal e usar o comando ls. O comando ls exibe informações sobre diretórios e arquivos da forma como eles são, de fato, tratados pelo Linux.

Executando o comando ls -l, podemos ter uma saída como esta:

ls -l
(...)
-rw-r--r-- 1 cawasame users      903 Jan  4 01:30 Teste.txt
(...)

(Fizemos algumas omissões e colorimos o resultado por questões didáticas)

Não se preocupe com todas as informações apresentadas. O que precisa ser analisado agora é o seguinte:

cawasame é o dono do arquivo Teste.txt;
users é o grupo ao qual o arquivo Teste.txt pertence;
A parte -rw-r--r-- corresponde a lista de permissões sobre o arquivo Teste.txt.

O conceito de dono e grupo já é de nosso domínio. Vamos analisar mais de perto as permissões.

As letras r, w e o símbolo - representam as permissões sobre o arquivo Teste.txt. Normalmente, a lista de permissões consiste nas letras r (para leitura), w (para escrita), x (para executáveis) e o símbolo - (significando nada aplicável), que pode aparecer no lugar de uma destas letras.

Pode parecer confuso a primeira vista, mas é muito simples de entender, depois que a gente aprende a olhar direito. Analise a figura abaixo.


Permissões


A lista de permissões

Para entender facilmente a lista de permissões, basta dividí-la em quatro grupos, como mostrado na figura acima. O significado de cada grupo é o seguinte:

Tipo de arquivo: este caractere representa o tipo de arquivo. Um arquivo comum é indicado por um traço (-). A maioria absoluta dos arquivos se enquadra nesta categoria. Um d indica que o "arquivo" é, na verdade, um diretório. Existem outras letras, mas para casos raros e fora do escopo deste artigo.

Permissões do dono: os dois primeiros caracteres deste grupo (rw) indicam que o dono deste arquivo tem permissões de leitura (r) e escrita (w) sobre ele. O traço (-) indica que o dono não pode executar este arquivo, provavelmente porque ele não é um programa nem um script. Caso fosse um executável poderia haver um x neste local, e o dono poderia executá-lo.

Permissões do grupo: o primeiro caractere deste grupo indica que todo usuário que pertencer a este grupo tem permissão para ler (r) o arquivo. Porém o traço (-) na segunda posição indica que a escrita não é permitida. O traço (-) na terceira posição indica, da mesma forma que para o dono, que o arquivo em questão não é um executável e que os usuários que pertencem ao grupo não podem executá-lo.

Permissões dos demais: este último grupo de regras de permissões define o que todos os demais usuários do sistema podem fazer sobre o arquivo. A interpretação dos caracteres é a mesma: o primeiro caractere deste grupo indica que qualquer usuário tem permissão para ler (r) o arquivo. Porém o traço (-) na segunda posição indica que a escrita não é permitida. O traço (-) na terceira posição indica que o arquivo em questão não é um executável e que ninguém poderá executá-lo.


Exercício de fixação

Como este assunto pode ser difícil de assimilar na primeira leitura, vamos observar a figura abaixo e interpretar o que vemos.


Arquivos e diretórios na pasta bin de minha "home"


O Dolphin pode ser configurado para exibir muita informação a respeito dos diretórios e arquivos, como mostrado na figura acima. Nela podemos ver as colunas Permissões, Proprietário e Grupo.

De imediato, podemos ver que todos os diretórios e arquivos pertencem ao usuário cawasame e ao grupo users.

Graficamente, podemos ver que BOINC e chkrootkit-0.49 são diretórios. Isto fica claro porque podemos ver também o d na primeira posição, na coluna Permissões!

burnxbox360game e videoinfo.sh não são diretórios. Isto fica claro pela ausência do d na primeira posição.

Estas mesmas informações em um Terminal seriam exibidas desta forma, pelo comando ls -l:

cawasame@SuSE112:~/bin> ls -l
total 16
drwxr-xr-x 3 cawasame users 4096 Nov 29 12:55 BOINC
-rwxr-xr-x 1 cawasame users  465 Dez 30 12:07 burnxbox360game
drwxr-xr-x 2 cawasame users 4096 Dez  6 18:28 chkrootkit-0.49
-rwxr-xr-x 1 cawasame users   87 Dez  2 17:41 videoinfo.sh
cawasame@SuSE112:~/bin>


Note que para facilitar a interpretação, BOINC e chkrootkit-0.49 são exibidos na cor azul, indicando de imediato que são diretórios e não arquivos comuns. Mas o tira-teima é o d na primeira posição das permissões.


Os x que aparecem no segundo, terceiro e quarto grupos de permissões não significam que BOINC e chkrootkit-0.49 são executáveis. Como se tratam de diretórios, significa que é permitido o acesso a eles, ou seja, os usuário poderão entrar neles.


burnxbox360game e videoinfo.sh, como já foi dito, são arquivos. No caso destes dois arquivos, os x que aparecem no segundo, terceiro e quarto grupos de permissões indicam que eles são executáveis (programas ou scripts) e que tanto o dono quanto os demais usuários têm permissão para executá-los. Porém a ausência da permissão de escrita (w) no terceiro e quarto grupos indicam que apenas o dono pode modifcá-los (escrever ou alterar).

No Dolphin é ainda mais óbvio, visualmente (o ícone semelhante a um cursor indica que são scripts). No Terminal, a cor verde indica a mesma coisa: são arquivos executáveis.


Alterando Permissões e a Propriedade (ownership)

Embora seja possível alterar as permissões de acesso via Dolphin, vamos fazer isto usando o terminal. É sabido que as interfaces gráficas ajudam bastante a utilização de qualquer sistema operacional. Todavia, muita coisa importante é deixa em segundo plano e o usuário termina por acostumar-se com o pouco que lhe é passado via interface gráfica.

Por questões didáticas, vamos mostrar como alterar permissões usando o comando chmod, e vamos mostrar como alterar a propriedade (quem é o dono) de um arquivo, usando o comando chown.

Depois que você tiver aprendido a usar chmod e chown em toda a potencialidade deles, ficará muito fácil fazer a parte mais simples via Dolphin.


O comando chmod

chmod é o comando do Linux que altera as permissões de acesso sobre diretórios e arquivos. A sintaxe básica de chmod é apresentada quando o invocamos com a opção --help. Ex.:

chmod --help
Uso:  chmod [OPÇÃO]... MODO[,MODO]... ARQUIVO...
 ou:  chmod [OPÇÃO]... MODO-OCTAL ARQUIVO...
(...)
Altera o modo de cada ARQUIVO para MODO.

(...)

  -R, --recursive  altera arquivos e diretórios recursivamente
      --help       mostra esta ajuda e finaliza
      --version    informa a versão e finaliza

Cada MODO é da forma "[ugoa]*([-+=]([rwxXst]*|[ugo]))+".


Mais uma vez, fizemos algumas omissões por questões didáticas. E nâo se assuste com a forma hieroglífica deste help! Vamos dissecá-lo a partir de agora.

Simplificadamente, você usa chmod desta forma:

chmod permissões ARQUIVO

permissões é o que o --help chama de MODO
ARQUIVO é o arquivo ou diretório que você quer modificar as permissões

A parte que precisamos estudar é realmente permissões! Nada melhor que alguns exemplos, para depos virem as explicações, concordam? Então vamos partir de uma situação um pouco atípica. Analisem o que se segue:

d--------- 2 cawasame users 4096 Jan  4 22:50 Diretorio
---------- 1 cawasame users  592 Dez 21 00:36 Texto.txt

Observem que Diretorio é um diretório. E Texto.txt é um arquivo comum. Mas, que coisa esquisita, não há permissão nenhuma! Do jeito que aí está, quase ninguém pode fazer quase nada sobre Diretorio e Texto.txt. (Claro que o usuário root pode tudo!).

Dissemos quase ninguém pode fazer quase nada por uma razão: o dono pode alterar as permissões. Mas antes que ele as faça, nem ele poderá ler (r), escrever (w) ou executar (x) nada!

Se algum usuário, mesmo o dono, tentar entrar em Diretorio, não vai conseguir!
Se algum usuário, mesmo o dono, tentar ver o conteúdo de Texto.txt, não vai conseguir!

É uma situação absurda, inútil! Foi criada apenas para que possamos aprender a usar o chmod. Então vamos lá:


chmod e diretórios

Para que um diretório tenha utilidade, é preciso que você possa entrar nele (x) e ter direitos de leitura (r) e escrita (w) sobre ele, não é mesmo? Então vamos começar dando ao dono (u) permissões para isto. Fazemos assim:

chmod u+rwx Diretorio

Resultado:
drwx------ 2 cawasame users 4096 Jan  4 22:50 Diretorio


Interprete isto como:

"Mude as permissões (chmod) do dono (u) dando-lhe (+) permissão para leitura, escrita e execução (rwx) sobre Diretorio"

OBS.: Lembre-se que, no caso de diretórios, "execução" significa poder entrar neles.

Ok, agora o dono pode entrar no diretório e tem permissão de gravar coisas dentro dele e até mesmo apagar. Vamos agora dar permissões ao grupo (g). Você seria capaz de fazer isto sozinho? Aposto que sim. Arraste o ponteiro do mouse sobre as linhas em branco aí abaixo, para ver o comando!


chmod g+rx Diretorio


Resultado (acumulando com o comando anterior):
drwxr-x--- 2 cawasame users 4096 Jan  4 22:50 Diretorio



Interprete isto como:

"Mude as permissões (chmod) do grupo (g) dando-lhe (+) permissão para leitura e execução (rx) sobre Diretorio"

Neste ponto, o dono do diretório Diretorio tem permissões para entrar nele, ler, gravar e apagar coisas dentro dele. Os usuários do grupo ao qual Diretorio pertence, têm permissão para entrar nele e apenas ler coisas dentro dele.

Se deixarmos as coisas como estão, os outros (o), ou seja, os demais usuários que não o dono e que não façam parte do grupo ao qual Diretorio pertence, não poderão fazer absolutamente nada sobre Diretorio. Mas, se você quiser dar aos outros as mesmas permissões que o grupo, basta usar chmod maus uma vez, deste forma:


chmod o+rx Diretorio


Resultado (acumulando com os comandos anteriores):
drwxr-xr-x 2 cawasame users 4096 Jan  4 22:50 Diretorio

Interprete isto como:
"Mude as permissões (chmod) para outros usuários (o) dando-lhes (+) permissões para leitura e execução (rx) sobre Diretorio"


Juntando tudo

Fizemos as mudanças nas permissões de forma gradativa, começando pelo dono, depois o grupo e finalmente os outros. Mas poderíamos ter feito tudo de uma vez, desta forma:

chmod u+rwx,g+rw,o+rw Diretorio

Simples, não?!

Se você agora olhar mais uma vez para o --help do comando chmod, certamente entenderá melhor o que significam:
 Uso:  chmod [OPÇÃO]... MODO[,MODO]... ARQUIVO... 
(...)
Cada MODO é da forma "[ugoa]*([-+=]([rwxXst]*|[ugo]))+".

Já utilizamos as letras u, g, e o, que correspondem ao usuário dono (u), ao grupo (g) e aos outros (o). A letra a significa todos (all).

Se você quiser dar as mesmas permissões a todos (usuário dono, grupo e outros) de uma vez só, use chmod com a. Ex.:

chmod a+rwx Diretorio

O comando acima permissões de leitura, escrita e execução sobre Diretorio a todo mundo (all) de uma só vez!


chmod e arquivos

Tudo o que você aprendeu até agora sobre o chmod e diretórios funciona do mesmo jeito com os arquivos. A única diferença é que, no caso de arquivos, a permissão x deve ser usada para informar que determinado arquivo é um programa ou script executável.

O arquivo Texto.txt continua sem nenhuma permissão definida. Ou melhor, as permissões estão definidas de modo a que ninguém possa fazer nada com ele. Com base no conhecimento que já temos, podemos definir as permissões simplesmente com o comando:

chmod u+rw,g+r,o+r Texto.txt

Desta forma, as permissões ficam assim:

-rw-r--r-- 1 cawasame users  592 Dez 21 00:36 Texto.txt


O comando chown

Outro comando que precisamos aprender para completar esta etapa é o chown. Este comando é usado para informar quem é o dono e também a que grupo pertence um diretório ou um arquivo. Sua sintaxe básica é a seguinte:

chown --help
Uso: chown [OPÇÃO]... [DONO][:[GRUPO]] ARQUIVO...
 ou: chown [OPÇÃO]... --reference=ARQREF ARQUIVO...
Muda o dono e/ou grupo de cada ARQUIVO para DONO e/ou GRUPO.
(...) 
  -R, --recursive        muda arquivos e diretórios recursivamente        
(...)

     --help     mostra esta ajuda e finaliza
      --version  informa a versão e finaliza

O dono, caso não informado, permanece inalterado. O grupo também não é
alterado se não for informado, mas mudará para o grupo de login se deixado
implícito por ":" após um DONO simbólico.
DONO e GRUPO podem ser numéricos bem como simbólicos.

Exemplo:
  chown root /u         Altera o dono de /u para "root".
  chown root:equipe /u  Idem, mas também altera seu grupo para "equipe".
  chown -hR root /u     Altera o dono de /u e seus arquivos para "root".

(mais uma vez, fizemos algumas omissões por questões didáticas)

OBS.: Embora você possa usar chown, em muitas situações você terar que utilizá-lo com sudo ou depois de mudar para o modo super usuário como o comando su. Isto decorre do fato de que você só pode fazer mudanças sobre o que te pertence. Ou seja, se um arquivo te pertence e você quer dá-lo a outro, tudo bem. Mas se o arquivo não for teu, apenas o usuário root poderá mudar de uma para outro dono (a não ser o próprio dono, claro).


chown na prática

O uso prático de chown é muito simples. Você o utiliza mais ou menos assim:

chown dono:grupo ARQUIVO

dono:grupo é a combinação "usuário que será o novo dono":"novo grupo" ao qual ARQUIVO passará a pertencer.

Você pode mudar apenas o dono, sem interferir no grupo ao qual ARQUIVO pertence, desta forma:
chown dono ARQUIVO

Uma das utilidades para chown é quando você por alguma razão copiou ou moveu um arquivo para tua home ou, ainda, se estava trabalhando com o usuário root e criou alguma coisa. Nestes casos, pode acontecer que embora o arquivo esteja em tua home, ele pertence ao root (ao a outro usuário). Você usa chown para resolver o problema. Analise a situação abaixo:

cawasame@SuSE112:~> ls -l
(...)
-rw-r--r--   1 root     root          20 Jan  5 13:33 config.txt
(...)

Sabe lá Deus por que, o arquivo config.txt está em minha home, mas pertence ao usuário root. E embora eu tenha permissões de leitura, não sou o dono, nem posso fazer alterações nele!

Resolve-se isto facilmente com chown. Basta executar o seguinte comando:

cawasame@SuSE112:~> sudo chown cawasame:users config.txt
Senha:
cawasame@SuSE112:~>

Feito isto, as coisas agora estarão assim:

cawasame@SuSE112:~> ls -l config.txt
-rw-r--r-- 1 cawasame users 20 Jan  5 13:33 config.txt
cawasame@SuSE112:~>


Note que se tivéssemos usado chown sem o sudo antes, teríamos obtido o seguinte resultado:

cawasame@SuSE112:~> chown cawasame:users config.txt
chown: alterando o dono de "config.txt": Operação não permitida

Pelo simples fato de que o dono de config.txt até então é o root!


Outra forma de usar chmod

Existe outra forma de usar chmod muito mais eficiente, embora seja talvez mais difícil de entender. Quando você usa a forma chmod u+rw, fica fácil interpretar o que está sendo realizado, pois o u indica que você vai alterar as permissões do usuário dono do arquivo. Além disso, o + indica que você está dando permissões e o r e o w também claramante informam quais serão as permissões.

Este modo de usar chmod, porém, tem um incoveniente: ele não altera o modo das permissões que não forem informadas. Explicando: se você der permissões de leitura, escrita e execução a um arquivo e depois quiser remover apenas a permissão de execução do seguinte modo:

chmod u+rwx Texto.txt

e depois um

chmod u+rw Texto.txt

Não vai funcionar! Ou seja, a permissão de execução dada anteriormente não será removida no segundo comando, como poderia parecer que sim!

O correto seria fazer

chmod u-x Texto.txt

Porém existe um outro modo de usar chmod que mata os dois coelhos numa só paulada! É o modo octal (ou numérico).


OCTAL-MODE de chmod

A outra forma de usar chmod é esta:

chmod 000 Texto.txt -> Retira todas as permissões sobre Texto.txt (---------)
chmod 777 Texto.txt -> Dá a todo mundo todas as permissões possíveis sobre Texto.txt (rwxrwxrwx)
chmod 444 Texto.txt -> Dá a todo mundo apenas a permissão para leitura sobre texto.txt (r--r--r--)

No modo octal você deve sempre usar três dígitos numéricos. O primeiro dígito define as permissões do usuário dono (u); o segundo dígito define as permissões do grupo (g); e o terceiro dígito define as permissões dos outros (o). Os valores possíveis estão dentro da faixa de 0 a 7 e as permissões envolvidas podem ser mais esclarecidas observando a figura abaixo.


Octetos usados em chmod

A lógica por trás disto é muito simples, se você entende de binários! Considere que cada permissão (rwx) é um bit. Se o bit correspondente ao r estiver ativado (1), então a permissão é dada. Se o bit correspondete ao r estiver desativado (0), então a permissão e tirada. E isto vale para todas as outras permissões, respeitando a posição da letra (a ordem é sempre rwx).

7 significa todas as permissões ativadas, pois todos os bits estão em 1. É só lembrar que 111 em binário é igual a 7.
4 significa apenas a permissão de leitura, pois apenas o bit da letra r está ativado e os outros estão desativados. 100 em binário é igual a 4!

É muito simples! Digamos que você tenha um script (arquivo executável) e você queira dar permissões de leitura, escrita e execução para o dono, mas apenas leitura e execução para os demais. As permissões seriam rwxr-xr-x. Colocando isto em binário seria 111101101. Separando em seus respectivos grupos, teríamos 111 para o dono, 101 para o grupo e 101 para os outros. Ora 111=7; 101=5 (consulte a figura acima). Deste modo, usaríamos chmod assim:

chmod 755 script

que pode ser interpretado como

chmod 111 101 101 script

ou como

chmod rwx r-x r-x script

As cores são para lembrar que a primeira posição é o usuário dono, a segunda posíção é o grupo e a terceira os outros.

A vantagem de usar chmod assim é que de uma vez só você ativa ou desativa as opções que quiser.

Nenhum comentário:

Postar um comentário