Módulo 3 · 3.1
Utilizadores, grupos e permissões de ficheiros
Módulo 3: Utilizadores, permissões e sudo · Tempo de leitura: 12 minutos
Objetivo de aprendizagem: Depois desta lição, saberá criar e consultar utilizadores e grupos, ler as permissões de um ficheiro ou pasta em ls -l e defini-las corretamente com chmod e chown sem abrir tudo.
Conceitos-chave: root (UID 0), utilizador comum, utilizador de sistema, /etc/passwd, /etc/shadow, grupo, adduser, id, rwx, proprietário, grupo, outros, octal (644, 755, 600), chmod, chown, umask, setuid, 777
Todos são um número
O Linux foi concebido desde o início para vários utilizadores numa só máquina. Cada processo em execução corre em nome de um utilizador e cada ficheiro tem um proprietário. Para o sistema, um utilizador é sobretudo um número, o UID:
- root tem o UID 0. O root pode tudo: ler e alterar qualquer ficheiro, parar qualquer serviço, criar qualquer utilizador. Não existe um "tem a certeza?".
- Utilizadores comuns, como
anna, recebem no Debian e no Ubuntu um UID a partir de 1000. Podem escrever na sua própria pasta pessoal e pouco mais. - Utilizadores de sistema têm um número baixo e, normalmente, nem palavra-passe nem shell. Os serviços correm sob um utilizador deste tipo: o nginx sob
www-data, o PostgreSQL sobpostgres. Se um desses serviços for comprometido, o intruso fica apenas com as permissões desse utilizador, não com as do root.
Para ver quem é, use id:
anna@web1:~$ id
uid=1000(anna) gid=1000(anna) groups=1000(anna),27(sudo),100(users)A Anna tem o UID 1000, um grupo próprio anna, e pertence também aos grupos sudo e users.
Onde estão os utilizadores
A lista de utilizadores está em /etc/passwd, uma linha por utilizador:
anna@web1:~$ grep -E '^(root|www-data|anna):' /etc/passwd
root:x:0:0:root:/root:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
anna:x:1000:1000:Anna,,,:/home/anna:/bin/bashOs campos, separados por dois pontos: nome, x (a palavra-passe está noutro sítio), UID, grupo principal, descrição, pasta pessoal, shell. Em www-data, a shell é /usr/sbin/nologin: não é possível iniciar sessão.
As palavras-passe propriamente ditas estão guardadas, cifradas (em hash), em /etc/shadow. Só o root pode ler esse ficheiro. Um ! ou * no início do campo da palavra-passe significa: não é possível iniciar sessão com palavra-passe. É assim que o root está bloqueado por predefinição no Ubuntu, e no Debian se não tiver indicado uma palavra-passe de root durante a instalação.
Criar utilizadores e grupos
No Debian e no Ubuntu utiliza o prático adduser:
root@web1:~# adduser anna
info: Adding user `anna' ...
info: Adding new group `anna' (1000) ...
info: Adding new user `anna' (1000) with group `anna (1000)' ...
info: Creating home directory `/home/anna' ...
info: Copying files from `/etc/skel' ...
New password:
Retype new password:
...O adduser cria o utilizador, um grupo próprio com o mesmo nome e uma pasta pessoal, e pede uma palavra-passe. Existe também o useradd, de nível mais baixo (e que é o comando habitual no AlmaLinux e no Rocky Linux), mas sem opções faz menos: não define palavra-passe e, em alguns sistemas, não cria pasta pessoal.
Um grupo é uma forma de dar permissões a vários utilizadores de uma só vez. Para adicionar um utilizador a um grupo:
root@web1:~# adduser anna www-data
root@web1:~# usermod -aG www-data anna # o mesmo, funciona em todo o ladoAtenção ao -a em usermod: sem -a, substitui todos os grupos adicionais do utilizador apenas por este. Um novo grupo só passa a valer depois de voltar a iniciar sessão.
Para bloquear uma conta sem a eliminar (por exemplo, de um antigo colega):
root@web1:~# usermod -L -e 1 joao-L bloqueia a palavra-passe, -e 1 faz a conta expirar. Atenção: uma palavra-passe bloqueada nem sempre impede o acesso com uma chave SSH. Remova, por isso, também as chaves em /home/joao/.ssh/authorized_keys (lição 2.3); uma conta expirada (-e 1) é recusada pelo sshd.
Ler permissões
anna@web1:~$ ls -l /var/www/example.com
total 12
-rw-r--r-- 1 anna www-data 1520 Nov 9 10:12 index.html
-rw-r----- 1 anna www-data 412 Nov 9 10:14 config.php
drwxr-xr-x 2 anna www-data 4096 Nov 9 10:15 images
drwxrwxr-x 2 www-data www-data 4096 Nov 9 10:20 uploadsO primeiro bloco de dez caracteres é a chave de tudo:
- Carácter 1: o tipo.
-é um ficheiro comum,duma pasta (diretório),luma ligação simbólica (symlink). - Caracteres 2 a 4: o que o proprietário pode fazer.
- Caracteres 5 a 7: o que o grupo pode fazer.
- Caracteres 8 a 10: o que os outros (todos os restantes) podem fazer.
Seguem-se o número de ligações, o proprietário, o grupo, o tamanho e a data.
Num ficheiro, as letras significam:
| Letra | Significado num ficheiro |
|---|---|
r | ler |
w | alterar |
x | executar como programa ou script |
E numa pasta, algo ligeiramente diferente:
| Letra | Significado numa pasta |
|---|---|
r | listar os nomes dos ficheiros na pasta |
w | criar, mudar o nome e eliminar ficheiros na pasta |
x | entrar na pasta e abrir os ficheiros que contém |
Este último ponto surpreende muitas pessoas. Sem x numa pasta, não consegue chegar aos ficheiros que ela contém, mesmo que esses ficheiros sejam legíveis. E quem tem w numa pasta pode eliminar ficheiros nela, mesmo que pertençam a outra pessoa.
No exemplo: index.html pode ser lido por todos; config.php (com a palavra-passe da base de dados) pode ser lido e alterado pela Anna, o grupo www-data (ou seja, o servidor web) só o pode ler, e os restantes nada. Em uploads o servidor web pode escrever, porque é aí que ficam os carregamentos dos visitantes.
Permissões em número
As permissões são muitas vezes escritas como três algarismos, o número octal. Cada letra tem um valor: r = 4, w = 2, x = 1. Some por grupo:
| Permissões | Número | Utilização |
|---|---|---|
rw-r--r-- | 644 | ficheiro comum que todos podem ler |
rw-r----- | 640 | ficheiro para o proprietário e o grupo, como uma configuração com uma palavra-passe |
rw------- | 600 | ficheiro secreto, como authorized_keys ou uma chave privada |
rwxr-xr-x | 755 | pasta ou programa que todos podem utilizar |
rwx------ | 700 | pasta privada, como ~/.ssh |
Alterar permissões: chmod e chown
anna@web1:~$ chmod 640 /var/www/example.com/config.php
anna@web1:~$ chmod g+w /var/www/example.com/uploads
root@web1:~# chown anna:www-data /var/www/example.com/config.phpchmod altera as permissões, com um número ou com letras (u, g, o para proprietário, grupo e outros; + ou - e a letra). chown eigenaar:groep altera o proprietário e o grupo; só o root o pode fazer. Com -R, ambos atuam sobre uma pasta inteira, e é aí que muitas vezes as coisas correm mal: chmod -R 644 numa pasta torna todas as subpastas inutilizáveis, porque as pastas precisam de x. Para uma árvore inteira, prefira find:
root@web1:~# find /var/www/example.com -type d -exec chmod 755 {} +
root@web1:~# find /var/www/example.com -type f -exec chmod 644 {} +Nunca 777
"Não funcionava, por isso pus 777." 777 significa: todos no servidor podem ler, alterar e executar isto. Se algum dia um único serviço ou site no seu servidor for comprometido, o intruso pode escrever em tudo o que tenha 777, incluindo os seus ficheiros PHP. O verdadeiro problema é quase sempre o proprietário ou o grupo: dê ao servidor web, através do grupo, exatamente a permissão de que precisa, e apenas na pasta onde é necessária.
Permissões predefinidas e bits especiais
Os novos ficheiros recebem as suas permissões através da umask. Com a umask habitual 022, os novos ficheiros ficam com 644 e as novas pastas com 755. Pode ver a sua umask com o comando umask.
Por vezes vê um s em vez de um x, como em /usr/bin/passwd (-rwsr-xr-x). É o bit setuid: o programa corre com as permissões do proprietário (root), mesmo que seja iniciado por um utilizador comum. Isso é necessário para alguns programas de sistema, mas nunca o defina num script por conta própria. Um ficheiro setuid inesperado é um sinal conhecido de intrusão; com find / -perm -4000 -type f 2>/dev/null vê todos.
No AlmaLinux e no Rocky Linux
Aí, adduser é outro nome para useradd; utilize useradd -m anna e depois passwd anna. Os grupos adicionam-se com usermod -aG. O SELinux acrescenta uma camada extra às permissões desta lição: um ficheiro com as permissões corretas pode ainda assim ser recusado se tiver a etiqueta SELinux errada (ls -Z mostra-a).
Resumo
- Cada utilizador tem um UID; o root (0) pode tudo, os serviços correm sob utilizadores de sistema próprios, sem shell.
- Os utilizadores estão em
/etc/passwd, os hashes das palavras-passe em/etc/shadow. Crie utilizadores comaddusere adicione grupos comusermod -aG. ls -lmostra o tipo, as permissões do proprietário, do grupo e dos outros e, a seguir, o proprietário e o grupo. Numa pasta,xsignifica entrar ewcriar e eliminar ficheiros.- Números habituais: 644 e 755 para conteúdo público, 640 para configuração com segredos, 600 e 700 para conteúdo privado. Nunca 777.
- Utilize
findpara definir permissões numa árvore inteira; esteja atento a ficheiros setuid.
Questionário
Exercício
Exercício Z3.1: Ler permissões. Abra o ficheiro de exemplo rechten-1.txt: a saída de id para três utilizadores e de ls -l numa pasta web. Responda, para cada pergunta, quem pode fazer o quê (por exemplo: "o servidor web consegue alterar config.php?", "que ficheiro tem permissões demasiado abertas?", "que número corresponde a .env?"). O programa compara as suas respostas com a chave fixa e explica o porquê de cada uma.
Para saber mais
Os passos descritos nestes artigos aplicam-se aos pacotes de alojamento e aos VPS da WebOké; noutros fornecedores funciona de forma semelhante.
- Proibido (403): não tem permissão para aceder a / neste servidor
- Iniciar sessão no seu VPS com SSH (e criar uma chave SSH)
- Curso gratuito de WordPress 7.4: Reforçar a segurança da site: permissões, cabeçalhos e plugins de segurança
- Manual do Debian sobre adduser: https://manpages.debian.org/trixie/adduser/adduser.8.en.html
- Manual do Debian sobre chmod: https://manpages.debian.org/trixie/coreutils/chmod.1.en.html
- Ler e definir corretamente as permissões de ficheiros no seu VPS
