argos-setup/README.md

383 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ARGOS SOC — Setup & Installer
Tecnotel Servizi SRL — [www.tecnotelsrl.com](https://www.tecnotelsrl.com)
Repository pubblico contenente l'installer di prima fase e il Web Setup Wizard di ARGOS SOC.
---
## Architettura di riferimento: due VM sulla stessa VNet
ARGOS è la console SOC; **Wazuh/OpenSearch** è il SIEM che fa da normalizzatore e
store degli eventi. Il deployment standard è su **due VM Ubuntu 24.04 LTS** nella
**stessa VNet**: ARGOS interroga l'indexer Wazuh esclusivamente sull'**IP privato**,
nessun traffico SIEM transita su Internet.
```
VNet privata (es. 172.25.0.0/16)
┌────────────────────────────┐ ┌────────────────────────────┐
│ VM ARGOS │ │ VM WAZUH (SIEM) │
│ 172.25.0.5 │ 9200 │ 172.25.0.4 │
│ Flask + React + analytics │─────▶│ Indexer/OpenSearch │
│ console SOC :443 │ https│ Manager :1514/1515 │
│ web installer :8888 (temp) │ │ Syslog :514 │
└────────────────────────────┘ └────────────────────────────┘
▲ ▲
│ :443 (console) │ :514 / :1514 (log apparati/agenti)
tuo ufficio / VPN firewall, switch, endpoint
```
ARGOS si connette all'indexer in **HTTPS + Basic auth** e tollera il certificato
self-signed di Wazuh (verifica TLS disattivata lato client): non serve importare
alcuna CA per il primo bring-up.
### Matrice porte
| Servizio | VM | Porta | Sorgente consentita |
|---|---|---|---|
| Indexer / OpenSearch | Wazuh | 9200/tcp | **solo IP privato ARGOS** |
| Manager (agenti) | Wazuh | 1514/1515/tcp | VNet interna |
| Syslog (firewall/switch) | Wazuh | 514/udp+tcp | sorgenti interne / VNet |
| API Wazuh | Wazuh | 55000/tcp | localhost (ARGOS non la usa) |
| Dashboard Wazuh (opzionale) | Wazuh | 443/tcp | tuo IP ufficio (o disabilitata) |
| Console ARGOS | ARGOS | 443/tcp | tuo IP ufficio / VPN |
| Web installer ARGOS (temporaneo) | ARGOS | 8888/tcp | tuo IP ufficio (chiusa a fine setup) |
| SSH | entrambe | 22/tcp | solo IP admin |
---
## Prerequisiti
- Due VM **Ubuntu 24.04 LTS** (24.04 o 26.04 supportate), accesso root (sudo).
- **Sizing minimo** per VM: 2 vCPU / 8 GB RAM / 50 GB disco. Per la VM Wazuh sono
consigliati 4 vCPU / 16 GB e un disco da 128256 GB (il DB vulnerabilità si espande
a ~7,5 GB in import: sotto i 50 GB l'installazione si corrompe).
- **IP privati statici** su entrambe le NIC (in Azure: allocazione *Static*).
- Connettività in uscita verso `repo.argosdefense.io` (codice/aggiornamenti) e
`license.argosdefense.io` (licenze/heartbeat) dalla VM ARGOS.
- Una **licenza ARGOS** valida emessa da Tecnotel per il `machine_id` della VM ARGOS.
> In tutta la guida si usano come esempio: **Wazuh `172.25.0.4`**, **ARGOS `172.25.0.5`**,
> VNet `172.25.0.0/16`. Sostituisci con i tuoi valori reali.
---
# Parte A — Installazione Wazuh (VM `172.25.0.4`)
### A.1 Network Security Group (Azure)
Apri l'indexer **solo verso l'IP privato di ARGOS**, mai pubblico. Le altre porte
SIEM restano interne alla VNet. SSH/dashboard solo dal tuo IP ufficio.
```bash
RG=il-tuo-resource-group
NSG=nsg-wazuh
ARGOS_PRIV_IP=172.25.0.5
VNET_CIDR=172.25.0.0/16
MY_OFFICE_IP=203.0.113.5 # il tuo IP pubblico ufficio
# Indexer 9200: SOLO da ARGOS
az network nsg rule create -g $RG --nsg-name $NSG -n allow-indexer-argos \
--priority 200 --access Allow --protocol Tcp --direction Inbound \
--source-address-prefixes ${ARGOS_PRIV_IP}/32 --destination-port-ranges 9200
# Agenti/syslog: dalla VNet interna
az network nsg rule create -g $RG --nsg-name $NSG -n allow-siem-vnet \
--priority 210 --access Allow --protocol Tcp --direction Inbound \
--source-address-prefixes $VNET_CIDR --destination-port-ranges 1514 1515 514
# SSH dal solo IP admin
az network nsg rule create -g $RG --nsg-name $NSG -n allow-ssh-admin \
--priority 220 --access Allow --protocol Tcp --direction Inbound \
--source-address-prefixes $MY_OFFICE_IP --destination-port-ranges 22
```
### A.2 Installazione (all-in-one Wazuh 4.14)
```bash
sudo timedatectl set-timezone Europe/Rome
sudo apt update && sudo apt -y upgrade
sudo hostnamectl set-hostname wazuh
# Verifica la serie corrente su packages.wazuh.com se il download dà 404
curl -sO https://packages.wazuh.com/4.14/wazuh-install.sh
sudo bash ./wazuh-install.sh -a
```
L'assistente (1015 min) installa indexer + manager + dashboard + filebeat, genera i
certificati con l'IP privato già nel SAN e stampa a fine corsa **User: admin / Password: …**.
### A.3 Tuning per 8 GB di RAM
L'installer assegna 4 GB di heap all'indexer: su una VM da 8 GB è troppo. Abbassa a 2 GB:
```bash
sudo sed -i 's/^-Xms4g/-Xms2g/; s/^-Xmx4g/-Xmx2g/' /etc/wazuh-indexer/jvm.options
sudo systemctl restart wazuh-indexer
```
La **dashboard Wazuh non è necessaria** in un deployment ARGOS (la console SOC è ARGOS,
che interroga OpenSearch direttamente). Su 8 GB conviene disabilitarla:
```bash
sudo systemctl disable --now wazuh-dashboard
```
### A.4 Credenziali e verifica servizi
```bash
sudo tar -xf wazuh-install-files.tar
sudo grep -E "indexer_(username|password)" wazuh-install-files/wazuh-passwords.txt
sudo systemctl --no-pager status wazuh-indexer wazuh-manager filebeat | grep -E "●|Active:"
```
### A.5 Verifica binding indexer
L'all-in-one imposta di norma `network.host` sull'IP privato. Controlla:
```bash
grep -E "network.host|network.publish_host" /etc/wazuh-indexer/opensearch.yml
sudo ss -ltnp | grep 9200
```
Solo se NON è l'IP privato né `0.0.0.0`, correggi e riavvia:
```bash
sudo sed -i 's/^network.host:.*/network.host: "172.25.0.4"/' /etc/wazuh-indexer/opensearch.yml
sudo systemctl restart wazuh-indexer
```
Se UFW è attivo (su Azure di norma è spento, il controllo è l'NSG):
```bash
sudo ufw allow from 172.25.0.5 to any port 9200 proto tcp
```
---
# Parte B — Installazione ARGOS (VM `172.25.0.5`)
### B.1 Network Security Group (Azure)
```bash
RG=il-tuo-resource-group
NSG=nsg-argos
MY_OFFICE_IP=203.0.113.5
# Console ARGOS :443 dal tuo IP ufficio
az network nsg rule create -g $RG --nsg-name $NSG -n allow-console \
--priority 200 --access Allow --protocol Tcp --direction Inbound \
--source-address-prefixes $MY_OFFICE_IP --destination-port-ranges 443
# Web installer :8888 TEMPORANEO (il setup la richiude da solo a fine wizard)
az network nsg rule create -g $RG --nsg-name $NSG -n allow-installer-temp \
--priority 210 --access Allow --protocol Tcp --direction Inbound \
--source-address-prefixes $MY_OFFICE_IP --destination-port-ranges 8888
# SSH dal solo IP admin
az network nsg rule create -g $RG --nsg-name $NSG -n allow-ssh-admin \
--priority 220 --access Allow --protocol Tcp --direction Inbound \
--source-address-prefixes $MY_OFFICE_IP --destination-port-ranges 22
```
### B.2 Bootstrap (one-liner)
Su Ubuntu 24.04/26.04 LTS vergine:
```bash
curl -fsSL https://repo.argosdefense.io/tecnotel/argos-setup/raw/branch/main/bootstrap.sh | sudo bash
```
Il bootstrap scarica il repository, esegue `first-setup.sh` (pacchetti, utente `argos`,
cartelle `/opt/argos`, firewall, nginx temporaneo) e avvia il **Web Installer** su
`http://172.25.0.5:8888`.
> Installazione manuale equivalente:
> ```bash
> sudo apt update && sudo apt install -y git
> git clone https://repo.argosdefense.io/tecnotel/argos-setup.git /opt/argos-setup-pkg
> cd /opt/argos-setup-pkg && sudo bash first-setup.sh
> ```
### B.3 Web Installer — wizard in 6 step
Apri `http://172.25.0.5:8888` e segui:
1. **Licenza ARGOS** — il wizard mostra il `machine_id` della VM. Invialo a Tecnotel,
ricevi `license.json`, caricalo.
2. **Informazioni cliente** (nome, dominio, logo, contesto AI opzionale).
3. **Rete & SSL** (hostname/FQDN, certificato: Let's Encrypt / caricamento / autofirmato —
per una VM in VNet senza DNS pubblico usa **autofirmato**).
4. **SIEM (OpenSearch)** — punta all'indexer Wazuh sull'IP privato:
- **URL**: `https://172.25.0.4:9200`
- **Utente**: `admin`
- **Password**: quella recuperata in A.4
5. **Utente admin** della console ARGOS.
6. **Riepilogo & Installazione** — il wizard clona il repository privato `tecnotel/argos`
con il token della licenza, crea il virtualenv, configura i servizi systemd
(`argos-backend/sync/ops/analytics/updater`) e avvia ARGOS.
Al termine il Web Installer si disattiva da solo e la porta 8888 viene chiusa.
Puoi rimuovere la regola NSG temporanea `allow-installer-temp`.
---
## Verifica end-to-end
Dalla VM **ARGOS**, prima del wizard puoi già validare la rete verso il SIEM:
```bash
curl -k -u admin:'LA_PASSWORD' https://172.25.0.4:9200
curl -k -u admin:'LA_PASSWORD' "https://172.25.0.4:9200/_cat/indices/wazuh-alerts-*?v"
```
La prima deve restituire il JSON con `cluster_name`; la seconda elenca gli indici
`wazuh-alerts-*` (o segnala che non ce ne sono ancora — normale su un SIEM appena nato).
A ARGOS installato, la console su `https://172.25.0.5` deve mostrare i conteggi eventi
dal SIEM: è la conferma che backend ↔ indexer comunicano.
---
# Parte C — Configurazione Wazuh per ARGOS (decoder, M365/Entra, anti-rumore)
A questo punto Wazuh raccoglie, ma non normalizza ancora nel formato canonico
`data.argos.*`. La configurazione completa (decoder/rule per-vendor + moduli cloud +
baseline anti-rumore) **non si scrive a mano**: è versionata nel repo `argos` sotto
`integrazioni/` ed è già documentata in modo autoritativo in
**`integrazioni/installers/README.md`**. Sulla VM ARGOS il path è
`/opt/argos/app/integrazioni/`.
### C.1 Come portare decoder e config sulla VM Wazuh
Due strade equivalenti:
- **Da UI ARGOS**: Impostazioni → Integrazioni SIEM → abilita i vendor in uso →
*Scarica Bundle Completo* → copia lo zip sulla VM Wazuh (`scp`/`sftp`).
- **Dal repo**: copia `/opt/argos/app/integrazioni/` dalla VM ARGOS alla VM Wazuh.
### C.2 Ordine su un Wazuh appena installato (sintesi di `installers/README.md`)
1. **`opensearch-template-patches/install.sh`** — PRIMA di qualsiasi evento. Corregge
il bug Filebeat upstream **#24331** (campi nested di MS Graph/Office365 dichiarati
`keyword` invece di `object` → mapping corrotto). Senza questa patch gli eventi
Entra/M365 passano `wazuh-logtest` ma **non vengono indicizzati**, quindi ARGOS non
li vede. Va **riapplicata dopo ogni upgrade** del manager (il restart re-installa il
template stock).
2. *(solo se gli switch Cisco passano da Graylog)* `gelf-syslog-bridge/install.sh`.
3. **`wazuh-config-template/`**: compila `secrets.env` (tenant/client/secret M365+Entra,
parametri cliente), esegui `render-config.sh`, copia l'`ossec.conf` generato in
`/var/ossec/etc/`. Il template include già `<remote>` syslog 514, i moduli
`<ms-graph>` e `<office365>`, e il `<ruleset>` con `decoder_exclude`/`rule_exclude`
dei decoder stock (Cisco/FortiGate/FortiAuth/Sophos/ESET) così non doppiano i
canonici ARGOS.
4. **`deploy.sh`** — sincronizza i decoder/rule dei vendor abilitati in
`/var/ossec/etc/{decoders,rules}/argos/` (backup + `wazuh-logtest` + rollback
automatico). `sudo bash deploy.sh` (oppure `--dry-run` / `--no-restart`).
5. `sudo systemctl restart wazuh-manager`.
6. Validazione: `sudo /var/ossec/bin/wazuh-analysisd -t` deve uscire 0; `wazuh-logtest`
sui sample deve mostrare i decoder canonici che matchano.
### C.3 Eventi del server stesso (riduzione rumore)
Il template ARGOS imposta già una baseline sobria: **FIM (`syscheck`) disabilitato** sul
manager e `decoder_exclude`/`rule_exclude` per non far scattare i decoder vendor stock.
Su una VM collector da 8 GB conviene tagliare anche il self-monitoring residuo, editando
`/var/ossec/etc/ossec.conf`:
```xml
<rootcheck><disabled>yes</disabled></rootcheck>
<wodle name="syscollector"><disabled>yes</disabled></wodle>
<vulnerability-detection><enabled>no</enabled></vulnerability-detection>
```
(Disabilitare `vulnerability-detection` libera anche RAM e i ~7,5 GB di DB import — utile
sugli 8 GB.) Si consiglia di **lasciare attiva la raccolta di `auth.log`** della VM Wazuh:
i tentativi SSH sul SIEM stesso sono eventi che vuoi vedere. Riavvia il manager dopo le
modifiche.
### C.4 Microsoft 365 + Entra ID
- **App Registration** in Entra ID (un'unica app per entrambi):
- Microsoft Graph (permessi *application*): `AuditLog.Read.All`, `Directory.Read.All`,
`SecurityEvents.Read.All` e — avendo **Entra ID P2**`IdentityRiskyUser.Read.All` e
`IdentityRiskEvent.Read.All` (per riskyUsers/riskDetections di Identity Protection).
- Office 365 Management API: `ActivityFeed.Read`.
- **Consenso amministratore** + audit logging abilitato sul tenant.
- Inserisci `tenant_id` / `client_id` / `secret_value` in `secrets.env`: finiscono nei
blocchi `<ms-graph>` e `<office365>` dell'`ossec.conf` generato.
- **Vincolo**: senza lo step C.2.1 (template patch) gli eventi Entra/M365 non si
indicizzano. È il primo controllo da fare se "logtest ok ma zero alert in OpenSearch".
- Nota versione: il bug delle *default rules* MS Graph (#34240) è risolto da **Wazuh
4.14.4**; su installazione fresca ≥ 4.14.4 non serve alcun workaround manuale.
### C.5 Stato per sorgente — stack Tecnotel
| Sorgente | Dominio · range | Canale | Stato registry |
|---|---|---|---|
| FortiGate | firewall · 111000111199 | syslog 514 | ✅ production |
| Cisco IOS (switch) | switch · 118000118199 | syslog (vedi nota) | ✅ production |
| Ubiquiti UniFi (WiFi/AP) | wireless · 119200119299 | syslog 514 | ✅ production |
| QNAP NAS | applications · 120200120299 | syslog 514 | ✅ production-v1 |
| ESET | endpoint · 116000116199 | docker `eset-integration` | ✅ production |
| Entra ID | identity · 114000114099 | wodle `ms-graph` | ✅ production |
| Microsoft 365 | cloud · 113000113099 | wodle `office365` | ✅ production |
| 3CX | voip · 117000117099 | syslog 514 | ⚠️ placeholder (decoder da scrivere) |
Note operative:
- **FortiGate**: syslog free-style → 514. Su FortiOS 7.4.x usa il glob `*PATTERN*`, non il
regex `~` (bug del parser su quella build).
- **Cisco IOS**: il path canonico ARGOS prevede Cisco → Graylog → `gelf-syslog-bridge`
Wazuh. Se i tuoi switch inviano **syslog diretto**, va verificato che il decoder
`cisco-ios` parsi quel formato: in caso contrario o si interpone Graylog, o si adatta il
decoder sui log reali.
- **3CX**: stub nel registry — il decoder canonico va costruito su 3-5 righe di syslog
reali prima di abilitarlo.
---
## Opzioni certificato SSL (console ARGOS)
- **Let's Encrypt** — automatico, richiede DNS pubblico già puntato alla VM.
- **Certificato esistente** — caricamento `.crt` + `.key` (es. wildcard aziendale, CA interna).
- **Autofirmato** — RSA 4096, validità 10 anni, consigliato per VM in VNet senza DNS
pubblico. I browser segnaleranno il certificato come non attendibile (atteso).
---
## Hardening consigliato (post bring-up)
- **Utente OpenSearch dedicato ad ARGOS** con permessi limitati (read su `wazuh-alerts-*`,
write su `argos-alerts-enriched-*`) al posto dell'`admin` globale.
- **Normalizzazione `data.argos.*`** sul Wazuh manager (decoder + regole canoniche) per i
log dei tuoi apparati (FortiGate, Cisco, ESET): è il cuore dell'architettura ARGOS lato SIEM.
- **Backup** di `/opt/argos/config` e `/opt/argos/data` (la console ARGOS include
Backup & Restore dei file di configurazione).
---
## Contenuto del repository
| File | Scopo |
|---|---|
| `bootstrap.sh` | One-liner installer: scarica il repo e avvia first-setup.sh |
| `first-setup.sh` | Installer ambiente base: sistema, utenti, firewall, nginx temp, avvia wizard web |
| `setup_server.py` | Backend Python del Web Installer (porta 8888, self-contained) |
| `setup.html` | Frontend del Web Installer — wizard in 6 step |
## Repository correlati
- [`tecnotel/argos`](https://repo.argosdefense.io/tecnotel/argos) — codice runtime di
ARGOS SOC (privato, accessibile solo con licenza).
## Requisiti (sintesi)
- Ubuntu **24.04 LTS** o **26.04 LTS** (verificato dallo script).
- Accesso root (sudo).
- VM ARGOS: connettività in uscita verso `repo.argosdefense.io` e `license.argosdefense.io`;
raggiungibilità dell'indexer Wazuh su `:9200` (IP privato, VNet).
- Wazuh: serie corrente su [packages.wazuh.com](https://packages.wazuh.com) (4.14 al momento).
## Versioning
Questo repository segue lo stesso schema di versioning di `argos` (SemVer tag `vX.Y.Z`).