IKE and IPsec SA Renewal
The keys negotiated for IKE SAs and IPsec SAs should only be used for a limited
amount of time. Additionally IPsec SA keys should only encrypt a limited amount
of data. This means that each SA should expire after a specific lifetime or after
a specific data or packet volume. To avoid interruptions, a replacement SA needs
to be negotiated before that happens. This is called rekeying.
IKE SAs
Depending on the IKE version there are up to three ways to replace an IKE SA
before it expires.
Rekeying
In comparison to IKEv1 which only supports reauthentication (see below), IKEv2
provides proper inline rekeying of IKE SAs by use of CREATE_CHILD_SA exchanges.
This means that new keys may be established without any interruption of the
existing IKE and IPsec SAs.
This is the default for IKEv2 configurations based on
swanctl.conf using the
vici management interface.
Reauthentication
This method to renew the IKE keys involves creating a complete IKE SA from
scratch, which includes complete IKE_SA_INIT and IKE_AUTH exchanges and the
recreation of all associated IPsec SAs.
The point of a reauthentication, as the term implies, is to redo the
authentication and to verify that the peers still have access to valid credentials.
Without reauthentication it is currently possible to keep a connection alive even
after a peer’s certificate has expired. Revocation of certificates by means of
CRLs or OCSP is also only checked during authentication.  Reauthentication
also could make sense in cases where smart cards are used for client authentication,
as it ensures that the user still has the smart card inserted and unlocked with
the PIN.
Reauthenticating an IKE SA may be done in two ways:
- Break-before-make
 - 
This is the default behavior of the
IKEdaemon when reauthenticating anIKEv2 SA. It means that allIKE_SAsandCHILD SAsare torn down before recreating them. This will cause some interruptions during which noIPsec SAsare installed. If trap policies are used it could also trigger unnecessary acquires and hence duplicateIPsec SAsduring that downtime. To prevent plaintext traffic from leaving the host appropriate firewall rules or drop policies may be used. - Make-before-break
 - 
This method first creates duplicates of the
IKE SAsand allCHILD SAsoverlapping with the existing ones and then deletes the old ones. This avoids interruptions but requires that both peers can handle overlappingSAs(e.g. in regards to virtual IPs, duplicate policies or updown scripts). It is supported forIKEv2since version 5.3.0 but is disabled by default and may be enabled by explicitly settingcharon.make_before_break = yes
 
The make_before_break option was introduced in
strongswan.conf with strongSwan version 5.3.0
| Setting | Default | Description | 
|---|---|---|
make_before_break  | 
  | 
Initiate IKEv2 reauthentication with a make-before-break instead of a
 break-before-make scheme. Make-before-break uses overlapping   | 
IKEv1 SAs are also rekeyed/reauthenticated using a make-before-break scheme.
However only the IKE SA is affected. IPsec SAs are adopted by the new IKE SA
and not recreated.
IKEv2 Responder Behavior
Responders that have reauthentication configured will use the AUTH_LIFETIME
notify defined by RFC 4478 to demand that clients reauthenticate before
a certain time. If the responder can not initiate the reauthentication itself (e.g.
due to asymmetric authentication like EAP) it will close the IKE_SA if the client
fails to reauthenticate the SA in time. The responder sends the calculated and
randomized reauthentication time to the client (not the hard lifetime of the SA).
Starting with version 5.9.4, the criteria for sending an AUTH_LIFETIME
           notification by the IKE responder have changed: When IKE reauthentication
           is enabled (reauth_time > 0), AUTH_LIFETIME notifies are now only
           sent by a responder if it can’t reauthenticate the IKE_SA itself due to
           asymmetric authentication (i.e. EAP) or the assignment of virtual IP
           addresses.
 | 
