Reverse proxy Apache HTTPD con `mod_auth_openidc` per l'autenticazione OIDC e gestione multitenant
10K+
Questa immagine Docker fornisce un reverse proxy Apache HTTPD configurato con mod_auth_openidc per l'autenticazione OIDC.
La configurazione è dinamica e basata su variabili d'ambiente, permettendo di gestire molteplici tenant con una singola immagine.
Questa immagine è basata su registry.access.redhat.com/ubi10/httpd-24, una distribuzione Apache HTTPD 2.4 ottimizzata per container Red Hat Universal Base Image.
Moduli Apache installati:
| Modulo | Descrizione | Documentazione |
|---|---|---|
mod_auth_openidc | Modulo di autenticazione OpenID Connect per Apache. Gestisce il flusso di autenticazione OIDC, la gestione delle sessioni e l'iniezione di claim negli header HTTP. | mod_auth_openidc Documentation |
mod_proxy | Modulo per il proxying delle richieste HTTP verso backend remoti. | Apache mod_proxy Documentation |
mod_proxy_http | Estensione di mod_proxy per il protocollo HTTP/HTTPS. | Apache mod_proxy_http Documentation |
mod_headers | Modulo per la manipolazione degli header HTTP (lettura, modifica, eliminazione). Utilizzato per sanificare e iniettare gli header verso il backend. | Apache mod_headers Documentation |
mod_ssl | Modulo per il supporto HTTPS e SSL/TLS, incluso SSLProxyEngine per backend HTTPS. | Apache mod_ssl Documentation |
mod_rewrite | Modulo per la riscrittura URL e il routing dinamico. | Apache mod_rewrite Documentation |
La configurazione avviene tramite variabili d'ambiente. È necessario definire il dominio base e la lista dei tenant, e poi le configurazioni specifiche per ogni tenant.
| Variabile | Descrizione | Default | Esempio |
|---|---|---|---|
DOMAIN | Il dominio base per i virtual host. | - | servizio.cineca.it |
TENANTS | Lista separata da virgola dei nomi dei tenant (sottodomini). | - | sviluppoprodotti,cineca |
OIDC_CRYPTO_PASSPHRASE | Passphrase per la crittografia della sessione OIDC. | 9f8d7c6b... (UUID statico) | secret... |
OIDC_REMOTE_USER_CLAIM | Claim da utilizzare come Remote User. | sub | email |
OIDC_SCOPE | Scope OIDC richiesti. | openid email profile | openid profile |
OIDC_USER_ROLE_CLAIM | Nome del claim contenente i ruoli utente (utilizzato per popolare l'header X-User-Role). | userRole | roles |
OIDC_SESSION_INACTIVITY_TIMEOUT | Timeout di inattivita della sessione OIDC (secondi). | 3600 | 1800 |
OIDC_RELEASE_USER_HEADERS | Abilita il rilascio degli header utente standard. | true | false |
OIDC_RELEASE_AUTHORIZATION_HEADER | Abilita il rilascio dell'header Authorization con l'access token. | false | true |
PROXY_SSE_MODE | Abilita la modalità SSE (Server Sent Events), forzando il flush immediato dei pacchetti e disabilitando gzip. | false | true |
OIDC_CACHE_TYPE | Tipo di cache (file, memcache). | file | memcache |
OIDC_CACHE_ENCRYPT | Abilita la crittografia della cache. | On | Off |
OIDC_MEMCACHE_CACHE_SERVERS | URL del/dei server Memcache (richiesto se type è memcache). | - | memcache-server1 |
FALLBACK_SERVICE_URL | URL di default del backend (se non specificato per tenant). | - | http://backend/ |
SERVICE_PATH | Path specifico (o lista separata da spazi) da proxare verso un servizio dedicato. | - | /api/v2 /api/v3 |
SERVICE_URL | URL del servizio dedicato (o lista separata da spazi) per i path specificati. | - | http://new-backend/api/v2 http://other-backend/api/v3 |
PROTECTED_PATH | Path da proteggere con OIDC. | / | /secure |
PROXY_TIMEOUT | Timeout per la connessione al backend (secondi). | 60 | 300 |
PROXY_CONNECTION_TIMEOUT | Timeout di connessione al backend (secondi). | 10 | 5 |
Per ogni tenant definito nella lista TENANTS, il sistema si aspetta delle variabili d'ambiente specifiche. Il nome della variabile è composto dal nome del tenant in maiuscolo (es. per sviluppoprodotti il prefisso sarà SVILUPPOPRODOTTI_).
| Variabile | Descrizione | Default (se non specificato) |
|---|---|---|
[TENANT]_PROVIDER_METADATA_URL | URL dei metadati del provider OIDC. | Obbligatorio |
[TENANT]_CLIENT_SECRET | Client Secret per l'autenticazione OIDC. | Obbligatorio |
[TENANT]_FALLBACK_SERVICE_URL | URL del backend verso cui fare proxy. | Valore di FALLBACK_SERVICE_URL globale |
[TENANT]_SERVICE_PATH | Path specifico (o lista separata da spazi) da proxare per questo tenant. | Valore di SERVICE_PATH globale |
[TENANT]_SERVICE_URL | URL del servizio dedicato (o lista separata da spazi) per questo tenant. | Valore di SERVICE_URL globale |
[TENANT]_CLIENT_ID | Client ID per l'autenticazione OIDC. | https://[tenant].[domain]/oidc |
[TENANT]_REDIRECT_URI | Redirect URI per OIDC. | https://[tenant].[domain]/redirect_uri |
[TENANT]_PROTECTED_PATH | Path specifico da proteggere. | Valore di PROTECTED_PATH globale (/) |
[TENANT]_REMOTE_USER_CLAIM | Override del claim user remoto. | Valore di OIDC_REMOTE_USER_CLAIM globale |
[TENANT]_SCOPE | Override degli scope OIDC. | Valore di OIDC_SCOPE globale |
Configurazioni degli header iniettati verso il backend.
Header sempre presenti (se il dato è disponibile nella sessione OIDC o Apache):
| Header | Origine valore |
|---|---|
X-Remote-User | Valore della variabile REMOTE_USER (utente autenticato). |
X-Tenant | Valore del claim tenant (se restituito dall'IDP). |
Header utente (controllati da OIDC_RELEASE_USER_HEADERS=true):
| Header | Claim OIDC sorgente |
|---|---|
X-Email | email |
X-Given-Name | given_name |
X-Family-Name | family_name |
X-Fiscal-Code | fiscalCode |
X-Asset-List | assetList |
X-User-Role | Valore definito in OIDC_USER_ROLE_CLAIM (default: userRole) |
Questi header vengono sanificati (unset) prima di essere popolati per evitare spoofing.
Header di autorizzazione (controllato da OIDC_RELEASE_AUTHORIZATION_HEADER=true):
Authorization: Bearer <OIDC_access_token> (non sovrascrive se già presente).Il container supporta due livelli di proxying:
SERVICE_PATH e SERVICE_URL (come valori singoli o liste separate da spazi), le richieste che iniziano con SERVICE_PATH vengono inoltrate al corrispondente SERVICE_URL. Nel caso di liste, l'ordine dei path deve corrispondere a quello degli URL.FALLBACK_SERVICE_URL.Configurazione backend HTTPS:
SSLProxyEngine On, quindi supporta backend https (con certificati validi o fidati dalla CA di sistema).La cache delle sessioni OIDC può essere configurata tramite OIDC_CACHE_TYPE.
File System (OIDC_CACHE_TYPE=file - default):
Le sessioni sono salvate in /opt/app-root/mod_auth_openidc/cache.
Per persistere le sessioni tra riavvii del container, montare un volume in questo percorso.
Esempio docker-compose.yml:
volumes:
- ./cache:/opt/app-root/mod_auth_openidc/cache
Memcache (OIDC_CACHE_TYPE=memcache):
Richiede OIDC_MEMCACHE_CACHE_SERVERS impostato all'indirizzo del server Memcached.
.envDOMAIN=servizio.cineca.it
TENANTS=sviluppoprodotti,cineca
# OIDC_CRYPTO_PASSPHRASE=mysecretpassphrase
OIDC_REMOTE_USER_CLAIM=email
OIDC_SESSION_INACTIVITY_TIMEOUT=1800
PROTECTED_PATH=/secure
OIDC_RELEASE_USER_HEADERS=true
OIDC_RELEASE_AUTHORIZATION_HEADER=false
# Configurazione per il tenant 'sviluppoprodotti'
SVILUPPOPRODOTTI_PROVIDER_METADATA_URL=https://sviluppoprodotti.idp.pp.cineca.it/.well-known/openid-configuration
SVILUPPOPRODOTTI_CLIENT_SECRET=mysecret1
SVILUPPOPRODOTTI_FALLBACK_SERVICE_URL=https://backend-app-1.internal/api
# Configurazione per il tenant 'cineca'
CINECA_PROVIDER_METADATA_URL=https://idp-is.cineca.it/.well-known/openid-configuration
CINECA_CLIENT_SECRET=mysecret2
CINECA_FALLBACK_SERVICE_URL=https://backend-app-2.internal/api
CINECA_PROTECTED_PATH=/admin
# Configurazione per un tenant con proxy specifico
# UNIPI_SERVICE_PATH=/api/v2
# UNIPI_SERVICE_URL=http://backend-v2/api/v2
docker build -t httpd-oidc-proxy .
Eseguire il container passando il file delle variabili d'ambiente:
docker run -p 8080:8080 --env-file local.env httpd-oidc-proxy:latest
All'avvio del container, lo script httpd-pre-init/oidc-init.sh:
TENANTS e DOMAIN.common.conf) con le direttive globali (Header, Cache).Content type
Image
Digest
sha256:9729e375c…
Size
97.3 MB
Last updated
about 2 months ago
docker pull cinecadockerhub01/httpd-oidc-proxy