Originalmente, os usuários pretendiam corresponder a um ser humano usando o sistema, daí o nome. Cada processo é executado como um usuário específico e cada arquivo pertence a um usuário específico. Um usuário especial, chamado root, é usado para coisas que não pertencem a nenhum usuário humano específico, ou seja, o próprio sistema operacional. Como o root corresponde ao próprio sistema operacional, ele possui todos os privilégios.
Logo as pessoas descobriram que era conveniente criar vários usuários do sistema, sem grandes privilégios. Isso permite isolar os vários serviços executados em uma máquina, para que não pisem nos dedos uns dos outros. Uma conta de serviço (ou "conta do sistema", esses dois termos são sinônimos) é aquela que corresponde a um serviço em execução no sistema, e não a alguém que esteja usando o sistema. Você geralmente tem uma conta de serviço para cada tarefa em execução no sistema que possui seu próprio conjunto de privilégios (por exemplo, seus próprios arquivos, suas próprias portas de rede, etc.).
Não existe uma definição formal de conta humana vs sistema / serviço. O kernel não se importa (exceto conceder muitos privilégios ao usuário com UID 0). A maioria dos comandos de administração também não se importa. Algumas diferenças típicas são:
- Um usuário humano tem um nome real como "John Doe", enquanto um usuário do sistema tem um nome descritivo como "Nasal daemon" ou nenhum.
- Um usuário humano possui um shell de login real (por exemplo,
/bin/sh
ou /bin/bash
ou /bin/csh
. Alguns usuários do sistema têm um shell (quase sempre /bin/sh
), outros não, dependendo de como eles devem ser usados (por exemplo, su foo
requerfoo
um shell).
- Um usuário humano geralmente possui uma senha - mas nem sempre é o caso, por exemplo, um usuário remoto apenas pode ter uma chave SSH. Observe que nos unices modernos, a senha não está,
/etc/passwd
mas em algum outro arquivo, como/etc/shadow
.
- O diretório inicial de um usuário humano geralmente está abaixo
/home
(ou em algum local específico do site), enquanto o diretório inicial de um usuário do sistema geralmente não está abaixo /home
e pode não existir (mas há exceções).
- A maioria dos sites designa um intervalo de IDs de usuário para usuários do sistema e um intervalo separado para usuários humanos. Reservar 100–65533 ou 500–65533 ou 1000–65533 é típico e a maioria das distribuições é configurada para começar a alocar IDs de usuário reais de 500 ou 1000.
Nos sites em que as contas são compartilhadas em várias máquinas, normalmente existe um servidor central que contém listas de usuários, acessíveis via NIS ou LDAP . A passwd
entrada em /etc/nsswitch.conf
especifica onde encontrar informações do usuário. É comum ter usuários do sistema no local/etc/passwd
e reais do banco de dados em toda a rede, mas às vezes existem usuários do sistema no banco de dados em toda a rede (para impor UIDs consistentes, o que facilita a replicação de servidor e dados), e às vezes existem usuários humanos no arquivo local (para permitir que eles efetuem login, mesmo quando a rede estiver hospedada).
Uma conta acessível ao ser humano disfarçada de usuário do sistema normalmente não teria um nome real, mas teria um shell de login e um conjunto de senhas ou uma chave SSH, além de ter um ID de usuário no intervalo do sistema. De fato, seria melhor disfarçar o uso de uma conta real do sistema cuja remoção faria com que algum serviço parasse de funcionar. Mas você não pode ter regras rígidas para detectar possíveis ataques: por definição, os invasores não seguem regras.
Contas de serviço e contas humanas são gerenciadas pelos mesmos comandos e registradas nos mesmos arquivos. Os comandos de criação de conta podem ter opções para definir padrões razoáveis para usuários humanos versus serviços, por exemplo, para escolher um ID de usuário no intervalo adequado e solicitar uma senha para um humano e desativar a autenticação de senha para um serviço. Por exemplo, adduser
vsadduser --system
ou useradd
vs useradd -r
no Linux.