Aplique o princípio do privilégio mínimo: contas de serviço sem shell, sudo restrito, systemd isolado, usuários do banco, papéis no Proxmox e no Windows.
Para que serve
O privilégio mínimo é dar a cada pessoa, aplicação e script apenas as permissões necessárias para a sua tarefa, e nada além. Quando uma aplicação web roda como root ou o backup usa a senha de administrador do Proxmox, uma única falha vira controle total do servidor. Com contas e permissões separadas, o invasor fica preso ao pedaço que comprometeu. Este artigo mostra como aplicar isso no Linux, no banco de dados, no Proxmox VE e no Windows Server.
Pré-requisitos
- Acesso root/administrador ao host e às VMs.
- Uma lista dos serviços que rodam em cada VM e de quem precisa administrar o quê.
- Uma janela de teste: mudar o usuário de um serviço pode exigir ajustar permissões de pastas.
Passo 1: privilégio mínimo para contas de serviço no Linux
- Crie um usuário de sistema por aplicação, sem senha e sem shell:
sudo useradd --system --home-dir /opt/minhaapp --shell /usr/sbin/nologin minhaapp sudo chown -R minhaapp:minhaapp /opt/minhaapp - Rode o serviço com esse usuário e com isolamento do systemd. Exemplo de
/etc/systemd/system/minhaapp.service:
Se a aplicação precisa escutar em porta abaixo de 1024, troque[Unit] Description=Minha aplicação After=network.target [Service] User=minhaapp Group=minhaapp ExecStart=/opt/minhaapp/bin/minhaapp NoNewPrivileges=yes ProtectSystem=strict ProtectHome=yes PrivateTmp=yes ReadWritePaths=/opt/minhaapp/dados /var/log/minhaapp CapabilityBoundingSet= Restart=on-failure [Install] WantedBy=multi-user.targetCapabilityBoundingSet=porAmbientCapabilities=CAP_NET_BIND_SERVICEeCapabilityBoundingSet=CAP_NET_BIND_SERVICE. - Aplique e avalie:
O comando mostra uma nota de exposição e quais proteções ainda faltam.sudo systemctl daemon-reload && sudo systemctl restart minhaapp systemd-analyze security minhaapp.service - Separe sites em PHP-FPM: um pool por site, cada um com o próprio
useregroup, para que a invasão de um site não permita ler os arquivos do outro.
Passo 2: sudo restrito em vez de root
Pessoas e scripts de deploy raramente precisam de root completo. Libere só os comandos necessários com visudo:
sudo visudo -f /etc/sudoers.d/deploy
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart minhaapp.service, /usr/bin/systemctl status minhaapp.service
Evite liberar editores, tar, find, less ou interpretadores (python, bash) via sudo: todos permitem escapar para um shell de root. Revise periodicamente com sudo grep -r . /etc/sudoers.d/ e getent group sudo.
visudo, que valida antes de salvar, e mantenha uma sessão root aberta enquanto testa. Se perder o acesso, entre como root pelo console IPMI/iLO.Passo 3: usuários do banco de dados
- MySQL/MariaDB: um usuário por aplicação, preso ao banco dela e ao IP de origem:
Para backup, um usuário só de leitura (CREATE USER 'app_erp'@'10.10.10.21' IDENTIFIED BY 'senha-longa-gerada'; GRANT SELECT, INSERT, UPDATE, DELETE ON erp.* TO 'app_erp'@'10.10.10.21';SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER). - PostgreSQL: o dono do banco (que cria tabelas nas migrações) e o usuário da aplicação no dia a dia devem ser papéis diferentes. Restrinja origem e método no
pg_hba.conf. - Nunca use
root/postgres/sana string de conexão de uma aplicação.
Passo 4: papéis e tokens no Proxmox VE e no Backup Server
- Usuários nominais com papéis limitados. Para quem só opera algumas VMs:
Com muitas VMs, agrupe em Pools e dê a permissão empveum user add joao@pve pveum passwd joao@pve pveum acl modify /vms/101 --users joao@pve --roles PVEVMUser/pool/nome-do-pool. - Tokens de API com separação de privilégios para integrações (monitoramento, automação, painéis de terceiros):
O token só tem o que foi dado a ele explicitamente;pveum user add monitor@pve pveum user token add monitor@pve zabbix --privsep 1 pveum acl modify / --tokens 'monitor@pve!zabbix' --roles PVEAuditorPVEAuditorpermite apenas leitura. - Backup que não consegue apagar backup. No Proxmox Backup Server, dê ao usuário ou token usado pelo Proxmox VE o papel DatastoreBackup: ele cria backups e lê os próprios, mas não pode podar nem apagar. A limpeza (prune) fica com um agendamento no próprio PBS. Assim, se o host for comprometido, o invasor não destrói os backups pelo mesmo acesso.
Passo 5: Windows Server
- Conta administrativa separada: cada pessoa usa uma conta comum para o dia a dia e outra, distinta, só para administrar. Confira quem é administrador com:
(useGet-LocalGroupMember -Group "Administradores""Administrators"em instalações em inglês). - Serviços com contas virtuais em vez de um usuário administrador com senha. Uma conta virtual tem o formato
NT SERVICE\NomeDoServicoe não tem senha para vazar:
Em domínio Active Directory, prefira contas gMSA, que têm senha trocada automaticamente.sc.exe config MeuServico obj= "NT SERVICE\MeuServico" - Impeça logon interativo de contas de serviço com as diretivas "Negar logon por meio dos Serviços de Área de Trabalho Remota" e "Negar logon localmente" (
secpol.msc→ Diretivas Locais → Atribuição de direitos de usuário). - SQL Server: logins por aplicação com papéis no banco específico, nunca
sa.
Como saber se funcionou
ps -eo user,comm | sort | uniq -c | sort -rnmostra as aplicações rodando com os seus usuários próprios, e não como root.systemd-analyze securitymostra notas melhores nos serviços ajustados.- O usuário
joao@pvevê e opera apenas as VMs permitidas; tentar outra VM retorna "permission denied". - Tentar remover um backup com o token do PVE no PBS falha por falta de permissão.
Problemas comuns
- Serviço não sobe após trocar o usuário: falta permissão em alguma pasta ou arquivo de configuração. Veja
journalctl -u minhaapp -ee ajuste comchown/chmodapenas o necessário. - "Read-only file system" com
ProtectSystem=strict: inclua a pasta emReadWritePaths=. - Token do Proxmox sem acesso a nada: com
--privsep 1, a permissão precisa ser dada ao token, não só ao usuário. - Aplicação exige ser administrador: geralmente ela só precisa de escrita em uma pasta ou de uma porta privilegiada. Descubra o motivo antes de conceder administrador.
Perguntas frequentes
Por que não usar o root para tudo, se só eu acesso o servidor?
Porque o risco não é só você: é cada aplicação exposta na internet. Com contas separadas, a falha em um sistema não entrega os demais.
O que é uma conta de serviço?
Uma conta usada por um programa, não por uma pessoa. Ela não deve ter senha conhecida, login interativo nem privilégios além do que o programa precisa.
Com que frequência revisar permissões?
Todo mês, junto com o checklist de segurança, e sempre que alguém entrar ou sair da equipe.
Leitura complementar
Precisa de ajuda?
Se perdeu o acesso administrativo depois de alterar sudo ou permissões e precisa do console IPMI/iLO, abra um ticket ou chame o suporte 24/7.
