Há uma diferença entre o superusuário (root) e o dono de um diretório (que alguns chamam de pasta) e/ou arquivo. Por exemplo, temos o usuário VOL (ou Fabio, ou Clodoaldo, ou Samuel, etc) que é criado ao instalar o sistema operacional
Linux (seja ele Debian, Slackware, Kali, Ubuntu, Red Hat, etc) e você escolhe o nome que quiser para o usuário.
Este usuário não é o superusuário (o superusuário é o root [raiz]). O root é uma coisa, o usuário é outra coisa. O root pode ser qualquer pessoa que tenha a senha de root e acesse com "su -", "su", "sudo", etc, no terminal. Já veremos os comandos.
Nos diretórios e arquivos do Linux temos, grosso modo, três níveis: Dono, Grupo e Outros. Quem define, basicamente, as permissões para o Dono, para o Grupo e para os Outros é o root.
Aí surgem duas perguntas:
1. QUEM TEM PRECEDÊNCIA NAS PERMISSÕES: O DONO, O GRUPO OU OS OUTROS?
As permissões de um diretório têm precedência sobre as dos arquivos que ele contém. O Linux não deixa o Dono brigar com o Grupo e com os Outros. As permissões do Usuário/Dono, do Grupo e dos Outros são distintas, separadas, e você, sendo o cara que usa o sistema, tem de estar ciente disso, tem de raciocinar com os três níveis de permissão, principalmente com o Dono e o Grupo.
2. E SE EU SETAR UMAS PERMISSÕES PARA O DONO E OUTRAS DIFERENTES PARA O GRUPO?
O Linux não deixa isso acontecer. Caso você sete permissões somente para o Dono, por exemplo, as permissões para o Grupo continuam as mesmas, caso você setar permissões para o Grupo sem o parâmetro -R (recursivamente, veremos adiante) as permissões para os arquivos dentro do Grupo permanecem as mesmas e o Linux não deixa criar conflito, não deixa o Dono brigar com o Grupo e com os Outros.
Não confunda root com o Dono do diretório e/ou arquivo. O Dono é o dono, é como o Highlander, só pode haver um para diretórios e/ou arquivos. O Grupo é um conjunto de usuários colocados ali pelo root ou pelo proprietário, mas no fim das contas é o tal de root quem decide - como vimos -, e o root pode ser qualquer um que tenha a senha de superusuário (root). Os Outros são os outros, são todos aqueles que não são Dono e não fazem parte da patota do Grupinho decidido pelo root ou pelo dono.
No Linux, um arquivo ou diretório pode ter apenas um proprietário/dono e um grupo proprietário, não sendo possível ter dois proprietários. O proprietário/dono é o usuário que criou o arquivo ou diretório e tem direitos de acesso especiais a ele, como permissão de modificá-lo ou excluí-lo; ou é um usuário que não criou o diretório.
DESENVOLVIMENTO 1
Até aqui, é importantíssimo entender que o root é uma coisa e o Dono de diretórios e arquivos é outra; são distintos.
O root está acima do Dono, do Grupo e dos Outros. O root é o cara! E esse cara pode ser qualquer um (que tenha a senha de root)!
Por exemplo, o usuário lebowski é um cara chamado João Muhammad Wang da Silva Smith (na instalação do sistema ele poderia ter colocado o nome do usuário de João, de Muhammad, de Wang, de Silva, de Smith, etc, mas preferiu colocar o nome de lebowski). E este usuário lebowski, que é o CPF João Muhammad Wang da Silva Smith, é o Dono lebowski de algum diretório e/ou arquivo e pode fazer parte de um Grupo ou pode ser os Outros em relação a algum diretório e/ou arquivo. Quem decide é o root.
Então, a pessoa João Muhammad Wang da Silva Smith como root pode colocar o usuário lebowski (ele mesmo) como Outros em um determinado diretório e/ou arquivo, bem como pode colocar como Dono ou colocar na patota, no Grupo.
O importante é entender que você enquanto root deve abstrair do mundo e a partir daí enxergar você mesmo como um usuário qualquer, ou seja, neste momento você é o root, é o cara; você não é o lebowski, sequer você é o João Muhammad Wang da Silva Smith... você nem é você mesmo: você é o Superusurário, é o root.
O lebowski, neste momento, é um usuário que o root manipula como quiser e você é o root... pelo menos até deslogar do root e voltar a ser o lebowski com seus poderes limitados, sem poderes de super-vaca.
No
Linux temos R de Read (em Português "Leitura"), W de Write (em Português "Escrita", mas entende-se aqui por Escrita/Gravação) e temos X de Execute (Execução).
Leitura - Concede a capacidade de ler, ou seja, visualizar o conteúdo do arquivo.
Escrita/Gravação - Entende-se aqueles diretórios e arquivos os quais um determinado usuário pode alterar, escrever e gravar no arquivo; concede a capacidade de modificar ou remover o conteúdo do arquivo; é a permissão mais cabulosa das três.
Execução - O usuário com permissões de execução pode executar um arquivo como um programa.
E temos os modos de acesso concernentes às permissões:
Ler
O acesso a um diretório significa que o usuário pode ler o conteúdo. O usuário pode ver os nomes dos arquivos dentro do diretório.
Escrever
Significa que o usuário pode adicionar ou excluir arquivos do diretório e pode modificar o conteúdo de um arquivo.
Executar
A execução de um diretório ou arquivo realmente não faz sentido na forma de acesso ao diretório ou arquivo, então pense nisso como uma permissão de passagem (não passageira, mas de passagem, atravessar). Por exemplo, um usuário deve ter acesso de execução ao diretório bin para executar o comando ls ou cd.
Então não confunda as permissões de forma geral com as permissões dos modos de acesso, isso reflete-se ao que veremos adiante com chown (change owner) e chmod (change mode).
Porém, antes temos o seguinte esquema:
O hífen (tracinho) indica que uma determinada permissão não está configurada, ou seja, o usuário não tem aquela permissão.
- 0 Sem permissões --- = 0
- 1 Permissão de Execução --x = 1
- 2 Permissão de Escrita -w- = 2
- 3 Permissão de Escrita e Execução: 1 (execute) + 2 (write) = 3 -wx
- 4 Permissão de Leitura r-- = 4
- 5 Permissão de Leitura e Execução: 4 (read) + 1 (execute) = 5 r-x
- 6 Permissão de Leitura e Escrita: 4 (read) + 2 (write) = 6 rw-
- 7 Todas as Permissões: 4 (read) + 2 (write) + 1 (execute) = 7 rwx
- R de Read (Leitura) recebe o valor 4.
- W de Write (Escrever/Gravar) recebe o valor 2.
- X de Execution (Execução) recebe o valor 1.
Neste momento, você, neófito, pode estar se perguntando: "Agora colocaram números no meio da parada?"
Mas é simples, é o formato octal (são oito algarismos de 0 a 7).
O formato octal é um conjunto de oito números onde cada número define um tipo de acesso diferente.
Recebem esses valores (números) porque foram convencionados, apesar de que isso remonta aos primórdios de bits e bytes, mas não vem ao caso.
Veremos agora a saída do comando ls -l para vermos algumas permissões como exemplo.
# ls -l
total 52
-rw-r--r-- 1 root root 9644 abr 5 02:54 clamav-milter.conf
-rw-r--r-- 1 root root 26117 abr 5 02:54 clamd.conf
-rw-r--r-- 1 root root 5983 abr 5 02:54 freshclam.conf
drwxr-xr-x 12 root root 4096 mar 13 20:34 nftables
-rw-r--r-- 1 root root 0 mar 13 19:14 packages.txt
Vamos analisar a primeira parte da seguinte linha:
drwxr-xr-x 12 root root 4096 mar 13 20:34 nftables
- Tem 10 caracteres no começo da linha (drwxr-xr-x).
- Inicia com "d" que significa que é um diretório, os outros nove são as permissões propriamente ditas, três para cada: Dono, Grupo e Outros. rwx (dono), r-x (grupo) e r-x (outros).
- O hífen, no caso, não é um separador, ele indica quando uma permissão não está configurada e as permissões aparecem em sequência rwx.
Traduzindo para octal:
- rwx é 4+2+1 = 7.
- r-x é 4+1 = 5
- r-x é 4+1 = 5
Em octal a permissão é 755.
Aí você escolhe se quer trabalhar umas vezes com letras (rwx) e outras com números (421).
Esta linha:
-rw-r--r-- 1 root root 5983 abr 5 02:54 freshclam.conf
Tem os 10 caracteres iniciando com um hífen (traço) que estando no início da linha indica se tratar de um arquivo.
Seguindo o esquema r=4, w=2 e x=1 temos os nove caracteres restantes que são as permissões propriamente ditas:
rw- = 4+2 = 6
r-- = 4
r-- = 4
Permissão 644.
Lembrando que muitas vezes um programa ao ser instalado ele muda as permissões padrões do sistema operacional para suas próprias permissões, mas é para isso mesmo que existem os comandos, principalmente como root, para você alterar tudo e bagunçar todo o sistema.
# ls -l
lista as permissões dos diretórios e arquivos.
Caso queira listar um diretório ou arquivo em específico:
# ls -l nome_do_arquivo ou diretorio
Não me deterei em comandos aqui, pois temos que entender a lógica da coisa antes de ser um mero decorador de comandos. Os comandos você memoriza praticando e os manuais estão aí para auxiliar.
Dando um umask -S no mesmo lugar:
# umask -S u=rwx,g=rx,o=rx
u=usuário=dono, g=grupo e o=outros.
Podemos ver a diferença. A saída do umask refere-se às permissões padrões em relação ao sistema e a saída do ls -l refere-se aos diretórios e arquivos.
Em qualquer lugar (diretório) que você for, a saída do umask -S será sempre a mesma. Vá dando cd /home, cd /usr/src, cd /bin/X11, etc, e dando umask -S e verá que a saída é sempre a mesma.
A saída de ls -l muda de acordo com as permissões de cada diretório e arquivo.
Quando aparecer uma linha assim:
lrwxrwxrwx 1 root root 4 mar 18 17:58 zstdmt -> zstd
O "l" (letra éle) no início dos 10 caracteres indica se tratar de um link simbólico (symlink).
Agora ficou fácil de entender as permissões, a linha aí de cima tem as permissões:rwx - Dono;
rwx - Grupo;
rwx - Outros.
Permissão 777.
Depois do primeiro caractere à esquerda começam as permissões que são nove caracteres e quando tem hífen nos nove caracteres indica que tal permissão (r, w ou x) não está setada.
No primeiro caractere:
- d -> indica que é um diretório;
- hífen(-) -> indica que é um arquivo;
- l -> indica que é um link simbólico.
Vamos ver o significado de toda a linha:
drwxr-xr-x 12 root root 4096 mar 13 20:34 nftables
- d = tipo do arquivo (é um diretório)
- rwxr-xr-x = permissões de acesso ao diretório ou arquivo ou symlink
- 12 = número total de links para o arquivo ("atalhos") somado com o número de diretórios e arquivos dentro do diretório em questão
- root = usuário proprietário do arquivo
- root = grupo do arquivo
- 4096 = tamanho do arquivo em bytes
- mar = mês da última modificação
- 13 = dia da última modificação
- 20:34 = horário da última modificação
- nftables = nome do arquivo ou diretório
ALTERANDO PERMISSÕES
# chmod 444 diretorio ou arquivo
ou
$ sudo chmod 444 diretorio ou arquivo
Podemos aplicar uma permissão recursivamente com o parâmetro "-R" de forma que todo o diretório e subdiretórios e arquivos também recebam esta permissão. Exemplo:
# chmod -R 750 diretorio ou arquivo
Obs.: A opção -R muda as permissões de TODOS os diretórios e arquivos que estão dentro do diretório. Por exemplo:
# chmod -R 777 nftables
mudará as permissões de TODOS os diretórios e arquivos incluindo os arquivos dentro dos diretórios dentro de nftables, TUDO ficará com as permissões 777. Use com cuidado.
ALTERANDO O DONO
Sintaxe:
chown [opções] [novo_proprietário] [:novo_grupo] nomes_arquivos
Alterar o dono do diretório ou arquivo para o usuário lebowski
# chown lebowski diretorio ou arquivo
Alterar o usuário (dono) e o grupo do diretório ou arquivo para dono lebowski e grupo patota:
# chown lebowski:patota nome_do_diretorio ou nome_do_arquivo
Vamos ver um pouco mais na realidade:
# adduser lebowski www-data
# cd /var/www
# chown -Rv www-data:www-data /var/www/
# chmod -Rv g+rw /var/www/
O comando adduser foi usado para colocar o usuário lebowski no grupo www-data, a patota do Apache.
Depois o root entrou (cd, change directory) no diretório /var/www.
O comando chown (change owner) atribuiu os arquivos contidos em /var/www para o usuário e grupo www-data, ou seja, colocou o usuário www-data como dono e colocou o /var/www no grupo www-data. E atribuiu recursivamente (-R) e verbosamente (v dá informações na saída do comando).
Pode ter um usuário e um grupo com o mesmo nome, mas não pode ter dois usuários com o mesmo nome e nem dois grupos com o mesmo nome.chown define quem é o proprietário do arquivo ou diretório.
chmod define quem tem permissão de fazer outras coisas dentro do arquivo ou diretório.
O comando chmod (change mode) adicionou permissões de leitura (r) e escrita (w) aos arquivos para os grupos a que pertencem, no caso www-data.
Percebam que pode ter mais de uma sintaxe:
# chmod g+rw diretorio ou arquivo
# chmod 755 diretorio ou arquivo
- g+rw acrescenta essas permissões, caso não tenham.
- g-rx tira essas permissões, caso tenham.
- g=x elimina todas as permissões que tem no grupo e deixa com somente permissão de execução (x).
A mesma coisa com:
Lembrando:
- u = Usuário/Dono;
- g = Grupo;
- o = Outros.
DESENVOLVIMENTO 2
Em relação ao bit "Set-User-ID" citado anteriormente de passagem (tema de casa para quem tiver interesse), caso der o comando abaixo:
# chmod us arquivo.txt
ativa o bit SUID e faz com que qualquer um que tente acessar esse arquivo o fará como sendo o proprietário do arquivo.
E se der o comando abaixo:
# chmod a=rw arquivo.txt
dará permissão de leitura e escrita para todos ao arquivo.txt (a de all, todos em Português).
Testando algumas coisas
No diretório root crie um diretório:
# mkdir teste
e dê um ls -l
# ls -l teste
total 0
Entre no teste:
# cd teste
Crie um arquivo dentro do diretório teste:
# vim teste1
Usei o vim, use teu editor de texto preferido.
Digite qualquer coisa dentro do arquivo. Salve e saia.
Volte ao root:
# cd
Dê um ls -l:
# ls -l teste
total 4
-rw-r--r-- 1 root root 6 abr 15 20:50 teste1
E vemos que o arquivo teste1 foi criado com as permissões padrões do umask para arquivos txt.
Vamos criar um diretório dentro de teste:
# cd teste
# mkdir teste2
Entrando no diretório teste2:
# cd /teste/teste2
Vamos criar um arquivo dentro de teste2:
# vim teste3
Digite qualquer coisa dentro, salve e saia.
Volte ao root:
# cd
Dê um ls -l no diretório e teste:
# ls -l teste
total 8
-rw-r--rr-- 1 root root 6 abr 15 20:50 teste1
drwxr-xr-x 2 root root 4096 abr 15 20:58 teste2
O comando não exibiu o arquivo dentro de teste2 porque não estamos no diretório teste2.
Percebam que as permissões padrões criadas para o diretório teste2 são diferentes das permissões do arquivo teste1, isso acontece porque o
Linux cria permissões padrões diferentes para diretórios e arquivos.
Os diretórios, dentro da estrutura Linux, recebem umas permissões padrões e os arquivos outras, dependendo se o arquivo é texto ou binário.
A umask (user mask, máscara do usuário, grosso modo) é somente um padrão que pode ser alterado pelo root. Um diretório tem permissão de execução para que se possa entrar nele. Além disso, as permissões de um diretório tem precedência sobre as dos arquivos que ele contém.
Caso você alterar as permissões do diretório teste2 sem o parâmetro -R (recursivamente), as permissões do arquivo teste3 permanecerão as mesmas.
Caso você der um chmod 0 teste2:
# chmod 0 teste2
verá que o diretório teste2 ficará sem permissão nenhuma, mas o arquivo dentro continuará com as permissões anteriormente definidas.
Mas vamos entender mais um pouco.
# ls -l
-rw-r--rr-- 1 root root 6 abr 15 20:50 teste1
d--------- 2 root root 4096 abr 15 20:58 teste2
Agora vamos dar um:
# ls -l teste2
A saída será:
total 4
-rw-r--r-- 1 root root 6 abr 15 20:50 teste3
Isso acontece por que o comando "ls -l teste2" mostra somente as permissões do que está dentro do diretório teste2.
Para vermos as permissões de teste2 devemos digitar o comando ls -l sem parâmetros:
# ls -l
-rw-r--rr-- 1 root root 6 abr 15 20:50 teste1
d--------- 2 root root 4096 abr 15 20:58 teste2
Também temos o arquivo /etc/sudoers (man sudoers) que em sistemas Debian e derivados, além de alguns outros não derivados do Debian, é o arquivo que determina os privilégios de sudo.
A man page sudoers (Manual do sudoers) descreve também o grupo wheel.
Em sistemas Debian e derivados o grupo é chamado de sudo (SuperUser DO - SuperUsuário FAZ) e em outros sistemas como Red Hat e derivados o grupo é chamado de wheel (roda).
No arquivo /etc/sudoers do Debian, por exemplo, sequer toca no nome da patota do wheel.
Quando você usa sudo, su, etc, na realidade você está quase como root.
Para estar como root mesmo - o todo poderoso superusuário com plenos poderes de super-vaca - você precisa logar como root na inicialização do sistema. Porém, isto não é aconselhável e nem é necessário.
Entendendo um pouco as linhas do /etc/sudoers:
1. ALL=(ALL:ALL) ALL: O primeiro ALL representa todos os hosts, o segundo ALL indica todos os usuários e o terceiro ALL indica todos os grupos. O último ALL representa todos os comandos. Dar estes privilégios a um usuário o coloca no grupo sudo e o mesmo não precisa mais digitar a senha antes de um comando específico com sudo. E se não estiver na patota do sudo dará a mensagem: lebowski não está no arquivo sudoers.
2. ALL=(ALL) ALL: O primeiro ALL representa todos os hosts, o segundo ALL indica todos os usuários, como não tem o terceiro ALL o usuário colocado com estes privilégios não poderá executar comandos como outros grupos. O último ALL representa todos os comandos.
Para abrir o arquivo /etc/sudoers com o editor de texto padrão do sistema execute o comando:
$ sudo visudo
senão use o teu editor preferido:
# vim /etc/sudoers
Podes colocar o seguinte para teu usuário:
ALL=(ALL:ALL) NOPASSWD: ALL
Salve e saia. Não precisará mais digitar senha com sudo, exemplo:
$ sudo apt-get update
ou qualquer outro comando que precise de privilégios root não pedirá senha nunca.
CURIOSIDADE IMPORTANTE
No Debian e derivados se você digitar como usuário su ou su - verá a diferença no terminal:
$ su
digitando a senha mudará para:
#
As inicias "su" em si significam "Substitute User", substitui o ID do usuário e do grupo, ou seja, você entra temporariamente nessa condição.
su sem parâmetro mudará para o usuário em que está (no caso acima estava em lebowski). É a mesma coisa que digitar:
$ su lebowski
Para mudar de usuário:
$ su postgres
$ su usuario etc
A senha que pedirá é a senha do usuário digitado ali, não é a senha de root ou do seu usuário, no caso, lebowski.
Caso der falha de autenticação provavelmente é por que você não cadastrou senha para o usuário, ele só foi criado, mas não tem senha.
$ sudo passwd usuario
e digite a senha do seu usuário para logar e depois digite as duas senhas para o usuário.
Para mudar para outro usuário com ou sem poderes de root depende em qual grupo o usuário foi colocado. Caso estiver no grupo sudo terá privilégios de root.
Basta digitar su seguido do nome do usuário que se quer.
O su - (com hífen) sem parâmetro entra no diretório /home do usuário como root.
Pode utilizar também o comando usermod para inserir usuários, mudar diretórios, etc.
Mudando o nome lebowski para grande_lebowski:
# usermod -l lebowski grande_lebowski
Para trancar uma conta:
# usermod -L lebowski
Utilize a opção -U para destrancar:
# usermod -U lebowski
Para criar um usuário e um diretório /home para esse novo usuário use a opção -m do comando
# useradd -m grande_lebowski
CONCLUSÃO
Como vimos, é simples entender as permissões do
Linux.
Procurei fazer uma abordagem geral, mas com certeza faltou alguma coisa, pois o assunto é extenso.
Muita gente confunde o Dono do diretório ou arquivo com o root, apesar de que o root pode ser (e é) dono de diretórios e arquivos, mas tem essa distinção.
Considerando o Dono e o Grupo pode-se setar as permissões ou restrições de acordo com o que você quer. Por exemplo, em relação ao Samba sempre há aquela dúvida entre as permissões do Samba e as permissões do sistema em si, porém, você entendendo isso agora as coisas ficam mais claras.
O root é o superusuário, é o cara... é praticamente o Superman do mundo Linux.
Aquele usuário que você dá o nome durante a instalação nem é você quando você está como root, nessa hora você é o root.
É Importante também entender o que significam as permissões de Leitura, Escrita e Execução, como vimos.
Quando você usa sudo, su, etc, na realidade você está quase como root.
O aconselhável é usar, por exemplo, o sudo e digitar a senha cada vez que for pedida no terminal, pois assim você tem tempo de pensar antes de fazer bobagem no sistema.
Em sistemas Debian e derivados o grupo é chamado de sudo e em outros sistemas como Red Hat e derivados o grupo é chamado de wheel.
Para estar como root mesmo - o todo poderoso superusuário com plenos poderes de super-vaca - você precisa logar como root na inicialização do sistema, porém, isto não é aconselhável e nem é necessário.
Mais exemplos de como lidar com as permissões no Linux encontramos nos links das referências abaixo: