Sign inSign up

cinecadockerhub01/httpd-oidc-proxy

By cinecadockerhub01

Updated about 2 months ago

Reverse proxy Apache HTTPD con `mod_auth_openidc` per l'autenticazione OIDC e gestione multitenant

Image
Security
Web servers
0

10K+

cinecadockerhub01/httpd-oidc-proxy repository overview

HTTPD OIDC Proxy

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.

Immagine Sorgente e Moduli

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:

ModuloDescrizioneDocumentazione
mod_auth_openidcModulo 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_proxyModulo per il proxying delle richieste HTTP verso backend remoti.Apache mod_proxy Documentation
mod_proxy_httpEstensione di mod_proxy per il protocollo HTTP/HTTPS.Apache mod_proxy_http Documentation
mod_headersModulo per la manipolazione degli header HTTP (lettura, modifica, eliminazione). Utilizzato per sanificare e iniettare gli header verso il backend.Apache mod_headers Documentation
mod_sslModulo per il supporto HTTPS e SSL/TLS, incluso SSLProxyEngine per backend HTTPS.Apache mod_ssl Documentation
mod_rewriteModulo per la riscrittura URL e il routing dinamico.Apache mod_rewrite Documentation

Configurazione

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.

Variabili Globali
VariabileDescrizioneDefaultEsempio
DOMAINIl dominio base per i virtual host.-servizio.cineca.it
TENANTSLista separata da virgola dei nomi dei tenant (sottodomini).-sviluppoprodotti,cineca
OIDC_CRYPTO_PASSPHRASEPassphrase per la crittografia della sessione OIDC.9f8d7c6b... (UUID statico)secret...
OIDC_REMOTE_USER_CLAIMClaim da utilizzare come Remote User.subemail
OIDC_SCOPEScope OIDC richiesti.openid email profileopenid profile
OIDC_USER_ROLE_CLAIMNome del claim contenente i ruoli utente (utilizzato per popolare l'header X-User-Role).userRoleroles
OIDC_SESSION_INACTIVITY_TIMEOUTTimeout di inattivita della sessione OIDC (secondi).36001800
OIDC_RELEASE_USER_HEADERSAbilita il rilascio degli header utente standard.truefalse
OIDC_RELEASE_AUTHORIZATION_HEADERAbilita il rilascio dell'header Authorization con l'access token.falsetrue
PROXY_SSE_MODEAbilita la modalità SSE (Server Sent Events), forzando il flush immediato dei pacchetti e disabilitando gzip.falsetrue
OIDC_CACHE_TYPETipo di cache (file, memcache).filememcache
OIDC_CACHE_ENCRYPTAbilita la crittografia della cache.OnOff
OIDC_MEMCACHE_CACHE_SERVERSURL del/dei server Memcache (richiesto se type è memcache).-memcache-server1
FALLBACK_SERVICE_URLURL di default del backend (se non specificato per tenant).-http://backend/
SERVICE_PATHPath specifico (o lista separata da spazi) da proxare verso un servizio dedicato.-/api/v2 /api/v3
SERVICE_URLURL del servizio dedicato (o lista separata da spazi) per i path specificati.-http://new-backend/api/v2 http://other-backend/api/v3
PROTECTED_PATHPath da proteggere con OIDC.//secure
PROXY_TIMEOUTTimeout per la connessione al backend (secondi).60300
PROXY_CONNECTION_TIMEOUTTimeout di connessione al backend (secondi).105
Variabili per Tenant

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_).

VariabileDescrizioneDefault (se non specificato)
[TENANT]_PROVIDER_METADATA_URLURL dei metadati del provider OIDC.Obbligatorio
[TENANT]_CLIENT_SECRETClient Secret per l'autenticazione OIDC.Obbligatorio
[TENANT]_FALLBACK_SERVICE_URLURL del backend verso cui fare proxy.Valore di FALLBACK_SERVICE_URL globale
[TENANT]_SERVICE_PATHPath specifico (o lista separata da spazi) da proxare per questo tenant.Valore di SERVICE_PATH globale
[TENANT]_SERVICE_URLURL del servizio dedicato (o lista separata da spazi) per questo tenant.Valore di SERVICE_URL globale
[TENANT]_CLIENT_IDClient ID per l'autenticazione OIDC.https://[tenant].[domain]/oidc
[TENANT]_REDIRECT_URIRedirect URI per OIDC.https://[tenant].[domain]/redirect_uri
[TENANT]_PROTECTED_PATHPath specifico da proteggere.Valore di PROTECTED_PATH globale (/)
[TENANT]_REMOTE_USER_CLAIMOverride del claim user remoto.Valore di OIDC_REMOTE_USER_CLAIM globale
[TENANT]_SCOPEOverride degli scope OIDC.Valore di OIDC_SCOPE globale
Mappatura Header

Configurazioni degli header iniettati verso il backend.

Header sempre presenti (se il dato è disponibile nella sessione OIDC o Apache):

HeaderOrigine valore
X-Remote-UserValore della variabile REMOTE_USER (utente autenticato).
X-TenantValore del claim tenant (se restituito dall'IDP).

Header utente (controllati da OIDC_RELEASE_USER_HEADERS=true):

HeaderClaim OIDC sorgente
X-Emailemail
X-Given-Namegiven_name
X-Family-Namefamily_name
X-Fiscal-CodefiscalCode
X-Asset-ListassetList
X-User-RoleValore 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).
Logica di Proxying

Il container supporta due livelli di proxying:

  1. Proxy Specifico: Se vengono definiti 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.
  2. Proxy di Fallback: Tutte le altre richieste vengono inoltrate a FALLBACK_SERVICE_URL.

Configurazione backend HTTPS:

  • Il proxy è configurato con SSLProxyEngine On, quindi supporta backend https (con certificati validi o fidati dalla CA di sistema).
Persistenza e Cache

La cache delle sessioni OIDC può essere configurata tramite OIDC_CACHE_TYPE.

  1. 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
    
  2. Memcache (OIDC_CACHE_TYPE=memcache): Richiede OIDC_MEMCACHE_CACHE_SERVERS impostato all'indirizzo del server Memcached.

Esempio di file .env
DOMAIN=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

Utilizzo

Build
docker build -t httpd-oidc-proxy .
Run

Eseguire il container passando il file delle variabili d'ambiente:

docker run -p 8080:8080 --env-file local.env httpd-oidc-proxy:latest

Funzionamento Interno

All'avvio del container, lo script httpd-pre-init/oidc-init.sh:

  1. Legge la variabile TENANTS e DOMAIN.
  2. Per ogni tenant, recupera le variabili d'ambiente specifiche.
  3. Genera un file di configurazione Apache (VirtualHost) per quel tenant.
  4. Genera una configurazione comune (common.conf) con le direttive globali (Header, Cache).
  5. Salva i file affinché Apache li carichi all'avvio.

Tag summary

Content type

Image

Digest

sha256:9729e375c

Size

97.3 MB

Last updated

about 2 months ago

docker pull cinecadockerhub01/httpd-oidc-proxy