DevOps Admin

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

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

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 /etc/passwd, 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 /etc/shadow), UID, GID, comentário GECOS, diretório home e shell padrão. Paralelamente, /etc/shadow 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.

# 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)

Criação e Exclusão de Usuários

Para criar um novo usuário em produção, nunca use adduser interativo em scripts de automação. Use useradd 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 userdel -r para eliminar também seu diretório home, mas sempre faça backup dos dados antes.

# Criar usuário com configurações explícitas para produção
useradd -m -s /bin/bash -c "Desenvolvedor Backend" -d /home/devbackend devbackend

# Definir senha com validade (180 dias)
echo "devbackend:SenhaTemporaria123!" | 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

Modificação de Atributos de Usuário

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

# 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 "Senior DevOps Engineer" 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>/dev/null

Gerenciamento de Grupos e Permissões

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 /etc/passwd) e grupos secundários (definidos em /etc/group).

O arquivo /etc/group 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 /etc/group), 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.

# 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

Permissões de Arquivo e Propriedade

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.

# 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

Umask e Padrão de Criação de Arquivos

O umask 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.

# 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 "umask 0077" >> /home/username/.bashrc

Escalação de Privilégios com Sudo

O sudo 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 /etc/sudoers, 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.

O poder do sudo está em sua granularidade: você pode permitir que um usuário execute apenas /usr/bin/systemctl restart nginx sem permitir outras alterações. Combine isso com NOPASSWD 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.

# 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 "SELECT version();"

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

Configuração Granular do Sudoers

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

# 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

Auditoria e Segurança no Sudo

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

# 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 <ID_DA_SESSAO>

# 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

Boas Práticas em Ambientes de Produção

Gerenciar usuários e sudo em produção não é apenas sobre funcionalidade—é sobre segurança, rastreabilidade e conformidade. Primeira prática essencial: nunca use a conta root diretamente. 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.

Segunda prática: automação determinística. 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 "aquele clique rápido" no servidor—tudo deve ser código.

# 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 "$username" &>/dev/null; then
        echo "Usuário $username já existe. Pulando."
        return 0
    fi

    useradd -m -s /bin/bash -c "$fullname" "$username"
    echo "$username foi criado com sucesso"
}

# Adicionar a grupos existentes
add_to_groups() {
    local username=$1
    shift
    local groups=("$@")

    for group in "${groups[@]}"; do
        if grep -q "^$group:" /etc/group; then
            usermod -aG "$group" "$username"
            echo "Adicionado $username ao grupo $group"
        else
            echo "Aviso: grupo $group não existe"
        fi
    done
}

# Execução
create_user_if_not_exists "devbackend" "Desenvolvedor Backend"
create_user_if_not_exists "devinfra" "DevOps Engineer"

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

add_to_groups "devbackend" "team_devops" "sudo"
add_to_groups "devinfra" "team_devops" "sudo"

echo "Script de provisionamento concluído"

Terceira prática: rotação regular de senhas e chaves. 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 chage para gerenciar políticas de envelhecimento e considere integradores como sssd para sincronização com diretórios centralizados (LDAP, Active Directory).

# 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

Quarta prática: princípio do menor privilégio (PoLP). 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.

# 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 "Defaults:devbackend umask=0077" >> /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/

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

# 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

Conclusão

O gerenciamento eficaz de usuários, grupos e sudo em produção reside em três pilares: segurança através da granularidade (não root direto, apenas sudo com auditoria), automação e versionamento (tudo deve ser código reproduzível) e monitoramento contínuo (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.

Referências


Artigos relacionados