dedao
(usa Slackware)
Enviado em 16/04/2006 - 21:25h
ola....estou escrevendo um artigo sobre permissoes no linux, e gostaria d saber da opniao de vcs, sobre erros, o q esta faltando, etc,.....desculpem pelo tamanho do artigo, ou c aqui nao eh o local mais adequado para esse tipo de post. Apenas preferi escutar a opniao de vcs antes d sair publicando algum artigo que tivesse erros ou estivesse incompleto.....como aqui ja ficou um post extremamente grande, se possível, gostaria que as respostas fossem enviadas para meu email renato.people@gmail.com ...dedsde ja agradeço a atenção de todos...[]s...dedao
Introdução
As permissões são um dos aspectos mais importantes do Linux (na verdade, de todos os sistemas baseados em Unix). Elas são usadas para vários fins, mas servem principalmente para proteger o sistema e os arquivos dos usuários.
Somente o super-usuário (root) tem ações irrestritas no sistema, justamente por ser o usuário responsável pela configuração, administração e manutenção do Linux. Cabe a ele por exemplo, determinar o que cada usuário pode executar, criar, modificar, etc. Naturalmente, a forma usada para determinar o que o usuário pode fazer é a determinação de permissões.
Um ponto interessante de citar é que o Linux trata todos os diretórios como arquivo também, portanto, as permissões se aplicam de igual forma para ambos. Tais permissões podem ser divididas em quatro partes para indicar: tipo, proprietário, grupo e outras permissões. O primeiro caractere da string indica o tipo de arquivo: se for "d" representa um diretório, se for "-" equivale a um arquivo. Entretanto, outros caracteres podem aparecer, já que existem outros tipos de arquivo no Linux, conforme mostra a tabela abaixo:
d => diretório
b => arquivo de bloco
c => arquivo especial de caractere
p => canal
s => socket
- => arquivo normal
É necessário ter um certo cuidado com as permissões. Por exemplo, do que adianta o usuário ter permissão de gravação se ele não tem permissão de leitura habilitada? Ele poderá ler o arquivo para poder modifica-lo? Não! De certo, isso tem utilidade em arquivos de log. Fazendo associação com as letras r, w, x e o caractere -, vamos entender cada uma:
r => significa permissão de leitura (read);
w => significa permissão de gravação (write);
x => significa permissão de execução (execution);
- => significa permissão desabilitada.
A ordem em que as permissões devem aparecer é rwx.
Muitas vezes a pessoa não sabe o que está fazendo quando dá uma permissão 777 ou 455 para um arquivo. Vou explicar mais a fundo o funcionamento do chmod.
Um 'ls -la' no Linux tem o seguinte output:
drwxr-xr-x 2 root root 4096 Set 22 10:08 temp
-rwxrwxr-x 1 garcia garcia 1088 Jul 5 16:17 torpedo
-rw-rw-r-- 1 garcia garcia 18283 Ago 3 13:10 videoteca.tar.gz
-rw------- 1 garcia garcia 4857 Ago 11 11:46 .viminfo
drwxr-xr-x 2 garcia garcia 4096 Jul 15 11:34 vlc
-rw-rw-r-- 1 garcia garcia 14872515 Jul 15 11:30 vlc-binary.tar.gz
drwxr-xr-x 2 garcia garcia 4096 Mar 4 2004 webalizer-2.01-10-x86
Então, fica subdividido dessa forma:
d rwx rwx rwx
1. d: tipo de arquivo (diretório);
2. rwx: permissões do proprietário e/ou usuário;
3. rwx : permissões para usuários do mesmo grupo;
4. rwx: permissões para todos usuários.
Configurando permissões com chmod
Acima, você dever tido pelo menos uma noção do que são permissões e sua importância no Linux. Chegou a hora de aprender a configurar permissões e isso é feito através do comando chmod (de change mode). Um detalhe interessante deste comando é que você pode configurar permissões de duas maneiras: simbolicamente e numericamente. Primeiramente veremos o método simbólico.
Para ter uma visão mais clara da forma simbólica com o chmod, imagine que tais símbolos se encontram em duas listas, e a combinação deles gera a permissão:
Lista 1
Símbolo
u => usuário
g => grupo
O (letra o maiúscula) => outro
a => totos
Lista 2
Símbolo
r => leitura
w => gravação
x => execução
Para poder combinar os símbolos destas duas listas, usam-se os operadores:
+ (sinal de adição) => adicionar permissão
- (sinal de subtração) => remover permissão
= (sinal de igualdade) => definir permissão
Para mostrar como essa combinação é feita, vamos supor que você deseje adicionar permissão de gravação no arquivo teste.old para um usuário. Então o comando a ser digitado será:
chmod u+w teste.old
O ?u? indica que a permissão será dada a um usuário, o sinal de adição (+) indica que está sendo adicionada a permissão e ?w? indica que a permissão que está sendo dada é de gravação.
Caso você queira dar permissões de leitura e execução ao seu grupo, o comando será:
chmod g+rw teste.old
Também se pode trabalhar com valores decimais de 0 a 7. Cada valor tem uma combinação de permissões pelos 3 grupos de caracteres que expliquei acima. Vamos à elas.
0 : --- (nenhuma permissão)
1 : --x (somente execução)
2 : -w- (somente escrita)
3 : -wx (escrita e execução)
4 : r-- (somente leitura)
5 : r-x (leitura e execução)
6 : rw- (leitura e escrita)
7 : rwx (leitura, escrita e execução)
# chmod 640 arquivo.ext
Atribui permissão de leitura e escrita (6) para o dono do arquivo, somente leitura para usuários do mesmo grupo (4) e nenhuma permissão para outros usuários (0).
Para vc não perder dono e grupo definidos anteriormente, use o número 4 antes das permissões:
# chmod -R 4777 pasta
Só o dono do arquivo possa removê-lo
#chmod -R 1777 pasta
Status
Estar letras que aparecem junto com as permissoes (chmod u=rwx), são chamadas de status. Abaixo segue algumas dicas interessantes a respeito dos tipos de status. Para maiores informaçoes, você pode acessar a manpage stat.
Sequencia de formatos validos para arquivos (sem filesystem)
%a acesso direita octal
%F tipo de arquivo
%f cru modalidade hex
%G nome do proprietário do grupo
%g ID do proprietario do grupo
%n nome do arquivo
%U nome do proprietario
%u id do proprietario
%x horario do ultimo acesso
%y da última vez da modificação
Sequencia de formatos validos para file system
%a blocos livres para usuarios comuns
%b tamanho de um arquivo do sistema
%n nome do arquivo
Para apagar todas as permissões da pasta do fulano
# chmod a-rwx <pasta do fulano>
Para fazer com que só o fulano mexa nos seus arquivos:
# chmod u=rwx <pasta do fulano>
é o mesmo que
chown fulano.fulano -R /home/fulano
chmod 740 -R /home/fulano
chgrp
Muda o grupo de um arquivo/diretório.
chgrp [opções] [grupo] [arquivo/diretório]
Onde:
grupo
Novo grupo do arquivo/diretório.
arquivo/diretório
Arquivo/diretório que terá o grupo alterado.
opções
-c, --changes
Somente mostra os arquivos/grupos que forem alterados.
-f, --silent
Não mostra mensagens de erro para arquivos/diretórios que não puderam ser alterados.
-v, --verbose
Mostra todas as mensagens e arquivos sendo modificados.
-R, --recursive
Altera os grupos de arquivos/sub-diretórios do diretório atual.
chown
Muda dono de um arquivo/diretório. Opcionalmente pode também ser usado para mudar o grupo.
chown [opções] [dono.grupo] [diretório/arquivo]
onde:
dono.grupo
Nome do dono.grupo que será atribuído ao diretório/arquivo. O grupo é opcional.
diretório/arquivo
Diretório/arquivo que o dono.grupo será modificado.
opções
-v, --verbose
Mostra os arquivos enquanto são alterados.
-f, --supress
Não mostra mensagens de erro durante a execução do programa.
-c, --changes
Mostra somente arquivos que forem alterados.
-R, --recursive
Altera dono e grupo de arquivos no diretório atual e sub-diretórios.
O dono.grupo pode ser especificado usando o nome de grupo ou o código numérico correspondente ao grupo (GID).
Você deve ter permissões de gravação no diretório/arquivo para alterar seu dono/grupo.
chown joao teste.txt - Muda o dono do arquivo teste.txt para joao.
chown joao.users teste.txt - Muda o dono do arquivo teste.txt para joao e seu grupo para users.
chown -R joao.users * - Muda o dono/grupo dos arquivos do diretório atual e sub-diretórios para joao/users (desde que você tenha permissões de gravação no diretórios e sub-diretórios).
UMASK
O umask (máscara de criação de arquivos) é responsável por controlar as permissões padrão dos arquivos.O umask é uma espécie de filtro pelo qual os arquivos passam para determinar quais permissões permanecem neles. Se o valor da permissão for verdadeiro, continua no arquivo, caso contrário, deverá sair.
Se você usar o comando umask sem parâmetros será mostrado o valor atual que este comando está usando:
[usuario@localhost]# umask
002
Se você quiser alterar este valor você deve usar o comando umask com o valor da máscara como argumento:
[usuario@localhost]# umask
222
Para descobrir como o comando umask funciona você deve observar os bits da máscara, e não somente o número octal.
Veja os exemplos do comando umask para a criação de arquivos:
rwx rwx rwx rwx rwx rwx
umask=022 000 010 010 umask=133 001 011 011
=========== ===========
rw- r-- r-- rw- r-- r--
Você deve oberservar que o bit 0 liga uma permissão e que o bit 1 desliga uma permissão. Mas você deve ter notado que o bit "x" foi desligado, mesmo tendo a permissão 0. Isso é uma proteção do Linux, que não deixa criar nenhum arquivo com a permissão de executável. Se você quiser criar um arquivo executável deverá fazê-lo através do comando chmod. Isso é uma proteção muito boa, pois evita que vírus ataquem o sistema.
Veja o mesmo exemplo para a criação de diretórios:
rwx rwx rwx rwx rwx rwx
umask=022 000 010 010 umask=133 001 011 011
=========== ===========
rwx r-x r-x rw- r-- r--
Para descobrir como o comando umask funciona você deve observar os bits da máscara, e não somente o número octal.
Veja os exemplos do comando umask para a criação de arquivos:
rwx rwx rwx rwx rwx rwx
umask=022 000 010 010 umask=133 001 011 011
=========== ===========
rw- r-- r-- rw- r-- r--
A umask (user mask) são 3 números que definem as permissões iniciais do dono, grupo e outros usuários que o arquivo/diretório receberá quando for criado ou copiado. Digite umask sem parâmetros para retornar o valor de sua umask atual.
A umask tem efeitos diferentes caso o arquivo que estiver sendo criado for binário (um programa executável) ou texto (Arquivo texto e binário, Seção 2.2.3) . Veja a tabela a seguir para ver qual é a mais adequada a sua situação:
---------------------------------------------
| | ARQUIVO | DIRETÓRIO |
| UMASK |----------------------| |
| | Binário | Texto | |
|------------------------------|------------|
| 0 | r-x | rw- | rwx |
| 1 | r-- | rw- | rw- |
| 2 | r-x | r-- | r-x |
| 3 | r-- | r-- | r-- |
| 4 | --x | -w- | -wx |
| 5 | --- | -w- | -w- |
| 6 | --x | --- | --x |
| 7 | --- | --- | --- |
---------------------------------------------
Um arquivo texto criado com o comando umask 012;touch texto.txt receberá as permissões -rw-rw-r--, pois 0 (dono) terá permissões rw-, 1 (grupo), terá permissões rw- e 2 (outros usuários) terão permissões r--. Um arquivo binário copiado com o comando umask 012;cp /bin/ls /tmp/ls receberá as permissões -r-xr--r-x (confira com a tabela acima).
UID e GID
O Linux gerencia os usuários e os grupos através de números conhecidos como UID (User ID) e GID (Group ID). Como é possível perceber, UID são números de usuários e GID são números de grupos. Os nomes dos usuários e dos grupos servem apenas para facilitar o uso humano do computador.
Um fato ainda não citado, é que cada usuário precisa pertencer a um ou mais grupos. Como cada arquivo ou processo pertence a um usuário, logo, esse arquivo/processo pertence ao grupo de seu proprietário. Assim sendo, cada arquivo/processo está associado a um UID e a um GID.
Os números UID e GID variam de 0 a 65536. Dependendo do sistema, o valor limite pode ser maior. No caso do usuário root, esses valores são sempre 0 (zero). Assim, para fazer com que um usuário tenha os mesmos privilégios que o root, é necessário que seu GID seja 0. Isso informa ao sistema que o usuário em questão é super usuário.
Observação: na verdade, existe um UID real e um UID efetivo. O mesmo ocorre com o GID. Os números reais geralmente são iguais aos efetivos. Os UIDs e GIDs reais são usados, basicamente, para fins de contabilidade, enquanto que os efetivos são os usados para execução.
Se você formatar seu linux, deixando a partição /home intacta, ao tentar acessá-la e gravar algo nos arquivos da partição ela irá dar erro de permissão. Isso pode ser resolvido facilmente da seguinte maneira:
Copie todos arquivos do /etc ligados a usuarios e grupos, /etc/passwd /etc/groups /etc/users pra partição home por exemplo, reinstalar o servidor e depois copiar de volta esses arquivos.
chown altera o proprietário e o grupo do arquivo.
chgrp altera o grupo de um arquivo.
Permissoes Especiais
SUID
Se este bit estiver ligado em um arquivo executável, isso indica que que ele vai rodar com as permissões do seu dono (o proprietário do arquivo) e não com as permissões do usuário que o executou.
OBS: Só tem efeito em arquivos executáveis.
Tomemos como exemplo o shutdown. Ele está localizado no diretório /sbin/, e não pode ser executado por usuários comuns, retornando a seguinte mensagem de erro:
$ /sbin/shutdown
shutdown: you must be root to do that!
Ou seja, "shutdown: você precisa ser root para fazer isso!".
Vamos então ativar o buit SUID para permitir que o usuário davidson possa executar o shutdown:
# chmod 4755 /sbin/shutdown
Ou
# chmod u+s /sbin/shutdown
Observe que utilizamos 4 dígitos para o comando chmod no formato octal. O primeiro dígito, que até então não tínhamos utilizado, é justamente aquele utilizado para as permissões especiais. O número 4 corresponde ao bit SUID. Já no formato literal, utilizamos u+s para ativar (+) a permissão especial de execução (s) para os usuários (u).
SGUID
Faz o mesmo que o SUID, mas agora o arquivo executado vai rodar com as permissões do grupo do arquivo. Se aplicado a um diretório, força os arquivos/diretórios criados dentro dele a ter o mesmo grupo do diretório pai, ao invés do grupo primário do usuário que o criou.
Agora, para ativar o bit SGID, utilizamos o chmod na forma octal ou literal:
# chmod 2755 /sbin/shutdown
Ou
# chmod g+s /sbin/shutdown
No formato octal, veja que o número 2 corresponde ao bit SGID, enquanto os outros 3 números correspondem às permissões normais do arquivo. Já no formato literal, utilizamos g+s para ativar (+) a permissão especial de execução (s) para o grupo (g).
STICKY
Se este bit for ativado, faz com que arquivos criados em um determinado diretório só possam ser apagados por quem o criou (dono) ou pelo super-usuário do sistema. Um exemplo de uso do STICKY é o diretório /tmp.
Para ligar o bit STICKY num diretório, utilizamos o chmod no formato octal ou literal. Como exemplo, vamos ligar o bit STICKY no diretório documentos/.
$ chmod 1755 documentos
Ou
$ chmod o+t documentos
No formato octal, o número 1 corresponde ao bit STICKY, enquanto os outros 3 dígitos correspondem às permissões simples do diretório. No formato literal, utilizamos o+t, para ativar (+) a restrição da exclusão de arquivos (t) para os outros usuários (o).
Observe agora as novas permissões do diretório tmp/:
$ ls -ld documentos
drwxr-xr-t 2 renato 160 2005-03-11 10:43 teste
Observe que o bit "x" das permissões dos outros usuários foi substituído por um "t", indicando que o bit STICKY está ligado.
Agora, basta dar permissão de escrita para os outros usuários, para que eles possam criar arquivos dentro desse diretório:
$ chmod o+w tmp