RSS

terça-feira, 11 de maio de 2010

Como gerenciar permissões no Linux

Introdução

Permissões de acesso

O GNU/Linux, como todo sistema operacional robusto e estável, tem na permissão de acesso a arquivos e diretórios a principal proteção do sistema de arquivos. Essas permissões impedem o acesso indevido de programas e usuários a lugares não autorizados.

Vamos mostrar como identificamos o tipo de arquivo, quem é o seu dono, a que grupo ele pertence, os tipos de permissão de arquivos/diretórios, permissões especiais, os comandos de manipulação de permissões e por fim falaremos dos comandos que usamos para mudar a propriedade e grupo de arquivos/diretórios.

Tipo de arquivo

São definidos 7 tipos de arquivos no Linux. Mesmo havendo a inclusão de algo novo no sistema de arquivos, ele ainda deve ser incluso de forma a se enquadrar em um desses tipos.

Antes de iniciarmos, vamos criar um diretório base para nossos testes/exemplos. Daremos o nome de "Documentos" a este diretório e dentro dele iremos criar um outro diretório de nome "Documentos", além de um arquivo chamado "bugiganga.txt".

# mkdir /documentos
# chmod 777 /documentos
# cd /documentos/
# mkdir Documentos
 

# ls -l
drwxr-xr-x 2 root root 4096 2010-05-04 14:32 Documentos

# touch bugiganga.txt
 

# ls -l
-rw-r--r-- 1 root root    0 2010-05-04 14:33 bugiganga.txt
drwxr-xr-x 2 root root 4096 2010-05-04 14:32 Documentos

Agora vamos identificar o tipo de arquivo estamos trabalhando. De acordo com saída do comando "ls -l" temos:

# ls -l
-rw-r--r-- 1 root root    0 2010-05-04 14:33 bugiganga.txt
drwxr-xr-x 2 root root 4096 2010-05-04 14:32 Documentos

Da esquerda para direita temos uma sequência de 10 bits (caracteres). Nesse primeiro momento iremos nos ater apenas ao bit mais significativo, que é o primeiro bit da esquerda para direita. Ele equivale ao "tipo" de arquivo que estamos trabalhando.

Na saída de nosso exemplo, iremos destacar apenas os 10 bits, de 1 de tipo e 9 de permissão, e daremos uma atenção especial ao bit de "tipo", com isso teremos condição de compreender melhor e saber como identificar cada um dos 7 tipos de arquivos Linux. 
 Segue abaixo tabela indicativa de tipos de arquivos: 
Agora iremos comentar sobre cada um dos 7 "tipos" de arquivos Linux.
  • Arquivo regular - São arquivos texto, arquivos de dados, executáveis, bibliotecas etc.
  • Diretórios - São arquivos que possuem referências com nomes para outros arquivos.
  • Arquivos de dispositivos de caracteres e de dispositivos de blocos - São os arquivos utilizados por programas, que permitem a comunicação com o hardware e periféricos do sistema.
  • Sockets Local - Comunicação entre processos. Exemplo: sistema de impressão e o syslog.
  • Pipes - Assim como os sockets, os pipes também permitem a comunicação entre dois processos executados no mesmo host.
  • Links simbólicos - Também conhecidos como soft link é basicamente um arquivo que aponta para outro arquivo, podemos enxergar de forma mais clara se pensarmos nele como sendo um atalho.

 

Conjunto de permissões

Dono, grupo e outros

A definição de acesso aos arquivos e diretórios é feita seguindo 3 conjuntos de permissão que equivalem ao "dono" , ao "grupo dono" dos arquivos e diretórios e "outros".

Dono:

É o usuário que criou o arquivo ou diretório. Somente ele ou o "root" podem modificar as permissões de acesso ao arquivo ou diretório criado por ele. Temos como identificação do dono do arquivos o user id (UID).

A identificação do usuário fica armazenado no arquivo /etc/passwd.

Grupo:

