Escolar Documentos
Profissional Documentos
Cultura Documentos
Gerenciando Perssões No Linux
Gerenciando Perssões No Linux
Introdução
O gerenciamento de usuários no Linux é um tema bem conhecido, mas, ao mesmo tempo, fonte de
várias dúvidas. Este é um mini-tutorial sobre o gerenciamento de usuários, grupos e permissões de
acesso via linha de comando, onde você pode tirar suas dúvidas.
Como bem sabemos, o Linux é um sistema multiusuário, cujas raízes remetem aos sistemas Unix. O
sistema pode ser usado por inúmeros usuários simultaneamente, sem que um atrapalhe as atividades
do outro, nem que possa alterar seus arquivos. Dois exemplos extremos seriam um servidor LTSP,
onde dezenas de usuários podem rodar aplicativos simultaneamente, via rede, através de terminais
burros conectados ao servidor principal, e um servidor web de shared hosting, que pode hospedar
milhares de sites diferentes, cada um administrado por um usuário diferente.
Os dois comandos mais básicos são o "adduser" e o "passwd", que permitem, respectivamente
adicionar novos usuários e alterar as senhas de acesso posteriormente, como em:
# adduser joao
# passwd joao
O próprio usuário pode alterar a senha usando o comando "passwd", desde que ele saiba a senha
antiga. Se o usuário esqueceu a senha, você pode definir uma nova executando o comando como
root; nesse caso o sistema pede a nova senha diretamente, sem solicitar a senha antiga.
joao:x:1001:1001:,,,:/home/joao:/bin/bash
Assim como qualquer outro arquivo de configuração, o "/etc/passwd" pode ser editado
manualmente, ou com a ajuda do comando "usermod". Existem diversas situações em que você
pode desejar trocar o shell padrão ou o diretório home do usuário, de forma a limitar o acesso ao
servidor. Em um servidor web compartilhado por muitos usuários, por exemplo, o diretório home de
cada usuário seria a pasta contendo os arquivos do site, e o shell padrão seria um aplicativo como o
MySecureShell, destinado a limitar o acesso do usuário a esta pasta específica.
Para alterar o shell do usuário você usa o parâmetro "-s", como em:
Você pode também especificar estes parâmetros diretamente ao criar o usuário, como em:
Bem antigamente, as senhas eram salvas no próprio arquivo "/etc/passwd", juntamente com as
demais informações, o que abria brecha para diversos tipos de ataques. A partir de um certo ponto
(por volta de 1996) todas as distribuições passaram a utilizar o sistema shadow, onde as senhas são
armazenadas de forma encriptada em um arquivo separado, o "/etc/shadow". Dentro do arquivo
você verá entradas contendo a senha encriptada, como em:
joao:$1$LpQPRMC5$eHXLjiW7ks80LQcepW0Rz.:13993:0:99999:7:::
As senhas são encriptadas usando um algoritmo de mão única, que permite apenas encriptar as
senhas, mas não recuperá-las. Durante o login, o sistema aplica o mesmo algoritmo à senha digitada
pelo usuário e compara a string resultante com a armazenada no arquivo. Se o resultado for o
mesmo, o sistema sabe que a senha confere e o acesso é autorizado.
Este sistema faz com que as senhas não sejam recuperáveis, já que a senha propriamente dita não é
salva em lugar nenhum. Se o usuário esqueceu a senha, você pode usar (como root) o comando
"passwd" para definir uma nova, mas não é possível recuperar a senha antiga.
Ferramentas como o John the ripper permitem descobrir as senhas armazenadas no arquivo
"/etc/shadow" usando um ataque de força bruta, que consiste em simplesmente testar todas as
possibilidades (incluindo alguns refinamentos, como descobrir senhas fáceis, baseadas em palavras
do dicionário) até descobrir a senha. Este método funciona bem em senhas fáceis, com até 6
caracteres, mas é inviável no caso de boas senhas, com 8 caracteres ou mais.
A senha referente ao usuário "joao", que usei como exemplo, poderia ser descoberta rapidamente.
Baixe o programa no http://www.openwall.com/john/ (ou instale-o usando o apt-get/yum) e tente
descobrir qual é :)
Continuando, para remover um usuário anteriormente criado, utilize o comando "deluser", como
em:
# deluser joao
Por questão de segurança, o comando remove apenas a conta, sem apagar o diretório home, ou
outras pastas (como o diretório de spool dos e-mails). O diretório home é especialmente importante,
pois ele guarda todas as configurações e os arquivos do usuário, de forma que em um servidor você
só deve removê-lo depois de ter realmente certeza do que está fazendo. Para remover o usuário
apagando também o diretório home, adicione o parâmetro "--remove-home", como em:
Como comentei, o diretório home é importante, por concentrar todos os arquivos do usuário. Uma
opção saudável ao removê-lo é criar um backup, de forma que você possa restaurá-lo mais tarde
caso necessário. Para isso, use a opção "--backup", que cria um arquivo compactado, contendo os
arquivos do usuário, salvo no diretório onde o comando for executado:
# deluser joao --remove-home --backup
Se executasse o comando "ls" depois de remover o usuário "joao" usando a opção de backup, veria
que foi criado o arquivo "joao.tar.bz2", referente ao backup.
Você também pode bloquear temporariamente um usuário, sem remover o home ou qualquer outro
arquivo usando o comando "passwd -l", como em:
# passwd -l joao
O "passwd -l" realmente trava a conta, fazendo com que o sistema passe a recursar qualquer senha
inserida na hora do login. Para desbloquear a conta posteriormente, use o "passwd -u", como em:
# passwd -u joao
Além da configuração dos usuários, temos a configuração dos grupos, que permitem organizar os
usuários, definindo as permissões de acesso de forma mais granular.
Imagine um caso em que você tenha um servidor compartilhado entre vários usuários, onde apenas
três deles, "maria", "jose" e "joao" devem ter acesso à pasta "/var/www/intranet", que contém os
arquivos do site interno da empresa.
Uma forma simples fazer isso é criar um grupo, adicionar os três usuários ao grupo e ajustar as
permissões da pasta de forma que o grupo tenha permissão de escrita. Para adicionar o grupo,
usamos o comando "groupadd", como em:
# groupadd intranet
Para adicionar os usuários desejados ao grupo, usamos o próprio comando "adduser", seguido pelo
login e o grupo ao qual ele deve ser adicionado (um de cada vez), como em:
# adduser maria intranet
No CentOS e em outras distribuições derivadas do Red Hat, o comando "adduser" é um link para o
comando "useradd", que não suporta essa opção. No caso delas, usamos o comando "usermod -a
-G", seguido do usuário e do grupo ao qual ele será adicionado, como em:
# usermod -a -G maria intranet
5bf52264
Existem algumas outras pequenas diferenças entre as opções aceitas pelo comando "adduser" entre
distribuições derivadas do Debian e derivadas do Red Hat, pois ele é na verdade um script, que
pode ser alterado pelos desenvolvedores para adicionar atalhos ou funções diversas.
Voltando ao tema principal, depois de adicionar os usuários ao grupo, falta ajustar as permissões de
acesso, o que é feito usando os comandos "chmod" e "chown". O primeiro permite ajustar as
permissões dos arquivos e pastas, enquanto o segundo permite transferir a posse, dizendo a qual
usuário e a qual grupo determinada pasta ou arquivo pertence.
No Linux, as permissões são agrupadas em 3 atributos principais: leitura, gravação e execução (no
caso dos arquivos) ou listagem do conteúdo (no caso das pastas). Eles são representados,
respectivamente, pelas letras r, w e x.
As permissões são definidas de forma separada para o dono, o grupo (que inclui todos os usuários
incluídos nele) e para os outros ou seja, todos os demais usuários do sistema. Em geral, o dono tem
acesso completo, o grupo tem permissões variáveis, de acordo com a função da pasta, e os demais
podem apenas ler os arquivos, sem alterar o conteúdo.
Se a pasta "/var/www/intranet" no nosso exemplo anterior foi criada pelo root, as permissões de
acesso (informadas pelo comando "ls -l") serão:
drwxr-xr-x 2 root root 4096 Jun 18 09:43 intranet
O primeiro "d" indica que se trata de um diretório. As três letras seguintes (rwx) indicam as
permissões de acesso para o dono da pasta, que no caso possui acesso completo. Em seguida, temos
as permissões de acesso para o grupo (r-x), cujos integrantes podem listar o conteúdo da pasta (x) e
podem ler os arquivos (r), sem poderem alterar nada. As três últimas letras (r-x) indicam as
permissões para os demais usuários, que também podem apenas ler.
O "root root" indica o dono e o grupo ao qual pertence a pasta, no caso o root. Ao cadastrar um
usuário no sistema é sempre criado um grupo com o mesmo nome (contendo apenas o próprio
usuário), o que explica o fato da pasta pertencer ao usuário "root" e também ao grupo "root". :)
Para que os usuários do grupo "intranet" possam alterar o conteúdo da pasta, o primeiro passo é
alterar as permissões, transferindo a posse do grupo "root" para o grupo "intranet". Nesse caso não
precisamos alterar o dono da pasta, que pode continuar sendo o root:
# chown -R root:intranet /var/www/intranet
O "-R" no exemplo faz com que a alteração seja aplicada de forma recursiva, afetando todos os
arquivos e sub-pastas. Sem ele, a alteração seria aplicada apenas à pasta propriamente dita, mas não
ao seu conteúdo. Em seguida, especificamos o novo dono e o novo grupo, separados por ":",
seguido da pasta. Com isso, as permissões serão alteradas para:
drwxr-xr-x 2 root intranet 4096 Jun 18 09:51 intranet
Falta agora alterar as permissões de acesso para o grupo, de forma que os usuários possam
finalmente escrever na pasta. Para isso, usamos o comando "chmod -R g+rw", que especifica que o
grupo (g) terá permissão de leitura e escrita (+rw):
# chmod -R g+rw /var/www/intranet
Se você quisesse fazer o oposto, ou seja, remover a permissão de escrita para o grupo, usaria o
"chmod -R g-w /var/www/intranet", se quisesse remover a permissão de leitura para todos os
demais usuários usaria o "chmod -R o-r" e, se quisesse abrir as permissões para todo mundo, usaria
o "chmod -R ugo+rwx".
+ : Adiciona a permissão
- : Remove a permissão
r : Permissão de leitura
w : Permissão de escrita
x : No caso dos arquivos indica permissão de escrita e, no caso da pasta, permissão para ver o
conteúdo.
Você pode também especificar as permissões de acesso no formato clássico, onde as permissões são
representadas por três números, como em:
Nesse caso, os três números indicam, respectivamente, as permissões de acesso para o dono, grupo
e para os outros. Cada número representa a soma das permissões desejadas, sendo que:
4 : Leitura
2 : Gravação
1 : Execução / listagem
Você simplesmente soma estes números para ter o número referente ao conjunto de permissões que
deseja: