# 🛡️ Guia de Segurança e Liberdade para o Usuário `deploy` Na cultura de DevOps moderna, a "lenda" do usuário `deploy` poder trabalhar com total liberdade sem ter acesso ao usuário `root` é, na verdade, uma **melhor prática de segurança chamada "Princípio do Menor Privilégio" (Least Privilege)**. Se o usuário `deploy` pudesse dar `sudo su` e virar `root` a qualquer momento, qualquer vulnerabilidade na sua aplicação web (ex: um upload de arquivo malicioso ou injeção de código) daria controle total do servidor inteiro para um invasor. Para dar ao usuário `deploy` toda a liberdade de desenvolvimento e publicação de aplicações com **segurança absoluta**, implementamos 4 pilares práticos: --- ## 🏗️ Pilar 1: Controle Total do Diretório Web (Sem `sudo`) O usuário `deploy` não precisa de permissão de root para alterar os arquivos da aplicação. Basta torná-lo dono dos diretórios de publicação. ### Prática: Geralmente usamos a pasta `/var/www/` ou criamos um diretório de aplicações na própria Home do usuário (`/home/deploy/apps/`). Para dar controle total ao `deploy` sem precisar de `sudo` para editar arquivos: ```bash # Criar a pasta do seu projeto sudo mkdir -p /var/www/meu-app # Definir o usuário deploy como proprietário da pasta sudo chown -R deploy:deploy /var/www/meu-app # Aplicar permissões recomendadas (pastas 755 e arquivos 644) find /var/www/meu-app -type d -exec chmod 755 {} \; find /var/www/meu-app -type f -exec chmod 644 {} \; ``` **Resultado**: O usuário `deploy` agora pode usar Git, SFTP, VSCode, criar arquivos, deletar e subir atualizações dentro de `/var/www/meu-app` com total liberdade e **zero** necessidade de usar `sudo`. --- ## 🐋 Pilar 2: Gerenciamento do Docker sem Root Se as suas aplicações rodam em Docker (ou Docker Compose), o usuário `deploy` não precisa usar `sudo docker` para gerenciar os containers. ### Prática: Adicionamos o usuário `deploy` ao grupo do Docker no Linux: ```bash sudo usermod -aG docker deploy ``` **Resultado**: Após fazer logout e login novamente, o usuário `deploy` poderá rodar comandos como `docker ps`, `docker compose up -d`, `docker restart` e fazer builds de imagens diretamente, com total liberdade, sem nunca usar `sudo`. --- ## ⚙️ Pilar 3: Sudoers com Limitação Cirúrgica (Segurança Avançada) Muitas vezes, a aplicação precisa apenas de tarefas muito específicas do sistema operacional, como por exemplo: * Reiniciar o servidor web Nginx (`systemctl restart nginx`). * Recarregar as configurações do Nginx (`systemctl reload nginx`). * Reiniciar um serviço específico da sua aplicação em NodeJS/Python criado no Systemd (`systemctl restart api-app`). ### Prática: Em vez de dar acesso total ao `sudo` para o `deploy`, nós liberamos **apenas estes comandos específicos**, sem requisição de senha! 1. Criamos um arquivo de configuração exclusivo no Sudoers para o `deploy`: ```bash sudo nano /etc/sudoers.d/deploy ``` 2. Adicionamos a regra cirúrgica: ```text # Permite que o usuário deploy execute APENAS estes comandos listados como root, sem pedir senha: deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx, /usr/bin/systemctl status nginx ``` 3. Aplicamos a permissão correta ao arquivo do sudoers: ```bash sudo chmod 440 /etc/sudoers.d/deploy ``` **Resultado**: O usuário `deploy` agora pode rodar `sudo systemctl reload nginx` para aplicar uma mudança de domínio na web com total liberdade, mas se ele tentar rodar `sudo apt update` ou `sudo userdel`, o sistema **negará o acesso**. --- ## 🔄 Pilar 4: Processos em Espaço de Usuário (PM2 / Systemd User) Se a sua aplicação web não roda em Docker e precisa ficar ativa em segundo plano (ex: aplicações Node.js, Python FastAPI, Go), o usuário `deploy` pode gerenciá-la de duas formas sem root: ### A. Utilizando o PM2 (NodeJS Process Manager) O PM2 roda diretamente no espaço de memória do usuário `deploy`. ```bash # Como usuário deploy, instalar e rodar apps: pm2 start app.js --name "minha-api" pm2 save ``` O `deploy` tem controle total para reiniciar (`pm2 restart minha-api`), parar, e ver logs sem precisar do root. ### B. Serviços Systemd do Usuário (`systemd --user`) O Linux moderno permite que usuários criem seus próprios arquivos de serviço que rodam sob sua conta na pasta: `~/.config/systemd/user/` Você pode gerenciar o serviço rodando: ```bash systemctl --user daemon-reload systemctl --user restart meu-servico.service ``` --- ## 📊 Tabela de Comparação de Segurança: | Ação | Como o Root faria (Inseguro) | Como o `deploy` faz com segurança | | :--- | :--- | :--- | | **Subir arquivos Web** | Usa `sudo` ou loga como `root` | Altera livremente dentro de `/var/www/` (Dono da pasta) | | **Gerenciar Containers** | `sudo docker compose restart` | `docker compose restart` (Membro do grupo `docker`) | | **Reiniciar Nginx** | `sudo systemctl restart nginx` | `sudo systemctl restart nginx` (Autorizado via Sudoers Cirúrgico) | | **Atualizar Código (Git)** | Roda `git pull` como root | Roda `git pull` usando suas chaves SSH do usuário |