É o grupo dono do arquivo ou diretório. É através desse conjunto de permissões que vários usuários podem ter acesso a arquivos e/ou diretórios onde eles não são os criadores. Um usuário pode pertencer a vários grupos, com isso o administrador do sistema tem como planejar uma boa política de segurança. Temos como identificação de grupo o group id (GID).

Quando um usuário é criado e não especificamos que este usuário deve pertencer a um grupo já existente no sistema, é criado por padrão um grupo com o mesmo nome do usuário.

O armazenamento das informações referentes aos grupos do sistemas e os usuários que fazem parte desses grupos, estão armazenados no arquivo /etc/group.

Outros:

São aqueles usuários que não são os criadores e nem pertencem ao grupo dono do arquivo ou diretório.

Tipos de permissão de acesso

Temos 3 tipos básicos de permissão que são aplicáveis para o usuário proprietário do arquivo/diretório (dono), os grupos proprietários do arquivo/diretório (grupo) e outros são as permissões de leitura, escrita e execução. São destinados 3 bits (caracteres) para cada um dos agentes (dono, grupo e outros) sendo um bit de leitura, um bit de escrita e um bit de execução.
 É importante deixar bem claro que a criação e a remoção de um arquivo/diretório depende da permissão de escrita estar setada no diretório "PAI", pois é nele que o mapeamento de nome para o espaço de dados é armazenado.

Podemos ainda usar a representação numérica octal (base 8), onde cada dígito equivale aos 3 bits de cada grupo de bits. 
 Abaixo mostraremos como funciona a representação octal:

O bit mais significativo representa as permissões de acesso do "dono" do arquivo ou diretório: 
O segundo bit mais significativo representa as permissões de acesso do "grupo" dono do arquivo ou diretório  


Já o último ou o bit menos significativo representa as permissões de acesso dos "outros". 

Permissões de acesso

Tipos de permissão de acesso

Temos 3 tipos básicos de permissão que são aplicáveis para o dono, o grupo e outros. São elas, permissão de leitura, escrita e execução. Cada uma dessas permissões é representada por 3 bits cada. Temos a representação de um bit para leitura, um bit para escrita e um bit para execução.

Tabela de comparativa de permissões em arquivos e diretórios. 


É importante deixar bem claro que a criação e a remoção de um arquivo/diretório depende exclusivamente da permissão de escrita que foi setada no diretório "PAI", pois o mapeamento de nome para o espaço de dados é armazenado nele.

Permissões de acesso especiais ou bits especiais

Além das permissões básicas ainda existem três permissões especiais que modificam o comportamento de arquivos e diretórios. São elas: setuid, setgid e sticky bit.

Detalharemos cada um deles a seguir.

Setuid

Esse bit especial é representado pela letra "s" no conjunto de bits destinados ao proprietário do arquivo (- --s --- ---). Tem como função fazer o ajuste das permissões de usuário durante a execução de um programa para o proprietário do arquivo. Isso significa que no momento em que o programa é executado, ele será executado como se o proprietário do arquivo o estivesse executando e não a o usuário que o executou.

A posição em que a letra "s" é a mesma posição do bit básico de execução (x). Você deve estar se perguntando, como saberei se o bit de execução esta ativado? É bem simples, quando tivermos a letra "s" minúscula, significa que teremos ativado além do setuid o bit de execução, mas se "S" for maiúsculo significa que apenas teremos setuid ativado.

Devemos ter muito cuidado ao ligarmos o Setuid em arquivos (scripts) onde o proprietário é o root, porque isso pode trazer problemas sérios de segurança, já que durante da execução o script ele executado como se o "superuser" o fizesse.

Quando nos referimos a diretórios o setuid não tem nenhuma funcionalidade.

Em formato octal, é representado por: 4000

Setgid

Esse bit especial tem a mesma funcionalidade do setuid no que se refere a arquivos, sua representação também é um "s" (- --- --s ---), quando trabalha em conjunto com o bit de execução. Da mesma forma que o setuid, ele é representação por um "S" maiúsculo quando o bit de execução não esta ativado.

