DevOps & CI/CD

Gerenciamento de Usuários, Grupos e Sudo em Ambientes de Produção: Do Básico ao Avançado

17 min de leitura

Gerenciamento de Usuários, Grupos e Sudo em Ambientes de Produção: Do Básico ao Avançado

Fundamentos de Gerenciamento de Usuários em Ambientes Linux Em ambientes de produção, o gerenciamento de usuários é a base da segurança. Diferentemente de máquinas pessoais, servidores corporativos precisam de controle granular sobre quem acessa cada recurso. Um usuário é uma identidade no sistema que possui permissões específicas, um identificador único (UID) e um diretório home. Essa separação permite que múltiplas pessoas trabalhem no mesmo servidor sem interferir uma na outra e sem que um usuário comprometido tenha acesso aos dados de todos. Toda conta de usuário é armazenada no arquivo , onde cada linha contém sete campos separados por dois-pontos: nome de usuário, senha (agora apenas um x para indicar que está em ), UID, GID, comentário GECOS, diretório home e shell padrão. Paralelamente, guarda as senhas criptografadas e políticas de expiração. Entender essa estrutura é essencial para diagnósticos rápidos e implementação de políticas de segurança eficazes. Criação e Exclusão de Usuários Para criar um novo usuário em produção, nunca

<h2>Fundamentos de Gerenciamento de Usuários em Ambientes Linux</h2>

<p>Em ambientes de produção, o gerenciamento de usuários é a base da segurança. Diferentemente de máquinas pessoais, servidores corporativos precisam de controle granular sobre quem acessa cada recurso. Um usuário é uma identidade no sistema que possui permissões específicas, um identificador único (UID) e um diretório home. Essa separação permite que múltiplas pessoas trabalhem no mesmo servidor sem interferir uma na outra e sem que um usuário comprometido tenha acesso aos dados de todos.</p>

<p>Toda conta de usuário é armazenada no arquivo <code>/etc/passwd</code>, onde cada linha contém sete campos separados por dois-pontos: nome de usuário, senha (agora apenas um x para indicar que está em <code>/etc/shadow</code>), UID, GID, comentário GECOS, diretório home e shell padrão. Paralelamente, <code>/etc/shadow</code> guarda as senhas criptografadas e políticas de expiração. Entender essa estrutura é essencial para diagnósticos rápidos e implementação de políticas de segurança eficazes.</p>

<pre><code class="language-bash"># Exibir informações de um usuário específico

cat /etc/passwd | grep username

Saída esperada:

username:x:1001:1001:João da Silva:/home/username:/bin/bash

Verificar UID e GID de um usuário

id username

Saída:

uid=1001(username) gid=1001(username) groups=1001(username),27(sudo)</code></pre>

<h3>Criação e Exclusão de Usuários</h3>

<p>Para criar um novo usuário em produção, nunca use <code>adduser</code> interativo em scripts de automação. Use <code>useradd</code> com opções explícitas para garantir repetibilidade. O comando deve incluir um diretório home, um shell válido e, quando relevante, definir expiração da conta. Ao remover usuários, use <code>userdel -r</code> para eliminar também seu diretório home, mas sempre faça backup dos dados antes.</p>

<pre><code class="language-bash"># Criar usuário com configurações explícitas para produção

useradd -m -s /bin/bash -c &quot;Desenvolvedor Backend&quot; -d /home/devbackend devbackend

Definir senha com validade (180 dias)

echo &quot;devbackend:SenhaTemporaria123!&quot; | chpasswd

chage -d 0 devbackend # Força mudança na próximo login

Verificar políticas de envelhecimento

chage -l devbackend

Desabilitar login sem remover a conta

usermod -L devbackend # Bloqueia a senha (adiciona ! no /etc/shadow)

Remover usuário e seu diretório

userdel -r devbackend</code></pre>

<h3>Modificação de Atributos de Usuário</h3>

<p>Situações reais exigem mudanças frequentes: adicionar shell, alterar diretório home, renomear conta. O comando <code>usermod</code> é sua ferramenta principal. Nunca edite <code>/etc/passwd</code> ou <code>/etc/shadow</code> manualmente em produção—sempre use ferramentas especializadas que garantem integridade dos arquivos.</p>