Note that strongSwan as a client will adhere to AUTH_LIFETIME notifies even if
reauthentication is disabled in the config (or configured differently). It
subtracts the locally configured over_time or margintime from the received
lifetime and schedules a reauthentication.
Settings
The following settings control when IKE SAs expire and how and when they are
replaced. Note that both configuration backends support randomization of rekeying
times to avoid collisions.
The following parameters are used in the
connections section of
swanctl.conf:
| Key | Default | Description [default] | 
|---|---|---|
<conn>.reauth_time  | 
  | 
Time to schedule IKE reauthentication. IKE reauthentication recreates the
 IKE/ISAKMP SA from scratch and re-evaluates the credentials. In asymmetric
 configurations (with EAP or configuration payloads) it might not be possible to
 actively reauthenticate as responder. The IKEv2 reauthentication lifetime
 negotiation can instruct the client to perform reauthentication. Reauthentication
 is disabled by default. Enabling it usually may lead to small connection
 interruptions as strongSwan uses a break-before-make policy with IKEv2 by
 default unless   | 
<conn>.rekey_time  | 
  | 
IKE rekeying refreshes key material using a Diffie-Hellman key exchange, but does
 not re-check associated credentials. It is supported with IKEv2 only. IKEv1
 performs a reauthentication procedure instead. With the default value, IKE
 rekeying is scheduled every   | 
<conn>.over_time  | 
[→]  | 
Hard IKE_SA lifetime if rekey/reauth does not complete, as time. To avoid having
 an IKE or ISAKMP connection kept alive if IKE reauthentication or rekeying fails
 perpetually, a maximum hard lifetime may be specified. If the IKE_SA fails to
 rekey or reauthenticate within the specified time, the IKE_SA gets closed.
 In contrast to CHILD_SA rekeying,   | 
<conn>.rand_time  | 
[→]  | 
Time range from which to choose a random value to subtract from rekey/reauth
 times. To avoid having both peers initiating the rekey/reauth procedure
 simultaneously, a random time gets subtracted from the rekey/reauth times.
 The default is equal to the configured   | 
IPsec SAs
IPsec SAs or CHILD_SAs are always rekeyed by creating new SAs and then
deleting the old ones. The cryptographic keys may either be derived from the
IKE key material or with a separate Diffie-Hellman (DH) exchange. The latter
is also known as Perfect Forward Secrecy (PFS). To use PFS, DH groups
may be added to the proposals for the IPsec SAs e.g.
esp_proposals = aes128-sha256-modp3072
in swanctl.conf. To make PFS optional (i.e. let the peer choose whether PFS
is used or not) add proposals with and without DH groups e.g.
esp_proposals = aes128-sha256-modp3072,aes128-sha256
IKEv2
There is one important aspect that affects IKEv2. The keys for the CHILD_SA
that is implicitly created with the IKE_AUTH exchange will always be derived
from the IKE key exchange even if PFS is configured. So if the peers disagree
on whether to use PFS or not (or on the DH groups) it will not be known until
the CHILD_SA is first rekeyed with a CREATE_CHILD_SA exchange (and fails).
This is also the reason why you won’t see a DH group in the status output of
the daemon until the SA is first rekeyed.
It’s possible to force a CHILD_SA rekeying via the
 swanctl command and the
