Initial commit: PrivX HA Architecture & Setup Guides

This commit is contained in:
Ambrogio
2026-02-11 10:29:46 +00:00
commit 5d751b9cda
5 changed files with 571 additions and 0 deletions

59
README.md Normal file
View File

@@ -0,0 +1,59 @@
# PrivX Home Lab - Enterprise High Availability Setup
Questo repository contiene la documentazione, le configurazioni e gli script per implementare un ambiente **SSH PrivX v42** in configurazione **High Availability (HA)**, replicando l'architettura Enterprise del **Polo Strategico Nazionale (PSN)**.
## 🏛️ Architettura Target
L'obiettivo è simulare un'infrastruttura critica resilient, distribuita su più nodi per garantire continuità operativa e scalabilità.
### Componenti
* **Load Balancer (LB):** Entry point unico (VIP). Gestisce il traffico HTTPS verso i Core e i Web Proxy. Richiede *Sticky Sessions*.
* **PrivX Core (2 Nodi):** Il cuore della gestione accessi, policy e audit. In configurazione Active/Active.
* **PrivX Carrier + Web Proxy (2 Nodi):** Gestiscono le sessioni web isolate (browser-in-browser). Scalano orizzontalmente.
* **Database (PostgreSQL):** Backend centrale per configurazioni, log e sessioni.
* **Storage (NFS/S3):** Per la registrazione delle sessioni (audit trail).
### Diagramma Logico
```mermaid
graph TD
User((User)) -->|HTTPS/443| LB[Load Balancer HAProxy/Nginx]
subgraph "PrivX Core Cluster"
LB -->|Sticky| Core1[PrivX Core 01]
LB -->|Sticky| Core2[PrivX Core 02]
end
subgraph "PrivX Web Access Cluster"
LB -->|WSS/443| Web1[Carrier + Web Proxy 01]
LB -->|WSS/443| Web2[Carrier + Web Proxy 02]
end
Core1 & Core2 -->|Persistenza| DB[(PostgreSQL 15)]
Web1 & Web2 -->|Config| Core1 & Core2
Core1 & Core2 -->|Audit Logs| NAS[NFS Storage]
```
## 🛠️ Risorse Richieste (Proxmox)
| Ruolo | Hostname | vCPU | RAM | Disk | OS | Note |
|-------|----------|------|-----|------|----|------|
| **Load Balancer** | `privx-lb` | 2 | 4GB | 20GB | Rocky 9 / Debian | Entry point SSL |
| **Core Node 1** | `privx-core-01` | 4 | 8GB | 50GB | Rocky Linux 9 | Master 1 |
| **Core Node 2** | `privx-core-02` | 4 | 8GB | 50GB | Rocky Linux 9 | Master 2 |
| **Web/Carrier 1** | `privx-web-01` | 4 | 16GB | 80GB | Rocky Linux 9 | Docker nested |
| **Web/Carrier 2** | `privx-web-02` | 4 | 16GB | 80GB | Rocky Linux 9 | Docker nested |
| **Database** | `privx-db` | 4 | 8GB | 100GB | Rocky Linux 9 | PostgreSQL 15 |
**Totale Stimato:** ~22 vCPU, ~56GB RAM (Rientra nel budget del lab: 16 core fisici / 64GB RAM).
## 🚀 Roadmap Implementazione
1. **[Database]**: Setup PostgreSQL 15 con SSL e ottimizzazioni per audit log (`pg_trigram`).
2. **[Core]**: Installazione dei due nodi Core e configurazione Cluster via DB condiviso.
3. **[Load Balancer]**: Configurazione HAProxy/Nginx per sticky sessions e SSL termination.
4. **[Web/Carrier]**: Deployment dei container Docker per il browser isolation e link ai Core.
5. **[Hardening]**: Chiusura porte, firewalling interno (simil-PSN).
---
*Progetto basato su PrivX v42 Architecture & PSN Low Level Design.*