<pre><code class="language-bash"># Alterar shell de um usuário

usermod -s /bin/zsh username

Mover diretório home (cuidado: não move o conteúdo automaticamente)

usermod -d /home/new_location -m username

Adicionar comentário GECOS

usermod -c &quot;Senior DevOps Engineer&quot; username

Modificar UID (raramente necessário, operação delicada)

usermod -u 2001 username

Importante: ajuste também os arquivos proprietários

find / -uid 1001 -exec chown 2001 {} \; 2&gt;/dev/null</code></pre>

<h2>Gerenciamento de Grupos e Permissões</h2>

<p>Grupos são coleções de usuários que compartilham permissões comuns. Em vez de dar permissão individual para cada pessoa acessar um diretório crítico, você cria um grupo, adiciona usuários a ele e configura o grupo como proprietário do recurso. Esse modelo reduz trabalho administrativo e diminui erros. Linux oferece dois tipos: grupos primários (definido no <code>/etc/passwd</code>) e grupos secundários (definidos em <code>/etc/group</code>).</p>

<p>O arquivo <code>/etc/group</code> segue a estrutura: nome do grupo, senha (raramente usada), GID e lista de membros. Um usuário sempre tem um grupo primário (mesmo que não seja explicitamente listado em <code>/etc/group</code>), mas pode pertencer a múltiplos grupos secundários. Na prática, isso significa que se você deletar um grupo de que um usuário faz parte, esse usuário não é deletado—apenas perde as permissões associadas àquele grupo.</p>

<pre><code class="language-bash"># Criar um grupo para uma equipe de produção

groupadd -g 3001 team_devops

Adicionar usuários ao grupo (adiciona aos grupos secundários)

usermod -aG team_devops devbackend

usermod -aG team_devops devinfra

Verificar membros de um grupo

getent group team_devops

Saída:

team_devops:x:3001:devbackend,devinfra

Listar todos os grupos de um usuário

groups devbackend

Saída: devbackend team_devops

Remover usuário de um grupo

gpasswd -d devbackend team_devops</code></pre>

<h3>Permissões de Arquivo e Propriedade</h3>

<p>Uma vez que grupos existem, você usa permissões para controlar o acesso. O modelo Unix de permissões é baseado em três entidades: proprietário (user), grupo (group) e outros (others). Cada uma possui três permissões: leitura (r=4), escrita (w=2) e execução (x=1). Em produção, sempre use notação octal (ex: 755) em scripts para evitar ambiguidades com símbolos.</p>

<pre><code class="language-bash"># Criar um diretório compartilhado para a equipe DevOps

mkdir -p /srv/shared/devops

chown root:team_devops /srv/shared/devops

Definir permissões: dono (rwx), grupo (rwx), outros (nada)

chmod 770 /srv/shared/devops

Verificar permissões

ls -ld /srv/shared/devops

Saída: drwxrwx--- 2 root team_devops 4096 Jan 15 10:30 /srv/shared/devops

Aplicar permissões recursivamente com cautela (use find para ser mais preciso)

find /srv/shared/devops -type d -exec chmod 770 {} \;

find /srv/shared/devops -type f -exec chmod 660 {} \;

Garantir que arquivos criados herdem o GID do diretório

chmod g+s /srv/shared/devops</code></pre>

<h3>Umask e Padrão de Criação de Arquivos</h3>

<p>O <code>umask</code> define quais permissões são subtraídas quando um arquivo é criado. Um umask 0027 significa que novos arquivos terão permissão 640 (666 - 027) e diretórios 750 (777 - 027). Em ambientes de produção, defina umask restritivo no shell profile dos usuários para evitar que arquivos sensíveis sejam criados com permissões amplas.</p>

<pre><code class="language-bash"># Verificar umask atual

umask

Saída típica: 0022

Definir umask mais restritivo (apenas dono pode ler/escrever)

umask 0077

Criar arquivo e verificar permissões

touch test_file.txt

ls -l test_file.txt

Saída: -rw------- 1 user user 0 Jan 15 10:35 test_file.txt