Ao ativarmos o setgid em diretórios, ele tem uma funcionalidade bem interessante. Todos os arquivos ou diretórios criados dentro dele, passam a ignorar o grupo padrão do usuário e pertencer ao mesmo grupo do diretório "pai".

Em formato octal, é representado por: 2000

Sticky bit

Sua funcionalidade para arquivos era salvar uma imagem do programa na swap, fazendo com que ele fosse carregado com mais velocidade. Hoje em dia ela tornou-se obsoleta e os sistemas atuais a ignoram.

Quando ativado em um diretório, faz com que só o proprietário do arquivo ou diretório consiga os remover ou editar.

Sua representação e feita através do caractere "t" ( - --- --- --t , bit de execução esta ativado) e "T" ( - --- --- --T , bit de execução não ativado).

Um bom exemplo da utilização desse bit é o /tmp, esse diretório é utilizado por programas/usuários para criar arquivos e diretórios temporários.

Em formato octal, é representado por: 1000

Tabela demonstrativa bits especiais: 

Umask

São as permissões iniciais que um arquivo/diretório. Isto significa que a "umask" é responsável pelas permissões no momento da criação do arquivo ou diretório. Ao digitarmos "umask" sem acrescentarmos nenhum parâmetro, teremos como resultado do valor atual dela.

O comportamento na criação de arquivos texto e binários é diferente. Conforme demonstrado na tabela a seguir


O valor padrão da umask é 022 na maioria das distribuições que estão atualmente no mercado. Ao se modificar a umask de um usuário temos que ter muito cuidado, pois podemos causar problemas de acesso de arquivos/diretórios.  

Manipulando as permissões

Modificando permissões

Antes de falarmos dos comandos que nos possibilitam mudar as permissões de acesso de usuários, grupos e outros. Falaremos das duas formas de modificá-las através das notações octal e simbólica. Elas são usadas para modificar cada um dos níveis de permissões.

Níveis de permissão:


 Notação octal:

Modificamos diretamente os 3 níveis de permissão. Para modificarmos as permissões através dessa forma, devemos especificar explicitamente o conjunto de permissões. Isto significa que iremos modificar de uma vez só os três níveis de permissão (dono, grupo e outros).

Não temos como modificar apenas 1 nível de permissão, quando usamos esta notação. Se a intenção é apenas modificar um nível de permissão, é mais simples optarmos pela notação simbólica ou especificarmos os outros 2 níveis usando o octal que representa o mesmo conjunto de permissões atuais.

Sua representação é um conjunto de oito números, onde cada um deles significa um conjunto de permissões diferente.

Tabela notação octal: 
 Tabela notação simbólica: 
Em adição as opções simbólicas descritas acima, temos 3 formas de trabalho: 
Para iniciarmos nossos exemplos vamos criar a seguinte árvore de diretórios, contendo alguns arquivos e diretórios: 
 Como já tínhamos o diretório "/documentos" e o arquivo "bugiganga.txt".

# cd /documentos
# touch organograma.odc
# cd Documentos/
# touch credores.xls
# touch contas_pagar.odc


Agora de dentro do diretório /documentos vamos dar o comando "ls -l".

# ls -l
-rw-r--r-- 1 root root    0 2010-05-04 14:33 bugiganga.txt 
drwxr-xr-x 2 root root 4096 2010-05-04 17:31 Documentos 
-rw-r--r-- 1 root root    0 2010-05-04 17:30 organograma.odc
Como podemos ver, o dono dos arquivos é o superusuário "root" e o grupo dono deles é o grupo "root". As permissões são de escrita(w) e leitura(r) para o dono (root), leitura(r) para o grupo (root) e leitura(r) para os outros, isso para os arquivos. No caso do diretório temos o bit de execução (x) ligado, além de todos os outros bits estarem com as permissões iguais as dos arquivos.

Agora estamos preparados para estudarmos os comandos que nos permitem manipular as permissões. Os comandos "chmod", "chgrp" e "chown" serão descritos a seguir.

