# Suíte open source para MSP · instalador

Palestra **Coopetir** · CoopTI Summit 2026 · UNODATA

Um script sobe até 8 ferramentas num único servidor Linux. Cada uma fica no seu subdomínio, com HTTPS automático pelo Let's Encrypt. Com o Keycloak na lista, elas já nascem com **login único**: um portal, uma senha e 2FA no celular para entrar em todas.

| # | Ferramenta | Para quê | Endereço |
|---|---|---|---|
| | Portal | a porta de entrada, com as ferramentas | `portal.<domínio>` |
| 1 | Keycloak | identidade e login único | `sso.<domínio>` |
| 2 | Zabbix 7 | monitoramento | `zabbix.<domínio>` |
| 3 | GLPI | helpdesk e inventário | `glpi.<domínio>` |
| 4 | Wazuh | segurança, SIEM e CIS | `wazuh.<domínio>` |
| 5 | Tactical RMM | RMM e acesso remoto | `rmm`, `api-rmm` e `mesh-rmm.<domínio>` |
| 6 | Nextcloud | arquivos | `arquivos.<domínio>` |
| 7 | Vaultwarden | cofre de senhas | `senhas.<domínio>` |
| 8 | Uptime Kuma | página de status | `status.<domínio>` |

## Antes de começar

- **Servidor:** Ubuntu 24.04 limpo, x86_64. Também deve rodar em Ubuntu 22.04 e Debian 12 ou 13.
- **Tamanho:** 16 GB de memória para as 8 ferramentas, ou 8 GB sem o Wazuh. 2 vCPU é o mínimo para teste e 4 é o recomendado para produção. Disco de 60 GB ou mais.
- **Portas abertas na nuvem:** 80 e 443. Para os agentes, abra também a 1514 e a 1515 (Wazuh) e a 10051 (Zabbix).
- **DNS:** um registro curinga `*.msp.suaempresa.com.br` apontando para o IP do servidor resolve todos os nomes de uma vez. Para só testar, sem domínio, deixe o domínio em branco e o script usa `<ip>.sslip.io`.

## Instalar

```bash
curl -fsSLO https://www.unodata.com.br/suite-msp/instalar-suite-msp.sh
sudo bash instalar-suite-msp.sh
```