146
core/setup-ha-nodes.md Normal file
View File

@@ -0,0 +1,146 @@
# PrivX Core HA Setup - 2 Nodi (Rocky Linux 9)
Questa guida descrive l'installazione di due server **PrivX Core** in configurazione Active-Active, connessi al DB centralizzato.
**Hostname:** `privx-core-01`, `privx-core-02`
**Ruolo:** Gestione autenticazione, API, storage configurazioni.
## 1. Prerequisiti su entrambi i nodi
### 1.1 Configurazione OS (Rocky Linux 9)
Assicurarsi che l'orario sia sincronizzato (Cruciale per i token TOTP/JWT):
```bash
sudo dnf install -y chrony
sudo systemctl enable --now chronyd
```
Disabilitare SELinux (Opzionale ma consigliato per evitare problemi iniziali nel lab, riabilitare poi):
```bash
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config
sudo setenforce 0
```
### 1.2 Firewall (UFW/Firewalld)
Aprire le porte necessarie per la comunicazione tra nodi Core e verso il DB:
* TCP 80/443 (HTTP/S per Load Balancer)
* TCP 5432 (PostgreSQL - Outbound)
* TCP 8888 (PrivX internal API - Inbound da altri nodi PrivX)
```bash
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=8888/tcp
sudo firewall-cmd --reload
```
## 2. Installazione PrivX (Nodo 01 - Master Iniziale)
### 2.1 Aggiunta Repository PrivX
Scarica e installa la repo ufficiale SSH.com (richiede licenza o trial):
```bash
sudo dnf config-manager --add-repo https://product-repository.ssh.com/rhel8/privx/privx.repo
# Nota: La repo RHEL8 funziona spesso anche su RHEL9, altrimenti cercare specifica RHEL9 se disponibile.
sudo dnf install -y privx
```
### 2.2 Configurazione Post-Install (Script interattivo)
Lancia lo script di setup sul primo nodo. Questo popolerà il DB.
```bash
sudo /opt/privx/scripts/postinstall.sh
```
Durante il setup, ti verranno chiesti i parametri del DB. Inserisci quelli creati nella guida `setup-postgresql.md`:
* **Database Host:** `privx-db` (o IP del DB)
* **Database User:** `privx`
* **Database Password:** `password_super_segreta...`
* **Database Name:** `privx`
* **SSL Mode:** `verify-full` (o `require` se hai certificati self-signed senza CA affidabile nel sistema).
Lo script genererà anche i certificati interni per Nginx e i microservizi.
## 3. Configurazione HA (Shared Config)
Per far funzionare il cluster, entrambi i nodi devono condividere la **stessa chiave di cifratura** e puntare allo stesso DB.
### 3.1 Backup Chiavi e Config dal Nodo 01
Copia i file critici dal Nodo 01 al Nodo 02 (via SCP sicuro):
```bash
# Sul Nodo 01
sudo tar czvf privx-ha-pack.tar.gz \
/opt/privx/keyvault \
/opt/privx/etc/shared-config.toml \
/opt/privx/etc/privx-ca.crt \
/opt/privx/etc/privx-ca.key
```
Trasferisci `privx-ha-pack.tar.gz` sul Nodo 02.
## 4. Installazione PrivX (Nodo 02 - Replica)
### 4.1 Installazione RPM
Sul secondo nodo, installa solo i pacchetti senza lanciare `postinstall.sh` subito.
```bash
sudo dnf config-manager --add-repo https://product-repository.ssh.com/rhel8/privx/privx.repo
sudo dnf install -y privx
```
### 4.2 Ripristino Configurazione HA
Prima di avviare, sovrascrivi le config con quelle del Nodo 01:
```bash
# Sul Nodo 02
sudo systemctl stop privx || true
sudo tar xzvf privx-ha-pack.tar.gz -C /
sudo chown -R privx:privx /opt/privx
```
### 4.3 Registrazione Nodo
Ora avvia PrivX sul secondo nodo. Se la configurazione DB in `shared-config.toml` è corretta, il nodo si collegherà al DB esistente e scaricherà le policy.
```bash
sudo systemctl enable --now privx
sudo /opt/privx/scripts/init_node.sh # Se disponibile, per registrare il nodo nel cluster DB
```
## 5. Verifica Cluster
Dal Nodo 01, controlla lo stato dei componenti:
```bash
privx-status
# Dovresti vedere entrambi i nodi (hostname) listati nei log o nella dashboard "Settings > Deployment".
```
## 6. Configurazione Load Balancer (Nginx/HAProxy)
Davanti ai due nodi Core devi mettere un LB. Esempio config Nginx (upstream):
```nginx
upstream privx_core {
ip_hash; # Sticky session obbligatoria!
server privx-core-01:443;
server privx-core-02:443;
}
server {
listen 443 ssl;
server_name privx-lb.tuodominio.local;
location / {
proxy_pass https://privx_core;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
```