Comando chmod

Usado para modificar as permissões de acesso de um arquivo ou diretório. Quando criamos um arquivo, seu dono (proprietário) é o usuário que o criou, seu o grupo é o grupo padrão do seu proprietário. Como vimos anteriormente existe uma exceção a essa regra. Caso o diretório onde esse arquivo/diretório esteja sendo criado possua o bit especial "setgid" ativado. Nesse caso o grupo passa a ser o mesmo grupo do diretório "pai".

Sintaxe:

chmod [opções] [permissões] [arquivo/diretório]

Opções:
 Segue abaixo exemplos do comando chmod:

Ex.1: Vamos dar direito de escrita para o grupo dono do arquivo bugiganga.txt.

# ls -l
-rw-r--r-- 1 root root    0 2010-05-04 14:33 bugiganga.txt 
drwxr-xr-x 2 root root 4096 2010-05-04 17:31 Documentos 
-rw-r--r-- 1 root root    0 2010-05-04 17:30 organograma.odc
# chmod g+w bugiganga.txt
# ls -l

-rw-rw-r-- 1 root root    0 2010-05-04 14:33 bugiganga.txt 
drwxr-xr-x 2 root root 4096 2010-05-04 17:31 Documentos 
-rw-r--r-- 1 root root    0 2010-05-04 17:30 organograma.odc
Ex.2: Iremos agora remover direito de escrita para o grupo dono do arquivo bugiganga.txt.

# chmod g-w bugiganga.txt
# ls -l

-rw-r--r-- 1 root root    0 2010-05-04 14:33 bugiganga.txt 
drwxr-xr-x 2 root root 4096 2010-05-04 17:31 Documentos 
-rw-r--r-- 1 root root    0 2010-05-04 17:30 organograma.odc
Ex.3: Vamos incluir o direito de escrita para os "outros" no diretório "Documentos" de forma recursiva, isso significa que arquivos/diretórios abaixo do diretório Documentos irão receber direito de escrita para os "outros".

# chmod -R o+w Documentos
# ls -l

-rw-r--r-- 1 root root    0 2010-05-04 14:33 bugiganga.txt 
drwxr-xrwx 2 root root 4096 2010-05-04 17:31 Documentos 
-rw-r--r-- 1 root root    0 2010-05-04 17:30 organograma.odc
# ls -l Documentos/
-rw-r--rw- 1 root root 0 2010-05-04 17:31 contas_pagar.odc 
-rw-r--rw- 1 root root 0 2010-05-04 17:31 credores.xls
Ex.4: Usaremos um exemplo de notação octal. Faremos com que o arquivo organograma só tenha direto de leitura e escrita para o dono do arquivo, nesse caso o "root".

# chmod 600 organograma.odc
# ls -l

-rw-r--r-- 1 root root    0 2010-05-04 14:33 bugiganga.txt 
drwxr-xrwx 2 root root 4096 2010-05-04 17:31 Documentos 
-rw------- 1 root root    0 2010-05-04 17:30 organograma.odc
Como acabamos de ver, podemos modificar as permissões de arquivos/diretórios de diversas formas.  

Você deve estar se perguntando, qual será a melhor forma de mudarmos as permissões de arquivos e diretório? Senhores, isso é uma questão de adaptação, se você conseguir trabalhar melhor com a notação simbólica, esta será a melhor forma, mas se você se identificar melhor com a notação octal, ela será melhor.

Comando chgrp

Comando nativo do Unix é usado para modificar o grupo dono do arquivo/diretório. Hoje em dia não é muito mais utilizado, pois o comando chown além de mudar a propriedade do arquivo/diretório, também muda o grupo. Como iremos mostrar como um pouco mais adiante.

Sintaxe:

chgrp [opções] [grupo] [arquivo/diretório]

Opções: 
 Daremos alguns exemplos do uso do comando "chgrp". Continuaremos a usar a estrutura de arquivos/diretórios que foram criados anteriormente. Apenas iremos acrescentar dois grupos um chamado administracao e outro chamado contabilidade.