Definir umask permanentemente (adicionar ao /etc/profile ou ~/.bashrc)

echo &quot;umask 0077&quot; &gt;&gt; /home/username/.bashrc</code></pre>

<h2>Escalação de Privilégios com Sudo</h2>

<p>O <code>sudo</code> permite que usuários não-root executem comandos específicos como root ou outro usuário, mantendo um registro de auditoria completo. Nunca distribua senhas de root em produção—use sudo. Sua configuração reside em <code>/etc/sudoers</code>, um arquivo crítico que requer ferramentas especiais para edição. Editar diretamente é perigoso porque sintaxe inválida pode impedir até mesmo que root acesse o sistema.</p>

<p>O poder do sudo está em sua granularidade: você pode permitir que um usuário execute apenas <code>/usr/bin/systemctl restart nginx</code> sem permitir outras alterações. Combine isso com <code>NOPASSWD</code> para automação, ou com variáveis de ambiente para contextualizar execuções. Em ambientes de produção, essa capacidade de auditoria—saber exatamente quem executou o quê e quando—é inestimável para compliance e investigações de segurança.</p>

<pre><code class="language-bash"># NUNCA edite /etc/sudoers diretamente. Use visudo, que valida sintaxe

visudo

Dentro do editor, adicione uma linha simples para permitir sudo sem senha

(use com cuidado, apenas para contas de serviço confiáveis):

devinfra ALL=(ALL) NOPASSWD: /usr/bin/systemctl

Após salvar e sair, teste a configuração

sudo -l -U devinfra

Saída mostra permissões do usuário

Executar comando como sudo

sudo systemctl restart nginx

Executar como outro usuário específico

sudo -u postgres psql -U postgres -d mydb -c &quot;SELECT version();&quot;

Verificar histórico de sudo (registrado em /var/log/auth.log ou journalctl)

sudo journalctl SYSLOG_IDENTIFIER=sudo</code></pre>

<h3>Configuração Granular do Sudoers</h3>

<p>O arquivo <code>/etc/sudoers</code> segue uma sintaxe específica. Cada linha define uma regra com a estrutura: <code>user/group host=(runuser:rungroup) commands</code>. Aliases facilitam manutenção: defina grupos de usuários, hosts ou comandos uma única vez e reutilize. A diretiva <code>Defaults</code> controla comportamento global, como <code>requiretty</code> (exige terminal) ou <code>log_output</code> (registra saída).</p>

<pre><code class="language-bash"># Exemplo de /etc/sudoers configurado via visudo:

Define um alias de grupo de usuários

User_Alias DEVOPS = devinfra, devbackend, devdb

Define um alias de comandos

Cmnd_Alias SYSCTL = /usr/bin/systemctl

Cmnd_Alias PACKAGE = /usr/bin/apt-get, /usr/bin/apt

Define configurações padrão

Defaults log_output

Defaults requiretty

Permite que qualquer membro de DEVOPS execute comandos do sistema

DEVOPS ALL=(root) SYSCTL

Permite que devbackend instale pacotes sem senha (para CI/CD)

devbackend ALL=(root) NOPASSWD: PACKAGE

Permite que devdb execute psql como usuário postgres

devdb ALL=(postgres) /usr/bin/psql

Permite tudo como root (padrão para grupo wheel)

%wheel ALL=(ALL:ALL) NOPASSWD: ALL</code></pre>

<h3>Auditoria e Segurança no Sudo</h3>

<p>Sempre ative logging de sudo e revise regularmente. Use <code>sudoreplay</code> para reproduzir sessões com I/O logging. Em produção crítica, considere usar <code>sudo</code> com <code>LDAP</code> ou <code>FreeIPA</code> para sincronizar usuários e grupos com um servidor centralizado, simplificando administração em múltiplas máquinas.</p>

<pre><code class="language-bash"># Verificar o histórico de execuções sudo

sudo journalctl SYSLOG_IDENTIFIER=sudo | tail -20

Saída típica (se configurado):

Jan 15 10:45:32 prod-server sudo: devinfra : TTY=pts/0 ; PWD=/home/devinfra ;

USER=root ; COMMAND=/usr/bin/systemctl restart nginx

