Linux: Mini Projeto Fase 2
Este é o projeto final da Fase 2. Você vai aplicar conhecimentos de gerenciamento de usuários, permissões de arquivo e variáveis de ambiente para transformar um cenário de "caos com um único usuário" em um servidor de desenvolvimento colaborativo multiusuário.
📋 Pré-requisitos: Você deve primeiro concluir
- Aula 8: Permissões de Arquivo
- Aula 9: Gerenciamento de Usuários e Grupos
- Aula 10: Variáveis de Ambiente e PATH
1. O Que Você Vai Aprender
- Projeto de sistema de usuários da equipe
- Estratégia de permissões para diretórios compartilhados
- Configuração unificada de umask para equipes
- Configuração individual de Shell por desenvolvedor
- Gerenciamento de privilégios sudo por grupo
2. O Pesadelo de Colaboração da Equipe do Alex
(1) O Problema: Três Pessoas Compartilhando um Servidor, Arquivos Se Misturando
A equipe de três pessoas do Alex compartilhava um servidor na nuvem. Todos faziam login como root e ninguém gerenciava permissões de arquivo — o script do Alex foi excluído por engano por um colega três vezes, e ele não conseguia encontrar seus próprios arquivos porque estavam misturados com tudo em /tmp.
(2) Um Ambiente Multiusuário Padronizado
Bob ajudou-os a projetar um ambiente multiusuário padrão:
# 1. Cada pessoa tem sua própria conta e diretório home
sudo useradd -m -s /bin/bash alice
sudo useradd -m -s /bin/bash bob
sudo useradd -m -s /bin/bash charlie
# 2. Diretório de projeto compartilhado (SGID garante herança do grupo)
sudo mkdir -p /srv/projeto
sudo chgrp desenvolvedores /srv/projeto
sudo chmod 2775 /srv/projeto
(3) O Benefício: Cada Pessoa Tem Seu Espaço, Áreas Compartilhadas Têm Ordem
Os arquivos não somem mais, todos têm seu próprio diretório home independente e configuração de Shell, e o diretório compartilhado tem as permissões corretas — ninguém vai excluir acidentalmente os arquivos de outra pessoa.
3. Pontos-Chave
(1) Princípios de Projeto de Ambiente Multiusuário
| Princípio | Descrição |
|---|---|
| Menor privilégio | Cada usuário só tem as permissões mínimas necessárias para fazer seu trabalho |
| Separação de responsabilidades | Papéis diferentes usam usuários diferentes; evite "um root para tudo" |
| Política de grupos | Use grupos para gerenciar conjuntos de permissões em vez de definir permissões por usuário |
| Trilha de auditoria | Use sudo em vez de root direto — todos os comandos são registrados |
(2) Estratégia de Permissões para Diretório Compartilhado
Para diretórios compartilhados de equipe, use SGID: arquivos recém-criados herdam automaticamente o grupo do diretório.
# /srv/projeto é o diretório compartilhado
sudo chown root:desenvolvedores /srv/projeto
sudo chmod 2775 /srv/projeto
# 2 = SGID (novos arquivos herdam o grupo)
# 775 = dono e grupo podem ler/escrever/executar, outros podem ler/executar
2 em chmod 2775 representa SGID — quando o SGID é definido em um diretório compartilhado, qualquer arquivo novo criado ali herda automaticamente o grupo do diretório (em vez do grupo primário do criador). Este é o mecanismo-chave para colaboração em equipe. Sem SGID, novos arquivos pertenceriam ao grupo primário do criador, e outros membros da equipe talvez não pudessem modificá-los.
(3) /etc/skel — Diretório de Templates do Usuário
Arquivos em /etc/skel/ são copiados automaticamente para o diretório home de um novo usuário quando sua conta é criada. Você pode adicionar configurações padrão personalizadas:
# Ver o conteúdo padrão de skel
ls -la /etc/skel/
# Adicionar configuração personalizada para todos os novos usuários
sudo tee -a /etc/skel/.bashrc << 'EOF'
# ---- Configuração padrão da equipe ----
alias ll='ls -la'
alias ..='cd ..'
export EDITOR=vim
EOF
(4) ▶ Exemplo: Criar um Sistema Completo de Usuários da Equipe
# Criar um grupo compartilhado
sudo groupadd desenvolvedores
# Criar contas para três desenvolvedores
for user in alice bob charlie; do
sudo useradd -m -s /bin/bash "$user"
sudo passwd "$user" # Definir senha interativamente
sudo usermod -aG desenvolvedores "$user"
echo "Usuário $user criado"
done
# Verificar
grep desenvolvedores /etc/group
Saída:
TEXTUsuário alice criado Usuário bob criado Usuário charlie criado desenvolvedores:x:1005:alice,bob,charlie
(5) ▶ Exemplo: Configurar um Diretório Compartilhado com SGID
# Criar diretório de projeto compartilhado
sudo mkdir -p /srv/projeto/{src,docs,scripts}
# Definir o grupo
sudo chgrp -R desenvolvedores /srv/projeto
# Definir SGID + permissões padrão
sudo chmod 2775 /srv/projeto
# 2 = SGID
# 7 = Dono (rwx)
# 7 = Grupo (rwx)
# 5 = Outros (r-x)
# Teste: criar um arquivo como um usuário diferente e verificar a herança do grupo
sudo -u alice touch /srv/projeto/teste.txt
ls -l /srv/projeto/teste.txt
# -rw-r--r-- 1 alice desenvolvedores 0 Jul 7 12:00 teste.txt
# Arquivo pertence ao grupo desenvolvedores ✅
Saída:
TEXT-rw-r--r-- 1 alice desenvolvedores 0 Jul 7 12:00 teste.txt
(6) ▶ Exemplo: Configurar umask Padrão
# Definir um umask unificado para a equipe (para que arquivos compartilhados sejam graváveis por padrão)
echo 'umask 002' | sudo tee -a /etc/bash.bashrc
# Efeito de 002:
# Arquivo: 666 - 002 = 664 (rw-rw-r--)
# Diretório: 777 - 002 = 775 (rwxrwxr-x)
# Assim, membros do grupo podem modificar os arquivos uns dos outros
ℹ️ Nota: Para colaboração em equipe, um umask unificado de 002 permite que membros do grupo modifiquem os arquivos uns dos outros. Mas atenção à segurança — em um servidor compartilhado por várias equipes, 002 pode ser permissivo demais. Recomenda-se usar SGID + 002 apenas em diretórios compartilhados, mantendo o padrão 022 para os diretórios home dos usuários.
Saída:
TEXTumask 002
(7) ▶ Exemplo: Configuração Personalizada de .bashrc
# Alex gosta de um prompt colorido
cat >> ~/.bashrc << 'EOF'
export PS1='\[\033[1;32m\]\u\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]\$ '
alias ll='ls -lah'
EOF
source ~/.bashrc
# Bob gosta simples
cat >> ~/.bashrc << 'EOF'
export PS1='\w\$ '
alias l='ls -CF'
EOF
source ~/.bashrc
Saída:
TEXTalice:~/projetos$ ls -lah drwxr-x--- 2 alice desenvolvedores 4096 Jul 7 10:30 .
(8) ▶ Exemplo: Gerenciamento de Privilégios sudo por Grupo
# Criar um grupo
sudo groupadd devops
# Adicionar Alex ao grupo devops (ele pode gerenciar serviços do sistema)
sudo usermod -aG devops charlie
# Configurar privilégios sudo por grupo
echo '%desenvolvedores ALL=(ALL) ALL' | sudo tee /etc/sudoers.d/desenvolvedores
echo '%devops ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/apt' | sudo tee /etc/sudoers.d/devops
# Definir permissões
sudo chmod 440 /etc/sudoers.d/*
/etc/sudoers.d/ para cada grupo. Assim, adicionar ou remover usuários exige apenas alterar a membresia do grupo, sem editar repetidamente os arquivos sudoers.
Saída:
TEXT%desenvolvedores ALL=(ALL) ALL %devops ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/apt
(9) ▶ Exemplo Abrangente: Script Completo de Implantação de Ambiente Multiusuário
#!/bin/bash
# setup-multi-user.sh - Configura um ambiente de desenvolvimento multiusuário
set -e
echo "=== Configurando ambiente de desenvolvimento multiusuário ==="
# 1. Criar usuários
EQUIPE_MEMBROS=("alice" "bob" "charlie")
sudo groupadd desenvolvedores 2>/dev/null || true
for user in "${EQUIPE_MEMBROS[@]}"; do
if id "$user" &>/dev/null; then
echo "Usuário $user já existe, pulando criação"
else
sudo useradd -m -s /bin/bash "$user"
echo "Defina a senha para $user:"
sudo passwd "$user"
fi
sudo usermod -aG desenvolvedores "$user"
done
echo "✅ Usuários criados"
# 2. Criar diretório compartilhado
sudo mkdir -p /srv/projeto/{src,docs,scripts,tests}
sudo chgrp -R desenvolvedores /srv/projeto
sudo chmod 2775 /srv/projeto
sudo chmod 2775 /srv/projeto/*/
echo "✅ Diretório compartilhado criado (SGID definido)"
# 3. Configurar umask da equipe
echo 'umask 002' | sudo tee -a /etc/bash.bashrc
echo "✅ umask da equipe configurado"
# 4. Configurar privilégios sudo
echo '%desenvolvedores ALL=(ALL) ALL' | sudo tee /etc/sudoers.d/desenvolvedores
sudo chmod 440 /etc/sudoers.d/desenvolvedores
echo "✅ Privilégios sudo configurados"
# 5. Criar README
cat | sudo tee /srv/projeto/README.md << 'EOF'
# Diretório de Projeto da Equipe
---
## 4. Estrutura do Diretório
- src/ — Código-fonte
- docs/ — Documentação
- scripts/ — Scripts
- tests/ — Testes
---
## 5. Regras
- umask 002, membros do grupo podem modificar os arquivos uns dos outros
- Não use root neste diretório
- Confirme antes de usar `sudo` para instalar software
EOF
echo "✅ README criado"
echo ""
echo "=== Ambiente Pronto ==="
echo "Usuários: ${EQUIPE_MEMBROS[*]}"
echo "Diretório compartilhado: /srv/projeto"
echo ""
echo "Verificação:"
echo " 1. Crie arquivos como usuários diferentes e verifique se o grupo é desenvolvedores"
echo " 2. Use who para ver usuários online"
echo " 3. Use sudo -l para ver privilégios"
❓ Perguntas Frequentes
P: Por que diretórios compartilhados devem ter SGID? R: SGID garante que qualquer arquivo ou subdiretório criado em um diretório compartilhado herde automaticamente o grupo do diretório pai. Sem SGID, arquivos criados por um usuário pertenceriam ao grupo privado desse usuário, e outros membros da equipe não teriam permissão para modificá-los. Com SGID, os arquivos pertencem automaticamente ao grupo
desenvolvedores.
P: O que faz o diretório
/etc/skel? R: Quando você cria um novo usuário comuseradd -m, todos os arquivos em/etc/skel/são copiados automaticamente para o diretório home do novo usuário. Você pode colocar templates padrão de.bashrc,.profile,.vimrce outros ali.
P: O que acontece se o umask for definido como 007? R: Um umask de 007 significa que novos arquivos e diretórios não recebem permissão para "outros". Arquivos: 666-007=660 (rw-rw----), diretórios: 777-007=770 (rwxrwx---). Adequado para servidores usados exclusivamente por uma equipe.
P: Quais devem ser as permissões do diretório home do usuário? R: O padrão é 755 (
rwxr-xr-x) — o dono tem controle total, outros só podem ler e executar (conseguem entrar com cd mas não podem escrever). Para privacidade, defina como 750 ou 700.
P: Como restringir os privilégios sudo de um usuário? R: Crie um arquivo independente em
/etc/sudoers.d/que especifique precisamente os comandos permitidos:alice ALL=(ALL) /usr/bin/systemctl, /usr/bin/apt. Isso limita o usuário a executar sudo apenas em systemctl e apt, nada mais.
📖 Resumo
- Sistema de usuários da equipe: contas individuais + grupo compartilhado desenvolvedores
- SGID (
chmod g+sou numérico2xxx) faz com que arquivos em diretórios compartilhados herdem automaticamente o grupo - umask 002 é adequado para colaboração em equipe (gravável pelo grupo)
/etc/skeldefine templates de configuração padrão para novos usuários- Gerenciamento de privilégios sudo por grupo: grupos diferentes recebem níveis de privilégio diferentes
📝 Exercícios
- Básico (Dificuldade ⭐): Crie dois usuários
dev1edev2, adicione-os ao grupoequipe, e crie um diretório compartilhado/srv/projeto-equipecom SGID (2775) - Intermediário (Dificuldade ⭐⭐): Crie arquivos no diretório compartilhado como
dev1edev2respectivamente, verifique se os arquivos pertencem automaticamente ao grupoequipe, e configuredev1para executar apenassudo aptesudo systemctl(comandos restritos) - Avançado (Dificuldade ⭐⭐⭐): Escreva um script que execute toda a configuração acima de uma só vez (criar usuários, grupos, diretórios, SGID, restrições sudo), com verificação de argumentos e tratamento de erros