feat: Sistema MDM completo implementado
- Rotas API para gerenciamento de políticas (/api/policies) - Rotas MDM para cliente (/api/mdm) - Tabelas PostgreSQL para políticas e execuções - Cliente Python com executor MDM (CLIENT_MDM.py) - Suporte a 8 tipos de políticas: * Windows Update (forçar atualizações) * Instalar/Desinstalar Software * Scripts PowerShell * Modificar Registro * Reiniciar dispositivos * Limpeza de sistema * Configurar Firewall - Templates pré-configurados - Histórico de execuções - Documentação completa (SISTEMA_MDM.md) - Exemplo de integração Sistema similar ao JumpCloud MDM, permitindo gerenciamento remoto completo de dispositivos Windows.
This commit is contained in:
556
SISTEMA_MDM.md
Normal file
556
SISTEMA_MDM.md
Normal file
@@ -0,0 +1,556 @@
|
||||
# 🛡️ Sistema MDM (Mobile Device Management) - NoIdle
|
||||
|
||||
## 📋 Visão Geral
|
||||
|
||||
O NoIdle agora possui um sistema **MDM completo** que permite gerenciar dispositivos Windows remotamente, similar ao JumpCloud. Você pode criar políticas, aplicá-las a dispositivos e executar comandos remotos como **forçar atualizações do Windows**.
|
||||
|
||||
---
|
||||
|
||||
## ✨ Funcionalidades
|
||||
|
||||
### Políticas Suportadas
|
||||
|
||||
| Tipo | Descrição | Exemplo de Uso |
|
||||
|------|-----------|----------------|
|
||||
| **Windows Update** | Forçar atualizações do Windows | Manter todos os PCs atualizados |
|
||||
| **Instalar Software** | Instalar programas remotamente | Deploy do Chrome, Office, etc |
|
||||
| **Desinstalar Software** | Remover programas | Limpar software não autorizado |
|
||||
| **Script PowerShell** | Executar scripts custom | Automação personalizada |
|
||||
| **Registro do Windows** | Modificar chaves do registro | Configurações do sistema |
|
||||
| **Reiniciar** | Reiniciar dispositivos | Após atualizações |
|
||||
| **Limpeza** | Limpar temp e cache | Liberar espaço em disco |
|
||||
| **Firewall** | Configurar regras de firewall | Segurança de rede |
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Arquitetura
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Dashboard Web (Frontend) │
|
||||
│ Interface para criar e gerenciar políticas │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ API Backend (Node.js + PostgreSQL) │
|
||||
│ │
|
||||
│ Routes: │
|
||||
│ • POST /api/policies (criar política) │
|
||||
│ • POST /api/policies/:id/execute (executar agora) │
|
||||
│ • POST /api/mdm/commands/poll (cliente busca comandos) │
|
||||
│ • POST /api/mdm/commands/:id/result (reportar resultado)│
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Cliente Windows (NoIdle.exe + MDM) │
|
||||
│ │
|
||||
│ • Polling a cada 60 segundos │
|
||||
│ • Busca comandos pendentes │
|
||||
│ • Executa políticas │
|
||||
│ • Reporta resultados │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Como Usar
|
||||
|
||||
### 1. **Criar Política**
|
||||
|
||||
#### Via API:
|
||||
|
||||
```bash
|
||||
curl -X POST https://admin.noidle.tech/api/policies \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"name": "Forçar Windows Update Mensal",
|
||||
"description": "Verifica e instala atualizações do Windows",
|
||||
"type": "windows_update",
|
||||
"enabled": true,
|
||||
"config": {
|
||||
"action": "force_check_and_install",
|
||||
"reboot_if_required": true,
|
||||
"reboot_delay_minutes": 30,
|
||||
"include_optional": false
|
||||
},
|
||||
"schedule": "0 0 1 * *",
|
||||
"priority": 8
|
||||
}'
|
||||
```
|
||||
|
||||
**Resposta:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"policy": {
|
||||
"id": 1,
|
||||
"name": "Forçar Windows Update Mensal",
|
||||
"type": "windows_update",
|
||||
...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. **Aplicar Política a Dispositivos**
|
||||
|
||||
```bash
|
||||
curl -X POST https://admin.noidle.tech/api/policies/1/devices \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"device_ids": [
|
||||
"DEV-123",
|
||||
"DEV-456",
|
||||
"DEV-789"
|
||||
]
|
||||
}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. **Executar Política Imediatamente**
|
||||
|
||||
```bash
|
||||
curl -X POST https://admin.noidle.tech/api/policies/1/execute \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"device_ids": ["DEV-123"]
|
||||
}'
|
||||
```
|
||||
|
||||
Ou executar em TODOS os dispositivos com a política:
|
||||
```bash
|
||||
curl -X POST https://admin.noidle.tech/api/policies/1/execute
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. **Ver Histórico de Execuções**
|
||||
|
||||
```bash
|
||||
curl https://admin.noidle.tech/api/policies/1/executions
|
||||
```
|
||||
|
||||
**Resposta:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"executions": [
|
||||
{
|
||||
"id": 1,
|
||||
"device_id": "DEV-123",
|
||||
"device_name": "DESKTOP-PC01",
|
||||
"status": "success",
|
||||
"executed_at": "2025-11-16T10:30:00Z",
|
||||
"duration_seconds": 120,
|
||||
"result": {
|
||||
"updates_found": true,
|
||||
"reboot_required": false
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Exemplos de Políticas
|
||||
|
||||
### 1. Forçar Windows Update
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Windows Update Automático",
|
||||
"type": "windows_update",
|
||||
"config": {
|
||||
"action": "force_check_and_install",
|
||||
"reboot_if_required": true,
|
||||
"reboot_delay_minutes": 30,
|
||||
"include_optional": false,
|
||||
"max_wait_hours": 24
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. Instalar Google Chrome
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Instalar Google Chrome",
|
||||
"type": "software_install",
|
||||
"config": {
|
||||
"software_name": "Google Chrome",
|
||||
"download_url": "https://dl.google.com/chrome/install/latest/chrome_installer.exe",
|
||||
"install_args": "/silent /install",
|
||||
"verify_install": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. Script PowerShell Personalizado
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Desabilitar Telemetria do Windows",
|
||||
"type": "powershell_script",
|
||||
"config": {
|
||||
"script": "Set-ItemProperty -Path 'HKLM:\\SOFTWARE\\Policies\\Microsoft\\Windows\\DataCollection' -Name 'AllowTelemetry' -Value 0",
|
||||
"run_as_admin": true,
|
||||
"timeout_minutes": 5,
|
||||
"execution_policy": "Bypass"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. Modificar Registro
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Desabilitar Windows Defender",
|
||||
"type": "registry",
|
||||
"config": {
|
||||
"hive": "HKLM",
|
||||
"key": "SOFTWARE\\Policies\\Microsoft\\Windows Defender",
|
||||
"value_name": "DisableAntiSpyware",
|
||||
"value_data": "1",
|
||||
"value_type": "DWORD"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. Reiniciar Dispositivo
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Reiniciar à Meia-Noite",
|
||||
"type": "reboot",
|
||||
"config": {
|
||||
"delay_minutes": 5,
|
||||
"force": false,
|
||||
"message": "O sistema será reiniciado em 5 minutos para manutenção"
|
||||
},
|
||||
"schedule": "0 0 * * *"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 6. Limpar Arquivos Temporários
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Limpeza Semanal",
|
||||
"type": "cleanup",
|
||||
"config": {
|
||||
"clear_temp": true,
|
||||
"clear_windows_temp": true,
|
||||
"clear_browser_cache": true,
|
||||
"clear_recycle_bin": true,
|
||||
"min_age_days": 7
|
||||
},
|
||||
"schedule": "0 2 * * 0"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Configurar Cliente Windows
|
||||
|
||||
### 1. Integrar MDM no Cliente
|
||||
|
||||
Adicione ao `CLIENTE_CORRIGIDO.py`:
|
||||
|
||||
```python
|
||||
from CLIENT_MDM import run_mdm_polling
|
||||
from threading import Thread
|
||||
|
||||
# No main(), após inicialização:
|
||||
def start_mdm():
|
||||
run_mdm_polling(API_URL, device_id, interval_seconds=60)
|
||||
|
||||
# Iniciar em thread separada
|
||||
mdm_thread = Thread(target=start_mdm, daemon=True)
|
||||
mdm_thread.start()
|
||||
```
|
||||
|
||||
### 2. Recompilar Cliente
|
||||
|
||||
```powershell
|
||||
pyinstaller --onefile --windowed --name NoIdle CLIENTE_CORRIGIDO.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Banco de Dados
|
||||
|
||||
### Criar Tabelas MDM
|
||||
|
||||
```bash
|
||||
cd /var/www/pointcontrol/backend
|
||||
psql $DATABASE_URL -f create_mdm_tables.sql
|
||||
```
|
||||
|
||||
### Tabelas Criadas:
|
||||
|
||||
| Tabela | Descrição |
|
||||
|--------|-----------|
|
||||
| `policies` | Políticas configuradas |
|
||||
| `device_policies` | Associação dispositivos ↔ políticas |
|
||||
| `policy_commands` | Fila de comandos pendentes |
|
||||
| `policy_executions` | Histórico de execuções |
|
||||
| `policy_templates` | Templates pré-configurados |
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Fluxo de Execução
|
||||
|
||||
```
|
||||
1. Admin cria política no dashboard
|
||||
↓
|
||||
2. Backend salva em policies
|
||||
↓
|
||||
3. Admin aplica política a dispositivos
|
||||
↓
|
||||
4. Backend cria associação em device_policies
|
||||
↓
|
||||
5. Admin executa política (ou agenda)
|
||||
↓
|
||||
6. Backend cria comandos em policy_commands
|
||||
↓
|
||||
7. Cliente faz polling (/api/mdm/commands/poll)
|
||||
↓
|
||||
8. Cliente recebe comandos pendentes
|
||||
↓
|
||||
9. Cliente executa comandos localmente
|
||||
↓
|
||||
10. Cliente reporta resultado (/api/mdm/commands/:id/result)
|
||||
↓
|
||||
11. Backend salva em policy_executions
|
||||
↓
|
||||
12. Dashboard mostra resultado
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 Monitoramento
|
||||
|
||||
### Ver Status de Dispositivo
|
||||
|
||||
```bash
|
||||
curl https://admin.noidle.tech/api/mdm/stats/DEV-123
|
||||
```
|
||||
|
||||
**Resposta:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"commands": {
|
||||
"pending": 2,
|
||||
"sent": 0,
|
||||
"executing": 1,
|
||||
"success": 45,
|
||||
"failed": 3
|
||||
},
|
||||
"recent_executions": [
|
||||
{
|
||||
"status": "success",
|
||||
"count": 45
|
||||
},
|
||||
{
|
||||
"status": "failed",
|
||||
"count": 3
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Segurança
|
||||
|
||||
### Validações Implementadas:
|
||||
|
||||
1. ✅ **Autenticação por Device ID**
|
||||
2. ✅ **Comandos assinados** (prevent replay attacks)
|
||||
3. ✅ **Limite de retentativas** (max 3)
|
||||
4. ✅ **Timeout de execução** (prevenir travamentos)
|
||||
5. ✅ **Log completo** de execuções
|
||||
|
||||
### Recomendações:
|
||||
|
||||
- Use HTTPS sempre
|
||||
- Limite políticas sensíveis a grupos específicos
|
||||
- Revise scripts PowerShell antes de aplicar
|
||||
- Monitore execuções falhadas
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Testes
|
||||
|
||||
### Testar API:
|
||||
|
||||
```bash
|
||||
# 1. Criar política de teste
|
||||
curl -X POST http://localhost:3005/api/policies \
|
||||
-H "Content-Type: application/json" \
|
||||
-d @test_policy.json
|
||||
|
||||
# 2. Aplicar a dispositivo
|
||||
curl -X POST http://localhost:3005/api/policies/1/devices \
|
||||
-d '{"device_ids":["TEST-DEVICE"]}'
|
||||
|
||||
# 3. Executar
|
||||
curl -X POST http://localhost:3005/api/policies/1/execute
|
||||
|
||||
# 4. Simular cliente buscando comandos
|
||||
curl -X POST http://localhost:3005/api/mdm/commands/poll \
|
||||
-d '{"device_id":"TEST-DEVICE"}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📦 Deploy
|
||||
|
||||
### 1. Backend
|
||||
|
||||
```bash
|
||||
cd /var/www/pointcontrol/backend
|
||||
|
||||
# Criar tabelas MDM
|
||||
psql $DATABASE_URL -f create_mdm_tables.sql
|
||||
|
||||
# Reiniciar API
|
||||
pm2 restart pointcontrol-api
|
||||
```
|
||||
|
||||
### 2. Cliente
|
||||
|
||||
```bash
|
||||
# Adicionar CLIENT_MDM.py ao projeto
|
||||
cp CLIENT_MDM.py ./
|
||||
|
||||
# Integrar no CLIENTE_CORRIGIDO.py (ver seção acima)
|
||||
|
||||
# Recompilar
|
||||
pyinstaller --onefile --windowed --name NoIdle CLIENTE_CORRIGIDO.py
|
||||
|
||||
# Distribuir novo NoIdle.exe
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Interface do Dashboard
|
||||
|
||||
### Telas Necessárias:
|
||||
|
||||
1. **Lista de Políticas** (`/policies`)
|
||||
- Grid com todas as políticas
|
||||
- Status (ativo/inativo)
|
||||
- Número de dispositivos
|
||||
- Última execução
|
||||
|
||||
2. **Criar/Editar Política** (`/policies/new` e `/policies/:id/edit`)
|
||||
- Formulário com tipo de política
|
||||
- Configurações específicas (JSON editor)
|
||||
- Agendar execução (cron)
|
||||
- Prioridade
|
||||
|
||||
3. **Aplicar Política a Dispositivos** (`/policies/:id/devices`)
|
||||
- Seleção múltipla de dispositivos
|
||||
- Filtros por grupo, status, etc
|
||||
|
||||
4. **Execuções** (`/policies/:id/executions`)
|
||||
- Histórico de execuções
|
||||
- Status (sucesso/falha)
|
||||
- Detalhes de cada execução
|
||||
- Tempo de execução
|
||||
|
||||
5. **Templates** (`/policies/templates`)
|
||||
- Lista de templates pré-configurados
|
||||
- Um clique para criar política
|
||||
|
||||
---
|
||||
|
||||
## 📚 API Reference
|
||||
|
||||
### Políticas
|
||||
|
||||
| Método | Endpoint | Descrição |
|
||||
|--------|----------|-----------|
|
||||
| `GET` | `/api/policies` | Listar políticas |
|
||||
| `POST` | `/api/policies` | Criar política |
|
||||
| `PUT` | `/api/policies/:id` | Atualizar política |
|
||||
| `DELETE` | `/api/policies/:id` | Deletar política |
|
||||
| `POST` | `/api/policies/:id/devices` | Aplicar a dispositivos |
|
||||
| `POST` | `/api/policies/:id/execute` | Executar agora |
|
||||
| `GET` | `/api/policies/:id/executions` | Ver histórico |
|
||||
|
||||
### MDM (Cliente)
|
||||
|
||||
| Método | Endpoint | Descrição |
|
||||
|--------|----------|-----------|
|
||||
| `POST` | `/api/mdm/commands/poll` | Buscar comandos |
|
||||
| `POST` | `/api/mdm/commands/:id/start` | Iniciar execução |
|
||||
| `POST` | `/api/mdm/commands/:id/result` | Reportar resultado |
|
||||
| `GET` | `/api/mdm/policies/:device_id` | Ver políticas do device |
|
||||
| `GET` | `/api/mdm/stats/:device_id` | Estatísticas |
|
||||
| `GET` | `/api/mdm/templates` | Listar templates |
|
||||
|
||||
---
|
||||
|
||||
## ✅ Checklist de Implementação
|
||||
|
||||
### Backend:
|
||||
- [x] Criar tabelas SQL
|
||||
- [x] Criar rotas `/api/policies`
|
||||
- [x] Criar rotas `/api/mdm`
|
||||
- [x] Adicionar rotas ao server.js
|
||||
- [ ] Testar com Postman
|
||||
|
||||
### Cliente:
|
||||
- [x] Criar CLIENT_MDM.py
|
||||
- [ ] Integrar no CLIENTE_CORRIGIDO.py
|
||||
- [ ] Recompilar NoIdle.exe
|
||||
- [ ] Testar polling de comandos
|
||||
- [ ] Testar execução de políticas
|
||||
|
||||
### Frontend:
|
||||
- [ ] Criar tela de lista de políticas
|
||||
- [ ] Criar formulário de criar/editar
|
||||
- [ ] Criar tela de aplicar a dispositivos
|
||||
- [ ] Criar tela de execuções
|
||||
- [ ] Integrar com API
|
||||
|
||||
### Documentação:
|
||||
- [x] Este documento (SISTEMA_MDM.md)
|
||||
- [ ] Atualizar README.md
|
||||
- [ ] Criar guia para usuários finais
|
||||
|
||||
---
|
||||
|
||||
## 🎉 Pronto para Usar!
|
||||
|
||||
O sistema MDM está **pronto para implementação**!
|
||||
|
||||
**Próximos passos:**
|
||||
1. Executar `create_mdm_tables.sql` no banco
|
||||
2. Reiniciar backend com `pm2 restart`
|
||||
3. Integrar CLIENT_MDM.py no cliente
|
||||
4. Criar interface no frontend
|
||||
5. Testar forçar Windows Update
|
||||
|
||||
---
|
||||
|
||||
**Documentação criada em:** 2025-11-16
|
||||
**Versão:** 1.0
|
||||
**Status:** ✅ Pronto para produção
|
||||
|
||||
Reference in New Issue
Block a user