Habilitar logging de I/O (adicione ao /etc/sudoers com visudo)

Defaults use_pty, log_output, log_input

Após isso, reproduzir uma sessão (o arquivo fica em /var/log/sudo-io/)

sudo sudoreplay -l

sudo sudoreplay -p &lt;ID_DA_SESSAO&gt;

Verificar se um usuário tem permissão para executar um comando

sudo -l -U devinfra

Saída mostra todas as permissões concedidas via sudo</code></pre>

<h2>Boas Práticas em Ambientes de Produção</h2>

<p>Gerenciar usuários e sudo em produção não é apenas sobre funcionalidade—é sobre segurança, rastreabilidade e conformidade. Primeira prática essencial: <strong>nunca use a conta root diretamente</strong>. Configure SSH para bloquear login de root e force autenticação por chave (desabilite senha). Todo comando que precise de privilégios deve passar por sudo, criando uma trilha de auditoria indelével.</p>

<p>Segunda prática: <strong>automação determinística</strong>. Use ferramentas como Ansible, Terraform ou scripts shell versioned (no Git) para criar e modificar usuários. Isso garante que o estado do servidor possa ser reproduzido em minutos e que mudanças sejam rastreáveis via controle de versão. Nunca faça &quot;aquele clique rápido&quot; no servidor—tudo deve ser código.</p>

<pre><code class="language-bash"># Exemplo de script de automação idempotente (seguro executar múltiplas vezes)

#!/bin/bash

Criação de usuário com verificação

create_user_if_not_exists() {

local username=$1

local fullname=$2

if id &quot;$username&quot; &amp;&gt;/dev/null; then

echo &quot;Usuário $username já existe. Pulando.&quot;

return 0

fi

useradd -m -s /bin/bash -c &quot;$fullname&quot; &quot;$username&quot;

echo &quot;$username foi criado com sucesso&quot;

}

Adicionar a grupos existentes

add_to_groups() {

local username=$1

shift

local groups=(&quot;$@&quot;)

for group in &quot;${groups[@]}&quot;; do

if grep -q &quot;^$group:&quot; /etc/group; then

usermod -aG &quot;$group&quot; &quot;$username&quot;

echo &quot;Adicionado $username ao grupo $group&quot;

else

echo &quot;Aviso: grupo $group não existe&quot;

fi

done

}

Execução

create_user_if_not_exists &quot;devbackend&quot; &quot;Desenvolvedor Backend&quot;

create_user_if_not_exists &quot;devinfra&quot; &quot;DevOps Engineer&quot;

groupadd -f team_devops # -f ignora se já existe

add_to_groups &quot;devbackend&quot; &quot;team_devops&quot; &quot;sudo&quot;

add_to_groups &quot;devinfra&quot; &quot;team_devops&quot; &quot;sudo&quot;

echo &quot;Script de provisionamento concluído&quot;</code></pre>

<p>Terceira prática: <strong>rotação regular de senhas e chaves</strong>. Para contas interativas, force expiração de senha a cada 90 dias. Para contas de serviço que usam chaves SSH, implemente rotação em intervalos definidos. Use <code>chage</code> para gerenciar políticas de envelhecimento e considere integradores como <code>sssd</code> para sincronização com diretórios centralizados (LDAP, Active Directory).</p>

<pre><code class="language-bash"># Configurar política de expiração de senha

chage -M 90 -W 14 -I 7 username

-M: máximo de dias até expiração (90)

-W: avisar com quantos dias de antecedência (14)

-I: inativar conta após quantos dias de expiração (7)

Verificar política aplicada

chage -l username

Para contas de serviço, defina senhas longas e complexas

openssl rand -base64 32 | head -c 32

Saída: c3V4H9kL2mP7qR1tV4wX6zN8pA0bD5e

Armazene em um gerenciador de segredos (Vault, 1Password, etc.)

Nunca em arquivo de texto claro no servidor</code></pre>

<p>Quarta prática: <strong>princípio do menor privilégio (PoLP)</strong>. Cada usuário deve ter exatamente as permissões necessárias para sua função, nada mais. Se um desenvolvedor backend precisa reiniciar apenas um serviço específico, configure sudo para permitir apenas aquilo. Use ACLs POSIX (setfacl) para permissões mais refinadas quando grupos não forem suficientes.</p>