vici interface. This could be used to test if there
is a PFS configuration mismatch.
Also, since version 5.8.0 strongSwan supports the initiation of childless
IKE_SAs. If enabled, no CHILD_SA is created during IKE_AUTH. The first
CHILD_SA will be created with a separate CREATE_CHILD_SA exchange. Thus the
configuration issue as described above will be apparent right from the start,
without having to trigger a rekeying or wait for one.
CHILD_SA Rekeying Behavior since Version 5.5.3
With version 5.5.3 the behavior during IKEv2 CHILD_SA rekeyings has changed
to avoid traffic loss. When responding to a CREATE_CHILD_SA request to rekey a
CHILD_SA the responder already has everything available to install and use the
new CHILD_SA. However, immediately doing so (as strongSwan did before 5.5.3)
could lead to lost traffic as the initiator won’t be able to process inbound
packets until it receives the CREATE_CHILD_SA response and updates the inbound
SA. To avoid this the responder only installs the new inbound SA and delays
installing the outbound SA until it receives the DELETE notify for the
replaced CHILD_SA.
The messages transporting these DELETE notifications could reach the peer
before packets sent with the deleted outbound SAs reach it. To reduce the
chance of traffic loss due to this the inbound SA of the replaced CHILD_SA
is not removed for a configurable amount of seconds as defined by the
charon.delete_rekeyed_delay
parameter after the DELETE notify has been processed.
IKEv1
With IKEv1 each Quick Mode exchange uses the complete proposals, so already
the first IPsec SA will use PFS according to the configuration.
Settings
The following settings control when IPsec SAs expire and when they are replaced. Note that both configuration backends support randomization of rekeying margins to avoid collisions.
The following parameters are used in the
connections.<conn>.children
section of swanctl.conf
| Key | Default | Description [default] | 
|---|---|---|
<child>.rekey_time  | 
[→]  | 
Time to schedule CHILD_SA rekeying. CHILD_SA rekeying refreshes key material,
 optionally using a Diffie-Hellman exchange if a group is specified in the proposal.
 To avoid rekey collisions initiated by both ends simultaneously, a value in the
 range of   | 
<child>.life_time  | 
[→]  | 
Maximum lifetime before CHILD_SA gets closed. Usually this hard lifetime is never
 reached, because the CHILD_SA gets rekeyed before. If that fails for whatever
 reason, this limit closes the CHILD_SA. The default is 10% more than the
   | 
<child>.rand_time  | 
[→]  | 
Time range from which to choose a random value to subtract from   | 
<child>.rekey_bytes  | 
[→]  | 
Number of bytes processed before initiating CHILD_SA rekeying. CHILD_SA rekeying
 refreshes key material, optionally using a Diffie-Hellman exchange if a group is
 specified in the proposal. To avoid rekey collisions initiated by both ends
 simultaneously, a value in the range of   | 
<child>.life_bytes  | 
Maximum bytes processed before CHILD_SA gets closed. Usually this hard volume
 limit is never reached, because the CHILD_SA gets rekeyed before. If that fails
 for whatever reason, this limit closes the CHILD_SA. The default is 10% more than
   | 
|
<child>.rand_bytes  | 
[→]  | 
Byte range from which to choose a random value to subtract from   | 
<child>.rekey_packets  | 
[→]  | 
Number of packets processed before initiating CHILD_SA rekeying. CHILD_SA rekeying
 refreshes key material, optionally using a Diffie-Hellman exchange if a group is
 specified in the proposal. To avoid rekey collisions initiated by both ends
 simultaneously, a value in the range of   | 
<child>.life_packets  | 
[→]  | 
Maximum number of packets processed before CHILD_SA gets closed. Usually this
 hard packets limit is never reached, because the CHILD_SA gets rekeyed before.
 If that fails for whatever reason, this limit closes the CHILD_SA. The default
 is 10% more than   | 
<child>.rand_packets  | 
[→]  | 
Packet range from which to choose a random value to subtract from   | 
Example
With the default settings in swanctl.conf the
following times are used:
- 
IKE SA default:
rekey_time = 4h = 240m over_time = 0.1 * rekey_time = 24m rand_time = over_time = 24m expiry = rekey_time + over_time = 264m rekey = rekey_time - random(0, rand_time) = [216, 240]m
Thus the daemon will attempt to rekey the
IKE SAat a random time between216and240minutes after establishing the SA. Or in other words, between24and48minutes before the SA expires. - 
IPsec SA default:
rekey_time = 1h = 60m life_time = 1.1 * rekey_time = 66m rand_time = life_time - rekey_time = 6m expiry = life_time = 66m rekey = rekey_time - random(0, rand_time) = [54, 60]m
Thus the daemon will attempt to rekey the
IPsec SAat a random time between54and60minutes after establishing the SA. Or in other words, between6and12minutes before the SA expires. 
| Since the rekeying of an SA needs some time, the margin values must not be set too low. |