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

1. O Que Você Vai Aprender


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:

BASH
# 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.

BASH
# /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
⚠️ Nota: O 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:

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

BASH
# 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:

TEXT
Usuá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

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

BASH
# 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:

TEXT
umask 002

(7) ▶ Exemplo: Configuração Personalizada de .bashrc

BASH
# 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:

TEXT
alice:~/projetos$ ls -lah
drwxr-x--- 2 alice desenvolvedores 4096 Jul  7 10:30 .

(8) ▶ Exemplo: Gerenciamento de Privilégios sudo por Grupo

BASH
# 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/*
💡 Dica: A abordagem recomendada para gerenciamento de privilégios sudo é o "princípio de grupo" — crie grupos por papel (por exemplo, desenvolvedores, devops) e crie arquivos separados em /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

BASH
#!/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 com useradd -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, .vimrc e 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


📝 Exercícios

  1. Básico (Dificuldade ⭐): Crie dois usuários dev1 e dev2, adicione-os ao grupo equipe, e crie um diretório compartilhado /srv/projeto-equipe com SGID (2775)
  2. Intermediário (Dificuldade ⭐⭐): Crie arquivos no diretório compartilhado como dev1 e dev2 respectivamente, verifique se os arquivos pertencem automaticamente ao grupo equipe, e configure dev1 para executar apenas sudo apt e sudo systemctl (comandos restritos)
  3. 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
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%