# groupadd administracao
# groupadd contabilidade


Agora vamos para dentro do diretório "/documentos" e vamos listar o conteúdo.

# ls -l
-rw-r--r-- 1 root root    0 2010-05-04 14:33 bugiganga.txt 
drwxr-xrwx 2 root root 4096 2010-05-04 17:31 Documentos 
-rw------- 1 root root    0 2010-05-04 17:30 organograma.odc
Ex.1: Vamos trocar o grupo (root) dono do arquivo bugiganga.txt para contabilidade. Estamos utilizando a opção "-v" para mostrar o arquivo que esta sendo modificado.

# chgrp -v contabilidade bugiganga.txt
changed group of `bugiganga.txt' to contabilidade

Ex2.: Agora iremos trocar o grupo (contabilidade) do arquivo bugiganga.txt para o grupo (administracao).

# chgrp administracao bugiganga.txt
# ls -l

drwxr-xrwx 2 root root          4096 2010-05-03 13:13 administracao 
-rw-r--rw- 1 root administracao    0 2010-05-03 11:07 bugiganga.txt 
-rw------- 1 root root             0 2010-05-03 13:11 organograma.odc
Ex3.: E por fim modificaremos o grupo administração para ser dono do diretório administracao.

# chgrp administracao administracao/
# ls -l

drwxr-xrwx 2 root administracao 4096 2010-05-03 13:13 administracao 
-rw-r--rw- 1 root administracao    0 2010-05-03 11:07 bugiganga.txt 
-rw------- 1 root root             0 2010-05-03 13:11 organograma.odc

Comando chown

Usado para modificar a propriedade de um arquivo/diretório.O interessante é que como mencionado anteriormente, ele tem a opção de modificar também o grupo proprietário da arquivo/diretório, conforme mostraremos mais adiante.

Sintaxe:

chown [opções] [dono:grupo] [arquivo/diretório]

Opções:
 Usando ainda a mesma árvore de diretórios criada para exemplos iremos demonstrar alguns exemplos do comando "chown". Antes de mais nada criaremos dois usuários (castro e pamela).

# useradd castro
# useradd pamela


Inicialmente vamos listar o conteúdo, para podermos ver como esta atualmente o diretório.

# ls -l
drwxr-xrwx 2 root administracao 4096 2010-05-03 13:13 administracao 
-rw-r--rw- 1 root administracao    0 2010-05-03 11:07 bugiganga.txt 
-rw------- 1 root root             0 2010-05-03 13:11 organograma.odc 
Ex1: Vamos passar a propriedade do arquivo organograma.odc para o usuário castro.

# chown castro organograma.odc
# ls -l

drwxr-xrwx 2 root   administracao 4096 2010-05-03 13:13 administracao 
-rw-r--rw- 1 root   administracao    0 2010-05-03 11:07 bugiganga.txt 
-rw------- 1 castro root             0 2010-05-03 13:11 organograma.odc
Ex2: Agora vamos além de mudar a propriedade do arquivo organograma.odc do usuário castro para o usuário pamela, passaremos o grupo contabilidade para o grupo dono do arquivo.

# chown pamela:contabilidade organograma.odc
# ls -l

drwxr-xrwx 2 root   administracao 4096 2010-05-03 13:13 administracao 
-rw-r--rw- 1 root   administracao    0 2010-05-03 11:07 bugiganga.txt 
-rw------- 1 pamela contabilidade    0 2010-05-03 13:11 organograma.odc

Conclusão

Espero que tenha conseguido passar como Gerenciar as permissões de arquivos/diretórios e como manipular suas propriedades. Temos que ter me mente que as fontes de informações do Linux devem sempre complementar os estudos de um bom administrador de sistemas.

Nos exemplos desse artigo, usamos apenas algumas opções que os comandos proporcionam. É importante usarmos as páginas de manuais dos comandos (páginas man).

Fonte: VivaoLinux