View File

@@ -0,0 +1,127 @@
# Setup PostgreSQL per PrivX HA (Rocky Linux 9)
Questa guida descrive l'installazione e la configurazione di un server PostgreSQL dedicato per un cluster PrivX in High Availability.
**Target OS:** Rocky Linux 9
**PostgreSQL Version:** 15 (Versione stabile raccomandata per PrivX v42)
**Ruolo:** Database Backend (Configurazioni, Sessioni, Audit Log)
## 1. Installazione PostgreSQL 15
Disabilita il modulo standard (spesso versione vecchia) e installa la repo ufficiale PGDG:
```bash
sudo dnf -qy module disable postgresql
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/15/redhat/rhel-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf install -y postgresql15-server postgresql15-contrib
```
Inizializza il database:
```bash
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
sudo systemctl enable --now postgresql-15
```
## 2. Configurazione SSL (Obbligatorio per PrivX)
PrivX **rifiuta** connessioni non criptate al DB core. Generiamo certificati self-signed per il lab (in produzione useresti una CA interna).
```bash
# Diventa utente postgres
sudo su - postgres
cd /var/lib/pgsql/15/data
# Genera chiave privata (senza passphr) e certificato valido 10 anni
openssl req -new -text -passout pass:abcd -subj /CN=privx-db -out server.req -keyout privkey.pem
openssl rsa -in privkey.pem -passin pass:abcd -out server.key
openssl req -x509 -in server.req -text -key server.key -out server.crt -days 3650
# Imposta permessi restrittivi (Postgres si rifiuta di partire se la chiave è leggibile da altri)
chmod 600 server.key
ls -l server.key
```
## 3. Configurazione `postgresql.conf`
Modifica `/var/lib/pgsql/15/data/postgresql.conf`:
```ini
# Ascolta su tutte le interfacce (o specifica l'IP del server DB)
listen_addresses = '*'
# Abilita SSL
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
# Ottimizzazioni per PrivX (Audit Log pesanti)
max_connections = 500 # PrivX apre molte connessioni (microservizi)
shared_buffers = 2GB # ~25% della RAM totale (assumendo 8GB RAM per la VM DB)
work_mem = 16MB # Aumenta per query complesse sugli audit
maintenance_work_mem = 512MB
effective_cache_size = 6GB # ~75% della RAM totale
logging_collector = on
log_directory = 'log'
```
## 4. Configurazione `pg_hba.conf`
Modifica `/var/lib/pgsql/15/data/pg_hba.conf` per consentire l'accesso ai nodi PrivX **solo via SSL** e con password cifrate (SCRAM-SHA-256).
```bash
# TYPE DATABASE USER ADDRESS METHOD
# Accesso locale
local all all peer
# Accesso remoto dai Nodi PrivX (Core e Web Proxy)
# Sostituisci la subnet con quella del tuo lab (es. 192.168.1.0/24)
hostssl all all 192.168.1.0/24 scram-sha-256
```
Riavvia il servizio:
```bash
exit # torna utente root
sudo systemctl restart postgresql-15
```
## 5. Creazione Database e Utente PrivX
PrivX richiede un DB vuoto e un utente con privilegi. Le estensioni verranno create dall'installer di PrivX, ma è buona norma pre-abilitarle o assicurarsi che l'utente abbia i diritti per farlo.
Accedi alla shell psql:
```bash
sudo -u postgres psql
```
Esegui le query:
```sql
-- Crea utente dedicato
CREATE USER privx WITH PASSWORD 'password_super_segreta_da_cambiare';
-- Crea database
CREATE DATABASE privx OWNER privx;
-- Concedi privilegi (necessario per creare estensioni come pgcrypto)
GRANT ALL PRIVILEGES ON DATABASE privx TO privx;
-- (Opzionale ma consigliato) Pre-abilita le estensioni richieste
\c privx
CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE EXTENSION IF NOT EXISTS citext;
CREATE EXTENSION IF NOT EXISTS pg_trigram; -- Cruciale per la ricerca veloce negli audit log!
-- Esci
\q
```
## 6. Verifica Connessione (Hardening Check)
Da un altro nodo (o dalla stessa macchina se hai il client), prova a connetterti forzando SSL:
```bash
psql "host=privx-db user=privx dbname=privx sslmode=require"
```
Se ricevi il prompt della password e entri, il DB è pronto per l'installer di PrivX.

