Gli indici dei parametri di sicurezza (SPI) possono significare cose diverse quando si fa riferimento a IKE e IPsec Security Associations (SA):
-
Per IKE due SPI a 64 bit identificano in modo univoco una SA IKE. Con IKEv2 la richiesta di IKE_SA_INIT
avrà solo l'SPI dell'iniziatore localmente univoco impostato nell'intestazione IKE, lo SPI del rispondente è zero . Il rispondente lo imposterà a un valore localmente unico nella sua risposta. I due SPI cambiano solo quando IKE SA viene reimpostato.
I due campi nell'intestazione IKE che ora sono denominati SPI iniziatore / risponditore erano precedentemente chiamati cookie iniziatore / risponditore in RFC 2408 (ISAKMP). Ciò potrebbe creare confusione poiché IKEv2 utilizza i payload della notifica COOKIE per contrastare gli attacchi denial of service .
-
Per IPsec un SPI a 32 bit identifica semi-un IPsec SA in modo univoco. Poiché queste SA sono unidirezionali, l'intestazione ESP / AH contiene solo l'SPI della SA in entrata della destinazione (diversamente dall'intestazione IKE che contiene sempre entrambi gli SPI). Poiché gli SPI sono localmente unici, questo e l'indirizzo di destinazione sono in genere sufficienti per identificare univocamente un SA. Ma potrebbe essere problematico, ad es. se due client dietro lo stesso NAT allocano lo stesso SPI locale quando si connettono allo stesso gateway VPN. La combinazione di SPI e indirizzo di destinazione sarebbe la stessa sul lato pubblico del NAT, motivo per cui è richiesto incapsulamento UDP . Le porte UDP consentono al NAT di indirizzare i pacchetti in entrata al client giusto. Allo stesso modo, il gateway deve adottare misure per differenziare le due SA in modo che venga utilizzata la SA corretta quando si invia traffico a ciascun client.
Does this mean, that the SPI a party sets is the SPI used for the incoming SA, not the outgoing one?
Sì, ogni peer invia lo SPI della sua SA in entrata all'altro peer.
Additionally my notes say that the initiator uses the SAD_ADD
method while the responder uses SAD_GETSPI
and SAD_UPDATE
.
Il processo di creazione di un IPsec SA utilizzando ad es. uno scambio CREATE_CHILD_SA
in IKEv2 potrebbe essere approssimativamente visualizzato in questo modo:
Initiator Responder
SAD_GETSPI (inbound SA) -----------> {select algorithms and derive keys}
SAD_ADD (outbound SA)
SAD_GETSPI (inbound SA)
{derive keys} <----------- SAD_UPDATE (inbound SA)
SAD_UPDATE (inbound SA)
SAD_ADD (outbound SA)
- L'iniziatore invia l'SPI della sua SA in entrata insieme a una proposta di algoritmi crittografici e, se viene utilizzata la perfetta segretezza inoltrata, il suo fattore Diffie-Hellman, al rispondente.
- Il rispondente seleziona gli algoritmi adatti e ricava le chiavi (facoltativamente usando DH) e procede all'installazione delle SA.
- Quindi restituisce il suo SPI in ingresso insieme agli algoritmi selezionati (e facoltativamente il suo fattore DH) all'iniziatore, che ora è in grado di installare le SA al suo fianco.
Inoltre, i due peer scambiano selettori di traffico che specificano il traffico di rete che deve essere coperto dalla SA stabilita.
SAD_UPDATE
: "Please update SPI x, set SPI to y."
Questo non è ciò che SAD_UPDATE
fa. In realtà non cambia affatto SPI, ma piuttosto tutti (o alcuni) degli altri aspetti della SA, e questi sono principalmente algoritmi e chiavi di crittografia / integrità (ma possono anche includere altre cose, come incapsulamento o le dimensioni della finestra anti-replay).
Il motivo per cui di solito vuoi chiamare SAD_GETSPI
e SAD_UPDATE
invece di semplicemente SAD_ADD
per SA in ingresso (anche sul risponditore, dove tutte le informazioni sarebbero disponibili) è che il SAD è solitamente gestito dal gestore kernel del sistema, mentre i daemon IKE operano in userland. Pertanto, chiamando SAD_GETSPI
assicurerai che l'SPI sia in realtà localmente unico. Quale potrebbe non essere garantito se ad es. due daemon IKE (per IKEv1 e IKEv2) o persino strumenti per gestire manualmente le SA (come ip xfrm
o setkey
) vengono utilizzati contemporaneamente su un sistema.
Ma è immaginabile che su alcuni sistemi ci possa essere una semplificazione che consentirebbe a un rispondente di chiamare SAD_ADD
senza specificare uno SPI, e il SAD ne allocherà uno, installerà l'SA e restituirà il nuovo SPI. Ma ciò richiederebbe una gestione speciale per questo caso particolare da parte del daemon keying (altrimenti potrebbe semplicemente chiamare SAD_ADD
per le SA in uscita e SAD_GETSPI/SAD_UPDATE
per le SA in ingresso, non importa se lo fa come iniziatore o risponditore).
RFC 2367 (PF_KEYv2) fornisce ulteriori informazioni su queste operazioni.