O script faz cinco perguntas:
1. Quais ferramentas instalar (Enter instala todas).
2. O domínio base.
3. O e-mail do gestor (também usado pelo Let's Encrypt).
4. O nome da empresa, que aparece no portal e na tela de login.
5. A confirmação final.

Antes de instalar, ele confere o DNS e a memória do servidor. A instalação completa leva de 15 a 25 minutos.

Para instalar sem nenhuma pergunta:

```bash
curl -fsSL https://www.unodata.com.br/suite-msp/instalar-suite-msp.sh | \
  sudo DOMINIO=msp.suaempresa.com.br EMAIL=ti@suaempresa.com.br SSO_NOME="Sua Empresa" FERRAMENTAS=todas bash -s -- --sim
```

Para instalar só algumas ferramentas, troque `todas` pelos números da tabela, por exemplo `FERRAMENTAS="2 3 8"`. O modo com perguntas exige o arquivo baixado: com `curl ... | sudo bash` o terminal não fica disponível, e o script se recusa a seguir em vez de assumir as respostas.

## Como funciona por dentro

```
                 Internet (só 80 e 443)
                          │
                    ┌─────▼─────┐   HTTPS automático (Let's Encrypt)
                    │   Caddy   │   e cabeçalho HSTS em todos os endereços
                    └─────┬─────┘
     ┌──────────┬─────────┼─────────┬──────────┬──────────┐
  Keycloak   Zabbix     GLPI    Nextcloud  Vaultwarden  Uptime Kuma   ← suíte principal
     │          │         │         │
     └──── PostgreSQL ────┘      MariaDB (GLPI)
                          │
             Wazuh (indexador, manager e painel)          ← pasta própria
             Tactical RMM + MeshCentral                   ← pasta própria
```

- Cada ferramenta roda em contêiner Docker e escuta só em `127.0.0.1`. Quem atende a internet é o Caddy, então nenhum banco nem painel interno fica exposto.
- Os bancos não têm porta para fora. As únicas portas além de 80 e 443 são as dos agentes: 1514 e 1515 do Wazuh e 10051 do Zabbix.
- Tudo mora em `/opt/suite-msp`, e os dados ficam em volumes do Docker (`docker volume ls`).

## Login único: como funciona

```
  você ──► portal.<domínio> ──► sso.<domínio> (Keycloak: senha + código do celular)
                                      │
             ┌──────────┬─────────────┼────────────┬─────────────┬─────────────┐
           Zabbix      GLPI         Wazuh       Nextcloud    Vaultwarden   Uptime Kuma
           (SAML)   (porteiro)      (SAML)       (OIDC)        (OIDC)      (porteiro)
```

- **Primeiro acesso:** entre em `portal.<domínio>` com o usuário `gestor` e a senha do `CREDENCIAIS.txt`. O Keycloak mostra um QR code. Escaneie com o Google Authenticator, o Microsoft Authenticator ou o Authy e digite o código. Pronto: o portal abre e cada ícone entra direto na ferramenta, já logado.
- **Grupos:** `msp-admin` é administrador em tudo. `msp-tecnico` entra no Zabbix como Admin, no GLPI, no Nextcloud e no Vaultwarden, mas não no painel do Uptime Kuma. O gestor já nasce em `msp-admin`.
- **Técnico novo:** no Keycloak (`sso.<domínio>/admin`, reino **msp**), crie o usuário, ponha no grupo e defina uma senha temporária. No primeiro acesso ele troca a senha e configura o 2FA.
- **Técnico que saiu:** desative o usuário no Keycloak. Ele perde o acesso a todas as ferramentas de uma vez.
- **Regras do reino:** senha de 12 caracteres ou mais, 2FA por aplicativo obrigatório no primeiro login e bloqueio depois de 10 tentativas erradas.

Como cada ferramenta entra:

| Ferramenta | Como | Observação |
|---|---|---|
| Zabbix | SAML nativo | o usuário nasce no primeiro login (msp-admin = Super admin) |
| GLPI | porteiro na frente (oauth2-proxy) | o gestor já nasce Super-Admin; técnico novo nasce Self-Service e você promove no GLPI |
| Wazuh | SAML nativo | msp-admin vira administrador no painel e na API |
| Nextcloud | OIDC (app user_oidc) | msp-admin vira admin do Nextcloud |
| Vaultwarden | OIDC nativo | entra pelo Keycloak, mas o cofre ainda pede a **senha mestra**, que é quem cifra as senhas. Isso é proposital |
| Uptime Kuma | porteiro na frente | só `msp-admin` vê o painel; páginas de status e pings continuam públicos |
| Tactical RMM | **fora do login único** | o login único do Tactical é pago (patrocínio do projeto). Ele mantém o login próprio com 2FA |

**Contas de emergência:** as contas locais de cada ferramenta (admin do Zabbix, glpi, admin do Wazuh e outras) continuam funcionando, com as senhas do `CREDENCIAIS.txt`. Use quando o Keycloak estiver fora do ar. No GLPI, o login local fica em `glpi.<domínio>/?noAUTO=1`.

## As senhas padrão: o que o script faz com cada uma

Toda ferramenta nasce com uma senha conhecida, publicada na documentação. O script troca todas e confere de fora que a senha antiga não entra mais.

| Ferramenta | Senha de fábrica | O que o script faz |
|---|---|---|
| Keycloak | definida na instalação | admin com senha aleatória |
| Zabbix | `Admin` / `zabbix` | troca pela API e confere que `zabbix` é recusada |
| GLPI | `glpi` / `glpi` e mais 3 usuários de exemplo | troca a do `glpi` e desativa `tech`, `normal` e `post-only` |
| Wazuh, painel | `admin` / `SecretPassword` | troca |
| Wazuh, usuários internos | `kibanaserver`, `kibanaro`, `logstash`, `readall` e `snapshotrestore`, cada um com o próprio nome como senha | troca todos. Sem isso, qualquer um entra no painel com `readall`/`readall` e lê os dados de segurança |
| Wazuh, API interna | `wazuh-wui` / `MyS3cr37P450r.*-` | troca |
| Wazuh, cadastro de agentes | aberto, sem senha | passa a exigir senha (fica nas credenciais) |
| Tactical RMM | definida na instalação | usuário `gestor` com senha aleatória, e 2FA obrigatório no primeiro login |
| MeshCentral | definida na instalação | senha aleatória e cadastro de contas novas fechado |
| Nextcloud | definida na instalação | admin com senha aleatória |
| Vaultwarden | cadastro aberto para qualquer um | cadastro fechado. O token do `/admin` fica guardado só como hash Argon2 |
| Uptime Kuma | o primeiro que abrir a página vira dono | o script cria o administrador na hora da instalação |
| Bancos (PostgreSQL e MariaDB) | definidas na instalação | senhas aleatórias e sem porta para fora |

As senhas que você usa ficam em `/opt/suite-msp/CREDENCIAIS.txt`. As internas, como as dos bancos, ficam em `/opt/suite-msp/.env`.

## Precisa de SMTP?

**Para o primeiro login, não.** Nenhuma das 8 ferramentas manda e-mail para liberar o acesso:

- **2FA do Tactical RMM:** é feito por aplicativo autenticador (Google Authenticator, Microsoft Authenticator, Authy). No primeiro login aparece um QR code. Escaneie e clique em *Finish* na mesma tela: se sair dela antes, o 2FA precisa ser resetado.
- **Convites do Vaultwarden:** funcionam sem SMTP. Você convida o e-mail no `/admin` e a pessoa cria a conta em `senhas.<domínio>` com esse e-mail, sem precisar confirmar nada. Um e-mail que não foi convidado não consegue se cadastrar.

**Para a operação do dia a dia, sim.** Sem SMTP você perde:

| Ferramenta | O que depende de e-mail | Onde configurar |
|---|---|---|
| Zabbix | alertas por e-mail | Alertas, Tipos de mídia, Email |
| GLPI | aviso de chamado novo e de resposta | Configurar, Notificações |
| Tactical RMM | alertas | Settings, Global Settings, Email Alerts |
| Uptime Kuma | aviso de serviço fora do ar (também manda por Telegram, Teams e outros) | Configurações, Notificações |
| Nextcloud | recuperação de senha e compartilhamento por e-mail | Configurações de administração, Básico |
| Keycloak | "esqueci minha senha" e verificação de e-mail | Realm settings, Email |
| Vaultwarden | 2FA por e-mail e aviso de login em aparelho novo (o 2FA por aplicativo funciona sem) | variáveis `SMTP_*` no `docker-compose.yml` |
| Wazuh | alertas por e-mail | `ossec.conf` (`email_notification`) |

## O que este script ainda NÃO faz

- **Login único no Tactical RMM:** existe, mas é recurso pago do projeto. O script não liga.
- **Backup:** não configura backup. Faça antes de colocar cliente: os volumes do Docker e a pasta `/opt/suite-msp`. O restic com Object Storage é um bom caminho.
- **Máquinas na nuvem:** não cria o servidor. Ele parte de um servidor que já existe.
- **Alta disponibilidade:** é um servidor só. Para produção com muitos clientes, separe o Wazuh num servidor próprio.

## Depois de instalar

1. **Portal:** entre em `portal.<domínio>` com o celular na mão para configurar o 2FA.
2. **Tactical RMM:** no primeiro login ele também pede o 2FA dele.
3. **Vaultwarden:** o gestor já está convidado. Convide os técnicos em `senhas.<domínio>/admin` com o token das credenciais, e eles entram por "Usar autenticação única".
4. **Wazuh:** ao instalar um agente, informe a senha de cadastro (`WAZUH_REGISTRATION_PASSWORD`).
5. **Credenciais:** guarde o `CREDENCIAIS.txt` num lugar seguro e apague-o do servidor.
6. **SMTP:** configure nas ferramentas em que você quer receber alerta (tabela acima).
7. **Backup:** configure antes de colocar cliente.

Pode rodar o script de novo a qualquer momento. Ele reaproveita as senhas e o domínio, sobe o que estiver parado e acrescenta ferramentas novas que você escolher.

## Onde fica cada coisa

| Caminho | Conteúdo |
|---|---|
| `/opt/suite-msp/core` | Keycloak, Zabbix, GLPI, Nextcloud, Vaultwarden, Uptime Kuma e o Caddy |
| `/opt/suite-msp/wazuh-docker/single-node` | Wazuh |
| `/opt/suite-msp/tactical` | Tactical RMM |
| `/opt/suite-msp/.env` | todas as senhas, inclusive as dos bancos |
| `/opt/suite-msp/CREDENCIAIS.txt` | as senhas de acesso, para guardar e apagar |
| `/opt/suite-msp/instalacao.log` | o registro da instalação |

---

Licença MIT. Use, mude, melhore e devolva a melhoria para o grupo.