102
load-balancer/nginx.conf Normal file
View File

@@ -0,0 +1,102 @@
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
# =========================================================================
# PrivX HA Load Balancer Configuration
# =========================================================================
# 1. PrivX Core Cluster (API & GUI)
# Sticky Sessions (ip_hash) are MANDATORY for OAuth flow and user sessions.
upstream privx_core_cluster {
ip_hash;
server 192.168.1.51:443; # Core Node 01
server 192.168.1.52:443; # Core Node 02
}
# 2. PrivX Web Access Cluster (Carrier + Web Proxy)
# WebSocket support is critical here. Sticky sessions required for browser consistency.
upstream privx_web_cluster {
ip_hash;
server 192.168.1.61:443; # Web Proxy Node 01
server 192.168.1.62:443; # Web Proxy Node 02
}
server {
listen 443 ssl http2;
server_name privx.tuodominio.local;
# SSL Termination (Self-Signed or CA)
ssl_certificate "/etc/nginx/ssl/privx-lb.crt";
ssl_certificate_key "/etc/nginx/ssl/privx-lb.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers PROFILE=SYSTEM;
ssl_prefer_server_ciphers on;
# --- Location: Core API & GUI ---
location / {
proxy_pass https://privx_core_cluster;
# Forward headers required by PrivX
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Timeout tuning for long running API calls
proxy_read_timeout 90;
}
# --- Location: Web Access (Browser-in-Browser) ---
# Routes WSS traffic specifically to the Web Proxy nodes
location /ws {
proxy_pass https://privx_web_cluster;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
# Increase timeouts for long SSH/RDP sessions
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}

View File

@@ -0,0 +1,137 @@
# Setup PrivX Web Access HA (Carrier + Web Proxy) - 2 Nodi
Questa guida copre l'installazione dei componenti per l'accesso Web (RDP/SSH via browser) in alta affidabilità.
Replichiamo l'architettura Enterprise con **2 Carrier** e **2 Web Proxy**.
**Hostname:** `privx-web-01`, `privx-web-02`
**Ruolo:** Gestione sessioni browser isolate (Docker-in-Docker) e proxy WSS.
## 1. Architettura Logica
* **Web Proxy:** Gestisce il traffico WebSocket sicuro (WSS) tra il browser dell'utente e il Carrier.
* **Carrier:** Esegue container Docker effimeri (Firefox) che renderizzano la sessione remota.
* **Relazione:** Ogni Web Proxy deve avere un Carrier associato (spesso sulla stessa macchina per latenza zero).
Nel nostro lab, installeremo entrambi i ruoli su ciascuno dei 2 nodi dedicati (`privx-web-01`, `privx-web-02`).
## 2. Prerequisiti (Rocky Linux 9)
Queste macchine richiedono **più RAM** (min 8GB, meglio 16GB) perché eseguono browser pesanti per ogni utente connesso.
### 2.1 Installazione Docker (Podman non supportato ufficialmente per Carrier)
PrivX Carrier usa Docker per spawnare i browser.
```bash
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker
sudo usermod -aG docker privx-carrier # (Dopo installazione pacchetto)
```
### 2.2 Repository PrivX
Aggiungi la repo come per i Core:
```bash
sudo dnf config-manager --add-repo https://product-repository.ssh.com/rhel8/privx/privx.repo
```
## 3. Installazione Componenti
Su entrambi i nodi (`privx-web-01` e `privx-web-02`), installa i pacchetti specifici:
```bash
sudo dnf install -y privx-carrier privx-web-proxy
```
## 4. Configurazione Nodo 01 (Master Web)
### 4.1 Registrazione al Core
Il Web Proxy deve autenticarsi con il Core. Genera un token di pairing sul Core (`privx-core-01`):
```bash
# SUL NODO CORE
sudo /opt/privx/scripts/generate_token.sh --ttl 3600 --type extender
# Copia il token generato.
```
Ora configura il Web Proxy sul Nodo 01:
```bash
# SUL NODO WEB 01
sudo /opt/privx/scripts/postinstall-web-proxy.sh
# Inserisci:
# - Core URL: https://privx-lb.tuodominio.local (o IP Core 01 per test)
# - Pairing Token: <incolla qui>
```
### 4.2 Configurazione Carrier
Il Carrier deve sapere dove trovare il Web Proxy (localhost) e scaricare l'immagine Docker del browser.
```bash
sudo /opt/privx/scripts/postinstall-carrier.sh
# L'installer scaricherà l'immagine Docker ufficiale di PrivX Browser.
# Verifica che Docker sia attivo!
```
## 5. Configurazione Nodo 02 (Replica HA)
Ripeti ESATTAMENTE gli stessi passaggi sul Nodo 02 (`privx-web-02`).
Usa un **nuovo token** generato dal Core (i token sono monouso).
### 5.1 Verifica HA
In PrivX GUI (Settings > Deployment > Status), dovresti vedere:
* 2 Web Proxies Online
* 2 Carriers Online
Se un nodo cade, il Load Balancer (vedi sotto) sposterà le nuove sessioni sull'altro. Le sessioni attive sul nodo caduto verranno perse (comportamento standard, non c'è live migration delle sessioni browser).
## 6. Configurazione Load Balancer per Web Access
Il traffico Web Access usa WebSocket (WSS). Il Load Balancer deve supportarlo.
Aggiungi al file di config del LB (es. Nginx):
```nginx
upstream privx_web {
ip_hash; # Sticky session CRUCIALE anche qui
server privx-web-01:443;
server privx-web-02:443;
}
server {
listen 443 ssl;
server_name privx-web.tuodominio.local;
location /ws {
proxy_pass https://privx_web;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}
}
```
## 7. Tuning Performance (Carrier)
Poiché girano browser, questi nodi consumano CPU/RAM.
Modifica `/opt/privx/etc/carrier-config.toml`:
```toml
[carrier]
# Limita il numero max di sessioni per nodo per non crashare
max_sessions = 50
# Pulisci container orfani ogni ora
cleanup_interval = 3600
```
Riavvia i servizi dopo le modifiche:
```bash
sudo systemctl restart privx-carrier privx-web-proxy
```