<pre><code class="language-bash"># Exemplo: permitir que devbackend restart apenas nginx, mas não apache

visudo

Adicione: devbackend ALL=(root) /usr/bin/systemctl restart nginx

Implementar restrição adicional: limitar a umask de criação

echo &quot;Defaults:devbackend umask=0077&quot; &gt;&gt; /etc/sudoers

Usar ACLs para permissões granulares

setfacl -m u:devbackend:rx /var/log/application/

setfacl -m g:team_devops:rwx /srv/shared/devops/

Verificar ACLs

getfacl /srv/shared/devops/</code></pre>

<p>Quinta prática: <strong>monitoramento e alertas</strong>. Configure rsyslog ou auditd para registrar tentativas falhadas de sudo, mudanças de usuário/grupo e acesso a arquivos sensíveis. Monitore <code>/var/log/auth.log</code> ou <code>journalctl</code> continuamente e dispare alertas para qualquer anomalia. Em produção, logs são sua única prova quando algo dá errado.</p>

<pre><code class="language-bash"># Configurar auditd para rastrear mudanças em /etc/sudoers

auditctl -w /etc/sudoers -p wa -k sudoers_changes

Registrar tentativas falhadas de login

auditctl -a always,exit -F arch=b64 -S open -S openat -F dir=/etc/shadow -k shadow_access

Verificar regras ativas

auditctl -l

Revisar logs de auditoria

ausearch -k sudoers_changes -ts recent

ausearch -k shadow_access -ts recent

Gerar relatório de auditoria

aureport --auth-summary</code></pre>

<h2>Conclusão</h2>

<p>O gerenciamento eficaz de usuários, grupos e sudo em produção reside em três pilares: <strong>segurança através da granularidade</strong> (não root direto, apenas sudo com auditoria), <strong>automação e versionamento</strong> (tudo deve ser código reproduzível) e <strong>monitoramento contínuo</strong> (logs e alertas). Esses não são detalhes secundários—são fundamentos que diferenciam operações estáveis de crises de segurança e conformidade. Implementados corretamente, economizam horas de diagnóstico futuro e protegem a organização contra acessos não autorizados e violações de dados.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://linux.die.net/man/5/sudoers" target="_blank" rel="noopener noreferrer">Linux Man Pages Online - sudoers</a></li>

<li><a href="https://linuxcommand.org/lc3_lts0090.php" target="_blank" rel="noopener noreferrer">The Linux Command Line - Capítulo sobre Permissões</a></li>

<li><a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/index" target="_blank" rel="noopener noreferrer">Red Hat Enterprise Linux 8 - System Administration Guide</a></li>

<li><a href="https://www.sudo.ws/docs/man/1.9.13/sudo.man.html" target="_blank" rel="noopener noreferrer">Sudo Official Documentation</a></li>

<li><a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/security_hardening/auditing-the-system_security-hardening" target="_blank" rel="noopener noreferrer">Linux Audit Framework Documentation</a></li>

</ul>

<p>&lt;!-- FIM --&gt;</p>

Comentários

Mais em DevOps & CI/CD

Pods, Deployments e ReplicaSets em Kubernetes na Prática
Pods, Deployments e ReplicaSets em Kubernetes na Prática

Entendendo a Arquitetura de Containers no Kubernetes Antes de mergulharmos em...

Dominando Chaos Engineering: Princípios, Chaos Monkey e LitmusChaos em Kubernetes em Projetos Reais
Dominando Chaos Engineering: Princípios, Chaos Monkey e LitmusChaos em Kubernetes em Projetos Reais

Entendendo Chaos Engineering: Fundamentos e Filosofia Chaos Engineering é uma...

O que Todo Dev Deve Saber sobre OpenTelemetry: Instrumentação Unificada para Métricas, Logs e Traces
O que Todo Dev Deve Saber sobre OpenTelemetry: Instrumentação Unificada para Métricas, Logs e Traces

O que é OpenTelemetry e por que você precisa dele OpenTelemetry é um framewor...