Originalmente, os usuários tinham a intenção de corresponder a um humano usando o sistema, daí o nome. Cada processo é executado como um usuário específico e cada arquivo é de propriedade de 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 root corresponde ao próprio sistema operacional, ele tem todos os privilégios.
Logo as pessoas descobriram que era conveniente criar vários usuários do sistema, sem privilégios abrangentes. Isso permite isolar os vários serviços que são executados em uma máquina, para que eles não peguem 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 usa o sistema. Você geralmente tem uma conta de serviço para cada tarefa em execução no sistema que tenha 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 (além de conceder muitos privilégios ao usuário com o 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 tem 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 são a ser usado (por exemplo, su foo
requer que foo
tenha uma casca).
- Um usuário humano geralmente tem uma senha - mas nem sempre é esse o caso, por exemplo, um usuário somente remoto pode ter apenas uma chave SSH. Observe que nos unices modernos, a senha não está em
/etc/passwd
, mas em algum outro arquivo, como /etc/shadow
.
- O diretório pessoal de um usuário humano geralmente está em
/home
(ou algum local específico do site), enquanto o diretório inicial de um usuário do sistema geralmente não está em /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 disjunto 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ários reais de 500 ou 1.000.
Nos sites em que as contas são compartilhadas em várias máquinas, geralmente há um servidor central que contém listas de usuários, acessíveis por NIS ou LDAP . A entrada passwd
em /etc/nsswitch.conf
especifica onde encontrar informações do usuário. É comum ter usuários do sistema no local /etc/passwd
e usuários reais do banco de dados em toda a rede, mas às vezes há usuários do sistema no banco de dados em toda a rede (para impor UIDs consistentes, o que facilita a replicação de dados e servidores) e às vezes, há usuários humanos no arquivo local (para permitir que eles efetuem login mesmo quando a rede é operada).
Uma conta acessível a humanos disfarçada como um 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, ao mesmo tempo em que teria um ID de usuário no intervalo do sistema. Na verdade, seria um disfarce melhor usar uma conta do sistema real 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 as 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 e de serviço, 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
vs adduser --system
ou useradd
vs useradd -r
no Linux.