rfc9061xml2.original.xml | rfc9061.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="US-ASCII"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<!-- $Id: draft-ietf-i2nsf-sdn-ipsec-flow-protection-14.xml,v 1.5 2020/10/07 06: | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
27:15 Exp $ --> | ||||
<!-- This template is for creating an Internet Draft using xml2rfc, | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft | |||
which is available here: http://xml.resource.org. --> | -ietf-i2nsf-sdn-ipsec-flow-protection-14" number="9061" obsoletes="" updates="" | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | submissionType="IETF" category="std" consensus="true" xml:lang="en" tocInclude=" | |||
<!-- One method to get references from the online citation libraries. | true" tocDepth="3" symRefs="true" sortRefs="true" version="3"> | |||
There has to be one entity for each item to be referenced. | <!-- xml2rfc v2v3 conversion 3.7.0 --> | |||
An alternate method (rfc include) is described in the references. --> | ||||
<!ENTITY RFC2119 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.2119.xml"> | ||||
<!ENTITY RFC2865 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.2865.xml"> | ||||
<!ENTITY RFC2866 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.2866.xml"> | ||||
<!ENTITY RFC3575 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.3575.xml"> | ||||
<!ENTITY RFC3579 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.3579.xml"> | ||||
<!ENTITY RFC4849 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.4849.xml"> | ||||
<!ENTITY RFC5080 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.5080.xml"> | ||||
<!ENTITY RFC5226 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.5226.xml"> | ||||
<!ENTITY RFC7149 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7149.xml"> | ||||
<!ENTITY RFC4301 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.4301.xml"> | ||||
<!ENTITY RFC6071 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6071.xml"> | ||||
<!ENTITY RFC2367 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.2367.xml"> | ||||
<!ENTITY RFC3549 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.3549.xml"> | ||||
<!ENTITY RFC3948 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.3948.xml"> | ||||
<!ENTITY RFC6437 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6437.xml"> | ||||
<!ENTITY RFC7296 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7296.xml"> | ||||
<!ENTITY RFC8229 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8229.xml"> | ||||
<!ENTITY RFC8192 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8192.xml"> | ||||
<!ENTITY RFC7426 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7426.xml"> | ||||
<!ENTITY RFC8329 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8329.xml"> | ||||
<!ENTITY RFC6020 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6020.xml"> | ||||
<!ENTITY RFC3688 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.3688.xml"> | ||||
<!ENTITY RFC8446 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8446.xml"> | ||||
<!ENTITY RFC6241 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6241.xml"> | ||||
<!ENTITY RFC6242 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6242.xml"> | ||||
<!ENTITY RFC8341 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8341.xml"> | ||||
<!ENTITY RFC8040 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8040.xml"> | ||||
<!ENTITY RFC8247 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8247.xml"> | ||||
<!ENTITY RFC7950 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7950.xml"> | ||||
<!ENTITY RFC8342 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8342.xml"> | ||||
<!ENTITY RFC8340 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8340.xml"> | ||||
<!ENTITY RFC2247 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.2247.xml"> | ||||
<!ENTITY RFC3947 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.3947.xml"> | ||||
<!ENTITY RFC4303 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.4303.xml"> | ||||
<!ENTITY RFC5280 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.5280.xml"> | ||||
<!ENTITY RFC5915 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.5915.xml"> | ||||
<!ENTITY RFC6040 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6040.xml"> | ||||
<!ENTITY RFC6991 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6991.xml"> | ||||
<!ENTITY RFC7383 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7383.xml"> | ||||
<!ENTITY RFC7427 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7427.xml"> | ||||
<!ENTITY RFC7619 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7619.xml"> | ||||
<!ENTITY RFC8017 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8017.xml"> | ||||
<!ENTITY RFC8174 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8174.xml"> | ||||
<!ENTITY RFC8221 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8221.xml"> | ||||
<!ENTITY RFC5322 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.5322.xml"> | ||||
<!ENTITY RFC8221 SYSTEM "http://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.3280.xml"> | ||||
]> | ||||
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?> | ||||
<!-- used by XSLT processors --> | ||||
<!-- For a complete list and description of processing instructions (PIs), pleas | ||||
e see http://xml.resource.org/authoring/README.html. --> | ||||
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds | ||||
might want to use. (Here they are set differently than their defaults in xml2rf | ||||
c v1.32) --> | ||||
<!-- <?rfc strict="yes" ?> --> | ||||
<!-- give errors regarding ID-nits and DTD validation --> | ||||
<!-- control the table of contents (ToC) --> | ||||
<?rfc toc="yes"?> | ||||
<!-- generate a ToC --> | ||||
<?rfc tocdepth="3"?> | ||||
<!-- the number of levels of subsections in ToC. default: 3 --> | ||||
<!-- control references --> | ||||
<?rfc symrefs="yes"?> | ||||
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] --> | ||||
<?rfc sortrefs="yes" ?> | ||||
<!-- sort the reference entries alphabetically --> | ||||
<!-- control vertical white space | ||||
(using these PIs as follows is recommended by the RFC Editor) --> | ||||
<?rfc compact="yes" ?> | ||||
<!-- do not start each main section on a new page --> | ||||
<?rfc subcompact="no" ?> | ||||
<!-- keep one blank line between list items --> | ||||
<!-- end of list of popular I-D processing instructions --> | ||||
<?rfc inline="yes"?> | ||||
<?rfc strict="no"?> | ||||
<?rfc rfcedstyle="yes"?> | ||||
<rfc ipr="trust200902" category="std" docName="draft-ietf-i2nsf-sdn-ipsec-flow-p | ||||
rotection-14"> | ||||
<!-- category values: std, bcp, info, exp, and historic | ||||
ipr values: full3667, noModification3667, noDerivatives3667 | ||||
you can add the attributes updates="NNNN" and obsoletes="NNNN" | ||||
they will automatically be output with "(if approved)" --> | ||||
<!-- ***** FRONT MATTER ***** --> | ||||
<front> | <front> | |||
<!-- The abbreviated title is used in the page header - it is only neces | <title abbrev="IPsec Flow Protection Based on SDN">A YANG Data Model for | |||
sary if the | IPsec Flow Protection Based on Software-Defined Networking (SDN)</title> | |||
full title is longer than 39 characters --> | <seriesInfo name="RFC" value="9061"/> | |||
<title abbrev="SDN-based IPsec Flow Protection"> Software-Defined Networ | ||||
king (SDN)-based IPsec Flow Protection</title> | ||||
<!-- add 'role="editor"' below for the editors if appropriate --> | ||||
<!-- Another author who claims to be an editor --> | ||||
<author fullname="Rafa Marin-Lopez" initials="R." surname="Marin-Lopez"> | <author fullname="Rafa Marin-Lopez" initials="R." surname="Marin-Lopez"> | |||
<organization>University of Murcia</organization> | <organization>University of Murcia</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Campus de Espinardo S/N, Faculty of Computer Science | <extaddr>Faculty of Computer Science</extaddr> | |||
</street> | <street>Campus de Espinardo S/N</street> | |||
<!-- Reorder these if your country does things differently - | <region>Murcia</region> | |||
-> | <code>30100</code> | |||
<city>Murcia</city> | <country>Spain</country> | |||
<region/> | </postal> | |||
<code>30100</code> | <phone>+34 868 88 85 01</phone> | |||
<country>Spain</country> | <email>rafa@um.es</email> | |||
</postal> | ||||
<phone>+34 868 88 85 01</phone> | ||||
<email>rafa@um.es</email> | ||||
<!-- uri and facsimile elements may also be added --> | ||||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Gabriel Lopez-Millan" initials="G." surname="Lopez-Mil | <author fullname="Gabriel Lopez-Millan" initials="G." surname="Lopez-Millan" | |||
lan"> | > | |||
<organization>University of Murcia</organization> | <organization>University of Murcia</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Campus de Espinardo S/N, Faculty of Computer Science | <extaddr>Faculty of Computer Science</extaddr> | |||
</street> | <street>Campus de Espinardo S/N</street> | |||
<!-- Reorder these if your country does things differently - | <region>Murcia</region> | |||
-> | <code>30100</code> | |||
<city>Murcia</city> | <country>Spain</country> | |||
<region/> | </postal> | |||
<code>30100</code> | <phone>+34 868 88 85 04</phone> | |||
<country>Spain</country> | <email>gabilm@um.es</email> | |||
</postal> | ||||
<phone>+34 868 88 85 04</phone> | ||||
<email>gabilm@um.es</email> | ||||
<!-- uri and facsimile elements may also be added --> | ||||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Fernando Pereniguez-Garcia" initials="F." surname="Per | <author fullname="Fernando Pereniguez-Garcia" initials="F." surname="Perenig | |||
eniguez-Garcia"> | uez-Garcia"> | |||
<organization>University Defense Center</organization> | <organization>University Defense Center</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Spanish Air Force Academy, MDE-UPCT</street> | <extaddr>Spanish Air Force Academy</extaddr> | |||
<!-- Reorder these if your country does things differently - | <street>MDE-UPCT</street> | |||
-> | <city>San Javier</city> | |||
<city>San Javier (Murcia)</city> | <region>Murcia</region> | |||
<region/> | <code>30720</code> | |||
<code>30720</code> | <country>Spain</country> | |||
<country>Spain</country> | </postal> | |||
</postal> | <phone>+34 968 18 99 46</phone> | |||
<phone>+34 968 18 99 46</phone> | <email>fernando.pereniguez@cud.upct.es</email> | |||
<email>fernando.pereniguez@cud.upct.es</email> | ||||
<!-- uri and facsimile elements may also be added --> | ||||
</address> | </address> | |||
</author> | </author> | |||
<date month="March" year="2021"/> | <date month="June" year="2021"/> | |||
<!-- If the month and year are both specified and are the current ones, | ||||
xml2rfc will fill | ||||
in the current day for you. If only the current year is specified, xml2 | ||||
rfc will fill | ||||
in the current day and month for you. If the year is not the current one, i | ||||
t is | ||||
necessary to specify at least a month (xml2rfc assumes day="1" if not speci | ||||
fied for the | ||||
purpose of calculating the expiry date). With drafts it is normally suffic | ||||
ient to | ||||
specify just the year. --> | ||||
<!-- Meta-data Declarations --> | ||||
<area>General</area> | <area>General</area> | |||
<workgroup>I2NSF</workgroup> | <workgroup>I2NSF</workgroup> | |||
<!-- WG name at the upperleft corner of the doc, | <keyword>NSF</keyword> | |||
IETF is fine for individual submissions. | <keyword>SDN</keyword> | |||
If this element is not present, the default is "Network Working Group", | <keyword>IPsec</keyword> | |||
which is used by the RFC Editor as a nod to the history of the IETF. -- | ||||
> | ||||
<keyword>NSF, SDN, IPsec</keyword> | ||||
<!-- Keywords will be incorporated into HTML output | ||||
files in a meta tag but they have no effect on text or nroff | ||||
output. If you submit your draft to the RFC Editor, the | ||||
keywords will be used for the search engine. --> | ||||
<abstract> | <abstract> | |||
<t>This document describes how to provide IPsec-based | <t>This document describes how to provide IPsec-based | |||
flow protection (integrity and confidentiality) by means | flow protection (integrity and confidentiality) by means | |||
of an Interface to Network Security Function (I2NSF) | of an Interface to Network Security Function (I2NSF) | |||
controller. It considers two main well-known scenarios | Controller. It considers two main well-known scenarios | |||
in IPsec: (i) gateway-to-gateway and (ii) host-to-host. | in IPsec: gateway-to-gateway and host-to-host. | |||
The service described in this document allows the | The service described in this document allows the | |||
configuration and monitoring of IPsec Security | configuration and monitoring of IPsec Security | |||
Associations (IPsec SAs) from a I2NSF Controller to one | Associations (IPsec SAs) from an I2NSF Controller to one | |||
or several flow-based Network Security Functions (NSFs) | or several flow-based Network Security Functions (NSFs) | |||
that rely on IPsec to protect data traffic. | that rely on IPsec to protect data traffic. | |||
</t> | </t> | |||
<t> The document focuses on the I2NSF NSF-facing | <t> This document focuses on the I2NSF NSF-Facing | |||
Interface by providing YANG data models for configuring | Interface by providing YANG data models for configuring | |||
the IPsec databases, namely Security Policy Database | the IPsec databases, namely Security Policy Database | |||
(SPD), Security Association Database (SAD), Peer | (SPD), Security Association Database (SAD), Peer | |||
Authorization Database (PAD), and IKEv2. This allows | Authorization Database (PAD), and Internet Key Exchange | |||
IPsec SA establishment | Version 2 (IKEv2). This allows IPsec SA establishment | |||
with minimal intervention by the network administrator. It defin | with minimal intervention by the network administrator. | |||
es three YANG modules but it does not define any new protocol. | This document defines three YANG modules, but it does not define any | |||
</t> | new protocol. | |||
</abstract> | </t> | |||
</front> | </abstract> | |||
<middle> | </front> | |||
<section anchor="intro" title="Introduction"> | <middle> | |||
<t> | <section anchor="intro" numbered="true" toc="default"> | |||
<name>Introduction</name> | ||||
<t> | ||||
Software-Defined Networking (SDN) is an architecture | Software-Defined Networking (SDN) is an architecture | |||
that enables administrators to directly program, | that enables administrators to directly program, | |||
orchestrate, control and manage network resources | orchestrate, control, and manage network resources | |||
through software. | through software. | |||
The SDN paradigm relocates the control of network | The SDN paradigm relocates the control of network | |||
resources to a centralized entity, namely the SDN | resources to a centralized entity, namely the SDN | |||
Controller. | Controller. | |||
SDN controllers configure and manage distributed | SDN Controllers configure and manage distributed | |||
network | network | |||
resources and provide an abstracted view of the | resources and provide an abstracted view of the | |||
network | network | |||
resources to SDN applications. | resources to SDN applications. | |||
SDN applications can customize and automate the | SDN applications can customize and automate the | |||
operations | operations | |||
(including management) of the abstracted network | (including management) of the abstracted network | |||
resources in a programmable manner via this interface <xref targ | resources in a programmable manner via this interface <xref targ | |||
et="RFC7149"/> | et="RFC7149" format="default"/> | |||
<xref target="ITU-T.Y.3300"/> | <xref target="ITU-T.Y.3300" format="default"/> | |||
<xref target="ONF-SDN-Architecture"/> | <xref target="ONF-SDN-Architecture" format="default"/> | |||
<xref target="ONF-OpenFlow"/>. | <xref target="ONF-OpenFlow" format="default"/>. | |||
</t> | </t> | |||
<t> | <t> | |||
Recently, several network scenarios now demand a centralized | Recently, several network scenarios now demand a centralized | |||
way of managing different security aspects, for example, | way of managing different security aspects, for example, | |||
Software-Defined WANs (SD-WANs). SD-WANs are an SDN extension | Software-Defined WANs (SD-WANs). SD-WANs are SDN extensions | |||
providing a software abstraction to create secure network | providing software abstractions to create secure network | |||
overlays over traditional WAN and branch networks. SD-WANs | overlays over traditional WAN and branch networks. SD-WANs | |||
utilize IPsec <xref target="RFC4301"/> as an underlying | utilize IPsec <xref target="RFC4301" format="default"/> as an un derlying | |||
security protocol. The goal of SD-WANs is to provide flexible | security protocol. The goal of SD-WANs is to provide flexible | |||
and automated deployment from a centralized point to enable | and automated deployment from a centralized point to enable | |||
on-demand network security services such as IPsec Security | on-demand network security services, such as IPsec Security | |||
Association (IPsec SA) management. | Association (IPsec SA) management. | |||
Additionally, Section 4.3.3 in <xref target="RFC8192"/> | Additionally, Section <xref target="RFC8192" sectionFormat="bare | |||
describes another example use case for Cloud Data Center | " | |||
Scenario titled "Client-Specific Security Policy in Cloud | section="4.3.3">"Client-Specific Security Policy in Cloud | |||
VPNs". The use case in RFC 8192 states that "dynamic key | VPNs"</xref> of <xref target="RFC8192"/> | |||
describes another example use case for a cloud data center | ||||
scenario. The use case in <xref target="RFC8192" format="default | ||||
"/> states that "dynamic key | ||||
management is critical for securing the VPN and the | management is critical for securing the VPN and the | |||
distribution of policies". These VPNs can be established using | distribution of policies". These VPNs can be established using | |||
IPsec. The management of IPsec SAs in data centers using a | IPsec. The management of IPsec SAs in data centers using a | |||
centralized entity is a scenario where the current | centralized entity is a scenario where the current | |||
specification may be applicable. | specification may be applicable. | |||
</t> | </t> | |||
<t> | ||||
<t> | ||||
Therefore, with the growth of SDN-based scenarios where | Therefore, with the growth of SDN-based scenarios where | |||
network resources are deployed in an autonomous manner, | network resources are deployed in an autonomous manner, | |||
a mechanism to manage IPsec SAs from a centralized entity | a mechanism to manage IPsec SAs from a centralized entity | |||
becomes more relevant in the industry. | becomes more relevant in the industry. | |||
</t> | </t> | |||
<t> In response to this need, the Interface to Network Security | ||||
<t> In response to this need, the Interface to Network Security | ||||
Functions (I2NSF) charter states that the goal of this | Functions (I2NSF) charter states that the goal of this | |||
working group is "to define set of software interfaces and | working group is "to define a set of software interfaces and | |||
YANG data models for controlling and monitoring aspects of | data models for controlling and monitoring aspects of | |||
physical and virtual Network Security Functions". As defined | physical and virtual NSFs". As defined | |||
in <xref target="RFC8192"/> an Network Security Function (NSF) i | in <xref target="RFC8192" format="default"/>, a Network Security | |||
s "a function | Function (NSF) is "a function | |||
that is used to ensure integrity, confidentiality, or | that is used to ensure integrity, confidentiality, or | |||
availability of network communication; to detect | availability of network communication; to detect | |||
unwanted network activity; or to block, or at least | unwanted network activity; or to block, or at least | |||
mitigate, the effects of unwanted activity". This document | mitigate, the effects of unwanted activity". This document | |||
pays special attention to flow-based NSFs that ensure | pays special attention to flow-based NSFs that ensure | |||
integrity and confidentiality by means of IPsec.</t> | integrity and confidentiality by means of IPsec.</t> | |||
<t> In fact, <xref target="RFC8192" sectionFormat="of" section="3 | ||||
<t> In fact, as Section 3.1.9 in <xref target="RFC8192"/> states | .1.9"/> states that | |||
"there is a need for a controller to create, manage, | "there is a need for a controller to create, manage, | |||
and distribute various keys to distributed NSFs.", however | and distribute various keys to distributed NSFs"; however, | |||
"there is a lack of a standard interface to provision | "there is a lack of a standard interface to provision | |||
and manage security associations". Inspired by the SDN | and manage security associations". Inspired by the SDN | |||
paradigm, the I2NSF framework <xref target="RFC8329"/> | paradigm, the I2NSF framework <xref target="RFC8329" format="def ault"/> | |||
defines a centralized entity, the I2NSF Controller, | defines a centralized entity, the I2NSF Controller, | |||
which manages one or multiple NSFs through a | which manages one or multiple NSFs through an | |||
I2NSF NSF-Facing Interface. In this | I2NSF NSF-Facing Interface. In this | |||
document an architecture is defined for allowing the I2NSF Contr oller to | document, an architecture is defined for allowing the I2NSF Cont roller to | |||
carry out the key management procedures. More specifically, | carry out the key management procedures. More specifically, | |||
three YANG data models are defined for the I2NSF NSF-Facing Inte | three YANG data models are defined for the I2NSF NSF-Facing Inte | |||
rface that | rface, which | |||
allow the I2NSF Controller to configure | allows the I2NSF Controller to configure | |||
and monitor IPsec-enabled flow-based NSFs.</t> | and monitor IPsec-enabled, flow-based NSFs.</t> | |||
<t>The IPsec architecture <xref target="RFC4301" format="default"/> define | ||||
<t>The IPsec architecture <xref target="RFC4301"/> defines | s | |||
a clear separation between the processing to provide | a clear separation between the processing to provide | |||
security services to IP packets and the key management | security services to IP packets and the key management | |||
procedures to establish the IPsec SAs, | procedures to establish the IPsec SAs, | |||
which allows centralizing the key management procedures | which allows centralizing the key management procedures | |||
in the I2NSF Controller. | in the I2NSF Controller. | |||
This document considers two typical scenarios to | This document considers two typical scenarios to | |||
autonomously manage IPsec SAs: gateway-to-gateway and | autonomously manage IPsec SAs: gateway-to-gateway and | |||
host-to-host <xref target="RFC6071"/>. In these cases, | host-to-host <xref target="RFC6071" format="default"/>. In these | |||
hosts, gateways or both may act as NSFs. Due to its | cases, | |||
hosts, gateways, or both may act as NSFs. Due to its | ||||
complexity, consideration for the host-to-gateway | complexity, consideration for the host-to-gateway | |||
scenario is out of scope. The source of this | scenario is out of scope. The source of this | |||
complexity comes from the fact that, in this | complexity comes from the fact that, in this | |||
scenario, the host may not be under the control of | scenario, the host may not be under the control of | |||
the I2NSF controller and, therefore, it is not | the I2NSF Controller and, therefore, it is not | |||
configurable. Nevertheless, the I2NSF interfaces | configurable. Nevertheless, the I2NSF interfaces | |||
defined in this document can be considered as a | defined in this document can be considered as a | |||
starting | starting | |||
point to analyze and provide a solution for the | point to analyze and provide a solution for the | |||
host-to-gateway scenario.</t> | host-to-gateway scenario.</t> | |||
<t> For the definition of the YANG data models for the I2NSF | ||||
<t> For the definition of the YANG data models for I2NSF | ||||
NSF-Facing Interface, this document considers | NSF-Facing Interface, this document considers | |||
two general cases, namely: | two general cases, namely:</t> | |||
<list style="format %d)"> | <ol spacing="normal" type="1"> | |||
<t> IKE case. The NSF | <li> IKE case. The NSF | |||
implements the Internet Key Exchange version 2 (IKEv2) | implements the Internet Key Exchange Version 2 (IKEv2) | |||
protocol and the IPsec databases: the Security | protocol and the IPsec databases: the Security | |||
Policy Database (SPD), the Security Association | Policy Database (SPD), the Security Association | |||
Database (SAD) and the Peer Authorization Database | Database (SAD), and the Peer Authorization Database | |||
(PAD). The I2NSF Controller is in charge of | (PAD). The I2NSF Controller is in charge of | |||
provisioning the NSF with the required information | provisioning the NSF with the required information | |||
in the SPD and PAD (e.g., IKE credentials), and for the | in the SPD and PAD (e.g., IKE credentials) and the | |||
IKE protocol itself (e.g., parameters for the IKE_SA_INIT | IKE protocol itself (e.g., parameters for the IKE_SA_INIT | |||
negotiation). | negotiation).</li> | |||
</t> | <li> IKE-less case. The NSF only implements the IPsec | |||
<t> IKE-less case. The NSF only implements the IPsec | ||||
databases (no IKE implementation). | databases (no IKE implementation). | |||
The I2NSF Controller will provide the required | The I2NSF Controller will provide the required | |||
parameters to create valid entries in the SPD and | parameters to create valid entries in the SPD and | |||
the SAD of the NSF. Therefore, the NSF will only have | the SAD of the NSF. Therefore, the NSF will only have | |||
support for IPsec while key management | support for IPsec whereas key management | |||
functionality is moved to the I2NSF Controller. | functionality is moved to the I2NSF Controller.</li> | |||
</t> | </ol> | |||
</list> | <t> In both cases, a YANG data model for the I2NSF NSF-Facing | |||
</t> | ||||
<t> In both cases, a YANG data model for the I2NSF NSF-Facing | ||||
Interface is required to carry out this provisioning | Interface is required to carry out this provisioning | |||
in a secure manner between the I2NSF Controller and the NSF. | in a secure manner between the I2NSF Controller and the NSF. | |||
<!--In particular, the IKE case requires the provision | Using YANG data modeling language version 1.1 <xref target="RFC7 | |||
of SPD and PAD entries, the IKE credential and | 950" format="default"/> and | |||
information related with the IKE negotiation | based on YANG data models defined in <xref target="netconf-vpn" | |||
(e.g. IKE_SA_INIT). --> | format="default"/> and | |||
Using YANG data modelling language version 1.1 <xref target="RFC | <xref target="I-D.tran-ipsecme-yang" format="default"/> and the | |||
7950"/> and | data structures defined | |||
based on YANG data models defined in <xref target="netconf-vpn"/ | in <xref target="RFC4301" format="default"/> and | |||
>, | <xref target="RFC7296" format="default"/>, this document defines | |||
<xref target="I-D.tran-ipsecme-yang"/>, an the data structures d | the | |||
efined in RFC 4301 <xref target="RFC4301"/> and RFC 7296 | ||||
<xref target="RFC7296"/>, this document defines the | ||||
required interfaces with a YANG data model for configuration | required interfaces with a YANG data model for configuration | |||
and state data for IKE, PAD, SPD and SAD | and state data for IKE, PAD, SPD, and SAD | |||
(see <xref target="ike-common-model"/>, | (see Sections <xref target="ike-common-model" format="counter"/> | |||
<xref target="ike-case-model"/> and | , | |||
<xref target="ike-less-model"/>). | <xref target="ike-case-model" format="counter"/>, and | |||
<xref target="ike-less-model" format="counter"/>). | ||||
The proposed YANG data model conforms to the Network Management | The proposed YANG data model conforms to the Network Management | |||
Datastore Architecture (NMDA) defined in <xref target="RFC8342"/ | Datastore Architecture (NMDA) defined in <xref target="RFC8342" | |||
>. | format="default"/>. | |||
Examples of the usage of these data models can be found in <xref | Examples of the usage of these data models can be found in Appen | |||
target="appendix-d"/>, | dices <xref target="appendix-d" format="counter"/>, | |||
<xref target="appendix-e"/> | <xref target="appendix-e" format="counter"/>, | |||
and <xref target="appendix-f"/>. | and <xref target="appendix-f" format="counter"/>. | |||
</t> | </t> | |||
<!-- <t> | ||||
This document considers two typical scenarios to manage | ||||
autonomously IPsec SAs: gateway-to-gateway and | ||||
host-to-host <xref target="RFC6071" />. In these cases, | ||||
hosts, gateways or both may act as NSFs. Consideration | ||||
for the host-to-gateway scenario is out of scope of | ||||
this document. | ||||
</t> --> | ||||
<!--<t> | ||||
Finally, this work pays attention to the challenge "Lack | ||||
of Mechanism for Dynamic Key Distribution to NSFs" | ||||
defined in <xref target="RFC8192" /> in the particular | ||||
case of the establishment and management of IPsec SAs. | ||||
In fact,this I-D could be considered as a proper use | ||||
case for this particular challenge in | ||||
<xref target="RFC8192" />. | ||||
</t>--> | ||||
<t> In summary, the objectives of this document are:</t> | <t> In summary, the objectives of this document are:</t> | |||
<t> | <ul spacing="normal"> | |||
<list style="symbols"> | <li> To describe the architecture for I2NSF-based | |||
<t> To describe the architecture for I2NSF-based | IPsec management, which allows for the | |||
IPsec management, which allows the | ||||
establishment and management of IPsec | establishment and management of IPsec | |||
security associations from the I2NSF | Security Associations from the I2NSF | |||
Controller in order to protect specific data | Controller in order to protect specific data | |||
flows between two flow-based NSFs | flows between two flow-based NSFs | |||
implementing IPsec.</t> | implementing IPsec.</li> | |||
<t>To map this architecture to the I2NSF | <li>To map this architecture to the I2NSF | |||
Framework.</t> | framework.</li> | |||
<t>To define the interfaces required to manage | <li>To define the interfaces required to manage | |||
and monitor the IPsec SAs in the NSF from a | and monitor the IPsec SAs in the NSF from an | |||
I2NSF Controller. YANG data models are | I2NSF Controller. YANG data models are | |||
defined for configuration and state data for | defined for configuration and state data for | |||
IPsec and IKEv2 management through the I2NSF | IPsec and IKEv2 management through the I2NSF | |||
NSF-Facing Interface. The YANG models can be | NSF-Facing Interface. The YANG data models can be | |||
used via existing protocols such as NETCONF | used via existing protocols, such as the Network Configuration Protoco | |||
<xref target="RFC6241"/> or RESTCONF | l (NETCONF) | |||
<xref target="RFC8040"/>. Thus, this | <xref target="RFC6241" format="default"/> or RESTCONF | |||
<xref target="RFC8040" format="default"/>. Thus, this | ||||
document defines three YANG modules (see | document defines three YANG modules (see | |||
<xref target="models"/>) but does not define any new | <xref target="models" format="default"/>) but does not define any new | |||
protocol.</t> | protocol.</li> | |||
</list> | </ul> | |||
</t> | </section> | |||
</section> | <section anchor="notation" numbered="true" toc="default"> | |||
<section title="Requirements Language"> | <name>Terminology</name> | |||
<t> | <t> | |||
The key words "MUST", "MUST NOT", "REQUIRED", | ||||
"SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", | ||||
"RECOMMENDED", "NOT RECOMMENDED", "MAY", and | ||||
"OPTIONAL" in this document are to be interpreted | ||||
as described in BCP 14 | ||||
<xref target="RFC2119" format="default"/> | ||||
<xref target="RFC8174" format="default"/> | ||||
when, and only when, they appear in all capitals, | ||||
as shown here. | ||||
</t> | ||||
</section> | ||||
<section anchor="notation" title="Terminology"> | ||||
<t> | ||||
This document uses the terminology described in | This document uses the terminology described in | |||
<xref target="RFC8329"/>, <xref target="RFC8192"/>, | <xref target="ITU-T.Y.3300" format="default"/>, <xref target="RFC | |||
<xref target="RFC4301"/>,<xref target="RFC7296"/>, | 8192" format="default"/>, | |||
<xref target="RFC6241"/>, | <xref target="RFC4301" format="default"/>, <xref target="RFC6437" | |||
<xref target="ITU-T.Y.3300"/>. | format="default"/>, | |||
<xref target="RFC7296" format="default"/>, <xref target="RFC6241" | ||||
<!--<xref target="ONF-SDN-Architecture"/>, | format="default"/>, and | |||
<xref target="ONF-OpenFlow"/>, | <xref target="RFC8329" format="default"/>. </t> | |||
<t>The following term is defined in <xref target="ITU-T.Y.3300" format="de | ||||
<xref target="ITU-T.X.1252"/>, | fault"/>:</t> | |||
<ul spacing="normal"> | ||||
and <xref target="ITU-T.X.800"/>. | <li>Software-Defined Networking (SDN)</li> | |||
</ul> | ||||
<xref target="RFC7149"/>--> | <t>The following terms are defined in <xref target="RFC8192" format="defau | |||
lt"/>:</t> | ||||
The following term is defined in <xref target="ITU-T.Y.3300"/>: | <ul spacing="normal"> | |||
<li>Network Security Function (NSF)</li> | ||||
<list style="symbols"> | <li>flow-based NSF</li> | |||
<t> | </ul> | |||
Software-Defined Networking. | <t>The following terms are defined in <xref target="RFC4301" format="defau | |||
</t> | lt"/>:</t> | |||
</list> | <ul spacing="normal"> | |||
<li>Peer Authorization Database (PAD)</li> | ||||
The following terms are defined in <xref target="RFC8192"/>: | <li>Security Association Database (SAD)</li> | |||
<li>Security Policy Database (SPD)</li> | ||||
<list style="symbols"> | </ul> | |||
<t>The following two terms are related or | ||||
<t>NSF.</t> | have identical definition/usage in <xref target="RFC6437" format="defau | |||
<t>Flow-based NSF.</t> | lt"/>:</t> | |||
</list> | <ul spacing="normal"> | |||
<li>flow</li> | ||||
The following terms are defined in <xref target="RFC4301"/>: | <li>traffic flow</li> | |||
</ul> | ||||
<list style="symbols"> | <t>The following term is defined in <xref target="RFC7296" format="default | |||
<t> | "/>:</t> | |||
Peer Authorization Database (PAD). | <ul spacing="normal"> | |||
</t> | <li>Internet Key Exchange Version 2 (IKEv2)</li> | |||
<t> | </ul> | |||
Security Associations Database (SAD). | <t>The following terms are defined in <xref target="RFC6241" format="defau | |||
</t> | lt"/>: </t> | |||
<t> | <ul spacing="normal"> | |||
Security Policy Database (SPD). | <li>configuration data</li> | |||
</t> | <li>configuration datastore</li> | |||
<li>state data</li> | ||||
</list> | <li>startup configuration datastore</li> | |||
<li>running configuration datastore</li> | ||||
The following two terms that are related or | </ul> | |||
have identical definition/usage in <xref target="RFC6437"/>: | <section numbered="true" toc="default"> | |||
<name>Requirements Language</name> | ||||
<list style="symbols"> | <t> | |||
<t> | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | |||
Flow or traffic flow. | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
</t> | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
</list> | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | ||||
The following term is defined in <xref target="RFC7296"/>: | be interpreted as | |||
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | ||||
<list style="symbols"> | when, and only when, they appear in all capitals, as shown here. | |||
<t> | </t> | |||
Internet Key Exchange version 2 (IKEv2). | </section> | |||
</t> | </section> | |||
</list> | <section anchor="cases" numbered="true" toc="default"> | |||
<name>SDN-Based IPsec Management Description</name> | ||||
<!--<t> | <t> As mentioned in <xref target="intro" format="default"/>, two cases are | |||
Flow-based Protection Policy. The set of rules | ||||
defining the conditions under which a data flow | ||||
MUST be protected with IPsec, and the rules | ||||
that MUST be applied to the specific flow. | ||||
</t>--> | ||||
The following terms are defined in <xref target="RFC6241"/>: | ||||
<list style="symbols"> | ||||
<t> | ||||
Configuration data. | ||||
</t><t> | ||||
Configuration datastore. | ||||
</t><t> | ||||
State data. | ||||
</t><t> | ||||
Startup configuration datastore. | ||||
</t><t> | ||||
Running configuration datastore. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<!-- Terminology --> | ||||
<section anchor="cases" title="SDN-based IPsec management description"> | ||||
<t> As mentioned in <xref target="intro"/>, two cases are | ||||
considered, depending on whether the NSF implements IKEv2 | considered, depending on whether the NSF implements IKEv2 | |||
or not: the IKE case and the IKE-less case. </t> | or not: the IKE case and the IKE-less case. </t> | |||
<section anchor="case1" numbered="true" toc="default"> | ||||
<section anchor="case1" title="IKE case: IKEv2/IPsec in the NSF"> | <name>IKE Case: IKEv2/IPsec in the NSF</name> | |||
<t> In this case, the NSF implements IPsec with | <t> In this case, the NSF implements IPsec with | |||
IKEv2 support. The I2NSF Controller is in | IKEv2 support. The I2NSF Controller is in | |||
charge of managing and applying IPsec connection | charge of managing and applying IPsec connection | |||
information (determining which nodes need to start an | information (determining which nodes need to start an | |||
IKEv2/IPsec session, identifying the type of traffic to be | IKEv2/IPsec session, identifying the type of traffic to be | |||
protected, deriving and delivering IKEv2 credentials such | protected, and deriving and delivering IKEv2 credentials, su | |||
as a pre-shared key, certificates, etc.), and applying | ch | |||
as a pre-shared key (PSK), certificates, etc.) and applying | ||||
other IKEv2 configuration parameters | other IKEv2 configuration parameters | |||
(e.g., cryptographic algorithms for establishing an IKEv2 | (e.g., cryptographic algorithms for establishing an IKEv2 | |||
SA) to the NSF necessary for the IKEv2 negotiation. | SA) to the NSF necessary for the IKEv2 negotiation. | |||
</t> | </t> | |||
<t> With these entries, the IKEv2 implementation can operate | <t> With these entries, the IKEv2 implementation can operate | |||
to establish the IPsec SAs. The I2NSF User | to establish the IPsec SAs. The I2NSF User | |||
establishes the IPsec requirements and information about | establishes the IPsec requirements and information about | |||
the end points (through the I2NSF | the endpoints (through the I2NSF | |||
Consumer-Facing Interface, | Consumer-Facing Interface | |||
<xref target="RFC8329"/>), and the I2NSF Controller | <xref target="RFC8329" format="default"/>), and the I2NSF Co | |||
translates these requirements into IKEv2, SPD and PAD | ntroller | |||
translates these requirements into IKEv2, SPD, and PAD | ||||
entries that will be installed into the NSF (through the | entries that will be installed into the NSF (through the | |||
I2NSF NSF-Facing Interface). With that information, | I2NSF NSF-Facing Interface). With that information, | |||
the NSF can just run IKEv2 to establish the required | the NSF can just run IKEv2 to establish the required | |||
IPsec SA (when the traffic flow needs protection). | IPsec SA (when the traffic flow needs protection). | |||
<xref target="fig:nsf-architecture1"/> | <xref target="fig_nsf-architecture1" format="default"/> | |||
shows the different layers and corresponding functionality. | shows the different layers and corresponding functionality. | |||
</t> | </t> | |||
<!-- maximum wide of the figure | <figure anchor="fig_nsf-architecture1"> | |||
--> | <name>IKE Case: IKE/IPsec in the NSF</name> | |||
<figure align="center" anchor="fig:nsf-architecture1" title="IKE | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
case: IKE/IPsec in the NSF"> | ||||
<artwork align="center"> | ||||
<![CDATA[ | ||||
+-------------------------------------------+ | +-------------------------------------------+ | |||
| IPsec Management System | I2NSF User | | IPsec Management System | I2NSF User | |||
+-------------------------------------------+ | +-------------------------------------------+ | |||
| | | | |||
| I2NSF Consumer-Facing | | I2NSF Consumer-Facing | |||
| Interface | | Interface | |||
+-------------------------------------------+ | +-------------------------------------------+ | |||
| IKEv2 Configuration, PAD and SPD Entries | I2NSF | | IKEv2 Configuration, PAD and SPD Entries | I2NSF | |||
| Distribution | Controller | | Distribution | Controller | |||
+-------------------------------------------+ | +-------------------------------------------+ | |||
| | | | |||
| I2NSF NSF-Facing | | I2NSF NSF-Facing | |||
| Interface | | Interface | |||
+-------------------------------------------+ | +-------------------------------------------+ | |||
| IKEv2 | IPsec(PAD, SPD) | Network | | IKEv2 | IPsec(PAD, SPD) | Network | |||
|-------------------------------------------| Security | |-------------------------------------------| Security | |||
| IPsec Data Protection and Forwarding | Function | | IPsec Data Protection and Forwarding | Function | |||
+-------------------------------------------+ | +-------------------------------------------+ | |||
]]> | ]]></artwork> | |||
</artwork> | </figure> | |||
</figure> | <t> | |||
<t> | ||||
I2NSF-based IPsec flow protection services provide | I2NSF-based IPsec flow protection services provide | |||
dynamic and flexible management of IPsec SAs in | dynamic and flexible management of IPsec SAs in | |||
flow-based NSFs. In order to support this capability | flow-based NSFs. In order to support this capability | |||
in the IKE case, a YANG data model for IKEv2, SPD and PAD | in the IKE case, a YANG data model for IKEv2, SPD, and PAD | |||
configuration data, and for IKEv2 state data | configuration data and for IKEv2 state data | |||
needs to be defined for | needs to be defined for | |||
the I2NSF NSF-Facing Interface (see <xref target="models"/>) | the I2NSF NSF-Facing Interface (see <xref target="models" fo | |||
.</t> | rmat="default"/>).</t> | |||
</section> | </section> | |||
<!-- "IKE case: IKE/IPsec in the NSF"" --> | <section anchor="case2" numbered="true" toc="default"> | |||
<section anchor="case2" title="IKE-less case: IPsec (no IKEv2) in th | <name>IKE-less Case: IPsec (No IKEv2) in the NSF</name> | |||
e NSF."> | <t> | |||
<t> | ||||
In this case, the NSF does not deploy IKEv2 and, | In this case, the NSF does not deploy IKEv2 and, | |||
therefore, the I2NSF Controller has to perform the | therefore, the I2NSF Controller has to perform the | |||
IKEv2 security functions and management of IPsec SAs by | IKEv2 security functions and management of IPsec SAs by | |||
populating and managing the SPD and the SAD. | populating and managing the SPD and the SAD. | |||
</t> | </t> | |||
<t> | <t> | |||
As shown in <xref target="fig:nsf-architecture2"/>, | As shown in <xref target="fig_nsf-architecture2" format="def | |||
ault"/>, | ||||
when an I2NSF User enforces flow-based | when an I2NSF User enforces flow-based | |||
protection policies through the Consumer-Facing | protection policies through the Consumer-Facing | |||
Interface, the I2NSF Controller translates these | Interface, the I2NSF Controller translates these | |||
requirements into SPD and SAD entries, which are | requirements into SPD and SAD entries, which are | |||
installed in the NSF. PAD entries are not required since | installed in the NSF. PAD entries are not required, since | |||
there is no IKEv2 in the NSF. | there is no IKEv2 in the NSF. | |||
</t> | </t> | |||
<figure align="center" anchor="fig:nsf-architecture2" title="IKE | <figure anchor="fig_nsf-architecture2"> | |||
-less case: IPsec (no IKEv2) in the NSF"> | <name>IKE-less Case: IPsec (No IKEv2) in the NSF</name> | |||
<artwork align="center"> | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
<![CDATA[ | ||||
+-----------------------------------------+ | +-----------------------------------------+ | |||
| IPsec Management System | I2NSF User | | IPsec Management System | I2NSF User | |||
+-----------------------------------------+ | +-----------------------------------------+ | |||
| | | | |||
| I2NSF Consumer-Facing Interface | | I2NSF Consumer-Facing Interface | |||
| | | | |||
+-----------------------------------------+ | +-----------------------------------------+ | |||
| SPD and SAD Entries | I2NSF | | SPD and SAD Entries | I2NSF | |||
| Distribution | Controller | | Distribution | Controller | |||
+-----------------------------------------+ | +-----------------------------------------+ | |||
| | | | |||
| I2NSF NSF-Facing Interface | | I2NSF NSF-Facing Interface | |||
| | | | |||
+-----------------------------------------+ | +-----------------------------------------+ | |||
| IPsec (SPD, SAD) | Network | | IPsec (SPD, SAD) | Network | |||
|-----------------------------------------| Security | |-----------------------------------------| Security | |||
| IPsec Data Protection and Forwarding | Function | | IPsec Data Protection and Forwarding | Function | |||
+-----------------------------------------+ | +-----------------------------------------+ | |||
]]></artwork> | ||||
]]> | </figure> | |||
</artwork> | <t> | |||
</figure> | ||||
<t> | ||||
In order to support the IKE-less case, a YANG data model | In order to support the IKE-less case, a YANG data model | |||
for SPD and SAD configuration data and SAD state data MUST | for SPD and SAD configuration data and SAD state data <bcp14 | |||
be defined for the NSF-Facing Interface (see <xref target="m | >MUST</bcp14> | |||
odels"/>). | be defined for the NSF-Facing Interface (see <xref target="m | |||
</t> | odels" format="default"/>). | |||
<t> Specifically, the IKE-less case assumes that the I2NSF | </t> | |||
<t> Specifically, the IKE-less case assumes that the I2NSF | ||||
Controller has to perform some security functions that | Controller has to perform some security functions that | |||
IKEv2 typically does, namely (non-exhaustive):</t> | IKEv2 typically does, namely (non-exhaustive list):</t> | |||
<t> | <ul spacing="normal"> | |||
<list style="symbols"> | <li>Initialization Vector (IV) generation</li> | |||
<t>IV generation.</t> | <li>prevention of counter resets for the same key</li> | |||
<t>Prevent counter resets for the same key.</t> | <li>generation of pseudorandom cryptographic | |||
<t>Generation of pseudo-random cryptographic | keys for the IPsec SAs</li> | |||
keys for the IPsec SAs.</t> | <li>generation of the IPsec SAs when required | |||
<t>Generation of the IPsec SAs when required | based on notifications (i.e., sadb-acquire) from | |||
based on notifications (i.e. sadb-acquire) from | the NSF</li> | |||
the NSF.</t> | <li>rekey of the IPsec SAs based on notifications | |||
<t>Rekey of the IPsec SAs based on notifications | from the NSF (i.e., expire)</li> | |||
from the NSF (i.e. expire).</t> | <li>NAT traversal discovery and management</li> | |||
<t>NAT Traversal discovery and management.</t> | </ul> | |||
</list> | <t>Additionally to these functions, another set of tasks | |||
</t> | ||||
<t>Additionally to these functions, another set of tasks | ||||
must be performed by the I2NSF Controller | must be performed by the I2NSF Controller | |||
(non-exhaustive list):</t> | (non-exhaustive list):</t> | |||
<t> | <ul spacing="normal"> | |||
<list style="symbols"> | <li>IPsec SA's Security Parameter Index (SPI) random generation</li> | |||
<t>IPsec SA's SPI random generation.</t> | <li>cryptographic algorithm selection</li> | |||
<t>Cryptographic algorithm selection.</t> | <li>usage of extended sequence numbers</li> | |||
<t>Usage of extended sequence numbers.</t> | <li>establishment of proper Traffic Selectors</li> | |||
<t>Establishment of proper traffic | </ul> | |||
selectors.</t> | </section> | |||
</list> | </section> | |||
</t> | <section anchor="comparison" numbered="true" toc="default"> | |||
</section> | <name>IKE Case vs. IKE-less Case</name> | |||
</section> | <t>In principle, the IKE case is easier to deploy than the IKE-less | |||
<!-- "IKE-less case: IPsec (no IKE) in the NSF" --> | ||||
<section anchor="comparison" title="IKE case vs IKE-less case"> | ||||
<t>In principle, the IKE case is easier to deploy than the IKE-less | ||||
case because current flow-based NSFs (either hosts or gateways) | case because current flow-based NSFs (either hosts or gateways) | |||
have access to IKEv2 implementations. While gateways typically | have access to IKEv2 implementations. While gateways typically | |||
deploy an IKEv2/IPsec implementation, hosts can easily install it. | deploy an IKEv2/IPsec implementation, hosts can easily install it. | |||
As a downside, the NSF needs more resources to use IKEv2 such as | As a downside, the NSF needs more resources to use IKEv2, such as | |||
memory for the IKEv2 implementation, and computation, since each | memory for the IKEv2 implementation and computation, since each | |||
IPsec security association rekeying MAY involve a Diffie-Hellman | IPsec Security Association rekeying <bcp14>MAY</bcp14> involve a Dif | |||
fie-Hellman (DH) | ||||
exchange. | exchange. | |||
</t> | </t> | |||
<t>Alternatively, the IKE-less case benefits the | <t>Alternatively, the IKE-less case benefits the | |||
deployment in resource-constrained NSFs. Moreover, IKEv2 does not ne ed to be | deployment in resource-constrained NSFs. Moreover, IKEv2 does not ne ed to be | |||
performed in gateway-to-gateway and host-to-host scenarios | performed in gateway-to-gateway and host-to-host scenarios | |||
under the same I2NSF Controller (see | under the same I2NSF Controller (see | |||
<xref target="appendix-g1"/>). On the contrary, | <xref target="appendix-g1" format="default"/>). On the contrary, | |||
the complexity of creating and managing IPsec SAs is shifted | the complexity of creating and managing IPsec SAs is shifted | |||
to the I2NSF Controller since IKEv2 is not in the | to the I2NSF Controller since IKEv2 is not in the | |||
NSF. As a consequence, this may result in a more complex | NSF. As a consequence, this may result in a more complex | |||
implementation in the controller side in comparison with | implementation in the controller side in comparison with the | |||
IKE case. For example, the I2NSF Controller has to | IKE case. For example, the I2NSF Controller has to | |||
deal with the latency existing in the path between the | deal with the latency existing in the path between the | |||
I2NSF Controller and the NSF, in order to solve tasks | I2NSF Controller and the NSF (in order to solve tasks, | |||
such as rekey, or creation and installation of new IPsec | such as rekey) or creation and installation of new IPsec | |||
SAs. However, this is not specific to this | SAs. However, this is not specific to this | |||
contribution but a general aspect in any SDN-based | contribution but a general aspect in any SDN-based | |||
network. In summary, this complexity may create some | network. In summary, this complexity may create some | |||
scalability and performance issues when the number of NSFs | scalability and performance issues when the number of NSFs | |||
is high. | is high. | |||
</t> | </t> | |||
<t>Nevertheless, literature around SDN-based network management | <t>Nevertheless, literature around SDN-based network management | |||
using a centralized controller (like the I2NSF Controller) | using a centralized controller (like the I2NSF Controller) | |||
is aware of scalability and performance issues and solutions | is aware of scalability and performance issues, and solutions | |||
have been already provided and discussed (e.g., hierarchical | have been already provided and discussed (e.g., hierarchical | |||
controllers, having multiple replicated controllers, dedicated | controllers, having multiple replicated controllers, dedicated | |||
high-speed management networks, etc). In the context of | high-speed management networks, etc.). In the context of | |||
I2SNF-based IPsec management, one way to reduce the latency and | I2NSF-based IPsec management, one way to reduce the latency and | |||
alleviate some performance issues can be the installation of the | alleviate some performance issues can be to install the | |||
IPsec policies and IPsec SAs at the same time (proactive mode, | IPsec policies and IPsec SAs at the same time (proactive mode, | |||
as described in <xref target="appendix-g1"/>) | as described in <xref target="appendix-g1" format="default"/>) | |||
instead of waiting for notifications (e.g., a | instead of waiting for notifications (e.g., a | |||
sadb-acquire notification received from a NSF requiring a new IP sec SA) | sadb-acquire notification received from an NSF requiring a new I Psec SA) | |||
to proceed with the IPsec SA installation (reactive mode). | to proceed with the IPsec SA installation (reactive mode). | |||
Another way to reduce the overhead and the potential scalability | Another way to reduce the overhead and the potential scalability | |||
and performance issues in the I2NSF Controller is to apply the | and performance issues in the I2NSF Controller is to apply the | |||
IKE case described in this document, since the IPsec SAs are | IKE case described in this document since the IPsec SAs are | |||
managed between NSFs without the involvement of the I2NSF | managed between NSFs without the involvement of the I2NSF | |||
Controller at all, except by the initial configuration (i.e. | Controller at all, except by the initial configuration (i.e., | |||
IKEv2, PAD and SPD entries) provided by the I2NSF Controller. | IKEv2, PAD, and SPD entries) provided by the I2NSF Controller. | |||
Other solutions, such as Controller-IKE | Other solutions, such as Controller-IKE | |||
<xref target="I-D.carrel-ipsecme-controller-ike"/>, | <xref target="I-D.carrel-ipsecme-controller-ike" format="default "/>, | |||
have proposed that NSFs provide their DH public keys to the | have proposed that NSFs provide their DH public keys to the | |||
I2NSF Controller, so that the I2NSF Controller | I2NSF Controller so that the I2NSF Controller | |||
distributes all public keys to all peers. All peers can | distributes all public keys to all peers. All peers can | |||
calculate a unique pairwise secret for each other peer and | calculate a unique pairwise secret for each other peer, and | |||
there is no inter-NSF messages. A rekey mechanism is | there is no inter-NSF messages. A rekey mechanism is | |||
further described in | further described in | |||
<xref target="I-D.carrel-ipsecme-controller-ike"/>. | <xref target="I-D.carrel-ipsecme-controller-ike" format="default | |||
</t> | "/>. | |||
<t>In terms of security, IKE case provides better | </t> | |||
security properties than IKE-less case, as discussed in | <t>In terms of security, the IKE case provides better | |||
<xref target="security"/>. The main reason is that the | security properties than the IKE-less case, as discussed in | |||
<xref target="security" format="default"/>. The main reason is that | ||||
the | ||||
NSFs generate the session keys and not the | NSFs generate the session keys and not the | |||
I2NSF Controller.</t> | I2NSF Controller.</t> | |||
<section anchor="rekeying" numbered="true" toc="default"> | ||||
<section anchor="rekeying" title="Rekeying process"> | <name>Rekeying Process</name> | |||
<t>Performing a rekey for IPsec SAs is an important | <t>Performing a rekey for IPsec SAs is an important | |||
operation during the IPsec SAs management. With | operation during the IPsec SAs management. With | |||
the YANG data models defined in this | the YANG data models defined in this | |||
document the I2NSF Controller can configure | document the I2NSF Controller can configure | |||
parameters of the rekey process (IKE case) or | parameters of the rekey process (IKE case) or | |||
conduct the rekey process (IKE-less case). | conduct the rekey process (IKE-less case). | |||
Indeed, depending on the case, the rekey process | Indeed, depending on the case, the rekey process | |||
is different.</t> | is different.</t> | |||
<t>For the IKE case, the rekeying process is carried | ||||
<t>For the IKE case, the rekeying process is carried | ||||
out by IKEv2, following the information defined | out by IKEv2, following the information defined | |||
in the SPD and SAD (i.e. based on the IPsec SA | in the SPD and SAD (i.e., based on the IPsec SA | |||
lifetime established by the I2NSF Controller using the YANG | lifetime established by the I2NSF Controller using the YANG | |||
data model defined in this document). | data model defined in this document). | |||
Therefore, IPsec connections will live unless something | Therefore, IPsec connections will live unless something | |||
different is required by the I2NSF User or the I2NSF | different is required by the I2NSF User or the I2NSF | |||
Controller detects something wrong.</t> | Controller detects something wrong.</t> | |||
<t>For the IKE-less case, the | ||||
<t>For the IKE-less case, the | I2NSF Controller <bcp14>MUST</bcp14> take care | |||
I2NSF Controller MUST take care | ||||
of the rekeying process. When the IPsec SA is | of the rekeying process. When the IPsec SA is | |||
going to expire (e.g., IPsec SA soft lifetime), | going to expire (e.g., IPsec SA soft lifetime), | |||
it MUST create a new IPsec SA and it MAY remove the | it <bcp14>MUST</bcp14> create a new IPsec SA and it <bcp14>M | |||
old one (e.g. when the lifetime of the old IPsec SA has not | AY</bcp14> remove the | |||
been defined). | old one (e.g., when the lifetime of the old IPsec SA has not | |||
been defined). | ||||
This rekeying process starts when the | This rekeying process starts when the | |||
I2NSF Controller receives a sadb-expire | I2NSF Controller receives a sadb-expire | |||
notification or, on the I2NSF Controller's initiative, | notification or, on the I2NSF Controller's initiative, | |||
based on lifetime state data obtained from the NSF. | based on lifetime state data obtained from the NSF. | |||
How the I2NSF Controller implements an algorithm for | How the I2NSF Controller implements an algorithm for | |||
the rekey process is out of the scope of this document. | the rekey process is out of the scope of this document. | |||
Nevertheless, an example of how this rekey could be | Nevertheless, an example of how this rekey could be | |||
performed is described in <xref target="appendix-g2"/>.</t> | performed is described in <xref target="appendix-g2" format="default"/ | |||
</section> | >.</t> | |||
</section> | ||||
<section anchor="restart" title="NSF state loss."> | <section anchor="restart" numbered="true" toc="default"> | |||
<t>If one of the NSF restarts, it will lose the | <name>NSF State Loss</name> | |||
<t>If one of the NSF restarts, it will lose the | ||||
IPsec state (affected NSF). By default, the | IPsec state (affected NSF). By default, the | |||
I2NSF Controller can assume that all the | I2NSF Controller can assume that all the | |||
state has been lost and therefore it will have | state has been lost and, therefore, it will have | |||
to send IKEv2, SPD and PAD information to the | to send IKEv2, SPD, and PAD information to the | |||
NSF in the IKE case, and SPD and SAD information | NSF in the IKE case and SPD and SAD information | |||
in the IKE-less case.</t> | in the IKE-less case.</t> | |||
<t> In both cases, the I2NSF Controller is aware of | <t> In both cases, the I2NSF Controller is aware of | |||
the affected NSF (e.g., the NETCONF/TCP connection is | the affected NSF (e.g., the NETCONF/TCP connection is | |||
broken with the affected NSF, the I2NSF Controller is | broken with the affected NSF, the I2NSF Controller is | |||
receiving sadb-bad-spi notification from a particular | receiving a sadb-bad-spi notification from a particular | |||
NSF, etc.). Moreover, the I2NSF Controller keeps | NSF, etc.). Moreover, the I2NSF Controller keeps | |||
a list of NSFs that have IPsec SAs with the | a list of NSFs that have IPsec SAs with the | |||
affected NSF. Therefore, it knows the affected IPsec | affected NSF. Therefore, it knows the affected IPsec | |||
SAs.</t> | SAs.</t> | |||
<t>In the IKE case, the I2NSF Controller may need | <t>In the IKE case, the I2NSF Controller may need | |||
to configure the affected NSF with the new IKEv2, | to configure the affected NSF with the new IKEv2, | |||
SPD and PAD information. Alternatively, IKEv2 | SPD, and PAD information. Alternatively, IKEv2 | |||
configuration MAY be made | configuration <bcp14>MAY</bcp14> be made | |||
permanent between NSF reboots without | permanent between NSF reboots without | |||
compromising security by means of the startup | compromising security by means of the startup | |||
configuration datastore in the NSF. This | configuration datastore in the NSF. This | |||
way, each time a NSF reboots it will use that | way, each time an NSF reboots, it will use that | |||
configuration for each rebooting. It would imply | configuration for each rebooting. It would imply | |||
avoiding contact with the I2NSF Controller. | avoiding contact with the I2NSF Controller. | |||
Finally, the I2NSF Controller | Finally, the I2NSF Controller | |||
may also need to send new parameters | may also need to send new parameters | |||
(e.g., a new fresh PSK for authentication) to the NSFs | (e.g., a new fresh PSK for authentication) to the NSFs | |||
which had IKEv2 SAs and IPsec SAs with the affected | that had IKEv2 SAs and IPsec SAs with the affected | |||
NSF.</t> | NSF.</t> | |||
<t>In the IKE-less case, the I2NSF Controller <bcp14>SHOULD</bcp14> dele | ||||
<t>In the IKE-less case, the I2NSF Controller SHOULD delete | te | |||
the old IPsec SAs in the non-failed nodes established with | the old IPsec SAs in the non-failed nodes established with | |||
the affected NSF. Once the affected node restarts, the I2NSF | the affected NSF. Once the affected node restarts, the I2NSF | |||
Controller MUST take the necessary actions to reestablish | Controller <bcp14>MUST</bcp14> take the necessary actions to | |||
IPsec protected communication between the failed node and | reestablish | |||
IPsec-protected communication between the failed node and | ||||
those others having IPsec SAs with the affected NSF. | those others having IPsec SAs with the affected NSF. | |||
How the I2NSF Controller implements an algorithm for | How the I2NSF Controller implements an algorithm for | |||
managing a potential NSF state loss is out of the scope of | managing a potential NSF state loss is out of the scope of | |||
this document. Nevertheless, an example of how this could be | this document. Nevertheless, an example of how this could be | |||
performed is described in <xref target="appendix-g3"/>. | performed is described in <xref target="appendix-g3" format=" | |||
</t> | default"/>. | |||
</t> | ||||
</section> | </section> | |||
<section anchor="nat-traversal" title="NAT Traversal"> | <section anchor="nat-traversal" numbered="true" toc="default"> | |||
<name>NAT Traversal</name> | ||||
<t>In the IKE case, IKEv2 already provides a mechanism | <t>In the IKE case, IKEv2 already provides a mechanism | |||
to detect whether some of the peers or both are located | to detect whether some of the peers or both are located | |||
behind a NAT. In this case, UDP or TCP | behind a NAT. In this case, UDP or TCP | |||
encapsulation for ESP packets (<xref target="RFC3948"/>, <xref target="RFC8229"/ | encapsulation for Encapsulating Security Payload (ESP) packets <xref target="RFC | |||
>) is required. | 3948" format="default"/> <xref target="RFC8229" format="default"/> is required. | |||
Note that IPsec transport mode MUST NOT be used in this specification | Note that IPsec transport mode <bcp14>MUST NOT</bcp14> be used in this | |||
specification | ||||
when NAT is required. | when NAT is required. | |||
</t> | </t> | |||
<t>In the IKE-less case, the NSF does not have the assistance | ||||
<t>In the IKE-less case, the NSF does not have the assistance | ||||
of the IKEv2 implementation to detect if it is located | of the IKEv2 implementation to detect if it is located | |||
behind a NAT. If the NSF does not have any other mechanism | behind a NAT. If the NSF does not have any other mechanism | |||
to detect this situation, the I2NSF Controller SHOULD | to detect this situation, the I2NSF Controller <bcp14>SHOULD< /bcp14> | |||
implement a mechanism to detect that case. The SDN paradigm | implement a mechanism to detect that case. The SDN paradigm | |||
generally assumes the I2NSF Controller has a view of the | generally assumes the I2NSF Controller has a view of the | |||
network under its control. This view is built either by | network under its control. This view is built either by | |||
requesting information from the NSFs under its control, or | requesting information from the NSFs under its control or | |||
by information pushed from the NSFs to the I2NSF Controller. | information pushed from the NSFs to the I2NSF Controller. | |||
Based on this information, the I2NSF Controller MAY guess | Based on this information, the I2NSF Controller <bcp14>MAY</b | |||
if there is a NAT configured between two hosts, and apply | cp14> guess | |||
if there is a NAT configured between two hosts and apply | ||||
the required policies to both NSFs besides activating the | the required policies to both NSFs besides activating the | |||
usage of UDP or TCP encapsulation of ESP packets | usage of UDP or TCP encapsulation of ESP packets | |||
(<xref target="RFC3948"/>, <xref target="RFC8229"/>). | <xref target="RFC3948" format="default"/> <xref target="RFC82 29" format="default"/>. | |||
The interface for discovering if the NSF | The interface for discovering if the NSF | |||
is behind a NAT is out of scope of this document.</t> | is behind a NAT is out of scope of this document.</t> | |||
<t>If the I2NSF Controller does not have any mechanism to know | ||||
<t>If the I2NSF Controller does not have any mechanism to know | whether a host is behind a NAT or not, then the IKE case | |||
whether a host is behind a NAT or not, then the IKE-case | <bcp14>MUST</bcp14> be used and not the IKE-less case.</t> | |||
MUST be used and not the IKE-less case.</t> | </section> | |||
</section> | <section anchor="nsf-discovery" numbered="true" toc="default"> | |||
<name>NSF Registration and Discovery</name> | ||||
<section anchor="nsf-discovery" title="NSF registration and discover | <t>NSF registration refers to the process of providing the | |||
y"> | I2NSF Controller information about a valid NSF, such as | |||
<t>NSF registration refers to the process of providing the | ||||
I2NSF Controller information about a valid NSF such as | ||||
certificate, IP address, etc. This information is | certificate, IP address, etc. This information is | |||
incorporated in a list of NSFs under its control.</t> | incorporated in a list of NSFs under its control.</t> | |||
<t>The assumption in this document is that, for both | <t>The assumption in this document is that, for both | |||
cases, before a NSF can operate in this system, it MUST | cases, before an NSF can operate in this system, it <bcp14>MU | |||
ST</bcp14> | ||||
be registered in the I2NSF Controller. In this way, when | be registered in the I2NSF Controller. In this way, when | |||
the NSF starts and establishes a connection to the I2NSF | the NSF starts and establishes a connection to the I2NSF | |||
Controller, it knows that the NSF is valid for joining the | Controller, it knows that the NSF is valid for joining the | |||
system.</t> | system.</t> | |||
<t>Either during this registration process or when the | <t>Either during this registration process or when the | |||
NSF connects with the I2NSF Controller, the I2NSF | NSF connects with the I2NSF Controller, the I2NSF | |||
Controller MUST discover certain capabilities of this | Controller <bcp14>MUST</bcp14> discover certain capabilities of this | |||
NSF, such as what are the cryptographic suites supported, | NSF, such as what are the cryptographic suites supported, | |||
authentication method, the support of the IKE case and/or | the authentication method, the support of the IKE case and/or | |||
the IKE-less case, etc.</t> | the IKE-less case, etc.</t> | |||
<t>The registration and discovery processes are out of | <t>The registration and discovery processes are out of | |||
the scope of this document.</t> | the scope of this document.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<!--SDN-based IPsec management description--> | <section anchor="models" numbered="true" toc="default"> | |||
<section anchor="models" title="YANG configuration data models"> | <name>YANG Configuration Data Models</name> | |||
<t> In order to support the IKE and IKE-less cases, | <t> In order to support the IKE and IKE-less cases, | |||
models are provided for the different parameters and | models are provided for the different parameters and | |||
values that must be configured to manage IPsec SAs. | values that must be configured to manage IPsec SAs. | |||
Specifically, the IKE case requires modeling IKEv2 | Specifically, the IKE case requires modeling IKEv2 | |||
configuration parameters, SPD and PAD, | configuration parameters, SPD and PAD, | |||
while the IKE-less case requires configuration | while the IKE-less case requires configuration | |||
YANG data models for the | YANG data models for the | |||
SPD and SAD. Three modules have been defined: ietf-i2nsf-ikec | SPD and SAD. Three modules have been defined: ietf-i2nsf-ikec | |||
(<xref target="ike-common-model"/>, common to both cases), | (<xref target="ike-common-model" format="default"/>, common to b | |||
ietf-i2nsf-ike (<xref target="ike-case-model"/>, IKE case), | oth cases), | |||
ietf-i2nsf-ikeless (<xref target="ike-less-model"/>, IKE-less ca | ietf-i2nsf-ike (<xref target="ike-case-model" format="default"/ | |||
se). | >, IKE case), and | |||
ietf-i2nsf-ikeless (<xref target="ike-less-model" format="defaul | ||||
t"/>, IKE-less case). | ||||
Since the module ietf-i2nsf-ikec has only typedef and | Since the module ietf-i2nsf-ikec has only typedef and | |||
groupings common to the other modules, a | groupings common to the other modules, a | |||
simplified view of the ietf-i2nsf-ike and ietf-i2nsf-ikeless | simplified view of the ietf-i2nsf-ike and ietf-i2nsf-ikeless | |||
modules is shown.</t> | modules is shown.</t> | |||
<!--> | <section anchor="ike-common-model" numbered="true" toc="default"> | |||
<t> In the following, we just summarize, by using a tree representat | <name>The 'ietf-i2nsf-ikec' Module</name> | |||
ion, the | <section anchor="common-overview" numbered="true" toc="default"> | |||
different configuration and state data models related with SPD, | <name>Data Model Overview</name> | |||
SAD, PAD and IKEv2.</t> | <t>The module ietf-i2nsf-ikec only has definitions of | |||
data types (typedef) and groupings that are common | ||||
<section anchor="spd-model" title="Security Policy Database (SPD) Mo | ||||
del">--> | ||||
<section anchor="ike-common-model" title="The 'ietf-i2nsf-ikec' Modu | ||||
le"> | ||||
<section anchor="common-overview" title="Data model overview"> | ||||
<t>The module ietf-i2nsf-ikec has only definition of | ||||
data types (typedef) and groupings which are common | ||||
to the other modules.</t> | to the other modules.</t> | |||
</section> | ||||
<section anchor="common-module" numbered="true" toc="default"> | ||||
<name>YANG Module</name> | ||||
<t> | ||||
This module has normative references to <xref target="RFC3 | ||||
947" format="default"/>, <xref target="RFC4301" format="default"/>, <xref target | ||||
="RFC4303" format="default"/>, <xref target="RFC8174" format="default"/>, <xref | ||||
target="RFC8221" format="default"/>, <xref target="RFC3948" format="default"/>, | ||||
<xref target="RFC8229" format="default"/>, <xref target="RFC6991" format="defau | ||||
lt"/>, <xref target="IANA-Protocols-Number" format="default"/>, <xref target="IK | ||||
Ev2-Parameters" format="default"/>, <xref target="IKEv2-Transform-Type-1" format | ||||
="default"/>, and <xref target="IKEv2-Transform-Type-3" format="default"/>. | ||||
</t> | ||||
<sourcecode name="ietf-i2nsf-ikec@2021-06-09.yang" type="yang" markers="true"><! | ||||
[CDATA[ | ||||
</section> | module ietf-i2nsf-ikec { | |||
yang-version 1.1; | ||||
<section anchor="common-module" title="YANG Module"> | namespace "urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikec"; | |||
<t> | prefix nsfikec; | |||
This module has normative references to <xref target="RFC3 | ||||
947"/>, <xref target="RFC4301"/>, <xref target="RFC4303"/>, <xref target="RFC817 | ||||
4"/>, <xref target="RFC8221"/>, <xref target="RFC3948"/>, <xref target="RFC8229 | ||||
"/>, <xref target="IANA-Protocols-Number"/>, <xref target="IKEv2-Parameters"/>, | ||||
<xref target="IKEv2-Transform-Type-1"/> and <xref target="IKEv2-Transform-Type-3 | ||||
"/>. | ||||
</t> | ||||
<t> | ||||
<figure> | ||||
<artwork> | ||||
<![CDATA[ | ||||
<CODE BEGINS> file "ietf-i2nsf-ikec@2021-03-18.yang" | ||||
module ietf-i2nsf-ikec { | ||||
yang-version 1.1; | ||||
namespace "urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikec"; | ||||
prefix "nsfikec"; | ||||
import ietf-inet-types { | ||||
prefix inet; | ||||
reference "RFC 6991: Common YANG Data Types"; | ||||
} | ||||
organization "IETF I2NSF Working Group"; | import ietf-inet-types { | |||
prefix inet; | ||||
reference | ||||
"RFC 6991: Common YANG Data Types."; | ||||
} | ||||
contact | organization | |||
"WG Web: <https://datatracker.ietf.org/wg/i2nsf/> | "IETF I2NSF Working Group"; | |||
contact | ||||
"WG Web: <https://datatracker.ietf.org/wg/i2nsf/> | ||||
WG List: <mailto:i2nsf@ietf.org> | WG List: <mailto:i2nsf@ietf.org> | |||
Author: Rafael Marin-Lopez | Author: Rafael Marin-Lopez | |||
<mailto:rafa@um.es> | <mailto:rafa@um.es> | |||
Author: Gabriel Lopez-Millan | Author: Gabriel Lopez-Millan | |||
<mailto:gabilm@um.es> | <mailto:gabilm@um.es> | |||
Author: Fernando Pereniguez-Garcia | Author: Fernando Pereniguez-Garcia | |||
<mailto:fernando.pereniguez@cud.upct.es> | <mailto:fernando.pereniguez@cud.upct.es> | |||
"; | "; | |||
description | ||||
description | "Common data model for the IKE and IKE-less cases | |||
"Common Data model for the IKE and IKE-less cases | ||||
defined by the SDN-based IPsec flow protection service. | defined by the SDN-based IPsec flow protection service. | |||
Copyright (c) 2020 IETF Trust and the persons | ||||
identified as authors of the code. All rights reserved. | ||||
Redistribution and use in source and binary forms, with | ||||
or without modification, is permitted pursuant to, and | ||||
subject to the license terms contained in, the | ||||
Simplified BSD License set forth in Section 4.c of the | ||||
IETF Trust's Legal Provisions Relating to IETF Documents | ||||
(https://trustee.ietf.org/license-info). | ||||
This version of this YANG module is part of RFC XXXX;; | ||||
see the RFC itself for full legal notices. | ||||
The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', | The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', | |||
'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', | 'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', | |||
'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this | 'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this | |||
document are to be interpreted as described in BCP 14 | document are to be interpreted as described in BCP 14 | |||
(RFC 2119) (RFC 8174) when, and only when, they appear | (RFC 2119) (RFC 8174) when, and only when, they appear | |||
in all capitals, as shown here."; | in all capitals, as shown here. | |||
revision "2021-03-18" { | Copyright (c) 2021 IETF Trust and the persons | |||
description "Initial version."; | identified as authors of the code. All rights reserved. | |||
reference "RFC XXXX: Software-Defined Networking | ||||
(SDN)-based IPsec Flow Protection."; | ||||
} | ||||
typedef encr-alg-t { | Redistribution and use in source and binary forms, with or | |||
type uint16; | without modification, is permitted pursuant to, and subject | |||
description | to the license terms contained in, the Simplified BSD License | |||
"The encryption algorithm is specified with a 16-bit | set forth in Section 4.c of the IETF Trust's Legal Provisions | |||
number extracted from the IANA Registry. The acceptable | Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info). | ||||
This version of this YANG module is part of RFC 9061; see | ||||
the RFC itself for full legal notices."; | ||||
revision 2021-06-09 { | ||||
description | ||||
"Initial version."; | ||||
reference | ||||
"RFC 9061: A YANG Data Model for IPsec Flow Protection | ||||
Based on Software-Defined Networking (SDN)."; | ||||
} | ||||
typedef encr-alg-t { | ||||
type uint16; | ||||
description | ||||
"The encryption algorithm is specified with a 16-bit | ||||
number extracted from the IANA registry. The acceptable | ||||
values MUST follow the requirement levels for | values MUST follow the requirement levels for | |||
encryption algorithms for ESP and IKEv2."; | encryption algorithms for ESP and IKEv2."; | |||
reference | reference | |||
"IANA; Internet Key Exchange V2 (IKEv2) Parameters; | "IANA: Internet Key Exchange Version 2 (IKEv2) Parameters, | |||
Transform Atribute Types; Transform Type 1 - Encryption | IKEv2 Transform Attribute Types, Transform Type 1 - | |||
Algorithm Transform IDs. RFC 8221 - Cryptographic | Encryption Algorithm Transform IDs | |||
Algorithm Implementation Requirements and Usage | RFC 8221: Cryptographic Algorithm Implementation | |||
Guidance for Encapsulating Security Payload (ESP) | Requirements and Usage Guidance for Encapsulating | |||
and Authentication Header (AH) and RFC 8247 - | Security Payload (ESP) and Authentication Header | |||
Algorithm Implementation Requirements and Usage | (AH) | |||
Guidance for the Internet Key Exchange Protocol | RFC 8247: Algorithm Implementation Requirements and Usage | |||
Version 2 (IKEv2)."; | Guidance for the Internet Key Exchange Protocol | |||
} | Version 2 (IKEv2)."; | |||
} | ||||
typedef intr-alg-t { | typedef intr-alg-t { | |||
type uint16; | type uint16; | |||
description | description | |||
"The integrity algorithm is specified with a 16-bit | "The integrity algorithm is specified with a 16-bit | |||
number extracted from the IANA Registry. | number extracted from the IANA registry. | |||
The acceptable values MUST follow the requirement | The acceptable values MUST follow the requirement | |||
levels for integrity algorithms for ESP and IKEv2."; | levels for integrity algorithms for ESP and IKEv2."; | |||
reference | reference | |||
"IANA; Internet Key Exchange V2 (IKEv2) Parameters; | "IANA: Internet Key Exchange Version 2 (IKEv2) Parameters, | |||
Transform Atribute Types; Transform Type 3 - Integrity | IKEv2 Transform Attribute Types, Transform Type 3 - | |||
Algorithm Transform IDs. RFC 8221 - Cryptographic | Integrity Algorithm Transform IDs | |||
Algorithm Implementation Requirements and Usage | RFC 8221: Cryptographic Algorithm Implementation | |||
Guidance for Encapsulating Security Payload (ESP) | Requirements and Usage Guidance for Encapsulating | |||
and Authentication Header (AH) and RFC 8247 - | Security Payload (ESP) and Authentication Header | |||
Algorithm Implementation Requirements and Usage | (AH) | |||
Guidance for the Internet Key Exchange Protocol | RFC 8247: Algorithm Implementation Requirements and Usage | |||
Version 2 (IKEv2)."; | Guidance for the Internet Key Exchange Protocol | |||
} | Version 2 (IKEv2)."; | |||
} | ||||
typedef ipsec-mode { | typedef ipsec-mode { | |||
type enumeration { | type enumeration { | |||
enum transport { | enum transport { | |||
description | description | |||
"IPsec transport mode. No Network Address | "IPsec transport mode. No Network Address | |||
Translation (NAT) support."; | Translation (NAT) support."; | |||
} | } | |||
enum tunnel { | enum tunnel { | |||
description "IPsec tunnel mode."; | description | |||
} | "IPsec tunnel mode."; | |||
} | } | |||
description | } | |||
"Type definition of IPsec mode: transport or | description | |||
"Type definition of IPsec mode: transport or | ||||
tunnel."; | tunnel."; | |||
reference | reference | |||
"Section 3.2 in RFC 4301."; | "RFC 4301: Security Architecture for the Internet Protocol, | |||
} | Section 3.2."; | |||
} | ||||
typedef esp-encap { | typedef esp-encap { | |||
type enumeration { | type enumeration { | |||
enum espintcp { | enum espintcp { | |||
description | description | |||
"ESP in TCP encapsulation."; | "ESP in TCP encapsulation."; | |||
reference | reference | |||
"RFC 8229 - TCP Encapsulation of IKE and | "RFC 8229: TCP Encapsulation of IKE and | |||
IPsec Packets."; | IPsec Packets."; | |||
} | } | |||
enum espinudp { | enum espinudp { | |||
description | description | |||
"ESP in UDP encapsulation."; | "ESP in UDP encapsulation."; | |||
reference | reference | |||
"RFC 3948 - UDP Encapsulation of IPsec ESP | "RFC 3948: UDP Encapsulation of IPsec ESP | |||
Packets."; | Packets."; | |||
} | } | |||
enum none { | enum none { | |||
description | description | |||
"No ESP encapsulation."; | "No ESP encapsulation."; | |||
} | } | |||
} | } | |||
description | description | |||
"Types of ESP encapsulation when Network Address | "Types of ESP encapsulation when Network Address | |||
Translation (NAT) may be present between two NSFs."; | Translation (NAT) may be present between two NSFs."; | |||
reference | reference | |||
"RFC 8229 - TCP Encapsulation of IKE and IPsec | "RFC 8229: TCP Encapsulation of IKE and IPsec Packets | |||
Packets and RFC 3948 - UDP Encapsulation of IPsec | RFC 3948: UDP Encapsulation of IPsec ESP Packets."; | |||
ESP Packets."; | } | |||
} | ||||
typedef ipsec-protocol-parameters { | typedef ipsec-protocol-params { | |||
type enumeration { | type enumeration { | |||
enum esp { description "IPsec ESP protocol."; } | enum esp { | |||
} | description | |||
description | "IPsec ESP protocol."; | |||
"Only the Encapsulation Security Protocol (ESP) is | } | |||
supported but it could be extended in the future."; | } | |||
reference | description | |||
"RFC 4303- IP Encapsulating Security Payload | "Only the Encapsulation Security Protocol (ESP) is | |||
(ESP)."; | supported, but it could be extended in the future."; | |||
} | reference | |||
"RFC 4303: IP Encapsulating Security Payload (ESP)."; | ||||
} | ||||
typedef lifetime-action { | typedef lifetime-action { | |||
type enumeration { | type enumeration { | |||
enum terminate-clear { | enum terminate-clear { | |||
description | description | |||
"Terminates the IPsec SA and allows the | "Terminates the IPsec SA and allows the | |||
packets through."; | packets through."; | |||
} | } | |||
enum terminate-hold { | enum terminate-hold { | |||
description | description | |||
"Terminates the IPsec SA and drops the | "Terminates the IPsec SA and drops the | |||
packets."; | packets."; | |||
} | } | |||
enum replace { | enum replace { | |||
description | description | |||
"Replaces the IPsec SA with a new one: | "Replaces the IPsec SA with a new one: | |||
rekey. "; | rekey."; | |||
} | } | |||
} | } | |||
description | description | |||
"When the lifetime of an IPsec SA expires an action | "When the lifetime of an IPsec SA expires, an action | |||
needs to be performed for the IPsec SA that | needs to be performed for the IPsec SA that | |||
reached the lifetime. There are three posible | reached the lifetime. There are three possible | |||
options: terminate-clear, terminate-hold and | options: terminate-clear, terminate-hold, and | |||
replace."; | replace."; | |||
reference | reference | |||
"Section 4.5 in RFC 4301."; | "RFC 4301: Security Architecture for the Internet Protocol, | |||
} | Section 4.5."; | |||
} | ||||
typedef ipsec-traffic-direction { | typedef ipsec-traffic-direction { | |||
type enumeration { | type enumeration { | |||
enum inbound { | enum inbound { | |||
description "Inbound traffic."; | description | |||
} | "Inbound traffic."; | |||
enum outbound { | } | |||
description "Outbound traffic."; | enum outbound { | |||
} | description | |||
} | "Outbound traffic."; | |||
description | } | |||
"IPsec traffic direction is defined in | } | |||
description | ||||
"IPsec traffic direction is defined in | ||||
two directions: inbound and outbound. | two directions: inbound and outbound. | |||
From a NSF perspective, inbound and | From an NSF perspective, inbound and | |||
outbound are defined as mentioned | outbound are defined as mentioned | |||
in RFC 4301 (Section 3.1)."; | in Section 3.1 in RFC 4301."; | |||
reference | reference | |||
"Section 3.1 in RFC 4301."; | "RFC 4301: Security Architecture for the Internet Protocol, | |||
} | Section 3.1."; | |||
} | ||||
typedef ipsec-spd-action { | typedef ipsec-spd-action { | |||
type enumeration { | type enumeration { | |||
enum protect { | enum protect { | |||
description | description | |||
"PROTECT the traffic with IPsec."; | "PROTECT the traffic with IPsec."; | |||
} | } | |||
enum bypass { | enum bypass { | |||
description | description | |||
"BYPASS the traffic. The packet is forwarded | "BYPASS the traffic. The packet is forwarded | |||
without IPsec protection."; | without IPsec protection."; | |||
} | } | |||
enum discard { | enum discard { | |||
description | description | |||
"DISCARD the traffic. The IP packet is | "DISCARD the traffic. The IP packet is | |||
discarded."; | discarded."; | |||
} | } | |||
} | } | |||
description | description | |||
"The action when traffic matches an IPsec security | "The action when traffic matches an IPsec security | |||
policy. According to RFC 4301 there are three | policy. According to RFC 4301, there are three | |||
possible values: BYPASS, PROTECT AND DISCARD"; | possible values: BYPASS, PROTECT, and DISCARD."; | |||
reference | reference | |||
"Section 4.4.1 in RFC 4301."; | "RFC 4301: Security Architecture for the Internet Protocol, | |||
} | Section 4.4.1."; | |||
} | ||||
typedef ipsec-inner-protocol { | typedef ipsec-inner-protocol { | |||
type union { | type union { | |||
type uint8; | type uint8; | |||
type enumeration { | type enumeration { | |||
enum any { | enum any { | |||
value 256; | value 256; | |||
description | description | |||
"Any IP protocol number value."; | "Any IP protocol number value."; | |||
} | } | |||
} | } | |||
} | } | |||
default any; | default "any"; | |||
description | description | |||
"IPsec protection can be applied to specific IP | "IPsec protection can be applied to specific IP | |||
traffic and layer 4 traffic (TCP, UDP, SCTP, etc.) | traffic and Layer 4 traffic (TCP, UDP, SCTP, etc.) | |||
or ANY protocol in the IP packet payload. We | or ANY protocol in the IP packet payload. | |||
The IP protocol number is specified with an uint8 | The IP protocol number is specified with a uint8 | |||
or ANY defining an enumerate with value 256 to | or ANY defining an enumerate with value 256 to | |||
indicate the protocol number. NOTE: In case | indicate the protocol number. Note that in case | |||
of IPv6, the protocol in the IP packet payload | of IPv6, the protocol in the IP packet payload | |||
is indicated in the Next Header field of the IPv6 | is indicated in the Next Header field of the IPv6 | |||
packet."; | packet."; | |||
reference | reference | |||
"Section 4.4.1.1 in RFC 4301. | "RFC 4301: Security Architecture for the Internet Protocol, | |||
IANA Registry - Protocol Numbers."; | Section 4.4.1.1 | |||
} | IANA: Protocol Numbers."; | |||
} | ||||
grouping encap { | grouping encap { | |||
description | description | |||
"This group of nodes allows to define the type of | "This group of nodes allows defining of the type of | |||
encapsulation in case NAT traversal is | encapsulation in case NAT traversal is | |||
required and includes port information."; | required and includes port information."; | |||
leaf espencap { | leaf espencap { | |||
type esp-encap; | type esp-encap; | |||
default none; | default "none"; | |||
description | description | |||
"ESP in TCP, ESP in UDP or ESP in TLS."; | "ESP in TCP, ESP in UDP, or ESP in TLS."; | |||
} | } | |||
leaf sport { | leaf sport { | |||
type inet:port-number; | type inet:port-number; | |||
default 4500; | default "4500"; | |||
description | description | |||
"Encapsulation source port."; | "Encapsulation source port."; | |||
} | } | |||
leaf dport { | leaf dport { | |||
type inet:port-number; | type inet:port-number; | |||
default 4500; | default "4500"; | |||
description | description | |||
"Encapsulation destination port."; | "Encapsulation destination port."; | |||
} | } | |||
leaf-list oaddr { | ||||
leaf-list oaddr { | type inet:ip-address; | |||
type inet:ip-address; | description | |||
description | "If required, this is the original address that | |||
"If required, this is the original address that | was used before NAT was applied over the packet."; | |||
was used before NAT was applied over the Packet. | } | |||
"; | reference | |||
} | "RFC 3947: Negotiation of NAT-Traversal in the IKE | |||
reference | RFC 8229: TCP Encapsulation of IKE and IPsec Packets."; | |||
"RFC 3947 and RFC 8229."; | } | |||
} | ||||
grouping lifetime { | grouping lifetime { | |||
description | description | |||
"Different lifetime values limited to an IPsec SA."; | "Different lifetime values limited to an IPsec SA."; | |||
leaf time { | leaf time { | |||
type uint32; | type uint32; | |||
units "seconds"; | units "seconds"; | |||
default 0; | default "0"; | |||
description | description | |||
"Time in seconds since the IPsec SA was added. | "Time in seconds since the IPsec SA was added. | |||
For example, if this value is 180 seconds it | For example, if this value is 180 seconds, it | |||
means the IPsec SA expires in 180 seconds since | means the IPsec SA expires in 180 seconds since | |||
it was added. The value 0 implies infinite."; | it was added. The value 0 implies infinite."; | |||
} | } | |||
leaf bytes { | leaf bytes { | |||
type uint64; | type uint64; | |||
default 0; | default "0"; | |||
description | description | |||
"If the IPsec SA processes the number of bytes | "If the IPsec SA processes the number of bytes | |||
expressed in this leaf, the IPsec SA expires and | expressed in this leaf, the IPsec SA expires and | |||
SHOULD be rekeyed. The value 0 implies | SHOULD be rekeyed. The value 0 implies | |||
infinite."; | ||||
} | ||||
leaf packets { | ||||
type uint32; | ||||
default 0; | ||||
description | ||||
"If the IPsec SA processes the number of packets | ||||
expressed in this leaf, the IPsec SA expires and | ||||
SHOULD be rekeyed. The value 0 implies | ||||
infinite."; | ||||
} | ||||
leaf idle { | ||||
type uint32; | ||||
units "seconds"; | ||||
default 0; | ||||
description | ||||
"When a NSF stores an IPsec SA, it | ||||
consumes system resources. For an idle IPsec SA this | ||||
is a waste of resources. If the IPsec SA is idle | ||||
during this number of seconds the IPsec SA | ||||
SHOULD be removed. The value 0 implies | ||||
infinite."; | infinite."; | |||
} | } | |||
reference | leaf packets { | |||
"Section 4.4.2.1 in RFC 4301."; | type uint32; | |||
} | default "0"; | |||
description | ||||
"If the IPsec SA processes the number of packets | ||||
expressed in this leaf, the IPsec SA expires and | ||||
SHOULD be rekeyed. The value 0 implies | ||||
infinite."; | ||||
} | ||||
leaf idle { | ||||
type uint32; | ||||
units "seconds"; | ||||
default "0"; | ||||
description | ||||
"When an NSF stores an IPsec SA, it | ||||
consumes system resources. For an idle IPsec SA, this | ||||
is a waste of resources. If the IPsec SA is idle | ||||
during this number of seconds, the IPsec SA | ||||
SHOULD be removed. The value 0 implies | ||||
infinite."; | ||||
} | ||||
reference | ||||
"RFC 4301: Security Architecture for the Internet Protocol, | ||||
Section 4.4.2.1."; | ||||
} | ||||
grouping port-range { | grouping port-range { | |||
description | description | |||
"This grouping defines a port range, such as | "This grouping defines a port range, such as that | |||
expressed in RFC 4301. For example: 1500 (Start | expressed in RFC 4301, for example, 1500 (Start | |||
Port Number)-1600 (End Port Number). | Port Number)-1600 (End Port Number). | |||
A port range is used in the Traffic Selector."; | A port range is used in the Traffic Selector."; | |||
leaf start { | ||||
leaf start { | type inet:port-number; | |||
type inet:port-number; | description | |||
description "Start port number."; | "Start port number."; | |||
} | } | |||
leaf end { | leaf end { | |||
type inet:port-number; | type inet:port-number; | |||
must '. >= ../start' { | must '. >= ../start' { | |||
error-message | error-message | |||
"The end port number MUST be equal or greater | "The end port number MUST be equal or greater | |||
than the start port number."; | than the start port number."; | |||
} | } | |||
description | description | |||
"End port number. To express a single port, set | "End port number. To express a single port, set | |||
the same value as start and end."; | the same value as start and end."; | |||
} | } | |||
reference "Section 4.4.1.2 in RFC 4301."; | reference | |||
} | "RFC 4301: Security Architecture for the Internet Protocol, | |||
Section 4.4.1.2."; | ||||
} | ||||
grouping tunnel-grouping { | grouping tunnel-grouping { | |||
description | description | |||
"The parameters required to define the IP tunnel | "The parameters required to define the IP tunnel | |||
endpoints when IPsec SA requires tunnel mode. The | endpoints when IPsec SA requires tunnel mode. The | |||
tunnel is defined by two endpoints: the local IP | tunnel is defined by two endpoints: the local IP | |||
address and the remote IP address."; | address and the remote IP address."; | |||
leaf local { | ||||
leaf local { | type inet:ip-address; | |||
type inet:ip-address; | mandatory true; | |||
mandatory true; | description | |||
description | "Local IP address' tunnel endpoint."; | |||
"Local IP address' tunnel endpoint."; | } | |||
} | leaf remote { | |||
leaf remote { | type inet:ip-address; | |||
type inet:ip-address; | mandatory true; | |||
mandatory true; | description | |||
description | "Remote IP address' tunnel endpoint."; | |||
"Remote IP address' tunnel endpoint."; | } | |||
} | leaf df-bit { | |||
leaf df-bit { | type enumeration { | |||
type enumeration { | enum clear { | |||
enum clear { | description | |||
description | "Disable the Don't Fragment (DF) bit | |||
"Disable the DF (Don't Fragment) bit | in the outer header. This is the | |||
in the outer header. This is the | ||||
default value."; | default value."; | |||
} | } | |||
enum set { | enum set { | |||
description | description | |||
"Enable the DF bit in the outer header."; | "Enable the DF bit in the outer header."; | |||
} | } | |||
enum copy { | enum copy { | |||
description | description | |||
"Copy the DF bit to the outer header."; | "Copy the DF bit to the outer header."; | |||
} | } | |||
} | } | |||
default clear; | default "clear"; | |||
description | description | |||
"Allow configuring the DF bit when encapsulating | "Allow configuring the DF bit when encapsulating | |||
tunnel mode IPsec traffic. RFC 4301 describes | tunnel mode IPsec traffic. RFC 4301 describes | |||
three options to handle the DF bit during | three options to handle the DF bit during | |||
tunnel encapsulation: clear, set and copy from | tunnel encapsulation: clear, set, and copy from | |||
the inner IP header. This MUST be ignored or | the inner IP header. This MUST be ignored or | |||
has no meaning when the local/remote | has no meaning when the local/remote | |||
IP addresses are IPv6 addresses."; | IP addresses are IPv6 addresses."; | |||
reference | reference | |||
"Section 8.1 in RFC 4301."; | "RFC 4301: Security Architecture for the Internet Protocol, | |||
} | Section 8.1."; | |||
leaf bypass-dscp { | } | |||
type boolean; | leaf bypass-dscp { | |||
default true; | type boolean; | |||
description | default "true"; | |||
"If True to copy the DSCP value from inner header | description | |||
to outer header. If False to map DSCP values | "If true, to copy the Differentiated Services Code | |||
Point (DSCP) value from inner header to outer header. | ||||
If false, to map DSCP values | ||||
from an inner header to values in an outer header | from an inner header to values in an outer header | |||
following ../dscp-mapping"; | following ../dscp-mapping."; | |||
reference | reference | |||
"Section 4.4.1.2. in RFC 4301."; | "RFC 4301: Security Architecture for the Internet Protocol, | |||
} | Section 4.4.1.2."; | |||
} | ||||
list dscp-mapping { | list dscp-mapping { | |||
must '../bypass-dscp = "false"'; | must '../bypass-dscp = "false"'; | |||
key id; | key "id"; | |||
ordered-by user; | ordered-by user; | |||
leaf id { | leaf id { | |||
type uint8; | type uint8; | |||
description | description | |||
"The index of list with the | "The index of list with the | |||
different mappings."; | different mappings."; | |||
} | } | |||
leaf inner-dscp { | ||||
leaf inner-dscp { | type inet:dscp; | |||
type inet:dscp; | description | |||
description | "The DSCP value of the inner IP packet. If this | |||
"The DSCP value of the inner IP packet. If this | leaf is not defined, it means ANY inner DSCP value."; | |||
leaf is not defined it means ANY inner DSCP value"; | } | |||
} | leaf outer-dscp { | |||
leaf outer-dscp { | type inet:dscp; | |||
type inet:dscp; | default "0"; | |||
default 0; | description | |||
description | "The DSCP value of the outer IP packet."; | |||
"The DSCP value of the outer IP packet"; | } | |||
} | description | |||
description | "A list that represents an array with the mapping from the | |||
"A list that represents an array with the mapping from the | ||||
inner DSCP value to outer DSCP value when bypass-dscp is | inner DSCP value to outer DSCP value when bypass-dscp is | |||
False. To express a default mapping in the list where any | false. To express a default mapping in the list where any | |||
other inner dscp value is not matching a node in the list, | other inner dscp value is not matching a node in the list, | |||
a new node has to be included at the end of the list where | a new node has to be included at the end of the list where | |||
the leaf inner-dscp is not defined (ANY) and the leaf | the leaf inner-dscp is not defined (ANY) and the leaf | |||
outer-dscp includes the value of the mapping. If there is no | outer-dscp includes the value of the mapping. If there is | |||
value set in the leaf outer-dscp the default value for this | no value set in the leaf outer-dscp, the default value for | |||
leaf is 0."; | this leaf is 0."; | |||
reference | reference | |||
"Section 4.4.1.2. and Appendix C in RFC 4301."; | "RFC 4301: Security Architecture for the Internet Protocol, | |||
} | Section 4.4.1.2 and Appendix C."; | |||
} | } | |||
} | ||||
grouping selector-grouping { | grouping selector-grouping { | |||
description | description | |||
"This grouping contains the definition of a Traffic | "This grouping contains the definition of a Traffic | |||
Selector, which is used in the IPsec policies and | Selector, which is used in the IPsec policies and | |||
IPsec SAs."; | IPsec SAs."; | |||
leaf local-prefix { | ||||
leaf local-prefix { | type inet:ip-prefix; | |||
type inet:ip-prefix; | mandatory true; | |||
mandatory true; | description | |||
description | "Local IP address prefix."; | |||
"Local IP address prefix."; | } | |||
} | leaf remote-prefix { | |||
leaf remote-prefix { | type inet:ip-prefix; | |||
type inet:ip-prefix; | mandatory true; | |||
mandatory true; | description | |||
description | "Remote IP address prefix."; | |||
"Remote IP address prefix."; | } | |||
} | leaf inner-protocol { | |||
leaf inner-protocol { | type ipsec-inner-protocol; | |||
type ipsec-inner-protocol; | default "any"; | |||
default any; | description | |||
description | "Inner protocol that is going to be | |||
"Inner Protocol that is going to be | ||||
protected with IPsec."; | protected with IPsec."; | |||
} | } | |||
list local-ports { | list local-ports { | |||
key "start end"; | key "start end"; | |||
uses port-range; | uses port-range; | |||
description | description | |||
"List of local ports. When the inner | "List of local ports. When the inner | |||
protocol is ICMP this 16 bit value | protocol is ICMP, this 16-bit value | |||
represents code and type. | represents code and type. | |||
If this list is not defined | If this list is not defined, | |||
it is assumed that start and | it is assumed that start and | |||
end are 0 by default (any port)."; | end are 0 by default (any port)."; | |||
} | } | |||
list remote-ports { | list remote-ports { | |||
key "start end"; | key "start end"; | |||
uses port-range; | uses port-range; | |||
description | description | |||
"List of remote ports. When the upper layer | "List of remote ports. When the upper layer | |||
protocol is ICMP this 16 bit value represents | protocol is ICMP, this 16-bit value represents | |||
code and type.If this list is not defined | code and type. If this list is not defined, | |||
it is assumed that start and end are 0 by | it is assumed that start and end are 0 by | |||
default (any port)"; | default (any port)."; | |||
} | } | |||
reference | reference | |||
"Section 4.4.1.2 in RFC 4301."; | "RFC 4301: Security Architecture for the Internet Protocol, | |||
} | Section 4.4.1.2."; | |||
} | ||||
grouping ipsec-policy-grouping { | grouping ipsec-policy-grouping { | |||
description | description | |||
"Holds configuration information for an IPsec SPD | "Holds configuration information for an IPsec SPD | |||
entry."; | entry."; | |||
leaf anti-replay-window-size { | ||||
leaf anti-replay-window-size { | type uint32; | |||
type uint32; | default "64"; | |||
default 64; | description | |||
description | "To set the anti-replay window size. | |||
"To set the anti-replay window size. | ||||
The default value is set | The default value is set | |||
to 64 following RFC 4303 recommendation."; | to 64, following the recommendation in RFC 4303."; | |||
reference | reference | |||
"Section 3.4.3 in RFC 4303"; | "RFC 4303: IP Encapsulating Security Payload (ESP), | |||
} | Section 3.4.3."; | |||
container traffic-selector { | } | |||
description | container traffic-selector { | |||
"Packets are selected for | description | |||
processing actions based on traffic selector | "Packets are selected for | |||
processing actions based on Traffic Selector | ||||
values, which refer to IP and inner protocol | values, which refer to IP and inner protocol | |||
header information."; | header information."; | |||
uses selector-grouping; | uses selector-grouping; | |||
reference | reference | |||
"Section 4.4.4.1 in RFC 4301."; | "RFC 4301: Security Architecture for the Internet Protocol, | |||
} | Section 4.4.4.1."; | |||
container processing-info { | } | |||
description | container processing-info { | |||
"SPD processing. If the required processing | description | |||
"SPD processing. If the required processing | ||||
action is protect, it contains the required | action is protect, it contains the required | |||
information to process the packet."; | information to process the packet."; | |||
leaf action { | leaf action { | |||
type ipsec-spd-action; | type ipsec-spd-action; | |||
default discard; | default "discard"; | |||
description | description | |||
"If bypass or discard, container | "If bypass or discard, container | |||
ipsec-sa-cfg is empty."; | ipsec-sa-cfg is empty."; | |||
} | } | |||
container ipsec-sa-cfg { | container ipsec-sa-cfg { | |||
when "../action = 'protect'"; | when "../action = 'protect'"; | |||
description | description | |||
"IPsec SA configuration included in the SPD | "IPsec SA configuration included in the SPD | |||
entry."; | entry."; | |||
leaf pfp-flag { | leaf pfp-flag { | |||
type boolean; | type boolean; | |||
default false; | default "false"; | |||
description | description | |||
"Each selector has a Populate From | "Each selector has a Populate From | |||
Packet (PFP) flag. If asserted for a | Packet (PFP) flag. If asserted for a | |||
given selector X, the flag indicates | given selector X, the flag indicates | |||
that the IPsec SA to be created should | that the IPsec SA to be created should | |||
take its value (local IP address, | take its value (local IP address, | |||
remote IP address, Next Layer | remote IP address, Next Layer | |||
Protocol, etc.) for X from the value | Protocol, etc.) for X from the value | |||
in the packet. Otherwise, the IPsec SA | in the packet. Otherwise, the IPsec SA | |||
should take its value(s) for X from | should take its value(s) for X from | |||
the value(s) in the SPD entry."; | the value(s) in the SPD entry."; | |||
} | } | |||
leaf ext-seq-num { | leaf ext-seq-num { | |||
type boolean; | type boolean; | |||
default false; | default "false"; | |||
description | description | |||
"True if this IPsec SA is using extended | "True if this IPsec SA is using extended | |||
sequence numbers. If true, the 64-bit | sequence numbers. If true, the 64-bit | |||
extended sequence number counter is used; | extended sequence number counter is used; | |||
if false, the normal 32-bit sequence | if false, the normal 32-bit sequence | |||
number counter is used."; | number counter is used."; | |||
} | } | |||
leaf seq-overflow { | leaf seq-overflow { | |||
type boolean; | type boolean; | |||
default false; | default "false"; | |||
description | description | |||
"The flag indicating whether | "The flag indicating whether | |||
overflow of the sequence number | overflow of the sequence number | |||
counter should prevent transmission | counter should prevent transmission | |||
of additional packets on the IPsec | of additional packets on the IPsec | |||
SA (false) and, therefore needs to | SA (false) and, therefore, needs to | |||
be rekeyed, or whether rollover is | be rekeyed or whether rollover is | |||
permitted (true). If Authenticated | permitted (true). If Authenticated | |||
Encryption with Associated Data | Encryption with Associated Data | |||
(AEAD) is used (leaf | (AEAD) is used (leaf | |||
esp-algorithms/encryption/algorithm-type) | esp-algorithms/encryption/algorithm-type), | |||
this flag MUST be false. Setting this | this flag MUST be false. Setting this | |||
flag to true is strongly discouraged."; | flag to true is strongly discouraged."; | |||
} | } | |||
leaf stateful-frag-check { | leaf stateful-frag-check { | |||
type boolean; | type boolean; | |||
default false; | default "false"; | |||
description | description | |||
"Indicates whether (true) or not (false) | "Indicates whether (true) or not (false) | |||
stateful fragment checking applies to | stateful fragment checking applies to | |||
the IPsec SA to be created."; | the IPsec SA to be created."; | |||
} | } | |||
leaf mode { | leaf mode { | |||
type ipsec-mode; | type ipsec-mode; | |||
default transport; | default "transport"; | |||
description | description | |||
"IPsec SA has to be processed in | "IPsec SA has to be processed in | |||
transport or tunnel mode."; | transport or tunnel mode."; | |||
} | } | |||
leaf protocol-parameters { | leaf protocol-parameters { | |||
type ipsec-protocol-parameters; | type ipsec-protocol-params; | |||
default esp; | default "esp"; | |||
description | description | |||
"Security protocol of the IPsec SA: | "Security protocol of the IPsec SA. | |||
Only ESP is supported but it could be | Only ESP is supported, but it could be | |||
extended in the future."; | extended in the future."; | |||
} | } | |||
container esp-algorithms { | container esp-algorithms { | |||
when "../protocol-parameters = 'esp'"; | when "../protocol-parameters = 'esp'"; | |||
description | description | |||
"Configuration of Encapsulating | "Configuration of Encapsulating | |||
Security Payload (ESP) parameters and | Security Payload (ESP) parameters and | |||
algorithms."; | algorithms."; | |||
leaf-list integrity { | ||||
leaf-list integrity { | type intr-alg-t; | |||
type intr-alg-t; | default "0"; | |||
default 0; | ordered-by user; | |||
ordered-by user; | description | |||
description | "Configuration of ESP authentication | |||
"Configuration of ESP authentication | based on the specified integrity | |||
based on the specified integrity | algorithm. With AEAD encryption | |||
algorithm. With AEAD encryption | algorithms, the integrity node is | |||
algorithms, the integrity node is | not used."; | |||
not used."; | reference | |||
reference | "RFC 4303: IP Encapsulating Security Payload (ESP), | |||
"Section 3.2 in RFC 4303."; | Section 3.2."; | |||
} | } | |||
list encryption { | list encryption { | |||
key id; | key "id"; | |||
ordered-by user; | ordered-by user; | |||
leaf id { | leaf id { | |||
type uint16; | type uint16; | |||
description | description | |||
"An identifier that unequivocally identifies each | "An identifier that unequivocally identifies each | |||
entry of the list, i.e., an encryption algorithm | entry of the list, i.e., an encryption algorithm | |||
and its key-length (if required)."; | and its key length (if required)."; | |||
} | } | |||
leaf algorithm-type { | leaf algorithm-type { | |||
type encr-alg-t; | type encr-alg-t; | |||
default 20; | default "20"; | |||
description | description | |||
"Default value 20 (ENCR_AES_GCM_16)"; | "Default value 20 (ENCR_AES_GCM_16)."; | |||
} | } | |||
leaf key-length { | leaf key-length { | |||
type uint16; | type uint16; | |||
default 128; | default "128"; | |||
description | description | |||
"By default key length is 128 | "By default, key length is 128 | |||
bits"; | bits."; | |||
} | } | |||
description | description | |||
"Encryption or AEAD algorithm for the | "Encryption or AEAD algorithm for the | |||
IPsec SAs. This list is ordered | IPsec SAs. This list is ordered | |||
following from the higher priority to | following from the higher priority to | |||
lower priority. First node of the | lower priority. First node of the | |||
list will be the algorithm with | list will be the algorithm with | |||
higher priority. In case the list | higher priority. In case the list | |||
is empty, then | is empty, then no encryption algorithm | |||
no encryption algorithm | ||||
is applied (NULL)."; | is applied (NULL)."; | |||
reference | reference | |||
"Section 3.2 in RFC 4303."; | "RFC 4303: IP Encapsulating Security Payload (ESP), | |||
} | Section 3.2."; | |||
leaf tfc-pad { | } | |||
type boolean; | leaf tfc-pad { | |||
default false; | type boolean; | |||
description | default "false"; | |||
"If Traffic Flow Confidentiality | description | |||
"If Traffic Flow Confidentiality | ||||
(TFC) padding for ESP encryption | (TFC) padding for ESP encryption | |||
can be used (true) or not (false)"; | can be used (true) or not (false)."; | |||
reference | reference | |||
"Section 2.7 in RFC 4303."; | "RFC 4303: IP Encapsulating Security Payload (ESP), | |||
} | Section 2.7."; | |||
reference | } | |||
"RFC 4303."; | reference | |||
} | "RFC 4303: IP Encapsulating Security Payload (ESP)."; | |||
container tunnel { | } | |||
when "../mode = 'tunnel'"; | container tunnel { | |||
uses tunnel-grouping; | when "../mode = 'tunnel'"; | |||
description | uses tunnel-grouping; | |||
"IPsec tunnel endpoints definition."; | description | |||
} | "IPsec tunnel endpoints definition."; | |||
} | } | |||
reference | } | |||
"Section 4.4.1.2 in RFC 4301."; | reference | |||
} | "RFC 4301: Security Architecture for the Internet Protocol, | |||
} | Section 4.4.1.2."; | |||
} | } | |||
} | ||||
<CODE ENDS> | } | |||
]]></sourcecode> | ||||
]]> | </section> | |||
</artwork> | </section> | |||
</figure> | <section anchor="ike-case-model" numbered="true" toc="default"> | |||
</t> | <name>The 'ietf-i2nsf-ike' Module</name> | |||
</section> | ||||
</section> | ||||
<section anchor="ike-case-model" title="The 'ietf-i2nsf-ike' Module" | ||||
> | ||||
<t>In this section, the YANG module for the IKE case is described.</t> | <t>In this section, the YANG module for the IKE case is described.</t> | |||
<section anchor="ike-overview" numbered="true" toc="default"> | ||||
<section anchor="ike-overview" title="Data model overview"> | <name>Data Model Overview</name> | |||
<t>The model related to IKEv2 has been extracted from | ||||
<t>The model related to IKEv2 has been extracted from | reading the IKEv2 standard in | |||
reading IKEv2 standard in | <xref target="RFC7296" format="default"/> and observing some o | |||
<xref target="RFC7296"/>, and observing some open | pen | |||
source implementations, such as Strongswan | source implementations, such as strongSwan | |||
<xref target="strongswan"/> or Libreswan | <xref target="strongswan" format="default"/> or Libreswan | |||
<xref target="libreswan"/>.</t> | <xref target="libreswan" format="default"/>.</t> | |||
<t>The definition of the PAD model has been | ||||
<t>The definition of the PAD model has been | extracted from the specification in | |||
extracted from the specification in section 4.4.3 in | <xref target="RFC4301" sectionFormat="of" section="4.4.3"/>. (No | |||
<xref target="RFC4301"/> (NOTE: Many | te that many | |||
implementations integrate PAD configuration as part | implementations integrate PAD configuration as part | |||
of the | of the IKEv2 configuration.)</t> | |||
IKEv2 configuration).</t> | <t> The definition of the SPD model has been | |||
mainly extracted from the specification in Section | ||||
<t> The definition of the SPD model has been | <xref target="RFC4301" section="4.4.1" sectionFormat="bare"/> an | |||
mainly extracted from the specification in section | d Appendix <xref target="RFC4301" section="D" sectionFormat="bare"/> of <xref ta | |||
4.4.1 and Appendix D in <xref target="RFC4301"/>. | rget="RFC4301" format="default"/>. | |||
</t> | </t> | |||
<t> The YANG data model for the IKE case is defined by the module "iet | ||||
<t> The YANG data model for the IKE case is defined by the mod | f-i2nsf-ike". Its structure is depicted in the following diagram, using the nota | |||
ule "ietf-i2nsf-ike". Its structure is depicted in the following diagram, using | tion syntax for YANG tree diagrams <xref target="RFC8340" format="default"/>. | |||
the notation syntax for YANG tree diagrams (<xref target="RFC8340"/>). | </t> | |||
</t> | <sourcecode type="yangtree"><![CDATA[ | |||
<t> | ||||
<figure> | ||||
<artwork> | ||||
<![CDATA[ | ||||
module: ietf-i2nsf-ike | module: ietf-i2nsf-ike | |||
+--rw ipsec-ike | +--rw ipsec-ike | |||
+--rw pad | +--rw pad | |||
| +--rw pad-entry* [name] | | +--rw pad-entry* [name] | |||
| +--rw name string | | +--rw name string | |||
| +--rw (identity) | | +--rw (identity) | |||
| | +--:(ipv4-address) | | | +--:(ipv4-address) | |||
| | | +--rw ipv4-address? inet:ipv4-address | | | | +--rw ipv4-address? inet:ipv4-address | |||
| | +--:(ipv6-address) | | | +--:(ipv6-address) | |||
| | | +--rw ipv6-address? inet:ipv6-address | | | | +--rw ipv6-address? inet:ipv6-address | |||
skipping to change at line 1652 ¶ | skipping to change at line 1444 ¶ | |||
| +--rw ca-data* binary | | +--rw ca-data* binary | |||
| +--rw crl-data? binary | | +--rw crl-data? binary | |||
| +--rw crl-uri? inet:uri | | +--rw crl-uri? inet:uri | |||
| +--rw oscp-uri? inet:uri | | +--rw oscp-uri? inet:uri | |||
+--rw conn-entry* [name] | +--rw conn-entry* [name] | |||
| +--rw name string | | +--rw name string | |||
| +--rw autostartup? autostartup-type | | +--rw autostartup? autostartup-type | |||
| +--rw initial-contact? boolean | | +--rw initial-contact? boolean | |||
| +--rw version? auth-protocol-type | | +--rw version? auth-protocol-type | |||
| +--rw fragmentation | | +--rw fragmentation | |||
| | +--rw enable? boolean | | | +--rw enabled? boolean | |||
| | +--rw mtu? uint16 | | | +--rw mtu? uint16 | |||
| +--rw ike-sa-lifetime-soft | | +--rw ike-sa-lifetime-soft | |||
| | +--rw rekey-time? uint32 | | | +--rw rekey-time? uint32 | |||
| | +--rw reauth-time? uint32 | | | +--rw reauth-time? uint32 | |||
| +--rw ike-sa-lifetime-hard | | +--rw ike-sa-lifetime-hard | |||
| | +--rw over-time? uint32 | | | +--rw over-time? uint32 | |||
| +--rw ike-sa-intr-alg* nsfikec:intr-alg-t | | +--rw ike-sa-intr-alg* nsfikec:intr-alg-t | |||
| +--rw ike-sa-encr-alg* [id] | | +--rw ike-sa-encr-alg* [id] | |||
| | +--rw id uint16 | | | +--rw id uint16 | |||
| | +--rw algorithm-type? nsfikec:encr-alg-t | | | +--rw algorithm-type? nsfikec:encr-alg-t | |||
skipping to change at line 1699 ¶ | skipping to change at line 1491 ¶ | |||
| | | +--rw start inet:port-number | | | | +--rw start inet:port-number | |||
| | | +--rw end inet:port-number | | | | +--rw end inet:port-number | |||
| | +--rw processing-info | | | +--rw processing-info | |||
| | +--rw action? ipsec-spd-action | | | +--rw action? ipsec-spd-action | |||
| | +--rw ipsec-sa-cfg | | | +--rw ipsec-sa-cfg | |||
| | +--rw pfp-flag? boolean | | | +--rw pfp-flag? boolean | |||
| | +--rw ext-seq-num? boolean | | | +--rw ext-seq-num? boolean | |||
| | +--rw seq-overflow? boolean | | | +--rw seq-overflow? boolean | |||
| | +--rw stateful-frag-check? boolean | | | +--rw stateful-frag-check? boolean | |||
| | +--rw mode? ipsec-mode | | | +--rw mode? ipsec-mode | |||
| | +--rw protocol-parameters? ipsec-protocol-parameters | | | +--rw protocol-parameters? ipsec-protocol-params | |||
| | +--rw esp-algorithms | | | +--rw esp-algorithms | |||
| | | +--rw integrity* intr-alg-t | | | | +--rw integrity* intr-alg-t | |||
| | | +--rw encryption* [id] | | | | +--rw encryption* [id] | |||
| | | | +--rw id uint16 | | | | | +--rw id uint16 | |||
| | | | +--rw algorithm-type? encr-alg-t | | | | | +--rw algorithm-type? encr-alg-t | |||
| | | | +--rw key-length? uint16 | | | | | +--rw key-length? uint16 | |||
| | | +--rw tfc-pad? boolean | | | | +--rw tfc-pad? boolean | |||
| | +--rw tunnel | | | +--rw tunnel | |||
| | +--rw local inet:ip-address | | | +--rw local inet:ip-address | |||
| | +--rw remote inet:ip-address | | | +--rw remote inet:ip-address | |||
skipping to change at line 1747 ¶ | skipping to change at line 1539 ¶ | |||
| | +--ro sport? inet:port-number | | | +--ro sport? inet:port-number | |||
| | +--ro dport? inet:port-number | | | +--ro dport? inet:port-number | |||
| | +--ro oaddr* inet:ip-address | | | +--ro oaddr* inet:ip-address | |||
| +--ro established? uint64 | | +--ro established? uint64 | |||
| +--ro current-rekey-time? uint64 | | +--ro current-rekey-time? uint64 | |||
| +--ro current-reauth-time? uint64 | | +--ro current-reauth-time? uint64 | |||
+--ro number-ike-sas | +--ro number-ike-sas | |||
+--ro total? yang:gauge64 | +--ro total? yang:gauge64 | |||
+--ro half-open? yang:gauge64 | +--ro half-open? yang:gauge64 | |||
+--ro half-open-cookies? yang:gauge64 | +--ro half-open-cookies? yang:gauge64 | |||
]]> | ]]></sourcecode> | |||
</artwork> | <t> | |||
</figure> | ||||
</t> | ||||
<t> | ||||
The YANG data model consists of a unique | The YANG data model consists of a unique | |||
"ipsec-ike" | "ipsec-ike" | |||
container defined as follows. Firstly, it | container defined as follows. Firstly, it | |||
contains a "pad" container that serves to | contains a "pad" container that serves to | |||
configure the Peer Authentication Database | configure the Peer Authentication Database | |||
with authentication information about local | with authentication information about local | |||
and remote peers (NSFs). More precisely, it | and remote peers (NSFs). More precisely, it | |||
consists of a list of entries, each one | consists of a list of entries, each one | |||
indicating the identity, authentication method | indicating the identity, authentication method, | |||
and credentials that a particular peer (local or | and credentials that a particular peer (local or | |||
remote) will use. Therefore, each entry contains | remote) will use. Therefore, each entry contains | |||
identity, authentication information, and | identity, authentication information, and | |||
credentials of either the local NSF or the | credentials of either the local NSF or the | |||
remote NSF. As a consequence, the I2NF Controller can | remote NSF. As a consequence, the I2NF Controller can | |||
store identity, authentication information and | store identity, authentication information, and | |||
credentials for the local NSF and the remote | credentials for the local NSF and the remote | |||
NSF. | NSF. | |||
</t> | </t> | |||
<t> Next, a list "conn-entry" is defined with | ||||
<t> Next, a list "conn-entry" is defined with | ||||
information about the different IKE connections | information about the different IKE connections | |||
a peer can maintain with others. Each connection | a peer can maintain with others. Each connection | |||
entry is composed of a wide number of parameters | entry is composed of a wide number of parameters | |||
to configure different aspects of a particular | to configure different aspects of a particular | |||
IKE connection between two peers: local and | IKE connection between two peers: local and | |||
remote peer authentication information; IKE SA | remote peer authentication information, IKE SA | |||
configuration (soft and hard lifetimes, | configuration (soft and hard lifetimes, | |||
cryptographic algorithms, etc.); list of IPsec | cryptographic algorithms, etc.), a list of IPsec | |||
policies describing the type of network traffic | policies describing the type of network traffic | |||
to be secured (local/remote subnet and ports, | to be secured (local/remote subnet and ports, | |||
etc.) and how must be protected (ESP, | etc.) and how it must be protected (ESP, | |||
tunnel/transport, cryptographic algorithms, | tunnel/transport, cryptographic algorithms, | |||
etc.); CHILD SA configuration (soft and hard | etc.), Child SA configuration (soft and hard | |||
lifetimes); and, state information of the IKE | lifetimes), and state information of the IKE | |||
connection (SPIs, usage of NAT, current | connection (SPIs, usage of NAT, current | |||
expiration times, etc.). | expiration times, etc.). | |||
</t> | </t> | |||
<t>Lastly, the "ipsec-ike" container declares a | ||||
<t>Lastly, the "ipsec-ike" container declares a | ||||
"number-ike-sas" container to specify state | "number-ike-sas" container to specify state | |||
information reported by the IKE software related | information reported by the IKE software related | |||
to the amount of IKE connections established. | to the amount of IKE connections established. | |||
</t> | </t> | |||
</section> | ||||
</section> | <section anchor="ike-example" numbered="true" toc="default"> | |||
<section anchor="ike-example" title="Example Usage"> | <name>Example Usage</name> | |||
<t><xref target="appendix-d" format="default"/> shows an example | ||||
<t><xref target="appendix-d"/> shows an example | of IKE case configuration for an NSF, in tunnel | |||
of IKE case configuration for a NSF, in tunnel | mode (gateway-to-gateway), with NSF | |||
mode (gateway-to-gateway), with NSFs | ||||
authentication based on X.509 certificates.</t> | authentication based on X.509 certificates.</t> | |||
</section> | ||||
<section anchor="ike-module" numbered="true" toc="default"> | ||||
<name>YANG Module</name> | ||||
<t>This YANG module has normative references to <xref target="RFC5280" | ||||
format="default"/>, <xref target="RFC4301" format="default"/>, <xref target="RF | ||||
C5915" format="default"/>, <xref target="RFC6991" format="default"/>, <xref targ | ||||
et="RFC7296" format="default"/>, <xref target="RFC7383" format="default"/>, <xre | ||||
f target="RFC7427" format="default"/>, <xref target="RFC7619" format="default"/> | ||||
, <xref target="RFC8017" format="default"/>, <xref target="ITU-T.X.690" format=" | ||||
default"/>, <xref target="RFC5322" format="default"/>, <xref target="RFC8229" fo | ||||
rmat="default"/>, <xref target="RFC8174" format="default"/>, <xref target="RFC69 | ||||
60" format="default"/>, <xref target="IKEv2-Auth-Method" format="default"/>, <xr | ||||
ef target="IKEv2-Transform-Type-4" format="default"/>, <xref target="IKEv2-Param | ||||
eters" format="default"/>, and <xref target="IANA-Method-Type" format="default"/ | ||||
>. | ||||
</t> | ||||
<sourcecode name="ietf-i2nsf-ike@2021-06-09.yang" type="yang" markers="true"><![ | ||||
CDATA[ | ||||
</section> | module ietf-i2nsf-ike { | |||
yang-version 1.1; | ||||
<section anchor="ike-module" title="YANG Module"> | namespace "urn:ietf:params:xml:ns:yang:ietf-i2nsf-ike"; | |||
prefix nsfike; | ||||
<t> | ||||
This YANG module has normative references to <xref targe | ||||
t="RFC2247"/>, <xref target="RFC5280"/>, <xref target="RFC4301"/>, <xref target= | ||||
"RFC5280"/>, <xref target="RFC5915"/>, <xref target="RFC6991"/>, <xref target="R | ||||
FC7296"/>, <xref target="RFC7383"/>, <xref target="RFC7427"/>, <xref target="RFC | ||||
7619"/>, <xref target="RFC8017"/>, <xref target="ITU-T.X.690"/>, <xref target="R | ||||
FC5322"/>, <xref target="RFC8229"/>, <xref target="RFC8174"/>, <xref target="IKE | ||||
v2-Auth-Method"/>, <xref target="IKEv2-Transform-Type-4"/>, <xref target="IKEv2- | ||||
Parameters"/> and <xref target="IANA-Method-Type"/>. | ||||
</t> | ||||
<t> | ||||
<figure> | ||||
<artwork> | ||||
<![CDATA[ | ||||
<CODE BEGINS> file "ietf-i2nsf-ike@2021-03-18.yang" | ||||
module ietf-i2nsf-ike { | ||||
yang-version 1.1; | ||||
namespace "urn:ietf:params:xml:ns:yang:ietf-i2nsf-ike"; | ||||
prefix "nsfike"; | ||||
import ietf-inet-types { | ||||
prefix inet; | ||||
reference "RFC 6991: Common YANG Data Types"; | ||||
} | ||||
import ietf-yang-types { | ||||
prefix yang; | ||||
reference "RFC 6991: Common YANG Data Types"; | ||||
} | ||||
import ietf-i2nsf-ikec { | ||||
prefix nsfikec; | ||||
reference | ||||
"RFC XXXX: Software-Defined Networking | ||||
(SDN)-based IPsec Flow Protection."; | ||||
} | ||||
import ietf-netconf-acm { | ||||
prefix nacm; | ||||
reference | ||||
"RFC 8341: Network Configuration Access Control | ||||
Model."; | ||||
} | ||||
organization "IETF I2NSF Working Group"; | import ietf-inet-types { | |||
prefix inet; | ||||
reference | ||||
"RFC 6991: Common YANG Data Types."; | ||||
} | ||||
import ietf-yang-types { | ||||
prefix yang; | ||||
reference | ||||
"RFC 6991: Common YANG Data Types."; | ||||
} | ||||
import ietf-i2nsf-ikec { | ||||
prefix nsfikec; | ||||
reference | ||||
"RFC 9061: A YANG Data Model for IPsec Flow Protection | ||||
Based on Software-Defined Networking (SDN)."; | ||||
} | ||||
import ietf-netconf-acm { | ||||
prefix nacm; | ||||
reference | ||||
"RFC 8341: Network Configuration Access Control | ||||
Model."; | ||||
} | ||||
contact | organization | |||
"WG Web: <https://datatracker.ietf.org/wg/i2nsf/> | "IETF I2NSF Working Group"; | |||
contact | ||||
"WG Web: <https://datatracker.ietf.org/wg/i2nsf/> | ||||
WG List: <mailto:i2nsf@ietf.org> | WG List: <mailto:i2nsf@ietf.org> | |||
Author: Rafael Marin-Lopez | Author: Rafael Marin-Lopez | |||
<mailto:rafa@um.es> | <mailto:rafa@um.es> | |||
Author: Gabriel Lopez-Millan | Author: Gabriel Lopez-Millan | |||
<mailto:gabilm@um.es> | <mailto:gabilm@um.es> | |||
Author: Fernando Pereniguez-Garcia | Author: Fernando Pereniguez-Garcia | |||
<mailto:fernando.pereniguez@cud.upct.es> | <mailto:fernando.pereniguez@cud.upct.es> | |||
"; | "; | |||
description | ||||
description | "This module contains the IPsec IKE case model for the SDN-based | |||
"This module contains IPsec IKE case model for the SDN-based | ||||
IPsec flow protection service. | IPsec flow protection service. | |||
Copyright (c) 2020 IETF Trust and the persons identified as | The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', | |||
'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', | ||||
'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this | ||||
document are to be interpreted as described in BCP 14 | ||||
(RFC 2119) (RFC 8174) when, and only when, they appear | ||||
in all capitals, as shown here. | ||||
Copyright (c) 2021 IETF Trust and the persons identified as | ||||
authors of the code. All rights reserved. | authors of the code. All rights reserved. | |||
Redistribution and use in source and binary forms, with or | Redistribution and use in source and binary forms, with or | |||
without modification, is permitted pursuant to, and subject | without modification, is permitted pursuant to, and subject | |||
to the license terms contained in, the Simplified BSD License | to the license terms contained in, the Simplified BSD License | |||
set forth in Section 4.c of the IETF Trust's Legal Provisions | set forth in Section 4.c of the IETF Trust's Legal Provisions | |||
Relating to IETF Documents | Relating to IETF Documents | |||
(http://trustee.ietf.org/license-info). | (http://trustee.ietf.org/license-info). | |||
This version of this YANG module is part of RFC XXXX; see | This version of this YANG module is part of RFC 9061; see | |||
the RFC itself for full legal notices. | the RFC itself for full legal notices."; | |||
The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', | ||||
'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', | ||||
'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this | ||||
document are to be interpreted as described in BCP 14 | ||||
(RFC 2119) (RFC 8174) when, and only when, they appear | ||||
in all capitals, as shown here."; | ||||
revision "2021-03-18" { | revision 2021-06-09 { | |||
description "Initial version."; | description | |||
reference | "Initial version."; | |||
"RFC XXXX: Software-Defined Networking | reference | |||
(SDN)-based IPsec Flow Protection."; | "RFC 9061: A YANG Data Model for IPsec Flow Protection | |||
} | Based on Software-Defined Networking (SDN)."; | |||
} | ||||
typedef ike-spi { | typedef ike-spi { | |||
type uint64 { range "0..max"; } | type uint64 { | |||
description | range "0..max"; | |||
"Security Parameter Index (SPI)'s IKE SA."; | } | |||
reference | description | |||
"Section 2.6 in RFC 7296."; | "Security Parameter Index (SPI)'s IKE SA."; | |||
} | reference | |||
"RFC 7296: Internet Key Exchange Protocol Version 2 | ||||
(IKEv2), Section 2.6."; | ||||
} | ||||
typedef autostartup-type { | typedef autostartup-type { | |||
type enumeration { | type enumeration { | |||
enum add { | enum add { | |||
description | description | |||
"IKE/IPsec configuration is only loaded into | "IKE/IPsec configuration is only loaded into | |||
IKE implementation but IKE/IPsec SA is not | IKE implementation, but IKE/IPsec SA is not | |||
started."; | started."; | |||
} | } | |||
enum on-demand { | enum on-demand { | |||
description | description | |||
"IKE/IPsec configuration is loaded | "IKE/IPsec configuration is loaded | |||
into IKE implementation. The IPsec policies | into IKE implementation. The IPsec policies | |||
are transferred to the NSF but the | are transferred to the NSF, but the | |||
IPsec SAs are not established immediately. | IPsec SAs are not established immediately. | |||
The IKE implementation will negotiate the | The IKE implementation will negotiate the | |||
IPsec SAs when they are required. | IPsec SAs when they are required | |||
(i.e. through an ACQUIRE notification)."; | (i.e., through an ACQUIRE notification)."; | |||
} | } | |||
enum start { | enum start { | |||
description | description | |||
"IKE/IPsec configuration is loaded | "IKE/IPsec configuration is loaded | |||
and transferred to the NSF's kernel, and the | and transferred to the NSF's kernel, and the | |||
IKEv2 based IPsec SAs are established | IKEv2-based IPsec SAs are established | |||
immediately without waiting for any packet."; | immediately without waiting for any packet."; | |||
} | } | |||
} | } | |||
description | description | |||
"Different policies to set IPsec SA configuration | "Different policies to set IPsec SA configuration | |||
into NSF's kernel when IKEv2 implementation has | into NSF's kernel when IKEv2 implementation has | |||
started."; | started."; | |||
} | } | |||
typedef fs-group { | typedef fs-group { | |||
type uint16; | type uint16; | |||
description | description | |||
"DH groups for IKE and IPsec SA rekey."; | "DH groups for IKE and IPsec SA rekey."; | |||
reference | reference | |||
"IANA; Internet Key Exchange V2 (IKEv2) Parameters; | "IANA: Internet Key Exchange Version 2 (IKEv2) Parameters, | |||
Transform Atribute Types; Transform Type 4 - | IKEv2 Transform Attribute Types, Transform Type 4 - | |||
Diffie-Hellman Group Transform IDs. | Diffie-Hellman Group Transform IDs | |||
Section 3.3.2 in RFC 7296."; | RFC 7296: Internet Key Exchange Protocol Version 2 | |||
} | (IKEv2), Section 3.3.2."; | |||
} | ||||
typedef auth-protocol-type { | typedef auth-protocol-type { | |||
type enumeration { | type enumeration { | |||
enum ikev2 { | enum ikev2 { | |||
value 2; | value 2; | |||
description | description | |||
"IKEv2 authentication protocol. It is the | "IKEv2 authentication protocol. It is the | |||
only one defined right now. An enum is | only one defined right now. An enum is | |||
used for further extensibility."; | used for further extensibility."; | |||
} | } | |||
} | } | |||
description | description | |||
"IKE authentication protocol version specified in the | "IKE authentication protocol version specified in the | |||
Peer Authorization Database (PAD). It is defined as | Peer Authorization Database (PAD). It is defined as | |||
enumerated to allow new IKE versions in the | enumerated to allow new IKE versions in the | |||
future."; | future."; | |||
reference | reference | |||
"RFC 7296."; | "RFC 7296: Internet Key Exchange Protocol Version 2 | |||
} | (IKEv2)."; | |||
} | ||||
typedef auth-method-type { | typedef auth-method-type { | |||
type enumeration { | type enumeration { | |||
enum pre-shared { | enum pre-shared { | |||
description | description | |||
"Select pre-shared key as the | "Select pre-shared key as the | |||
authentication method."; | authentication method."; | |||
reference | reference | |||
"RFC 7296."; | "RFC 7296: Internet Key Exchange Protocol Version 2 | |||
} | (IKEv2)."; | |||
enum eap { | } | |||
description | enum eap { | |||
"Select EAP as the authentication method."; | description | |||
reference | "Select the Extensible Authentication Protocol (EAP) as | |||
"RFC 7296."; | the authentication method."; | |||
} | reference | |||
enum digital-signature { | "RFC 7296: Internet Key Exchange Protocol Version 2 | |||
description | (IKEv2)."; | |||
"Select digital signature as the authentication method."; | } | |||
reference | enum digital-signature { | |||
"RFC 7296 and RFC 7427."; | description | |||
} | "Select digital signature as the authentication method."; | |||
enum null { | reference | |||
description | "RFC 7296: Internet Key Exchange Protocol Version 2 | |||
"Null authentication."; | (IKEv2) | |||
reference | RFC 7427: Signature Authentication in the Internet Key | |||
"RFC 7619."; | Exchange Version 2 (IKEv2)."; | |||
} | } | |||
} | enum null { | |||
description | description | |||
"Peer authentication method specified in the Peer | "Null authentication."; | |||
reference | ||||
"RFC 7619: The NULL Authentication Method in the Internet | ||||
Key Exchange Protocol Version 2 (IKEv2)."; | ||||
} | ||||
} | ||||
description | ||||
"Peer authentication method specified in the Peer | ||||
Authorization Database (PAD)."; | Authorization Database (PAD)."; | |||
} | } | |||
container ipsec-ike { | container ipsec-ike { | |||
description | description | |||
"IKE configuration for a NSF. It includes PAD | "IKE configuration for an NSF. It includes PAD | |||
parameters, IKE connection information and state | parameters, IKE connection information, and state | |||
data."; | data."; | |||
container pad { | ||||
container pad { | description | |||
description | "Configuration of the Peer Authorization Database | |||
"Configuration of the Peer Authorization Database | (PAD). Each entry of PAD contains authentication | |||
(PAD). Each entry of PAD contains authentication | ||||
information of either the local peer or the remote peer. | information of either the local peer or the remote peer. | |||
Therefore, the I2NSF Controller stores authentication | Therefore, the I2NSF Controller stores authentication | |||
information (and credentials) not only for the remote NSF | information (and credentials) not only for the remote NSF | |||
but also for the local NSF. The local NSF MAY use the | but also for the local NSF. The local NSF MAY use the | |||
same identity for different types of authentication | same identity for different types of authentication | |||
and credentials. Pointing to the entry for a local NSF | and credentials. Pointing to the entry for a local NSF | |||
(e.g., A) and the entry for remote NSF (e.g., B) | (e.g., A) and the entry for remote NSF (e.g., B) | |||
is possible to specify all the required information to | is possible to specify all the required information to | |||
carry out the authentication between A and B (see | carry out the authentication between A and B (see | |||
../conn-entry/local and ../conn-entry/remote)."; | ../conn-entry/local and ../conn-entry/remote)."; | |||
list pad-entry { | ||||
list pad-entry { | key "name"; | |||
key "name"; | ordered-by user; | |||
ordered-by user; | description | |||
description | "Peer Authorization Database (PAD) entry. It | |||
"Peer Authorization Database (PAD) entry. It | ||||
is a list of PAD entries ordered by the | is a list of PAD entries ordered by the | |||
I2NSF Controller and each entry is | I2NSF Controller, and each entry is | |||
univocally identified by a name"; | unequivocally identified by a name."; | |||
leaf name { | leaf name { | |||
type string; | type string; | |||
description | description | |||
"PAD unique name to identify this | "PAD-unique name to identify this | |||
entry."; | entry."; | |||
} | } | |||
choice identity { | choice identity { | |||
mandatory true; | mandatory true; | |||
description | description | |||
"A particular IKE peer will be | "A particular IKE peer will be | |||
identified by one of these identities. | identified by one of these identities. | |||
This peer can be a remote peer or local | This peer can be a remote peer or local | |||
peer (this NSF)."; | peer (this NSF)."; | |||
reference | reference | |||
"Section 4.4.3.1 in RFC 4301."; | "RFC 4301: Security Architecture for the Internet | |||
case ipv4-address { | Protocol, Section 4.4.3.1."; | |||
leaf ipv4-address { | case ipv4-address { | |||
type inet:ipv4-address; | leaf ipv4-address { | |||
description | type inet:ipv4-address; | |||
"Specifies the identity as | description | |||
a single four (4) octet IPv4 address."; | "Specifies the identity as | |||
} | a single 4-octet IPv4 address."; | |||
} | } | |||
case ipv6-address{ | } | |||
leaf ipv6-address { | case ipv6-address { | |||
type inet:ipv6-address; | leaf ipv6-address { | |||
description | type inet:ipv6-address; | |||
"Specifies the identity as a | description | |||
single sixteen (16) octet IPv6 | "Specifies the identity as a | |||
address. An example is | single 16-octet IPv6 | |||
address. An example is | ||||
2001:db8::8:800:200c:417a."; | 2001:db8::8:800:200c:417a."; | |||
} | } | |||
} | } | |||
case fqdn-string { | case fqdn-string { | |||
leaf fqdn-string { | leaf fqdn-string { | |||
type inet:domain-name; | type inet:domain-name; | |||
description | description | |||
"Specifies the identity as a | "Specifies the identity as a | |||
Fully-Qualified Domain Name | Fully Qualified Domain Name | |||
(FQDN) string. An example is: | (FQDN) string. An example is | |||
example.com. The string MUST | example.com. The string MUST | |||
NOT contain any terminators | NOT contain any terminators | |||
(e.g., NULL, CR, etc.)."; | (e.g., NULL, Carriage Return | |||
} | (CR), etc.)."; | |||
} | } | |||
case rfc822-address-string { | } | |||
leaf rfc822-address-string { | case rfc822-address-string { | |||
type string; | leaf rfc822-address-string { | |||
description | type string; | |||
"Specifies the identity as a | description | |||
fully-qualified RFC5322 email | "Specifies the identity as a | |||
address string. An example is, | fully qualified email address | |||
jsmith@example.com. The string | string (RFC 5322). An example is | |||
jsmith@example.com. The string | ||||
MUST NOT contain any | MUST NOT contain any | |||
terminators (e.g., NULL, CR, | terminators (e.g., NULL, CR, | |||
etc.)."; | etc.)."; | |||
reference | reference | |||
"RFC 5322."; | "RFC 5322: Internet Message Format."; | |||
} | } | |||
} | } | |||
case dnx509 { | case dnx509 { | |||
leaf dnx509 { | leaf dnx509 { | |||
type binary; | type binary; | |||
description | description | |||
"The binary | "The binary | |||
Distinguished Encoding Rules (DER) | Distinguished Encoding Rules (DER) | |||
encoding of an ASN.1 X.500 | encoding of an ASN.1 X.500 | |||
Distinguished Name, as specified in IKEv2."; | Distinguished Name, as specified in IKEv2."; | |||
reference | reference | |||
"RFC 5280. Section 3.5 in RFC 7296."; | "RFC 5280: Internet X.509 Public Key Infrastructure | |||
} | Certificate and Certificate Revocation | |||
} | List (CRL) Profile | |||
case gnx509 { | RFC 7296: Internet Key Exchange Protocol Version 2 | |||
leaf gnx509 { | (IKEv2), Section 3.5."; | |||
type binary; | } | |||
description | } | |||
"ASN.1 X.509 GeneralName | case gnx509 { | |||
structure as | leaf gnx509 { | |||
specified in RFC 5280, | type binary; | |||
encoded using ASN.1 | description | |||
distinguished encoding rules | "ASN.1 X.509 GeneralName structure, | |||
(DER), as specified in ITU-T | as specified in RFC 5280, encoded | |||
X.690."; | using ASN.1 Distinguished Encoding Rules | |||
reference | (DER), as specified in ITU-T X.690."; | |||
"RFC 5280"; | reference | |||
} | "RFC 5280: Internet X.509 Public Key Infrastructure | |||
Certificate and Certificate Revocation | ||||
} | List (CRL) Profile."; | |||
case id-key { | } | |||
leaf id-key { | } | |||
type binary; | case id-key { | |||
description | leaf id-key { | |||
"Opaque octet stream that may be | type binary; | |||
description | ||||
"Opaque octet stream that may be | ||||
used to pass vendor-specific | used to pass vendor-specific | |||
information for proprietary | information for proprietary | |||
types of identification."; | types of identification."; | |||
reference | reference | |||
"Section 3.5 in RFC 7296."; | "RFC 7296: Internet Key Exchange Protocol Version 2 | |||
} | (IKEv2), Section 3.5."; | |||
} | } | |||
case id-null { | } | |||
leaf id-null { | case id-null { | |||
type empty; | leaf id-null { | |||
description | type empty; | |||
"The ID_NULL identification is used | description | |||
"The ID_NULL identification is used | ||||
when the IKE identification payload | when the IKE identification payload | |||
is not used." ; | is not used."; | |||
reference | reference | |||
"RFC 7619."; | "RFC 7619: The NULL Authentication Method in the | |||
} | Internet Key Exchange Protocol Version 2 | |||
} | (IKEv2)."; | |||
} | } | |||
} | ||||
leaf auth-protocol { | } | |||
type auth-protocol-type; | leaf auth-protocol { | |||
default ikev2; | type auth-protocol-type; | |||
description | default "ikev2"; | |||
"Only IKEv2 is supported right now but | description | |||
"Only IKEv2 is supported right now, but | ||||
other authentication protocols may be | other authentication protocols may be | |||
supported in the future."; | supported in the future."; | |||
} | } | |||
container peer-authentication { | container peer-authentication { | |||
description | description | |||
"This container allows the Security | "This container allows the security | |||
Controller to configure the | controller to configure the | |||
authentication method (pre-shared key, | authentication method (pre-shared key, | |||
eap, digitial-signature, null) that | eap, digital-signature, null) that | |||
will be used with a particular peer and | will be used with a particular peer and | |||
the credentials to use, which will | the credentials to use, which will | |||
depend on the selected authentication | depend on the selected authentication | |||
method."; | method."; | |||
leaf auth-method { | ||||
leaf auth-method { | type auth-method-type; | |||
type auth-method-type; | default "pre-shared"; | |||
default pre-shared; | description | |||
description | "Type of authentication method | |||
"Type of authentication method | (pre-shared key, eap, digital signature, | |||
(pre-shared, eap, digital signature, | null)."; | |||
null)."; | reference | |||
reference | "RFC 7296: Internet Key Exchange Protocol Version 2 | |||
"Section 2.15 in RFC 7296."; | (IKEv2), Section 2.15."; | |||
} | } | |||
container eap-method { | container eap-method { | |||
when "../auth-method = 'eap'"; | when "../auth-method = 'eap'"; | |||
leaf eap-type { | leaf eap-type { | |||
type uint32 {range "1 .. 4294967295"; } | type uint32 { | |||
mandatory true; | range "1 .. 4294967295"; | |||
description | } | |||
"EAP method type specified with | mandatory true; | |||
description | ||||
"EAP method type specified with | ||||
a value extracted from the | a value extracted from the | |||
IANA Registry. This | IANA registry. This | |||
information provides the | information provides the | |||
particular EAP method to be | particular EAP method to be | |||
used. Depending on the EAP | used. Depending on the EAP | |||
method, pre-shared keys or | method, pre-shared keys or | |||
certificates may be used."; | certificates may be used."; | |||
} | } | |||
description | description | |||
"EAP method description used when | "EAP method description used when | |||
authentication method is 'eap'."; | authentication method is 'eap'."; | |||
reference | reference | |||
"IANA Registry; Extensible Authentication | "IANA: Extensible Authentication Protocol (EAP) | |||
Protocol (EAP); Registry; Method Types. | Registry, Method Types | |||
Section 2.16 in RFC 7296."; | RFC 7296: Internet Key Exchange Protocol Version 2 | |||
} | (IKEv2), Section 2.16."; | |||
container pre-shared { | } | |||
when | container pre-shared { | |||
"../auth-method[.='pre-shared' or | when "../auth-method[.='pre-shared' or | |||
.='eap']"; | .='eap']"; | |||
leaf secret { | leaf secret { | |||
nacm:default-deny-all; | nacm:default-deny-all; | |||
type yang:hex-string; | type yang:hex-string; | |||
description | description | |||
"Pre-shared secret value. The | "Pre-shared secret value. The | |||
NSF has to prevent read access | NSF has to prevent read access | |||
to this value for security | to this value for security | |||
reasons. This value MUST be | reasons. This value MUST be | |||
set if the EAP method uses a | set if the EAP method uses a | |||
pre-shared key or pre-shared | pre-shared key or pre-shared | |||
authentication has been chosen."; | authentication has been chosen."; | |||
} | } | |||
description | description | |||
"Shared secret value for PSK or | "Shared secret value for PSK or | |||
EAP method authentication based on | EAP method authentication based on | |||
PSK."; | PSK."; | |||
} | } | |||
container digital-signature { | container digital-signature { | |||
when | when "../auth-method[.='digital-signature' | |||
"../auth-method[.='digital-signature' | or .='eap']"; | |||
or .='eap']"; | leaf ds-algorithm { | |||
leaf ds-algorithm { | type uint8; | |||
type uint8; | default "14"; | |||
default 14; | description | |||
description | "The digital signature | |||
"The digital signature | ||||
algorithm is specified with a | algorithm is specified with a | |||
value extracted from the IANA | value extracted from the IANA | |||
Registry. Default is the generic | registry. Default is the generic | |||
Digital Signature method. Depending | digital signature method. Depending | |||
on the algorithm, the following leafs | on the algorithm, the following leafs | |||
MUST contain information. For | MUST contain information. For | |||
example if digital signature or the | example, if digital signature or the | |||
EAP method involves a certificate | EAP method involves a certificate, | |||
then leaf 'cert-data' and 'private-key' | then leaves 'cert-data' and 'private-key' | |||
will contain this information."; | will contain this information."; | |||
reference | reference | |||
"IANA Registry; Internet Key | "IANA: Internet Key Exchange Version 2 (IKEv2) | |||
Exchange Version 2 (IKEv2); | Parameters, IKEv2 Authentication Method."; | |||
Parameters; IKEv2 Authentication Method."; | } | |||
} | choice public-key { | |||
leaf raw-public-key { | ||||
choice public-key { | type binary; | |||
leaf raw-public-key { | description | |||
type binary; | "A binary that contains the | |||
description | ||||
"A binary that contains the | ||||
value of the public key. The | value of the public key. The | |||
interpretation of the content | interpretation of the content | |||
is defined by the digital | is defined by the digital | |||
signature algorithm. For | signature algorithm. For | |||
example, an RSA key is | example, an RSA key is | |||
represented as RSAPublicKey as | represented as RSAPublicKey, as | |||
defined in RFC 8017, and an | defined in RFC 8017, and an | |||
Elliptic Curve Cryptography | Elliptic Curve Cryptography | |||
(ECC) key is represented | (ECC) key is represented | |||
using the 'publicKey' | using the 'publicKey' | |||
described in RFC 5915."; | described in RFC 5915."; | |||
} | reference | |||
"RFC 5915: Elliptic Curve Private Key | ||||
leaf cert-data { | Structure | |||
type binary; | RFC 8017: PKCS #1: RSA Cryptography | |||
description | Specifications Version 2.2."; | |||
"X.509 certificate data in DER | } | |||
format. If raw-public-key is | leaf cert-data { | |||
type binary; | ||||
description | ||||
"X.509 certificate data in DER | ||||
format. If raw-public-key is | ||||
defined, this leaf is empty."; | defined, this leaf is empty."; | |||
reference "RFC 5280"; | reference | |||
} | "RFC 5280: Internet X.509 Public Key | |||
description | Infrastructure Certificate | |||
"If the I2NSF Controller | and Certificate Revocation | |||
List (CRL) Profile."; | ||||
} | ||||
description | ||||
"If the I2NSF Controller | ||||
knows that the NSF | knows that the NSF | |||
already owns a private key | already owns a private key | |||
associated to this public key | associated to this public key | |||
(e.g., the NSF generated the pair | (e.g., the NSF generated the pair | |||
public key/private key out of | public key/private key out of | |||
band), it will only configure | band), it will only configure | |||
one of the leaf of this | one of the leaves of this | |||
choice but not the leaf | choice but not the leaf | |||
private-key. The NSF, based on | private-key. The NSF, based on | |||
the public key value, can know | the public key value, can know | |||
the private key to be used."; | the private key to be used."; | |||
} | } | |||
leaf private-key { | leaf private-key { | |||
nacm:default-deny-all; | nacm:default-deny-all; | |||
type binary; | type binary; | |||
description | description | |||
"A binary that contains the | "A binary that contains the | |||
value of the private key. The | value of the private key. The | |||
interpretation of the content | interpretation of the content | |||
is defined by the digital | is defined by the digital | |||
signature algorithm. For | signature algorithm. For | |||
example, an RSA key is | example, an RSA key is | |||
represented as RSAPrivateKey as | represented as RSAPrivateKey, as | |||
defined in RFC 8017, and an | defined in RFC 8017, and an | |||
Elliptic Curve Cryptography | Elliptic Curve Cryptography | |||
(ECC) key is represented as | (ECC) key is represented as | |||
ECPrivateKey as defined in RFC | ECPrivateKey, as defined in RFC | |||
5915. This value is set | 5915. This value is set | |||
if public-key is defined and | if public key is defined and the | |||
I2NSF controller is in charge | I2NSF Controller is in charge | |||
of configuring the | of configuring the | |||
private-key. Otherwise, it is | private key. Otherwise, it is | |||
not set and the value is | not set and the value is | |||
kept in secret."; | kept in secret."; | |||
} | reference | |||
leaf-list ca-data { | "RFC 5915: Elliptic Curve Private Key | |||
type binary; | Structure | |||
description | RFC 8017: PKCS #1: RSA Cryptography | |||
"List of trusted Certification | Specifications Version 2.2."; | |||
Authorities (CA) certificates | } | |||
leaf-list ca-data { | ||||
type binary; | ||||
description | ||||
"List of trusted Certification | ||||
Authorities (CAs) certificates | ||||
encoded using ASN.1 | encoded using ASN.1 | |||
distinguished encoding rules | Distinguished Encoding Rules | |||
(DER). If it is not defined | (DER). If it is not defined, | |||
the default value is empty."; | the default value is empty."; | |||
} | } | |||
leaf crl-data { | leaf crl-data { | |||
type binary; | type binary; | |||
description | description | |||
"A CertificateList structure, as | "A CertificateList structure, as | |||
specified in RFC 5280, | specified in RFC 5280, | |||
encoded using ASN.1 | encoded using ASN.1 | |||
distinguished encoding rules | Distinguished Encoding Rules | |||
(DER),as specified in ITU-T | (DER), as specified in ITU-T | |||
X.690. If it is not defined | X.690. If it is not defined, | |||
the default value is empty."; | the default value is empty."; | |||
reference | reference | |||
"RFC 5280"; | "RFC 5280: Internet X.509 Public Key Infrastructure | |||
} | Certificate and Certificate Revocation | |||
leaf crl-uri { | List (CRL) Profile."; | |||
type inet:uri; | } | |||
description | leaf crl-uri { | |||
"X.509 CRL certificate URI. | type inet:uri; | |||
If it is not defined | description | |||
"X.509 Certificate Revocation List | ||||
(CRL) certificate URI. | ||||
If it is not defined, | ||||
the default value is empty."; | the default value is empty."; | |||
reference | reference | |||
"RFC 5280"; | "RFC 5280: Internet X.509 Public Key Infrastructure | |||
} | Certificate and Certificate Revocation | |||
leaf oscp-uri { | List (CRL) Profile."; | |||
type inet:uri; | } | |||
description | leaf oscp-uri { | |||
"OCSP URI. | type inet:uri; | |||
If it is not defined | description | |||
"Online Certificate Status Protocol | ||||
(OCSP) URI. If it is not defined, | ||||
the default value is empty."; | the default value is empty."; | |||
reference | reference | |||
"RFC 2560 and RFC 5280"; | "RFC 6960: X.509 Internet Public Key Infrastructure | |||
} | Online Certificate Status Protocol - OCSP | |||
description | RFC 5280: Internet X.509 Public Key Infrastructure | |||
"Digital Signature container."; | Certificate and Certificate Revocation | |||
} /*container digital-signature*/ | List (CRL) Profile."; | |||
} /*container peer-authentication*/ | } | |||
} | description | |||
} | "digital-signature container."; | |||
} /*container digital-signature*/ | ||||
list conn-entry { | } /*container peer-authentication*/ | |||
key "name"; | } | |||
description | } | |||
"IKE peer connection information. This list | list conn-entry { | |||
key "name"; | ||||
description | ||||
"IKE peer connection information. This list | ||||
contains the IKE connection for this peer | contains the IKE connection for this peer | |||
with other peers. This will create in | with other peers. This will create, in | |||
real time IKE Security Associations | real time, IKE Security Associations | |||
established with these nodes."; | established with these nodes."; | |||
leaf name { | leaf name { | |||
type string; | type string; | |||
description | description | |||
"Identifier for this connection | "Identifier for this connection | |||
entry."; | entry."; | |||
} | } | |||
leaf autostartup { | leaf autostartup { | |||
type autostartup-type; | type autostartup-type; | |||
default add; | default "add"; | |||
description | description | |||
"By-default: Only add configuration | "By default, only add configuration | |||
without starting the security | without starting the security | |||
association."; | association."; | |||
} | } | |||
leaf initial-contact { | leaf initial-contact { | |||
type boolean; | type boolean; | |||
default false; | default "false"; | |||
description | description | |||
"The goal of this value is to deactivate the | "The goal of this value is to deactivate the | |||
usage of INITIAL_CONTACT notification | usage of INITIAL_CONTACT notification | |||
(true). If this flag remains to false it | (true). If this flag remains set to false, it | |||
means the usage of the INITIAL_CONTACT | means the usage of the INITIAL_CONTACT | |||
notification will depend on the IKEv2 | notification will depend on the IKEv2 | |||
implementation."; | implementation."; | |||
} | } | |||
leaf version { | leaf version { | |||
type auth-protocol-type; | type auth-protocol-type; | |||
default ikev2; | default "ikev2"; | |||
description | description | |||
"IKE version. Only version 2 is supported."; | "IKE version. Only version 2 is supported."; | |||
} | } | |||
container fragmentation { | ||||
container fragmentation { | leaf enabled { | |||
leaf enable { | type boolean; | |||
type boolean; | default "false"; | |||
default false; | description | |||
description | "Whether or not to enable IKEv2 | |||
"Whether or not to enable IKEv2 | fragmentation (true or false)."; | |||
fragmentation (true or | reference | |||
false)."; | "RFC 7383: Internet Key Exchange Protocol Version 2 | |||
reference | (IKEv2) Message Fragmentation."; | |||
"RFC 7383."; | } | |||
} | leaf mtu { | |||
leaf mtu { | when "../enabled='true'"; | |||
when "../enable='true'"; | type uint16 { | |||
type uint16 { range "68..65535"; } | range "68..65535"; | |||
description | } | |||
"MTU that IKEv2 can use | description | |||
"MTU that IKEv2 can use | ||||
for IKEv2 fragmentation."; | for IKEv2 fragmentation."; | |||
reference | reference | |||
"RFC 7383."; | "RFC 7383: Internet Key Exchange Protocol Version 2 | |||
} | (IKEv2) Message Fragmentation."; | |||
description | } | |||
"IKEv2 fragmentation as per RFC 7383. If the | description | |||
IKEv2 fragmentation is enabled it is possible | "IKEv2 fragmentation, as per RFC 7383. If the | |||
IKEv2 fragmentation is enabled, it is possible | ||||
to specify the MTU."; | to specify the MTU."; | |||
} | } | |||
container ike-sa-lifetime-soft { | ||||
container ike-sa-lifetime-soft { | description | |||
description | "IKE SA lifetime soft. Two lifetime values | |||
"IKE SA lifetime soft. Two lifetime values | ||||
can be configured: either rekey time of the | can be configured: either rekey time of the | |||
IKE SA or reauth time of the IKE SA. When | IKE SA or reauth time of the IKE SA. When | |||
the rekey lifetime expires a rekey of the | the rekey lifetime expires, a rekey of the | |||
IKE SA starts. When reauth lifetime | IKE SA starts. When reauth lifetime | |||
expires a IKE SA reauthentication starts."; | expires, an IKE SA reauthentication starts."; | |||
leaf rekey-time { | leaf rekey-time { | |||
type uint32; | type uint32; | |||
units "seconds"; | units "seconds"; | |||
default 0; | default "0"; | |||
description | description | |||
"Time in seconds between each IKE SA | "Time in seconds between each IKE SA | |||
rekey. The value 0 means infinite."; | rekey. The value 0 means infinite."; | |||
} | } | |||
leaf reauth-time { | leaf reauth-time { | |||
type uint32; | type uint32; | |||
units "seconds"; | units "seconds"; | |||
default 0; | default "0"; | |||
description | description | |||
"Time in seconds between each IKE SA | "Time in seconds between each IKE SA | |||
reauthentication. The value 0 means | reauthentication. The value 0 means | |||
infinite."; | infinite."; | |||
} | } | |||
reference | reference | |||
"Section 2.8 in RFC 7296."; | "RFC 7296: Internet Key Exchange Protocol Version 2 | |||
} | (IKEv2), Section 2.8."; | |||
container ike-sa-lifetime-hard { | } | |||
description | container ike-sa-lifetime-hard { | |||
"Hard IKE SA lifetime. When this | description | |||
time is reached the IKE SA is removed."; | "Hard IKE SA lifetime. When this | |||
leaf over-time { | time is reached, the IKE SA is removed."; | |||
type uint32; | leaf over-time { | |||
units "seconds"; | type uint32; | |||
default 0; | units "seconds"; | |||
description | default "0"; | |||
"Time in seconds before the IKE SA is | description | |||
removed. The value 0 means infinite."; | "Time in seconds before the IKE SA is | |||
} | removed. The value 0 means infinite."; | |||
reference | } | |||
"RFC 7296."; | reference | |||
} | "RFC 7296: Internet Key Exchange Protocol Version 2 | |||
leaf-list ike-sa-intr-alg { | (IKEv2)."; | |||
type nsfikec:intr-alg-t; | } | |||
default 12; | leaf-list ike-sa-intr-alg { | |||
ordered-by user; | type nsfikec:intr-alg-t; | |||
description | default "12"; | |||
"Integrity algorithm for establishing | ordered-by user; | |||
the IKE SA. This list is ordered following | description | |||
"Integrity algorithm for establishing | ||||
the IKE SA. This list is ordered following | ||||
from the higher priority to lower priority. | from the higher priority to lower priority. | |||
First node of the list will be the algorithm | The first node of the list will be the | |||
with higher priority. | algorithm with higher priority. | |||
Default value 12 (AUTH_HMAC_SHA2_256_128)"; | Default value 12 (AUTH_HMAC_SHA2_256_128)."; | |||
} | } | |||
list ike-sa-encr-alg { | list ike-sa-encr-alg { | |||
key id; | key "id"; | |||
min-elements 1; | min-elements 1; | |||
ordered-by user; | ordered-by user; | |||
leaf id { | leaf id { | |||
type uint16; | type uint16; | |||
description | description | |||
"An identifier that unequivocally | "An identifier that unequivocally | |||
identifies each entry of the list, | identifies each entry of the list, | |||
i.e., an encryption algorithm and | i.e., an encryption algorithm and | |||
its key-length (if required)"; | its key length (if required)."; | |||
} | } | |||
leaf algorithm-type { | leaf algorithm-type { | |||
type nsfikec:encr-alg-t; | type nsfikec:encr-alg-t; | |||
default 12; | default "12"; | |||
description | description | |||
"Default value 12 (ENCR_AES_CBC)"; | "Default value 12 (ENCR_AES_CBC)."; | |||
} | } | |||
leaf key-length { | leaf key-length { | |||
type uint16; | type uint16; | |||
default 128; | default "128"; | |||
description | description | |||
"By default key length is 128 bits"; | "By default, key length is 128 bits."; | |||
} | } | |||
description | description | |||
"Encryption or AEAD algorithm for the IKE | "Encryption or AEAD algorithm for the IKE | |||
SAs. This list is ordered following | SAs. This list is ordered following | |||
from the higher priority to lower priority. | from the higher priority to lower priority. | |||
First node of the list will be the algorithm | The first node of the list will be the | |||
with higher priority"; | algorithm with higher priority."; | |||
} | } | |||
leaf dh-group { | leaf dh-group { | |||
type fs-group; | type fs-group; | |||
default 14; | default "14"; | |||
description | description | |||
"Group number for Diffie-Hellman | "Group number for Diffie-Hellman | |||
Exponentiation used during IKE_SA_INIT | Exponentiation used during IKE_SA_INIT | |||
for the IKE SA key exchange."; | for the IKE SA key exchange."; | |||
} | } | |||
leaf half-open-ike-sa-timer { | leaf half-open-ike-sa-timer { | |||
type uint32; | type uint32; | |||
units "seconds"; | units "seconds"; | |||
default 0; | default "0"; | |||
description | description | |||
"Set the half-open IKE SA timeout | "Set the half-open IKE SA timeout | |||
duration. The value 0 implies infinite."; | duration. The value 0 implies infinite."; | |||
reference | reference | |||
"Section 2 in RFC 7296."; | "RFC 7296: Internet Key Exchange Protocol Version 2 | |||
} | (IKEv2), Section 2."; | |||
leaf half-open-ike-sa-cookie-threshold { | } | |||
type uint32; | leaf half-open-ike-sa-cookie-threshold { | |||
default 0; | type uint32; | |||
description | default "0"; | |||
"Number of half-open IKE SAs that activate | description | |||
the cookie mechanism. The value 0 implies | "Number of half-open IKE SAs that activate | |||
infinite." ; | the cookie mechanism. The value 0 implies | |||
reference | infinite."; | |||
"Section 2.6 in RFC 7296."; | reference | |||
} | "RFC 7296: Internet Key Exchange Protocol Version 2 | |||
container local { | (IKEv2), Section 2.6."; | |||
leaf local-pad-entry-name { | } | |||
type string; | container local { | |||
mandatory true; | leaf local-pad-entry-name { | |||
description | type string; | |||
"Local peer authentication information. | mandatory true; | |||
description | ||||
"Local peer authentication information. | ||||
This node points to a specific entry in | This node points to a specific entry in | |||
the PAD where the authorization | the PAD where the authorization | |||
information about this particular local | information about this particular local | |||
peer is stored. It MUST match a | peer is stored. It MUST match a | |||
pad-entry-name."; | pad-entry-name."; | |||
} | } | |||
description | description | |||
"Local peer authentication information."; | "Local peer authentication information."; | |||
} | } | |||
container remote { | container remote { | |||
leaf remote-pad-entry-name { | leaf remote-pad-entry-name { | |||
type string; | type string; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Remote peer authentication information. | "Remote peer authentication information. | |||
This node points to a specific entry in | This node points to a specific entry in | |||
the PAD where the authorization | the PAD where the authorization | |||
information about this particular | information about this particular | |||
remote peer is stored. It MUST match a | remote peer is stored. It MUST match a | |||
pad-entry-name."; | pad-entry-name."; | |||
} | } | |||
description | description | |||
"Remote peer authentication information."; | "Remote peer authentication information."; | |||
} | } | |||
container encapsulation-type { | container encapsulation-type { | |||
uses nsfikec:encap; | uses nsfikec:encap; | |||
description | description | |||
"This container carries configuration | "This container carries configuration | |||
information about the source and destination | information about the source and destination | |||
ports of encapsulation that IKE should use | ports of encapsulation that IKE should use | |||
and the type of encapsulation that | and the type of encapsulation that | |||
should use when NAT traversal is required. | should be used when NAT traversal is required. | |||
However, this is just a best effort since | However, this is just a best effort since | |||
the IKE implementation may need to use a | the IKE implementation may need to use a | |||
different encapsulation as | different encapsulation, as described in | |||
described in RFC 8229."; | RFC 8229."; | |||
reference | reference | |||
"RFC 8229."; | "RFC 8229: TCP Encapsulation of IKE and IPsec | |||
} | Packets."; | |||
container spd { | } | |||
description | container spd { | |||
"Configuration of the Security Policy | description | |||
Database (SPD). This main information is | "Configuration of the Security Policy | |||
Database (SPD). This main information is | ||||
placed in the grouping | placed in the grouping | |||
ipsec-policy-grouping."; | ipsec-policy-grouping."; | |||
list spd-entry { | list spd-entry { | |||
key "name"; | key "name"; | |||
ordered-by user; | ordered-by user; | |||
leaf name { | leaf name { | |||
type string; | type string; | |||
description | description | |||
"SPD entry unique name to identify | "SPD-entry-unique name to identify | |||
the IPsec policy."; | the IPsec policy."; | |||
} | } | |||
container ipsec-policy-config { | container ipsec-policy-config { | |||
description | description | |||
"This container carries the | "This container carries the | |||
configuration of a IPsec policy."; | configuration of an IPsec policy."; | |||
uses nsfikec:ipsec-policy-grouping; | uses nsfikec:ipsec-policy-grouping; | |||
} | } | |||
description | description | |||
"List of entries which will constitute | "List of entries that will constitute | |||
the representation of the SPD. In this | the representation of the SPD. In this | |||
case, since the NSF implements IKE, it | case, since the NSF implements IKE, it | |||
is only required to send a IPsec policy | is only required to send an IPsec policy | |||
from this NSF where 'local' is this NSF | from this NSF where 'local' is this NSF | |||
and 'remote' the other NSF. The IKE | and 'remote' the other NSF. The IKE | |||
implementation will install IPsec | implementation will install IPsec | |||
policies in the NSF's kernel in both | policies in the NSF's kernel in both | |||
directions (inbound and outbound) and | directions (inbound and outbound) and | |||
their corresponding IPsec SAs based on | their corresponding IPsec SAs based on | |||
the information in this SPD entry."; | the information in this SPD entry."; | |||
} | } | |||
reference | reference | |||
"Section 2.9 in RFC 7296."; | "RFC 7296: Internet Key Exchange Protocol Version 2 | |||
} | (IKEv2), Section 2.9."; | |||
container child-sa-info { | } | |||
leaf-list fs-groups { | container child-sa-info { | |||
type fs-group; | leaf-list fs-groups { | |||
default 0; | type fs-group; | |||
ordered-by user; | default "0"; | |||
description | ordered-by user; | |||
"If non-zero, forward secrecy is | description | |||
"If non-zero, forward secrecy is | ||||
required when a new IPsec SA is being | required when a new IPsec SA is being | |||
created. The (non-zero) value indicates | created, the (non-zero) value indicates | |||
the group number to use for the key | the group number to use for the key | |||
exchange process used to achieve forward | exchange process used to achieve forward | |||
secrecy. | secrecy. | |||
This list is ordered following from the | This list is ordered following from the | |||
higher priority to lower priority. First | higher priority to lower priority. The | |||
node of the list will be the algorithm | first node of the list will be the | |||
with higher priority."; | algorithm with higher priority."; | |||
} | } | |||
container child-sa-lifetime-soft { | container child-sa-lifetime-soft { | |||
description | description | |||
"Soft IPsec SA lifetime. | "Soft IPsec SA lifetime. | |||
After the lifetime the action is | After the lifetime, the action is | |||
defined in this container | defined in this container | |||
in the leaf action."; | in the leaf action."; | |||
uses nsfikec:lifetime; | uses nsfikec:lifetime; | |||
leaf action { | leaf action { | |||
type nsfikec:lifetime-action; | type nsfikec:lifetime-action; | |||
default replace; | default "replace"; | |||
description | description | |||
"When the lifetime of an IPsec SA | "When the lifetime of an IPsec SA | |||
expires an action needs to be | expires, an action needs to be | |||
performed over the IPsec SA that | performed over the IPsec SA that | |||
reached the lifetime. There are | reached the lifetime. There are | |||
three possible options: | three possible options: | |||
terminate-clear, terminate-hold and | terminate-clear, terminate-hold, and | |||
replace."; | replace."; | |||
reference | reference | |||
"Section 4.5 in RFC 4301 and Section 2.8 | "RFC 4301: Security Architecture for the Internet | |||
in RFC 7296."; | Protocol, Section 4.5 | |||
} | RFC 7296: Internet Key Exchange Protocol Version 2 | |||
} | (IKEv2), Section 2.8."; | |||
container child-sa-lifetime-hard { | } | |||
description | } | |||
"IPsec SA lifetime hard. The action will | container child-sa-lifetime-hard { | |||
description | ||||
"IPsec SA lifetime hard. The action will | ||||
be to terminate the IPsec SA."; | be to terminate the IPsec SA."; | |||
uses nsfikec:lifetime; | uses nsfikec:lifetime; | |||
reference | reference | |||
"Section 2.8 in RFC 7296."; | "RFC 7296: Internet Key Exchange Protocol Version 2 | |||
} | (IKEv2), Section 2.8."; | |||
description | } | |||
"Specific information for IPsec SAs | description | |||
SAs. It includes PFS group and IPsec SAs | "Specific information for IPsec SAs. | |||
rekey lifetimes."; | It includes the Perfect Forward Secrecy (PFS) | |||
} | group and IPsec SAs rekey lifetimes."; | |||
container state { | } | |||
config false; | container state { | |||
leaf initiator { | config false; | |||
type boolean; | leaf initiator { | |||
description | type boolean; | |||
"It is acting as initiator for this | description | |||
"It is acting as an initiator for this | ||||
connection."; | connection."; | |||
} | } | |||
leaf initiator-ikesa-spi { | leaf initiator-ikesa-spi { | |||
type ike-spi; | type ike-spi; | |||
description | description | |||
"Initiator's IKE SA SPI."; | "Initiator's IKE SA SPI."; | |||
} | } | |||
leaf responder-ikesa-spi { | leaf responder-ikesa-spi { | |||
type ike-spi; | type ike-spi; | |||
description | description | |||
"Responder's IKE SA SPI."; | "Responder's IKE SA SPI."; | |||
} | } | |||
leaf nat-local { | leaf nat-local { | |||
type boolean; | type boolean; | |||
description | description | |||
"True, if local endpoint is behind a | "True if local endpoint is behind a | |||
NAT."; | NAT."; | |||
} | } | |||
leaf nat-remote { | leaf nat-remote { | |||
type boolean; | type boolean; | |||
description | description | |||
"True, if remote endpoint is behind | "True if remote endpoint is behind | |||
a NAT."; | a NAT."; | |||
} | } | |||
container encapsulation-type { | container encapsulation-type { | |||
uses nsfikec:encap; | uses nsfikec:encap; | |||
description | description | |||
"This container provides information | "This container provides information | |||
about the source and destination | about the source and destination | |||
ports of encapsulation that IKE is | ports of encapsulation that IKE is | |||
using, and the type of encapsulation | using and the type of encapsulation | |||
when NAT traversal is required."; | when NAT traversal is required."; | |||
reference | reference | |||
"RFC 8229."; | "RFC 8229: TCP Encapsulation of IKE and IPsec Packets."; | |||
} | } | |||
leaf established { | leaf established { | |||
type uint64; | type uint64; | |||
units "seconds"; | units "seconds"; | |||
description | description | |||
"Seconds since this IKE SA has been | "Seconds since this IKE SA has been | |||
established."; | established."; | |||
} | } | |||
leaf current-rekey-time { | leaf current-rekey-time { | |||
type uint64; | type uint64; | |||
units "seconds"; | units "seconds"; | |||
description | description | |||
"Seconds before IKE SA is rekeyed."; | "Seconds before IKE SA is rekeyed."; | |||
} | } | |||
leaf current-reauth-time { | leaf current-reauth-time { | |||
type uint64; | type uint64; | |||
units "seconds"; | units "seconds"; | |||
description | description | |||
"Seconds before IKE SA is | "Seconds before IKE SA is | |||
re-authenticated."; | reauthenticated."; | |||
} | } | |||
description | description | |||
"IKE state data for a particular | "IKE state data for a particular | |||
connection."; | connection."; | |||
} /* ike-sa-state */ | } /* ike-sa-state */ | |||
} /* ike-conn-entries */ | } /* ike-conn-entries */ | |||
container number-ike-sas { | ||||
container number-ike-sas { | config false; | |||
config false; | leaf total { | |||
leaf total { | type yang:gauge64; | |||
type yang:gauge64; | description | |||
description | "Total number of active IKE SAs."; | |||
"Total number of active IKE SAs."; | } | |||
} | leaf half-open { | |||
leaf half-open { | type yang:gauge64; | |||
type yang:gauge64; | description | |||
description | "Number of half-open active IKE SAs."; | |||
"Number of half-open active IKE SAs."; | } | |||
} | leaf half-open-cookies { | |||
leaf half-open-cookies { | type yang:gauge64; | |||
type yang:gauge64; | description | |||
description | "Number of half-open active IKE SAs with | |||
"Number of half open active IKE SAs with | ||||
cookie activated."; | cookie activated."; | |||
} | } | |||
description | description | |||
"General information about the IKE SAs. In | "General information about the IKE SAs. In | |||
particular, it provides the current number of | particular, it provides the current number of | |||
IKE SAs."; | IKE SAs."; | |||
} | } | |||
} /* container ipsec-ike */ | } /* container ipsec-ike */ | |||
} | } | |||
]]></sourcecode> | ||||
<CODE ENDS> | </section> | |||
</section> | ||||
]]> | <section anchor="ike-less-model" numbered="true" toc="default"> | |||
<name>The 'ietf-i2nsf-ikeless' Module</name> | ||||
</artwork> | <t>In this section, the YANG module for the IKE-less case is described.< | |||
</figure> | /t> | |||
</t> | <section anchor="ikeless-overview" numbered="true" toc="default"> | |||
<name>Data Model Overview</name> | ||||
</section> | <t> For this case, the definition of the SPD model has been | |||
mainly extracted from the specification in Section | ||||
</section> | <xref target="RFC4301" section="4.4.1" sectionFormat="ba | |||
re"/> and Appendix <xref target="RFC4301" section="D" sectionFormat="bare"/> in | ||||
<section anchor="ike-less-model" title="The 'ietf-i2nsf-ikeless' | <xref target="RFC4301" format="default"/>, | |||
Module "> | ||||
<t>In this section, the YANG module for the IKE-less case is d | ||||
escribed.</t> | ||||
<section anchor="ikeless-overview" title="Data model overview" | ||||
> | ||||
<t> For this case, the definition of the SPD model has been | ||||
mainly extracted from the specification in section | ||||
4.4.1 and Appendix D in <xref target="RFC4301"/>, | ||||
though with some changes, namely:</t> | though with some changes, namely:</t> | |||
<t> | <ul spacing="normal"> | |||
<list style="symbols"> | <li>For simplicity, each IPsec policy (spd-entry) contains one | |||
<t>For simplicity, each IPsec policy (spd-entry) con | Traffic Selector, instead of a list of them. The | |||
tains one | ||||
traffic selector, instead of a list of them. The | ||||
reason is that actual kernel | reason is that actual kernel | |||
implementations only admit a single traffic | implementations only admit a single Traffic | |||
selector per IPsec policy.</t> | Selector per IPsec policy.</li> | |||
<t>Each IPsec policy contains an identifier (reqid) | <li>Each IPsec policy contains an identifier (reqid) | |||
to relate the policy with the IPsec SA. This is | to relate the policy with the IPsec SA. This is | |||
common in Linux-based systems.</t> | common in Linux-based systems.</li> | |||
<t>Each IPsec policy has only one name and not a | <li>Each IPsec policy has only one name and not a | |||
list of names.</t> | list of names.</li> | |||
<t>Combined algorithms have been removed because | <li>Combined algorithms have been removed because | |||
encryption algorithms MAY include authenticated | encryption algorithms <bcp14>MAY</bcp14> include Aut | |||
encryption with associated data (AEAD).</t> | henticated | |||
<t>Tunnel information has been extended | Encryption with Associated Data (AEAD).</li> | |||
<li>Tunnel information has been extended | ||||
with information about DSCP mapping. | with information about DSCP mapping. | |||
The reason is that certain kernel | The reason is that certain kernel | |||
implementations accept configuration of | implementations accept configuration of | |||
these values.</t> | these values.</li> | |||
</list> | </ul> | |||
</t> | <t>The definition of the SAD model has been mainly | |||
extracted from the specification in | ||||
<t>The definition of the SAD model has been mainly | <xref target="RFC4301" sectionFormat="of" section="4.4.2"/>, | |||
extracted from the specification in section 4.4.2 in | though with some changes, namely:</t> | |||
<xref target="RFC4301"/> though with some changes, | <ul spacing="normal"> | |||
namely:</t> | <li>For simplicity, each IPsec SA | |||
<t> | (sad-entry) contains one Traffic | |||
<list style="symbols"> | Selector, instead of a list of them. The | |||
<t>For simplicity, each IPsec SA | ||||
(sad-entry) contains one traffic | ||||
selector, instead of a list of them. The | ||||
reason is that actual kernel | reason is that actual kernel | |||
implementations | implementations | |||
only admit a single traffic selector per | only admit a single Traffic Selector per | |||
IPsec SA.</t> | IPsec SA.</li> | |||
<li>Each IPsec SA contains an identifier (reqid) to | ||||
<t>Each IPsec SA contains a identifier (reqid) to | relate the IPsec SA with the IPsec policy. The reaso | |||
relate the IPsec SA with the IPsec Policy. The reaso | n | |||
n | is that real kernel implementations allow | |||
is that real kernel implementations allow to include | this value to be included.</li> | |||
this value.</t> | <li>Each IPsec SA is also named in the same way as | |||
IPsec policies.</li> | ||||
<t>Each IPsec SA has also a name in the same way as | <li>The model allows specifying the | |||
IPsec policies.</t> | algorithm for encryption. This can be | |||
<t>The model allows specifying the | ||||
algorithm for encryption. This can be an | ||||
Authenticated Encryption with Associated | Authenticated Encryption with Associated | |||
Data (AEAD) or non-AEAD. If an AEAD is | Data (AEAD) or non-AEAD. If an AEAD algorithm is | |||
specified the integrity algorithm is not | specified, the integrity algorithm is not | |||
required. If an non-AEAD algorithm is | required. If a non-AEAD algorithm is | |||
specified the integrity algorithm is | specified, the integrity algorithm is | |||
required <xref target="RFC8221"/>.</t> | required <xref target="RFC8221" format="default"/>.< | |||
/li> | ||||
<t>Tunnel information has been extended | <li>Tunnel information has been extended | |||
with information about Differentiated | with information about Differentiated | |||
Services Code Point (DSCP) mapping. It | Services Code Point (DSCP) mapping. It | |||
is assumed that | is assumed that | |||
NSFs involved in this document provide | NSFs involved in this document provide | |||
ECN full-functionality to prevent | ECN full functionality to prevent | |||
discarding of ECN congestion | discarding of ECN congestion | |||
indications <xref target="RFC6040"/>.</t> | indications <xref target="RFC6040" format="default"/ | |||
>.</li> | ||||
<t>Lifetime of the IPsec SAs also | <li>The lifetime of the IPsec SAs also | |||
include idle time | includes idle time | |||
and number of IP packets as threshold to trigger | and the number of IP packets as a threshold to trigg | |||
er | ||||
the lifetime. The reason is that | the lifetime. The reason is that | |||
actual kernel implementations allow to set these | actual kernel implementations allow for setting thes | |||
types of lifetimes.</t> | e | |||
types of lifetimes.</li> | ||||
<t>Information to configure the type of | <li>Information to configure the type of | |||
encapsulation (encapsulation-type) for IPsec ESP | encapsulation (encapsulation-type) for IPsec ESP | |||
packets in UDP (<xref target="RFC3948"/>), | packets in UDP <xref target="RFC3948" format="defaul | |||
or TCP (<xref target="RFC8229"/>) has been included. | t"/> | |||
</t> | or TCP <xref target="RFC8229" format="default"/> has | |||
</list> | been included.</li> | |||
</t> | </ul> | |||
<!--In other words, each traffic selector of a policy | <t> The notifications model has been defined using, as | |||
(spd-entry) generates a different IPsec SA (sad-entry). --> | reference, the PF_KEYv2 specification in | |||
<t> The notifications model has been defined using as | <xref target="RFC2367" format="default"/>.</t> | |||
reference the PF_KEYv2 specification in | <t> The YANG data model for the IKE-less case is defined by the module | |||
<xref target="RFC2367"/>.</t> | "ietf-i2nsf-ikeless". Its structure is depicted in the following diagram, using | |||
the notation syntax for YANG tree diagrams <xref target="RFC8340" format="defau | ||||
<t> The YANG data model for the IKE-less case is defined by | lt"/>. | |||
the module "ietf-i2nsf-ikeless". Its structure is depicted in the following diag | </t> | |||
ram, using the notation syntax for YANG tree diagrams (<xref target="RFC8340"/>) | <sourcecode type="yangtree"><![CDATA[ | |||
. | ||||
</t> | ||||
<t> | ||||
<figure> | ||||
<artwork> | ||||
<![CDATA[ | ||||
module: ietf-i2nsf-ikeless | module: ietf-i2nsf-ikeless | |||
+--rw ipsec-ikeless | +--rw ipsec-ikeless | |||
+--rw spd | +--rw spd | |||
| +--rw spd-entry* [name] | | +--rw spd-entry* [name] | |||
| +--rw name string | | +--rw name string | |||
| +--rw direction nsfikec:ipsec-traffic-direction | | +--rw direction nsfikec:ipsec-traffic-direction | |||
| +--rw reqid? uint64 | | +--rw reqid? uint64 | |||
| +--rw ipsec-policy-config | | +--rw ipsec-policy-config | |||
| +--rw anti-replay-window-size? uint32 | | +--rw anti-replay-window-size? uint32 | |||
| +--rw traffic-selector | | +--rw traffic-selector | |||
| | +--rw local-prefix inet:ip-prefix | | | +--rw local-prefix inet:ip-prefix | |||
| | +--rw remote-prefix inet:ip-prefix | | | +--rw remote-prefix inet:ip-prefix | |||
| | +--rw inner-protocol? ipsec-inner-protocol | | | +--rw inner-protocol? ipsec-inner-protocol | |||
| | +--rw local-ports* [start end] | | | +--rw local-ports* [start end] | |||
| | | +--rw start inet:port-number | | | | +--rw start inet:port-number | |||
| | | +--rw end inet:port-number | | | | +--rw end inet:port-number | |||
| | +--rw remote-ports* [start end] | | | +--rw remote-ports* [start end] | |||
| | +--rw start inet:port-number | | | +--rw start inet:port-number | |||
| | +--rw end inet:port-number | | | +--rw end inet:port-number | |||
| +--rw processing-info | | +--rw processing-info | |||
| +--rw action? ipsec-spd-action | | +--rw action? ipsec-spd-action | |||
| +--rw ipsec-sa-cfg | | +--rw ipsec-sa-cfg | |||
| +--rw pfp-flag? boolean | | +--rw pfp-flag? boolean | |||
| +--rw ext-seq-num? boolean | | +--rw ext-seq-num? boolean | |||
| +--rw seq-overflow? boolean | | +--rw seq-overflow? boolean | |||
| +--rw stateful-frag-check? boolean | | +--rw stateful-frag-check? boolean | |||
| +--rw mode? ipsec-mode | | +--rw mode? ipsec-mode | |||
| +--rw protocol-parameters? ipsec-protocol-parameters | | +--rw protocol-parameters? ipsec-protocol-params | |||
| +--rw esp-algorithms | | +--rw esp-algorithms | |||
| | +--rw integrity* intr-alg-t | | | +--rw integrity* intr-alg-t | |||
| | +--rw encryption* [id] | | | +--rw encryption* [id] | |||
| | | +--rw id uint16 | | | | +--rw id uint16 | |||
| | | +--rw algorithm-type? encr-alg-t | | | | +--rw algorithm-type? encr-alg-t | |||
| | | +--rw key-length? uint16 | | | | +--rw key-length? uint16 | |||
| | +--rw tfc-pad? boolean | | | +--rw tfc-pad? boolean | |||
| +--rw tunnel | | +--rw tunnel | |||
| +--rw local inet:ip-address | | +--rw local inet:ip-address | |||
| +--rw remote inet:ip-address | | +--rw remote inet:ip-address | |||
| +--rw df-bit? enumeration | | +--rw df-bit? enumeration | |||
| +--rw bypass-dscp? boolean | | +--rw bypass-dscp? boolean | |||
| +--rw dscp-mapping* [id] | | +--rw dscp-mapping* [id] | |||
| +--rw id uint8 | | +--rw id uint8 | |||
| +--rw inner-dscp? inet:dscp | | +--rw inner-dscp? inet:dscp | |||
| +--rw outer-dscp? inet:dscp | | +--rw outer-dscp? inet:dscp | |||
+--rw sad | +--rw sad | |||
+--rw sad-entry* [name] | +--rw sad-entry* [name] | |||
+--rw name string | +--rw name string | |||
+--rw reqid? uint64 | +--rw reqid? uint64 | |||
+--rw ipsec-sa-config | +--rw ipsec-sa-config | |||
| +--rw spi uint32 | | +--rw spi uint32 | |||
| +--rw ext-seq-num? boolean | | +--rw ext-seq-num? boolean | |||
| +--rw seq-overflow? boolean | | +--rw seq-overflow? boolean | |||
| +--rw anti-replay-window-size? uint32 | | +--rw anti-replay-window-size? uint32 | |||
| +--rw traffic-selector | | +--rw traffic-selector | |||
| | +--rw local-prefix inet:ip-prefix | | | +--rw local-prefix inet:ip-prefix | |||
| | +--rw remote-prefix inet:ip-prefix | | | +--rw remote-prefix inet:ip-prefix | |||
| | +--rw inner-protocol? ipsec-inner-protocol | | | +--rw inner-protocol? ipsec-inner-protocol | |||
| | +--rw local-ports* [start end] | | | +--rw local-ports* [start end] | |||
| | | +--rw start inet:port-number | | | | +--rw start inet:port-number | |||
| | | +--rw end inet:port-number | | | | +--rw end inet:port-number | |||
| | +--rw remote-ports* [start end] | | | +--rw remote-ports* [start end] | |||
| | +--rw start inet:port-number | | | +--rw start inet:port-number | |||
| | +--rw end inet:port-number | | | +--rw end inet:port-number | |||
| +--rw protocol-parameters? nsfikec:ipsec-protocol-parameters | | +--rw protocol-parameters? nsfikec:ipsec-protocol-params | |||
| +--rw mode? nsfikec:ipsec-mode | | +--rw mode? nsfikec:ipsec-mode | |||
| +--rw esp-sa | | +--rw esp-sa | |||
| | +--rw encryption | | | +--rw encryption | |||
| | | +--rw encryption-algorithm? nsfikec:encr-alg-t | | | | +--rw encryption-algorithm? nsfikec:encr-alg-t | |||
| | | +--rw key? yang:hex-string | | | | +--rw key? yang:hex-string | |||
| | | +--rw iv? yang:hex-string | | | | +--rw iv? yang:hex-string | |||
| | +--rw integrity | | | +--rw integrity | |||
| | +--rw integrity-algorithm? nsfikec:intr-alg-t | | | +--rw integrity-algorithm? nsfikec:intr-alg-t | |||
| | +--rw key? yang:hex-string | | | +--rw key? yang:hex-string | |||
| +--rw sa-lifetime-hard | | +--rw sa-lifetime-hard | |||
| | +--rw time? uint32 | | | +--rw time? uint32 | |||
| | +--rw bytes? yang:counter64 | | | +--rw bytes? yang:counter64 | |||
| | +--rw packets? uint32 | | | +--rw packets? uint32 | |||
| | +--rw idle? uint32 | | | +--rw idle? uint32 | |||
| +--rw sa-lifetime-soft | | +--rw sa-lifetime-soft | |||
| | +--rw time? uint32 | | | +--rw time? uint32 | |||
| | +--rw bytes? yang:counter64 | | | +--rw bytes? yang:counter64 | |||
| | +--rw packets? uint32 | | | +--rw packets? uint32 | |||
| | +--rw idle? uint32 | | | +--rw idle? uint32 | |||
| | +--rw action? nsfikec:lifetime-action | | | +--rw action? nsfikec:lifetime-action | |||
| +--rw tunnel | | +--rw tunnel | |||
| | +--rw local inet:ip-address | | | +--rw local inet:ip-address | |||
| | +--rw remote inet:ip-address | | | +--rw remote inet:ip-address | |||
| | +--rw df-bit? enumeration | | | +--rw df-bit? enumeration | |||
| | +--rw bypass-dscp? boolean | | | +--rw bypass-dscp? boolean | |||
| | +--rw dscp-mapping* [id] | | | +--rw dscp-mapping* [id] | |||
| | | +--rw id uint8 | | | | +--rw id uint8 | |||
| | | +--rw inner-dscp? inet:dscp | | | | +--rw inner-dscp? inet:dscp | |||
| | | +--rw outer-dscp? inet:dscp | | | | +--rw outer-dscp? inet:dscp | |||
| | +--rw dscp-values* inet:dscp | | | +--rw dscp-values* inet:dscp | |||
| +--rw encapsulation-type | | +--rw encapsulation-type | |||
| +--rw espencap? esp-encap | | +--rw espencap? esp-encap | |||
| +--rw sport? inet:port-number | | +--rw sport? inet:port-number | |||
| +--rw dport? inet:port-number | | +--rw dport? inet:port-number | |||
| +--rw oaddr* inet:ip-address | | +--rw oaddr* inet:ip-address | |||
+--ro ipsec-sa-state | +--ro ipsec-sa-state | |||
+--ro sa-lifetime-current | +--ro sa-lifetime-current | |||
| +--ro time? uint32 | | +--ro time? uint32 | |||
| +--ro bytes? yang:counter64 | | +--ro bytes? yang:counter64 | |||
| +--ro packets? uint32 | | +--ro packets? uint32 | |||
| +--ro idle? uint32 | | +--ro idle? uint32 | |||
+--ro replay-stats | +--ro replay-stats | |||
+--ro replay-window | +--ro replay-window | |||
| +--ro w? uint32 | | +--ro w? uint32 | |||
| +--ro t? uint64 | | +--ro t? uint64 | |||
| +--ro b? uint64 | | +--ro b? uint64 | |||
+--ro packet-dropped? yang:counter64 | +--ro packet-dropped? yang:counter64 | |||
+--ro failed? yang:counter64 | +--ro failed? yang:counter64 | |||
+--ro seq-number-counter? uint64 | +--ro seq-number-counter? uint64 | |||
notifications: | ||||
+---n sadb-acquire {ikeless-notification}? | ||||
| +--ro ipsec-policy-name string | ||||
| +--ro traffic-selector | ||||
| +--ro local-prefix inet:ip-prefix | ||||
| +--ro remote-prefix inet:ip-prefix | ||||
| +--ro inner-protocol? ipsec-inner-protocol | ||||
| +--ro local-ports* [start end] | ||||
| | +--ro start inet:port-number | ||||
| | +--ro end inet:port-number | ||||
| +--ro remote-ports* [start end] | ||||
| +--ro start inet:port-number | ||||
| +--ro end inet:port-number | ||||
+---n sadb-expire {ikeless-notification}? | ||||
| +--ro ipsec-sa-name string | ||||
| +--ro soft-lifetime-expire? boolean | ||||
| +--ro lifetime-current | ||||
| +--ro time? uint32 | ||||
| +--ro bytes? yang:counter64 | ||||
| +--ro packets? uint32 | ||||
| +--ro idle? uint32 | ||||
+---n sadb-seq-overflow {ikeless-notification}? | ||||
| +--ro ipsec-sa-name string | ||||
+---n sadb-bad-spi {ikeless-notification}? | ||||
+--ro spi uint32 | ||||
]]> | ||||
</artwork> | ||||
</figure> | ||||
</t> | ||||
<t> The YANG data model consists of a unique | notifications: | |||
"ipsec-ikeless" container which, in turn, is | +---n sadb-acquire {ikeless-notification}? | |||
| +--ro ipsec-policy-name string | ||||
| +--ro traffic-selector | ||||
| +--ro local-prefix inet:ip-prefix | ||||
| +--ro remote-prefix inet:ip-prefix | ||||
| +--ro inner-protocol? ipsec-inner-protocol | ||||
| +--ro local-ports* [start end] | ||||
| | +--ro start inet:port-number | ||||
| | +--ro end inet:port-number | ||||
| +--ro remote-ports* [start end] | ||||
| +--ro start inet:port-number | ||||
| +--ro end inet:port-number | ||||
+---n sadb-expire {ikeless-notification}? | ||||
| +--ro ipsec-sa-name string | ||||
| +--ro soft-lifetime-expire? boolean | ||||
| +--ro lifetime-current | ||||
| +--ro time? uint32 | ||||
| +--ro bytes? yang:counter64 | ||||
| +--ro packets? uint32 | ||||
| +--ro idle? uint32 | ||||
+---n sadb-seq-overflow {ikeless-notification}? | ||||
| +--ro ipsec-sa-name string | ||||
+---n sadb-bad-spi {ikeless-notification}? | ||||
+--ro spi uint32 | ||||
]]></sourcecode> | ||||
<t> The YANG data model consists of a unique | ||||
"ipsec-ikeless" container, which, in turn, is | ||||
composed of two additional containers: "spd" and | composed of two additional containers: "spd" and | |||
"sad". The "spd" container consists of a list of | "sad". The "spd" container consists of a list of | |||
entries that form the Security Policy Database. | entries that form the Security Policy Database. | |||
Compared to the IKE case YANG data model, this | Compared to the IKE case YANG data model, this | |||
part specifies a few additional parameters | part specifies a few additional parameters | |||
necessary due to the absence of an IKE software | necessary due to the absence of an IKE software | |||
in the NSF: traffic direction to apply the IPsec | in the NSF: traffic direction to apply the IPsec | |||
policy, and a "reqid" value to link an IPsec | policy and a "reqid" value to link an IPsec | |||
policy with its associated IPsec SAs since it is | policy with its associated IPsec SAs since it is | |||
otherwise a little hard to find by searching. | otherwise a little hard to find by searching. | |||
The "sad" container is a list of entries that form the Secur | The "sad" container is a list of entries that form the Secur | |||
ity Association Database. In general, each entry allows specifying both configur | ity Association Database. In general, each entry allows specifying both configur | |||
ation information (SPI, traffic selectors, tunnel/transport mode, cryptographic | ation information (SPI, Traffic Selectors, tunnel/transport mode, cryptographic | |||
algorithms and keying material, soft/hard lifetimes, etc.) as well as state info | algorithms and keying material, soft/hard lifetimes, etc.) as well as stating in | |||
rmation (time to expire, replay statistics, etc.) of a concrete IPsec SA. | formation (time to expire, replay statistics, etc.) of a concrete IPsec SA. | |||
</t> | </t> | |||
<t>In addition, the module defines a set of notifications to allow | ||||
<t> | the NSF to inform the I2NSF Controller about relevant events, such | |||
In addition, the module defines a set of notifications to al | as IPsec SA expiration, sequence number overflow, or bad SPI in a recei | |||
low the NSF inform I2NSF controller about relevant events such as IPsec SA expir | ved packet. | |||
ation, sequence number overflow or bad SPI in a received packet. | </t> | |||
</t> | </section> | |||
<section anchor="ikeless-examples" numbered="true" toc="default"> | ||||
</section> | <name>Example Usage</name> | |||
<section anchor="ikeless-examples" title="Example Usage"> | <t> | |||
<t> | <xref target="appendix-e" format="default"/> shows an ex | |||
<xref target="appendix-e"/> shows an example | ample | |||
of IKE-less case configuration for a NSF, in | of an IKE-less case configuration for an NSF in | |||
transport mode (host-to-host). Additionally, | transport mode (host-to-host). Additionally, | |||
<xref target="appendix-f"/> shows examples | <xref target="appendix-f" format="default"/> shows examp les | |||
of IPsec SA expire, acquire, sequence number | of IPsec SA expire, acquire, sequence number | |||
overflow and bad SPI notifications. | overflow, and bad SPI notifications. | |||
</t> | </t> | |||
</section> | ||||
</section> | <section anchor="ikeless-module" numbered="true" toc="default"> | |||
<section anchor="ikeless-module" title="YANG Module"> | <name>YANG Module</name> | |||
<t> | <t> | |||
This YANG module has normative references to | This YANG module has normative references to | |||
<xref target="RFC4301"/>, | <xref target="RFC4301" format="default"/>, | |||
<xref target="RFC6991"/>, | <xref target="RFC4303" format="default"/>, | |||
<xref target="RFC8174"/> and | <xref target="RFC6991" format="default"/>, | |||
<xref target="RFC8341"/>. | <xref target="RFC8174" format="default"/> and | |||
</t> | <xref target="RFC8341" format="default"/>. | |||
</t> | ||||
<t> | <sourcecode name="ietf-i2nsf-ikeless@2021-06-09.yang" type="yang" markers="true" | |||
<figure> | ><![CDATA[ | |||
<artwork> | ||||
<![CDATA[ | ||||
<CODE BEGINS> file "ietf-i2nsf-ikeless@2021-03-18.yang" | ||||
module ietf-i2nsf-ikeless { | ||||
yang-version 1.1; | ||||
namespace "urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless"; | ||||
prefix "nsfikels"; | ||||
import ietf-inet-types { | ||||
prefix inet; | ||||
reference "RFC 6991: Common YANG Data Types"; | ||||
} | ||||
import ietf-yang-types { | ||||
prefix yang; | ||||
reference "RFC 6991: Common YANG Data Types"; | ||||
} | ||||
import ietf-i2nsf-ikec { | ||||
prefix nsfikec; | ||||
reference | ||||
"RFC XXXX: Software-Defined Networking | ||||
(SDN)-based IPsec Flow Protection."; | ||||
} | ||||
import ietf-netconf-acm { | ||||
prefix nacm; | ||||
reference | ||||
"RFC 8341: Network Configuration Access Control | ||||
Model."; | ||||
} | ||||
organization "IETF I2NSF Working Group"; | module ietf-i2nsf-ikeless { | |||
yang-version 1.1; | ||||
namespace "urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless"; | ||||
prefix nsfikels; | ||||
contact | import ietf-inet-types { | |||
"WG Web: <https://datatracker.ietf.org/wg/i2nsf/> | prefix inet; | |||
WG List: <mailto:i2nsf@ietf.org> | reference | |||
"RFC 6991: Common YANG Data Types."; | ||||
} | ||||
import ietf-yang-types { | ||||
prefix yang; | ||||
reference | ||||
"RFC 6991: Common YANG Data Types."; | ||||
} | ||||
import ietf-i2nsf-ikec { | ||||
prefix nsfikec; | ||||
reference | ||||
"RFC 9061: A YANG Data Model for IPsec Flow Protection | ||||
Based on Software-Defined Networking (SDN)."; | ||||
} | ||||
import ietf-netconf-acm { | ||||
prefix nacm; | ||||
reference | ||||
"RFC 8341: Network Configuration Access Control | ||||
Model."; | ||||
} | ||||
Author: Rafael Marin-Lopez | organization | |||
<mailto:rafa@um.es> | "IETF I2NSF Working Group"; | |||
contact | ||||
"WG Web: <https://datatracker.ietf.org/wg/i2nsf/> | ||||
WG List: <mailto:i2nsf@ietf.org> | ||||
Author: Gabriel Lopez-Millan | Author: Rafael Marin-Lopez | |||
<mailto:gabilm@um.es> | <mailto:rafa@um.es> | |||
Author: Fernando Pereniguez-Garcia | Author: Gabriel Lopez-Millan | |||
<mailto:fernando.pereniguez@cud.upct.es> | <mailto:gabilm@um.es> | |||
"; | ||||
description | Author: Fernando Pereniguez-Garcia | |||
"Data model for IKE-less case in the SDN-base IPsec flow | <mailto:fernando.pereniguez@cud.upct.es> | |||
"; | ||||
description | ||||
"Data model for IKE-less case in the SDN-based IPsec flow | ||||
protection service. | protection service. | |||
Copyright (c) 2020 IETF Trust and the persons | ||||
identified as authors of the code. All rights reserved. | ||||
Redistribution and use in source and binary forms, with | ||||
or without modification, is permitted pursuant to, and | ||||
subject to the license terms contained in, the | ||||
Simplified BSD License set forth in Section 4.c of the | ||||
IETF Trust's Legal Provisions Relating to IETF Documents | ||||
(https://trustee.ietf.org/license-info). | ||||
This version of this YANG module is part of RFC XXXX;; | ||||
see the RFC itself for full legal notices. | ||||
The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', | The key words 'MUST', 'MUST NOT', 'REQUIRED', 'SHALL', | |||
'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', | 'SHALL NOT', 'SHOULD', 'SHOULD NOT', 'RECOMMENDED', | |||
'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this | 'NOT RECOMMENDED', 'MAY', and 'OPTIONAL' in this | |||
document are to be interpreted as described in BCP 14 | document are to be interpreted as described in BCP 14 | |||
(RFC 2119) (RFC 8174) when, and only when, they appear | (RFC 2119) (RFC 8174) when, and only when, they appear | |||
in all capitals, as shown here."; | in all capitals, as shown here. | |||
revision "2021-03-18" { | Copyright (c) 2021 IETF Trust and the persons | |||
description "Initial version."; | identified as authors of the code. All rights reserved. | |||
reference | ||||
"RFC XXXX: Software-Defined Networking | ||||
(SDN)-based IPsec Flow Protection."; | ||||
} | ||||
feature ikeless-notification { | Redistribution and use in source and binary forms, with or | |||
description | without modification, is permitted pursuant to, and subject | |||
"This feature indicates that the server supports | to the license terms contained in, the Simplified BSD License | |||
set forth in Section 4.c of the IETF Trust's Legal Provisions | ||||
Relating to IETF Documents | ||||
(https://trustee.ietf.org/license-info). | ||||
This version of this YANG module is part of RFC 9061; see | ||||
the RFC itself for full legal notices."; | ||||
revision 2021-06-09 { | ||||
description | ||||
"Initial version."; | ||||
reference | ||||
"RFC 9061: A YANG Data Model for IPsec Flow Protection | ||||
Based on Software-Defined Networking (SDN)."; | ||||
} | ||||
feature ikeless-notification { | ||||
description | ||||
"This feature indicates that the server supports | ||||
generating notifications in the ikeless module. | generating notifications in the ikeless module. | |||
To ensure broader applicability of this module, | To ensure broader applicability of this module, | |||
the notifications are marked as a feature. | the notifications are marked as a feature. | |||
For the implementation of ikeless case, | For the implementation of the IKE-less case, | |||
the NSF is expected to implement this | the NSF is expected to implement this | |||
feature."; | feature."; | |||
} | } | |||
container ipsec-ikeless { | container ipsec-ikeless { | |||
description | description | |||
"Container for configuration of the IKE-less | "Container for configuration of the IKE-less | |||
case. The container contains two additional | case. The container contains two additional | |||
containers: 'spd' and 'sad'. The first allows the | containers: 'spd' and 'sad'. The first allows the | |||
I2NSF Controller to configure IPsec policies in | I2NSF Controller to configure IPsec policies in | |||
the Security Policy Database SPD, and the second | the Security Policy Database (SPD), and the second | |||
allows to configure IPsec Security Associations | allows the I2NSF Controller to configure IPsec | |||
(IPsec SAs) in the Security Association Database | Security Associations (IPsec SAs) in the Security | |||
(SAD)."; | Association Database (SAD)."; | |||
reference "RFC 4301."; | reference | |||
"RFC 4301: Security Architecture for the Internet Protocol."; | ||||
container spd { | container spd { | |||
description | description | |||
"Configuration of the Security Policy Database | "Configuration of the Security Policy Database | |||
(SPD.)"; | (SPD)."; | |||
reference "Section 4.4.1.2 in RFC 4301."; | reference | |||
"RFC 4301: Security Architecture for the Internet Protocol, | ||||
list spd-entry { | Section 4.4.1.2."; | |||
key "name"; | list spd-entry { | |||
ordered-by user; | key "name"; | |||
leaf name { | ordered-by user; | |||
type string; | leaf name { | |||
description | type string; | |||
"SPD entry unique name to identify this | description | |||
"SPD-entry-unique name to identify this | ||||
entry."; | entry."; | |||
} | } | |||
leaf direction { | leaf direction { | |||
type nsfikec:ipsec-traffic-direction; | type nsfikec:ipsec-traffic-direction; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"Inbound traffic or outbound | "Inbound traffic or outbound | |||
traffic. In the IKE-less case the | traffic. In the IKE-less case, the | |||
I2NSF Controller needs to | I2NSF Controller needs to | |||
specify the policy direction to be | specify the policy direction to be | |||
applied in the NSF. In the IKE case | applied in the NSF. In the IKE case, | |||
this direction does not need to be | this direction does not need to be | |||
specified since IKE | specified, since IKE | |||
will determine the direction that | will determine the direction that the | |||
IPsec policy will require."; | IPsec policy will require."; | |||
} | } | |||
leaf reqid { | leaf reqid { | |||
type uint64; | type uint64; | |||
default 0; | default "0"; | |||
description | description | |||
"This value allows to link this | "This value allows linking this | |||
IPsec policy with IPsec SAs with the | IPsec policy with IPsec SAs with the | |||
same reqid. It is only required in | same reqid. It is only required in | |||
the IKE-less model since, in the IKE | the IKE-less model since, in the IKE | |||
case this link is handled internally | case, this link is handled internally | |||
by IKE."; | by IKE."; | |||
} | } | |||
container ipsec-policy-config { | ||||
container ipsec-policy-config { | description | |||
description | "This container carries the | |||
"This container carries the | configuration of an IPsec policy."; | |||
configuration of a IPsec policy."; | uses nsfikec:ipsec-policy-grouping; | |||
uses nsfikec:ipsec-policy-grouping; | } | |||
} | description | |||
description | "The SPD is represented as a list of SPD | |||
"The SPD is represented as a list of SPD | ||||
entries, where each SPD entry represents an | entries, where each SPD entry represents an | |||
IPsec policy."; | IPsec policy."; | |||
} /*list spd-entry*/ | } /*list spd-entry*/ | |||
} /*container spd*/ | } /*container spd*/ | |||
container sad { | ||||
container sad { | description | |||
description | "Configuration of the IPsec Security Association | |||
"Configuration of the IPsec Security Association | Database (SAD)."; | |||
Database (SAD)"; | reference | |||
reference "Section 4.4.2.1 in RFC 4301."; | "RFC 4301: Security Architecture for the Internet Protocol, | |||
Section 4.4.2.1."; | ||||
list sad-entry { | list sad-entry { | |||
key "name"; | key "name"; | |||
ordered-by user; | ordered-by user; | |||
leaf name { | leaf name { | |||
type string; | type string; | |||
description | description | |||
"SAD entry unique name to identify this | "SAD-entry-unique name to identify this | |||
entry."; | entry."; | |||
} | } | |||
leaf reqid { | leaf reqid { | |||
type uint64; | type uint64; | |||
default 0; | default "0"; | |||
description | description | |||
"This value allows to link this | "This value allows linking this | |||
IPsec SA with an IPsec policy with | IPsec SA with an IPsec policy with | |||
the same reqid."; | the same reqid."; | |||
} | } | |||
container ipsec-sa-config { | ||||
container ipsec-sa-config { | description | |||
description | "This container allows configuring | |||
"This container allows configuring | ||||
details of an IPsec SA."; | details of an IPsec SA."; | |||
leaf spi { | leaf spi { | |||
type uint32 { range "0..max"; } | type uint32 { | |||
mandatory true; | range "0..max"; | |||
description | } | |||
"Security Parameter Index (SPI)'s | mandatory true; | |||
IPsec SA."; | description | |||
} | "IPsec SA of Security Parameter Index (SPI)."; | |||
} | ||||
leaf ext-seq-num { | leaf ext-seq-num { | |||
type boolean; | type boolean; | |||
default true; | default "true"; | |||
description | description | |||
"True if this IPsec SA is using extended | "True if this IPsec SA is using extended | |||
sequence numbers. If true, the 64-bit | sequence numbers. If true, the 64-bit | |||
extended sequence number counter is used; | extended sequence number counter is used; | |||
if false, the normal 32-bit sequence | if false, the normal 32-bit sequence | |||
number counter is used."; | number counter is used."; | |||
} | } | |||
leaf seq-overflow { | ||||
leaf seq-overflow { | type boolean; | |||
type boolean; | default "false"; | |||
default false; | description | |||
description | "The flag indicating whether | |||
"The flag indicating whether | ||||
overflow of the sequence number | overflow of the sequence number | |||
counter should prevent transmission | counter should prevent transmission | |||
of additional packets on the IPsec | of additional packets on the IPsec | |||
SA (false) and, therefore needs to | SA (false) and, therefore, needs to | |||
be rekeyed, or whether rollover is | be rekeyed or whether rollover is | |||
permitted (true). If Authenticated | permitted (true). If Authenticated | |||
Encryption with Associated Data | Encryption with Associated Data | |||
(AEAD) is used (leaf | (AEAD) is used (leaf | |||
esp-algorithms/encryption/algorithm-type) | esp-algorithms/encryption/algorithm-type), | |||
this flag MUST BE false. Setting this | this flag MUST BE false. Setting this | |||
flag to true is strongly discouraged."; | flag to true is strongly discouraged."; | |||
} | } | |||
leaf anti-replay-window-size { | leaf anti-replay-window-size { | |||
type uint32; | type uint32; | |||
default 64; | default "64"; | |||
description | description | |||
"To set the anti-replay window size. | "To set the anti-replay window size. | |||
The default value is set to 64 | The default value is set to 64, | |||
following RFC 4303 recommendation."; | following the recommendation in RFC 4303."; | |||
reference | reference | |||
"Section 3.4.3 in RFC 4303"; | "RFC 4303: IP Encapsulating Security Payload (ESP), | |||
} | Section 3.4.3."; | |||
container traffic-selector { | } | |||
uses nsfikec:selector-grouping; | container traffic-selector { | |||
description | uses nsfikec:selector-grouping; | |||
"The IPsec SA traffic selector."; | description | |||
} | "The IPsec SA Traffic Selector."; | |||
leaf protocol-parameters { | } | |||
type nsfikec:ipsec-protocol-parameters; | leaf protocol-parameters { | |||
default esp; | type nsfikec:ipsec-protocol-params; | |||
description | default "esp"; | |||
"Security protocol of IPsec SA: Only | description | |||
"Security protocol of IPsec SA, only | ||||
ESP so far."; | ESP so far."; | |||
} | } | |||
leaf mode { | leaf mode { | |||
type nsfikec:ipsec-mode; | type nsfikec:ipsec-mode; | |||
default transport; | default "transport"; | |||
description | description | |||
"Tunnel or transport mode."; | "Tunnel or transport mode."; | |||
} | } | |||
container esp-sa { | container esp-sa { | |||
when "../protocol-parameters = 'esp'"; | when "../protocol-parameters = 'esp'"; | |||
description | description | |||
"In case the IPsec SA is | "In case the IPsec SA is an | |||
Encapsulation Security Payload | Encapsulation Security Payload | |||
(ESP), it is required to specify | (ESP), it is required to specify | |||
encryption and integrity | encryption and integrity | |||
algorithms, and key material."; | algorithms and key materials."; | |||
container encryption { | ||||
container encryption { | description | |||
description | "Configuration of encryption or | |||
"Configuration of encryption or | AEAD algorithm for IPsec | |||
AEAD algorithm for IPsec | Encapsulation Security Payload | |||
Encapsulation Security Payload | (ESP)."; | |||
(ESP)."; | leaf encryption-algorithm { | |||
type nsfikec:encr-alg-t; | ||||
leaf encryption-algorithm { | default "12"; | |||
type nsfikec:encr-alg-t; | description | |||
default 12; | "Configuration of ESP | |||
description | encryption. With AEAD | |||
"Configuration of ESP | ||||
encryption. With AEAD | ||||
algorithms, the integrity-algorithm | algorithms, the integrity-algorithm | |||
leaf is not used."; | leaf is not used."; | |||
} | } | |||
leaf key { | ||||
leaf key { | nacm:default-deny-all; | |||
nacm:default-deny-all; | type yang:hex-string; | |||
type yang:hex-string; | description | |||
description | "ESP encryption key value. | |||
"ESP encryption key value. | If this leaf is not defined, | |||
If this leaf is not defined | the key is not defined | |||
the key is not defined | (e.g., encryption is NULL). | |||
(e.g., encryption is NULL). | The key length is | |||
The key length is | determined by the | |||
determined by the | length of the key set in | |||
length of the key set in | this leaf. By default, it is | |||
this leaf. By default is | 128 bits."; | |||
128 bits."; | } | |||
} | leaf iv { | |||
leaf iv { | nacm:default-deny-all; | |||
nacm:default-deny-all; | type yang:hex-string; | |||
type yang:hex-string; | description | |||
description | "ESP encryption IV value. If | |||
"ESP encryption IV value. If | this leaf is not defined, the | |||
this leaf is not defined the | ||||
IV is not defined (e.g., | IV is not defined (e.g., | |||
encryption is NULL)"; | encryption is NULL)."; | |||
} | } | |||
} | } | |||
container integrity { | ||||
container integrity { | description | |||
description | "Configuration of integrity for | |||
"Configuration of integrity for | ||||
IPsec Encapsulation Security | IPsec Encapsulation Security | |||
Payload (ESP). This container | Payload (ESP). This container | |||
allows configuration of integrity | allows configuration of integrity | |||
algorithms when no AEAD | algorithms when no AEAD | |||
algorithms are used, and | algorithms are used and | |||
integrity is required."; | integrity is required."; | |||
leaf integrity-algorithm { | ||||
leaf integrity-algorithm { | type nsfikec:intr-alg-t; | |||
type nsfikec:intr-alg-t; | default "12"; | |||
default 12; | description | |||
description | "Message Authentication Code | |||
"Message Authentication Code | ||||
(MAC) algorithm to provide | (MAC) algorithm to provide | |||
integrity in ESP | integrity in ESP (default | |||
(default | ||||
AUTH_HMAC_SHA2_256_128). | AUTH_HMAC_SHA2_256_128). | |||
With AEAD algorithms, | With AEAD algorithms, | |||
the integrity leaf is not | the integrity leaf is not | |||
used."; | used."; | |||
} | } | |||
leaf key { | ||||
leaf key { | nacm:default-deny-all; | |||
nacm:default-deny-all; | type yang:hex-string; | |||
type yang:hex-string; | description | |||
description | "ESP integrity key value. | |||
"ESP integrity key value. | If this leaf is not defined, | |||
If this leaf is not defined | ||||
the key is not defined (e.g., | the key is not defined (e.g., | |||
AEAD algorithm is chosen and | AEAD algorithm is chosen and | |||
integrity algorithm is not | integrity algorithm is not | |||
required). The key length is | required). The key length is | |||
determined by the length of | determined by the length of | |||
the key configured."; | the key configured."; | |||
} | } | |||
} | } | |||
} /*container esp-sa*/ | } /*container esp-sa*/ | |||
container sa-lifetime-hard { | ||||
container sa-lifetime-hard { | description | |||
description | "IPsec SA hard lifetime. The action | |||
"IPsec SA hard lifetime. The action | associated is terminate and hold."; | |||
associated is terminate and | uses nsfikec:lifetime; | |||
hold."; | } | |||
uses nsfikec:lifetime; | container sa-lifetime-soft { | |||
} | description | |||
container sa-lifetime-soft { | "IPsec SA soft lifetime."; | |||
description | uses nsfikec:lifetime; | |||
"IPsec SA soft lifetime."; | leaf action { | |||
uses nsfikec:lifetime; | type nsfikec:lifetime-action; | |||
leaf action { | description | |||
type nsfikec:lifetime-action; | "Action lifetime: terminate-clear, | |||
description | terminate-hold, or replace."; | |||
"Action lifetime: | } | |||
terminate-clear, | } | |||
terminate-hold or replace."; | container tunnel { | |||
} | when "../mode = 'tunnel'"; | |||
} | uses nsfikec:tunnel-grouping; | |||
container tunnel { | leaf-list dscp-values { | |||
when "../mode = 'tunnel'"; | type inet:dscp; | |||
uses nsfikec:tunnel-grouping; | description | |||
leaf-list dscp-values { | "DSCP values allowed for ingress packets carried | |||
type inet:dscp; | over this IPsec SA. If no values are specified, no | |||
description | DSCP-specific filtering is applied. When | |||
"DSCP values allowed for ingress packets carried | ||||
over this IPsec SA. If no values are specified, no | ||||
DSCP-specific filtering is applied. When | ||||
../bypass-dscp is false and a dscp-mapping is | ../bypass-dscp is false and a dscp-mapping is | |||
defined, each value here would be the same as the | defined, each value here would be the same as the | |||
'inner' DSCP value for the DSCP mapping (list | 'inner' DSCP value for the DSCP mapping (list | |||
dscp-mapping)"; | dscp-mapping)."; | |||
reference | reference | |||
"Section 4.4.2.1. in RFC 4301."; | "RFC 4301: Security Architecture for the Internet | |||
} | Protocol, Section 4.4.2.1."; | |||
description | } | |||
"Endpoints of the IPsec tunnel."; | description | |||
} | "Endpoints of the IPsec tunnel."; | |||
container encapsulation-type { | } | |||
uses nsfikec:encap; | container encapsulation-type { | |||
description | uses nsfikec:encap; | |||
"This container carries | description | |||
"This container carries | ||||
configuration information about | configuration information about | |||
the source and destination ports | the source and destination ports | |||
which will be used for ESP | that will be used for ESP | |||
encapsulation that ESP packets the | encapsulation of ESP packets and | |||
type of encapsulation when NAT | the type of encapsulation when NAT | |||
traversal is in place."; | traversal is in place."; | |||
} | } | |||
} /*ipsec-sa-config*/ | } /*ipsec-sa-config*/ | |||
container ipsec-sa-state { | ||||
container ipsec-sa-state { | config false; | |||
config false; | description | |||
description | "Container describing IPsec SA state | |||
"Container describing IPsec SA state | ||||
data."; | data."; | |||
container sa-lifetime-current { | container sa-lifetime-current { | |||
uses nsfikec:lifetime; | uses nsfikec:lifetime; | |||
description | description | |||
"SAD lifetime current."; | "SAD lifetime current."; | |||
} | } | |||
container replay-stats { | container replay-stats { | |||
description | description | |||
"State data about the anti-replay | "State data about the anti-replay | |||
window."; | window."; | |||
container replay-window { | ||||
container replay-window { | leaf w { | |||
leaf w { | type uint32; | |||
type uint32; | description | |||
description | "Size of the replay window."; | |||
"Size of the replay window."; | } | |||
} | leaf t { | |||
leaf t { | type uint64; | |||
type uint64; | description | |||
description | "Highest sequence number | |||
"Highest sequence number | ||||
authenticated so far, | authenticated so far, | |||
upper bound of window."; | upper bound of window."; | |||
} | } | |||
leaf b { | leaf b { | |||
type uint64; | type uint64; | |||
description | description | |||
"Lower bound of window."; | "Lower bound of window."; | |||
} | } | |||
description | description | |||
"This container contains three | "This container contains three | |||
parameters that defines the state | parameters that define the state | |||
of the replay window: window size (w), | of the replay window: window size (w), | |||
highest sequence number authenticated (t) | highest sequence number authenticated (t), | |||
and lower bound of the window (b). According | and lower bound of the window (b), according | |||
to Appendix A2.1 - RFC 4303 w = t-b+1."; | to Appendix A2.1 in RFC 4303 (w = t - b + 1)."; | |||
reference | reference | |||
"Appendix A in RFC 4303."; | "RFC 4303: IP Encapsulating Security Payload (ESP), | |||
} | Appendix A."; | |||
} | ||||
leaf packet-dropped { | leaf packet-dropped { | |||
type yang:counter64; | type yang:counter64; | |||
description | description | |||
"Packets dropped | "Packets dropped | |||
because they are | because they are | |||
replay packets."; | replay packets."; | |||
} | } | |||
leaf failed { | ||||
leaf failed { | type yang:counter64; | |||
type yang:counter64; | description | |||
description | "Number of packets detected out | |||
"Number of packets detected out | ||||
of the replay window."; | of the replay window."; | |||
} | } | |||
leaf seq-number-counter { | ||||
leaf seq-number-counter { | type uint64; | |||
type uint64; | description | |||
description | "A 64-bit counter when this | |||
"A 64-bit counter when this | ||||
IPsec SA is using Extended | IPsec SA is using Extended | |||
Sequence Number or 32-bit | Sequence Number or 32-bit | |||
counter when it is not. | counter when it is not. | |||
Current value of sequence | Current value of sequence | |||
number."; | number."; | |||
} | } | |||
} /* container replay-stats*/ | } /* container replay-stats*/ | |||
} /*ipsec-sa-state*/ | } /*ipsec-sa-state*/ | |||
description | ||||
"List of SAD entries that form the SAD."; | ||||
} /*list sad-entry*/ | ||||
} /*container sad*/ | ||||
} /*container ipsec-ikeless*/ | ||||
description | /* Notifications */ | |||
"List of SAD entries that forms the SAD."; | ||||
} /*list sad-entry*/ | ||||
} /*container sad*/ | ||||
}/*container ipsec-ikeless*/ | ||||
/* Notifications */ | notification sadb-acquire { | |||
notification sadb-acquire { | if-feature "ikeless-notification"; | |||
if-feature ikeless-notification; | description | |||
description | "The NSF detects and notifies that | |||
"The NSF detects and notifies that | ||||
an IPsec SA is required for an | an IPsec SA is required for an | |||
outbound IP packet that has matched a SPD entry. | outbound IP packet that has matched an SPD entry. | |||
The traffic-selector container in this | The traffic-selector container in this | |||
notification contains information about | notification contains information about | |||
the IP packet that triggered this | the IP packet that triggered this | |||
notification."; | notification."; | |||
leaf ipsec-policy-name { | leaf ipsec-policy-name { | |||
type string; | type string; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"It contains the SPD entry name (unique) of | "It contains the SPD entry name (unique) of | |||
the IPsec policy that hits the IP packet | the IPsec policy that hits the IP-packet-required | |||
required IPsec SA. It is assumed the | IPsec SA. It is assumed the | |||
I2NSF Controller will have a copy of the | I2NSF Controller will have a copy of the | |||
information of this policy so it can | information of this policy so it can | |||
extract all the information with this | extract all the information with this | |||
unique identifier. The type of IPsec SA is | unique identifier. The type of IPsec SA is | |||
defined in the policy so the Security | defined in the policy so the security | |||
Controller can also know the type of IPsec | controller can also know the type of IPsec | |||
SA that MUST be generated."; | SA that MUST be generated."; | |||
} | } | |||
container traffic-selector { | container traffic-selector { | |||
description | description | |||
"The IP packet that triggered the acquire | "The IP packet that triggered the acquire | |||
and requires an IPsec SA. Specifically it | and requires an IPsec SA. Specifically, it | |||
will contain the IP source/mask and IP | will contain the IP source/mask and IP | |||
destination/mask; protocol (udp, tcp, | destination/mask, protocol (udp, tcp, | |||
etc...); and source and destination | etc.), and source and destination | |||
ports."; | ports."; | |||
uses nsfikec:selector-grouping; | uses nsfikec:selector-grouping; | |||
} | } | |||
} | } | |||
notification sadb-expire { | notification sadb-expire { | |||
if-feature ikeless-notification; | if-feature "ikeless-notification"; | |||
description "An IPsec SA expiration (soft or hard)."; | description | |||
leaf ipsec-sa-name { | "An IPsec SA expiration (soft or hard)."; | |||
type string; | leaf ipsec-sa-name { | |||
mandatory true; | type string; | |||
description | mandatory true; | |||
"It contains the SAD entry name (unique) of | description | |||
"It contains the SAD entry name (unique) of | ||||
the IPsec SA that is about to expire. It is assumed | the IPsec SA that is about to expire. It is assumed | |||
the I2NSF Controller will have a copy of the | the I2NSF Controller will have a copy of the | |||
IPsec SA information (except the cryptographic | IPsec SA information (except the cryptographic | |||
material and state data) indexed by this name | material and state data) indexed by this name | |||
(unique identifier) so it can know all the | (unique identifier) so it can know all the | |||
information (crypto algorithms, etc.) about | information (crypto algorithms, etc.) about | |||
the IPsec SA that has expired in order to | the IPsec SA that has expired in order to | |||
perform a rekey (soft lifetime) or delete it | perform a rekey (soft lifetime) or delete it | |||
(hard lifetime) with this unique identifier."; | (hard lifetime) with this unique identifier."; | |||
} | } | |||
leaf soft-lifetime-expire { | leaf soft-lifetime-expire { | |||
type boolean; | type boolean; | |||
default true; | default "true"; | |||
description | description | |||
"If this value is true the lifetime expired is | "If this value is true, the lifetime expired is | |||
soft. If it is false is hard."; | soft. If it is false, the lifetime is hard."; | |||
} | } | |||
container lifetime-current { | container lifetime-current { | |||
description | description | |||
"IPsec SA current lifetime. If | "IPsec SA current lifetime. If | |||
soft-lifetime-expired is true | soft-lifetime-expired is true, | |||
this container is set with the | this container is set with the | |||
lifetime information about current | lifetime information about current | |||
soft lifetime. | soft lifetime. | |||
It can help the NSF Controller | It can help the NSF Controller | |||
to know which of the (soft) lifetime | to know which of the (soft) lifetime | |||
limits raised the event: time, bytes, | limits raised the event: time, bytes, | |||
packets or idle."; | packets, or idle."; | |||
uses nsfikec:lifetime; | ||||
uses nsfikec:lifetime; | } | |||
} | } | |||
} | ||||
notification sadb-seq-overflow { | notification sadb-seq-overflow { | |||
if-feature ikeless-notification; | if-feature "ikeless-notification"; | |||
description "Sequence overflow notification."; | description | |||
leaf ipsec-sa-name { | "Sequence overflow notification."; | |||
type string; | leaf ipsec-sa-name { | |||
mandatory true; | type string; | |||
description | mandatory true; | |||
"It contains the SAD entry name (unique) of | description | |||
"It contains the SAD entry name (unique) of | ||||
the IPsec SA that is about to have a sequence | the IPsec SA that is about to have a sequence | |||
number overflow and rollover is not permitted. | number overflow, and rollover is not permitted. | |||
When the NSF issues this event before reaching | When the NSF issues this event before reaching | |||
a sequence number overflow is implementation | a sequence number, overflow is implementation | |||
specific and out of scope of this specification. | specific and out of scope of this specification. | |||
It is assumed the I2NSF Controller will have a | It is assumed the I2NSF Controller will have a | |||
copy of the IPsec SA information (except the | copy of the IPsec SA information (except the | |||
cryptographic material and state data) indexed | cryptographic material and state data) indexed | |||
by this name (unique identifier) so it can | by this name (unique identifier) so it can | |||
know all the information (crypto algorithms, | know all the information (crypto algorithms, | |||
etc.) about the IPsec SA in | etc.) about the IPsec SA in | |||
order to perform a rekey of the IPsec SA."; | order to perform a rekey of the IPsec SA."; | |||
} | } | |||
} | } | |||
notification sadb-bad-spi { | ||||
if-feature ikeless-notification; | ||||
description | ||||
"Notify when the NSF receives a packet with an | ||||
incorrect SPI (i.e. not present in the SAD)."; | ||||
leaf spi { | ||||
type uint32 { range "0..max"; } | ||||
mandatory true; | ||||
description | ||||
"SPI number contained in the erroneous IPsec | ||||
packet."; | ||||
} | ||||
} | ||||
} | ||||
<CODE ENDS> | ||||
]]> | ||||
</artwork> | ||||
</figure> | ||||
</t> | ||||
</section> | ||||
</section> | ||||
</section> | ||||
<section anchor="iana" title="IANA Considerations"> | ||||
<t>This document registers three URIs in the "ns" | ||||
subregistry of the IETF XML Registry | ||||
<xref target="RFC3688"/>. | ||||
Following the format in <xref target="RFC3688"/>, the | ||||
following registrations are requested:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork> | ||||
URI: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikec | ||||
Registrant Contact: The IESG. | ||||
XML: N/A, the requested URI is an XML namespace. | ||||
URI: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ike | ||||
Registrant Contact: The IESG. | ||||
XML: N/A, the requested URI is an XML namespace. | ||||
URI: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless | ||||
Registrant Contact: The IESG. | ||||
XML: N/A, the requested URI is an XML namespace. | ||||
</artwork> | ||||
</figure> | ||||
</t> | ||||
<t>This document registers three YANG modules in the "YANG | ||||
Module Names" registry <xref target="RFC6020"/>. Following t | ||||
he | ||||
format in <xref target="RFC6020"/>, the following registrati | ||||
ons | ||||
are requested:</t> | ||||
<t> | ||||
<figure> | ||||
<artwork> | ||||
Name: ietf-i2nsf-ikec | ||||
Namespace: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikec | ||||
Prefix: nsfikec | ||||
Reference: RFC XXXX | ||||
Name: ietf-i2nsf-ike | ||||
Namespace: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ike | ||||
Prefix: nsfike | ||||
Reference: RFC XXXX | ||||
Name: ietf-i2nsf-ikeless | notification sadb-bad-spi { | |||
Namespace: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless | if-feature "ikeless-notification"; | |||
Prefix: nsfikels | description | |||
Reference: RFC XXXX | "Notify when the NSF receives a packet with an | |||
</artwork> | incorrect SPI (i.e., not present in the SAD)."; | |||
</figure> | leaf spi { | |||
</t> | type uint32 { | |||
</section> | range "0..max"; | |||
<section anchor="security" title="Security Considerations"> | } | |||
<t> | mandatory true; | |||
description | ||||
"SPI number contained in the erroneous IPsec | ||||
packet."; | ||||
} | ||||
} | ||||
} | ||||
]]></sourcecode> | ||||
</section> | ||||
</section> | ||||
</section> | ||||
<section anchor="iana" numbered="true" toc="default"> | ||||
<name>IANA Considerations</name> | ||||
<t>IANA has registered the following namespaces in the "ns" | ||||
subregistry within the "IETF XML Registry" | ||||
<xref target="RFC3688" format="default"/>:</t> | ||||
<dl newline="false" spacing="compact"> | ||||
<dt>URI:</dt> | ||||
<dd>urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikec</dd> | ||||
<dt>Registrant Contact:</dt> | ||||
<dd>The IESG.</dd> | ||||
<dt>XML:</dt> | ||||
<dd>N/A, the requested URI is an XML namespace.</dd> | ||||
</dl> | ||||
<dl newline="false" spacing="compact"> | ||||
<dt>URI:</dt> | ||||
<dd>urn:ietf:params:xml:ns:yang:ietf-i2nsf-ike</dd> | ||||
<dt>Registrant Contact:</dt> | ||||
<dd>The IESG.</dd> | ||||
<dt>XML:</dt> | ||||
<dd>N/A, the requested URI is an XML namespace.</dd> | ||||
</dl> | ||||
<dl newline="false" spacing="compact"> | ||||
<dt>URI:</dt> | ||||
<dd>urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless</dd> | ||||
<dt>Registrant Contact:</dt> | ||||
<dd>The IESG.</dd> | ||||
<dt>XML:</dt> | ||||
<dd>N/A, the requested URI is an XML namespace.</dd> | ||||
</dl> | ||||
<t>IANA has registered the following YANG modules in the "YANG | ||||
Module Names" registry <xref target="RFC6020" format="defaul | ||||
t"/>:</t> | ||||
<dl newline="false" spacing="compact" indent="14"> | ||||
<dt>Name:</dt> | ||||
<dd>ietf-i2nsf-ikec</dd> | ||||
<dt>Maintained by IANA:</dt> | ||||
<dd>N</dd> | ||||
<dt>Namespace:</dt> | ||||
<dd>urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikec</dd> | ||||
<dt>Prefix:</dt> | ||||
<dd>nsfikec</dd> | ||||
<dt>Reference:</dt> | ||||
<dd>RFC 9061</dd> | ||||
</dl> | ||||
<dl newline="false" spacing="compact" indent="14"> | ||||
<dt>Name:</dt> | ||||
<dd>ietf-i2nsf-ike</dd> | ||||
<dt>Maintained by IANA:</dt> | ||||
<dd>N</dd> | ||||
<dt>Namespace:</dt> | ||||
<dd>urn:ietf:params:xml:ns:yang:ietf-i2nsf-ike</dd> | ||||
<dt>Prefix:</dt> | ||||
<dd>nsfike</dd> | ||||
<dt>Reference:</dt> | ||||
<dd>RFC 9061</dd> | ||||
</dl> | ||||
<dl newline="false" spacing="compact" indent="14"> | ||||
<dt>Name:</dt> | ||||
<dd>ietf-i2nsf-ikeless</dd> | ||||
<dt>Maintained by IANA:</dt> | ||||
<dd>N</dd> | ||||
<dt>Namespace:</dt> | ||||
<dd>urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless</dd> | ||||
<dt>Prefix:</dt> | ||||
<dd>nsfikels</dd> | ||||
<dt>Reference:</dt> | ||||
<dd>RFC 9061</dd> | ||||
</dl> | ||||
</section> | ||||
<section anchor="security" numbered="true" toc="default"> | ||||
<name>Security Considerations</name> | ||||
<t> | ||||
First of all, this document shares all the security | First of all, this document shares all the security | |||
issues of SDN that are specified in the "Security | issues of SDN that are specified in the Security | |||
Considerations" section of <xref target="ITU-T.Y.3300"/> | Considerations sections of <xref target="ITU-T.Y.3300" forma | |||
and <xref target="RFC7426"/>. </t> | t="default"/> | |||
<t>On the one hand, it is important to note that | and <xref target="RFC7426" format="default"/>. </t> | |||
there MUST | <t>On the one hand, it is important to note that | |||
there <bcp14>MUST</bcp14> | ||||
exist a security association between the I2NSF | exist a security association between the I2NSF | |||
Controller and the NSFs to protect the critical | Controller and the NSFs to protect the critical | |||
information (cryptographic keys, configuration | information (cryptographic keys, configuration | |||
parameter, etc.) exchanged between these | parameter, etc.) exchanged between these | |||
entities. The nature of and means to create that | entities. The nature of and means to create that | |||
security association is out of the scope of this | security association is out of the scope of this | |||
document (i.e., it is part of device | document (i.e., it is part of device | |||
provisioning or onboarding).</t> | provisioning or onboarding).</t> | |||
<t>On the other hand, if encryption is mandatory for all | <t>On the other hand, if encryption is mandatory for all | |||
traffic of a NSF, its default policy MUST be to drop | traffic of an NSF, its default policy <bcp14>MUST</bcp14> be | |||
to drop | ||||
(DISCARD) packets to prevent cleartext packet leaks. | (DISCARD) packets to prevent cleartext packet leaks. | |||
This default policy MUST be pre-configured in the startup | This default policy <bcp14>MUST</bcp14> be preconfigured in the startup | |||
configuration datastore in the NSF | configuration datastore in the NSF | |||
before the NSF contacts the | before the NSF contacts the | |||
I2NSF Controller. Moreover, the startup configuration | I2NSF Controller. Moreover, the startup configuration | |||
datastore MUST be also pre-configured with the required | datastore <bcp14>MUST</bcp14> be also preconfigured with the required | |||
ALLOW policies that allow the NSF to communicate with the | ALLOW policies that allow the NSF to communicate with the | |||
I2NSF Controller once the NSF is deployed. This | I2NSF Controller once the NSF is deployed. This | |||
pre-configuration step is not carried out by the | preconfiguration step is not carried out by the | |||
I2NSF Controller but by some other entity before the | I2NSF Controller but by some other entity before the | |||
NSF deployment. <!--Moreover, this initial startup | NSF deployment. In this manner, when the NSF | |||
configuration MUST include the different policies that | ||||
allow this NSF to contact the SC once the NSF has been | ||||
deployed. -->In this manner, when the NSF | ||||
starts/reboots, it will always first apply the | starts/reboots, it will always first apply the | |||
configuration in the startup configuration before | configuration in the startup configuration before | |||
contacting the I2NSF Controller.</t> | contacting the I2NSF Controller.</t> | |||
<t>Finally, this section is divided in two | <t>Finally, this section is divided in two | |||
parts in order to analyze different security | parts in order to analyze different security | |||
considerations for both cases: NSF with IKEv2 | considerations for both cases: NSF with IKEv2 | |||
(IKE case) and NSF without IKEv2 (IKE-less | (IKE case) and NSF without IKEv2 (IKE-less | |||
case). In general, the | case). In general, the | |||
I2NSF Controller, as typically in the SDN | I2NSF Controller, as typically in the SDN | |||
paradigm, is a target for different type of | paradigm, is a target for different type of | |||
attacks | attacks; see | |||
<xref target="SDNSecServ"/> and | <xref target="SDNSecServ" format="default"/> and | |||
<xref target="SDNSecurity"/>. Thus, the | <xref target="SDNSecurity" format="default"/>. Thus, the | |||
I2NSF Controller is a key entity in the | I2NSF Controller is a key entity in the | |||
infrastructure and MUST be protected accordingly. | infrastructure and <bcp14>MUST</bcp14> be protected accordin gly. | |||
In particular, the I2NSF Controller will handle | In particular, the I2NSF Controller will handle | |||
cryptographic material thus the attacker may try to access | cryptographic material; thus, the attacker may try to access | |||
this information. The impact is different depending on the I KE | this information. The impact is different depending on the I KE | |||
case or the IKE-less case.</t> | case or the IKE-less case.</t> | |||
<section anchor="sec-case1" title="IKE case"> | <section anchor="sec-case1" numbered="true" toc="default"> | |||
<t>In the IKE case, the I2NSF Controller sends IKEv2 | <name>IKE Case</name> | |||
<t>In the IKE case, the I2NSF Controller sends IKEv2 | ||||
credentials (PSK, public/private keys, certificates, | credentials (PSK, public/private keys, certificates, | |||
etc.) to the NSFs using the security association | etc.) to the NSFs using the security association | |||
between I2NSF Controller and NSFs. The I2NSF | between the I2NSF Controller and NSFs. The I2NSF | |||
Controller MUST NOT store the IKEv2 credentials after | Controller <bcp14>MUST NOT</bcp14> store the IKEv2 creden | |||
distributing them. Moreover, the NSFs MUST NOT allow | tials after | |||
distributing them. Moreover, the NSFs <bcp14>MUST NOT</bc | ||||
p14> allow | ||||
the reading of these values once they have been applied | the reading of these values once they have been applied | |||
by the I2NSF Controller (i.e. write only operations). | by the I2NSF Controller (i.e., write-only operations). | |||
One option is to always return the same value (i.e. all | One option is to always return the same value (i.e., all | |||
0s) if a read operation is carried out.</t> | 0s) if a read operation is carried out.</t> | |||
<t>If the attacker has access to the I2NSF Controller | ||||
<t>If the attacker has access to the I2NSF Controller | ||||
during the period of time that key material is | during the period of time that key material is | |||
generated, it might have access to the key material. | generated, it might have access to the key material. | |||
Since these values are used during NSF authentication in | Since these values are used during NSF authentication in | |||
IKEv2, it may impersonate the affected NSFs. Several | IKEv2, it may impersonate the affected NSFs. Several | |||
recommendations are important. | recommendations are important. </t> | |||
<ul spacing="normal"> | ||||
<list style="symbols"> | <li> IKEv2 configurations <bcp14>SHOULD</bcp14> adhere to the | |||
recommendations in <xref target="RFC8247" format="defaul | ||||
<t> IKEv2 configurations SHOULD adhere to the | t"/>. </li> | |||
recommendations in <xref target="RFC8247"/>. </t> | <li> If PSK authentication is | |||
used in IKEv2, the I2NSF Controller <bcp14>MUST</bcp14> | ||||
<t> If PSK authentication is | remove the | |||
used in IKEv2, the I2NSF Controller MUST remove the | ||||
PSK immediately after generating and distributing it. | PSK immediately after generating and distributing it. | |||
</t> | </li> | |||
<li>When public/private keys are used, the I2NSF | ||||
<t>When public/private keys are used, the I2NSF | Controller <bcp14>MAY</bcp14> generate both public key a | |||
Controller MAY generate both public key and private | nd private | |||
key. In such a case, the I2NSF Controller MUST remove | key. In such a case, the I2NSF Controller <bcp14>MUST</b | |||
cp14> remove | ||||
the associated private key immediately after | the associated private key immediately after | |||
distributing them to the NSFs. | distributing them to the NSFs. | |||
Alternatively, the NSF | Alternatively, the NSF | |||
MAY generate the private key and export only | <bcp14>MAY</bcp14> generate the private key and export o nly | |||
the public key to the I2NSF Controller. How | the public key to the I2NSF Controller. How | |||
the NSF generates these | the NSF generates these | |||
cryptographic material (public key/ private | cryptographic materials (public key/ private | |||
keys) and | keys) and | |||
exports the public key, is out of scope of | exports the public key is out of scope of | |||
this document. | this document. | |||
</t> | </li> | |||
<li>If certificates are used, the NSF <bcp14>MAY</bcp14> generate the | ||||
<t>If certificates are used, the NSF MAY generate the | ||||
private key and export the public key for certification | private key and export the public key for certification | |||
to the I2NSF Controller. How the NSF generates these | to the I2NSF Controller. How the NSF generates these | |||
cryptographic material (public key/ private keys) and | cryptographic material (public key/ private keys) and | |||
exports the public key, is out of scope of this | exports the public key is out of scope of this | |||
document.</t> | document.</li> | |||
</list> | </ul> | |||
</t> | </section> | |||
<section anchor="sec-case2" numbered="true" toc="default"> | ||||
</section> | <name>IKE-less Case</name> | |||
<section anchor="sec-case2" title="IKE-less case"> | <t> | |||
<t> | ||||
In the IKE-less case, the I2NSF Controller sends | In the IKE-less case, the I2NSF Controller sends | |||
the IPsec SA information to the NSF's SAD that | the IPsec SA information to the NSF's SAD that | |||
includes the private session keys required for | includes the private session keys required for | |||
integrity and encryption. The I2NSF Controller | integrity and encryption. The I2NSF Controller | |||
MUST NOT store the keys after | <bcp14>MUST NOT</bcp14> store the keys after | |||
distributing them. Moreover, the NSFs receiving | distributing them. Moreover, the NSFs receiving | |||
private key material MUST NOT allow the reading of | private key material <bcp14>MUST NOT</bcp14> allow the r eading of | |||
these values by any other entity (including the | these values by any other entity (including the | |||
I2NSF Controller itself) once they have been | I2NSF Controller itself) once they have been | |||
applied (i.e. write only operations) into the NSFs. | applied (i.e., write-only operations) into the NSFs. | |||
Nevertheless, if the attacker has access to the | Nevertheless, if the attacker has access to the | |||
I2NSF Controller during the period of time that | I2NSF Controller during the period of time that | |||
key material is generated, it may obtain these | key material is generated, it may obtain these | |||
values. In other words, the attacker might be able to | values. In other words, the attacker might be able to | |||
observe the IPsec traffic and decrypt, or even | observe the IPsec traffic and decrypt, or even | |||
modify and re-encrypt, the traffic between peers. | modify and re-encrypt, the traffic between peers. | |||
</t> | </t> | |||
<t>Finally, the security association between the | <t>Finally, the security association between the | |||
I2NSF Controller and the NSFs MUST provide, at | I2NSF Controller and the NSFs <bcp14>MUST</bcp14> provide, a | |||
t | ||||
least, the same degree of protection as the one | least, the same degree of protection as the one | |||
achieved by the IPsec SAs configured in the | achieved by the IPsec SAs configured in the | |||
NSFs. In particular, the security association | NSFs. In particular, the security association | |||
between the I2NSF Controller and the NSFs MUST | between the I2NSF Controller and the NSFs <bcp14>MUST</bcp14 > | |||
provide forward secrecy if this property is to | provide forward secrecy if this property is to | |||
be achieved in the IPsec SAs that the I2NSF | be achieved in the IPsec SAs that the I2NSF | |||
Controller configures in the NSFs. Similarly, | Controller configures in the NSFs. Similarly, | |||
the encryption algorithms used in the security | the encryption algorithms used in the security | |||
association between I2NSF Controller and the NSF | association between the I2NSF Controller and the NSF | |||
MUST have, at least, the same strength (minimum | <bcp14>MUST</bcp14> have, at least, the same strength (minim | |||
um | ||||
strength of a 128-bit key) as the algorithms | strength of a 128-bit key) as the algorithms | |||
used to establish the IPsec SAs. | used to establish the IPsec SAs. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec-yang" title="YANG modules"> | <section anchor="sec-yang" numbered="true" toc="default"> | |||
<t>The modules specified in this document define a | <name>YANG Modules</name> | |||
<t>The YANG modules specified in this document define a | ||||
schema for data that is designed to be accessed via | schema for data that is designed to be accessed via | |||
network management protocols such as NETCONF | network management protocols such as NETCONF | |||
<xref target="RFC6241"/> or RESTCONF | <xref target="RFC6241" format="default"/> or RESTCONF | |||
<xref target="RFC8040"/>. The lowest NETCONF layer | <xref target="RFC8040" format="default"/>. The lowest NE | |||
TCONF layer | ||||
is the secure transport layer, and the | is the secure transport layer, and the | |||
mandatory-to-implement secure transport is Secure Shell | mandatory-to-implement secure transport is Secure Shell | |||
(SSH) <xref target="RFC6242"/>. The lowest RESTCONF | (SSH) <xref target="RFC6242" format="default"/>. The low est RESTCONF | |||
layer is HTTPS, and the mandatory-to-implement secure | layer is HTTPS, and the mandatory-to-implement secure | |||
transport is TLS <xref target="RFC8446"/>.</t> | transport is TLS <xref target="RFC8446" format="default" | |||
/>.</t> | ||||
<t>The Network Configuration Access Control Model (NACM) | <t>The Network Configuration Access Control Model (NACM) | |||
<xref target="RFC8341"/> provides the means to restrict | <xref target="RFC8341" format="default"/> provides the m | |||
eans to restrict | ||||
access for particular NETCONF or RESTCONF users to a | access for particular NETCONF or RESTCONF users to a | |||
preconfigured subset of all available NETCONF or | preconfigured subset of all available NETCONF or | |||
RESTCONF protocol operations and content.</t> | RESTCONF protocol operations and content.</t> | |||
<t>There are a number of data nodes defined in these YANG | ||||
<t>There are a number of data nodes defined in these YANG | ||||
modules that are writable/creatable/deletable (i.e., | modules that are writable/creatable/deletable (i.e., | |||
config true, which is the default). These data nodes | config true, which is the default). These data nodes | |||
may be considered sensitive or vulnerable in some | may be considered sensitive or vulnerable in some | |||
network environments. Write operations | network environments. Write operations | |||
(e.g., edit-config) to these data nodes without | (e.g., edit-config) to these data nodes without | |||
proper protection can have a negative | proper protection can have a negative | |||
effect on network operations. These are the subtrees and | effect on network operations. These are the subtrees and | |||
data nodes and their sensitivity/vulnerability:</t> | data nodes and their sensitivity/vulnerability:</t> | |||
<t> For the IKE case (ietf-i2nsf-ike): | <dl newline="true" spacing="normal"> | |||
<dt>For the IKE case (ietf-i2nsf-ike):</dt> | ||||
<list hangIndent="6" style="hanging"> | <dd> | |||
<t>/ipsec-ike: The entire container in this module | <dl newline="false" spacing="normal"> | |||
<dt>/ipsec-ike:</dt> | ||||
<dd>The entire container in this module | ||||
is sensitive to write operations. An attacker may | is sensitive to write operations. An attacker may | |||
add/modify the credentials to be used for the | add/modify the credentials to be used for the | |||
authentication (e.g., to impersonate a NSF), the | authentication (e.g., to impersonate an NSF), for th e | |||
trust root (e.g., changing the trusted CA | trust root (e.g., changing the trusted CA | |||
certificates), the cryptographic algorithms | certificates), for the cryptographic algorithms | |||
(allowing a downgrading attack), the IPsec | (allowing a downgrading attack), for the IPsec | |||
policies (e.g., by allowing leaking of data traffic | policies (e.g., by allowing leaking of data traffic | |||
by changing to an allow policy), and in general | by changing to an allow policy), and in general, | |||
changing the IKE SA conditions and credentials | changing the IKE SA conditions and credentials | |||
between any NSF.</t> | between any NSF.</dd></dl> | |||
</list> | </dd> | |||
</t> | <dt> For the IKE-less case (ietf-i2nsf-ikeless):</dt> | |||
<t> For the IKE-less case (ietf-i2nsf-ikeless): | <dd> | |||
<dl newline="false" spacing="normal"> | ||||
<list hangIndent="6" style="hanging"> | <dt>/ipsec-ikeless: </dt> | |||
<t>/ipsec-ikeless: The entire container in this | <dd>The entire container in this | |||
module is sensitive to write operations. An | module is sensitive to write operations. An | |||
attacker may add/modify/delete any IPsec policies | attacker may add/modify/delete any IPsec policies | |||
(e.g., by allowing leaking of data traffic by | (e.g., by allowing leaking of data traffic by | |||
changing to a allow policy) in the | changing to an allow policy) in the | |||
/ipsec-ikeless/spd container, and | /ipsec-ikeless/spd container, | |||
add/modify/delete any IPsec SAs between | add/modify/delete any IPsec SAs between | |||
two NSF by means of /ipsec-ikeless/sad container | two NSF by means of /ipsec-ikeless/sad container, | |||
and, in general, changing any IPsec SAs and IPsec | and, in general, change any IPsec SAs and IPsec | |||
policies between any NSF.</t> | policies between any NSF.</dd></dl> | |||
</list> | </dd> | |||
</t> | </dl> | |||
<t>Some of the readable data nodes in this YANG module may | <t>Some of the readable data nodes in these YANG modules may | |||
be considered sensitive or vulnerable in some network | be considered sensitive or vulnerable in some network | |||
environments. It is thus important to control read | environments. It is thus important to control read | |||
access (e.g., via get, get-config, or notification) to | access (e.g., via get, get-config, or notification) to | |||
these data nodes. These are the subtrees and data nodes | these data nodes. These are the subtrees and data nodes | |||
and their sensitivity/vulnerability:</t> | and their sensitivity/vulnerability:</t> | |||
<dl newline="true" spacing="normal"> | ||||
<t> For the IKE case (ietf-i2nsf-ike): | <dt> For the IKE case (ietf-i2nsf-ike):</dt> | |||
<dd> | ||||
<list hangIndent="6" style="hanging"> | <dl newline="false" spacing="normal"> | |||
<t>/ipsec-ike/pad: This container includes sensitive | <dt>/ipsec-ike/pad:</dt> | |||
<dd>This container includes sensitive | ||||
information to read operations. This information | information to read operations. This information | |||
MUST NOT be returned to a client. For | <bcp14>MUST NOT</bcp14> be returned to a client. For | |||
example, cryptographic material configured in | example, cryptographic material configured in | |||
the NSFs (peer-authentication/pre-shared/secret and peer-authentication/digital-signature/private-key) | the NSFs (peer-authentication/pre-shared/secret and peer-authentication/digital-signature/private-key) | |||
are already protected by the NACM | are already protected by the NACM | |||
extension "default-deny-all" in this | extension "default-deny-all" in this | |||
document.</t> | document.</dd></dl> | |||
</list> | </dd> | |||
</t> | <dt> For the IKE-less case (ietf-i2nsf-ikeless):</dt> | |||
<t> For the IKE-less case (ietf-i2nsf-ikeless): | <dd> | |||
<dl newline="false" spacing="normal"> | ||||
<list hangIndent="6" style="hanging"> | <dt>/ipsec-ikeless/sad/sad-entry/ipsec-sa-config/esp-sa:</dt> | |||
<t>/ipsec-ikeless/sad/sad-entry/ipsec-sa-config/esp- | <dd>This | |||
sa: This | ||||
container includes symmetric keys for the IPsec | container includes symmetric keys for the IPsec | |||
SAs. For example, encryption/key contains an ESP | SAs. For example, encryption/key contains an ESP | |||
encryption key value and encryption/iv contains | encryption key value and encryption/iv contains | |||
an initialization vector value. Similarly, | an Initialization Vector value. Similarly, | |||
integrity/key has an ESP | integrity/key has an ESP | |||
integrity key value. Those values MUST NOT be | integrity key value. Those values <bcp14>MUST NO T</bcp14> be | |||
read by anyone and are protected by the NACM | read by anyone and are protected by the NACM | |||
extension "default-deny-all" in this document. | extension "default-deny-all" in this document. | |||
</t> | </dd></dl> | |||
</list> | </dd> | |||
</t> | </dl> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="ack" title="Acknowledgements"> | </middle> | |||
<t> | <back> | |||
Authors want to thank Paul Wouters, Valery | ||||
Smyslov,Sowmini Varadhan, David Carrel, Yoav | ||||
Nir, Tero Kivinen, | ||||
Martin Bjorklund, Graham Bartlett, Sandeep | ||||
Kampati, Linda | ||||
Dunbar, Mohit Sethi, Martin Bjorklund, Tom | ||||
Petch, Christian | ||||
Hopps, Rob Wilton, Carlos J. Bernardos, Alejandro | ||||
Perez-Mendez, Alejandro Abad-Carrascosa, Ignacio | ||||
Martinez, Ruben Ricart, and all IESG members | ||||
that have reviewed this document for their | ||||
valuable comments. | ||||
</t> | ||||
</section> | ||||
</middle> | ||||
<back> | ||||
<references title="Normative References"> | ||||
&RFC2119; | ||||
&RFC4301; | ||||
&RFC7296; | ||||
&RFC6020; | ||||
&RFC8446; | ||||
&RFC6241; | ||||
&RFC6242; | ||||
&RFC8341; | ||||
&RFC8040; | ||||
&RFC7950; | ||||
&RFC8247; | ||||
&RFC8342; | ||||
&RFC8340; | ||||
&RFC2247; | ||||
&RFC3947; | ||||
&RFC4303; | ||||
&RFC5280; | ||||
&RFC5915; | ||||
&RFC7383; | ||||
&RFC7427; | ||||
&RFC7619; | ||||
&RFC8017; | ||||
&RFC8174; | ||||
&RFC8221; | ||||
&RFC6991; | ||||
&RFC5322; | ||||
&RFC3948; | ||||
&RFC8229; | ||||
<reference anchor="IKEv2-Parameters" target='https://www.iana.or | ||||
g/assignments/ikev2-parameters/ikev2-parameters.xhtml'> | ||||
<front> | ||||
<title>Internet Key Exchange Version 2 (IKEv2) Parameter | ||||
s </title> | ||||
<author initials="IANA"> | ||||
<organization>Internet Assigned Numbers Authority (I | ||||
ANA)</organization> | ||||
</author> | ||||
<date month="August" day="14" year="2020"/> | ||||
</front> | ||||
<format type="TXT" target="https://www.iana.org/assignments/ | ||||
ikev2-parameters/ikev2-parameters.xhtml"/> | ||||
</reference> | ||||
<reference anchor="IKEv2-Transform-Type-1" target='https://www.i | ||||
ana.org/assignments/ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters-5'> | ||||
<front> | ||||
<title>Internet Key Exchange Version 2 (IKEv2) Parameter | ||||
s - Transform Type Values - Transform Type 1 - Encryption Algorithm Transform ID | ||||
s</title> | ||||
<author initials="IANA"> | ||||
<organization>Internet Assigned Numbers Authority (I | ||||
ANA)</organization> | ||||
</author> | ||||
<date month="August" day="14" year="2020"/> | ||||
</front> | ||||
<format type="TXT" target="https://www.iana.org/assignments/ | ||||
ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters-5"/> | ||||
</reference> | ||||
<reference anchor="IKEv2-Transform-Type-3" target='https://www.i | <displayreference target="I-D.tran-ipsecme-yang" to="TRAN-IPSECME-YANG"/> | |||
ana.org/assignments/ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters-7'> | <displayreference target="I-D.carrel-ipsecme-controller-ike" to="IPSECME-CONTROL | |||
<front> | LER-IKE"/> | |||
<title>Internet Key Exchange Version 2 (IKEv2) Parameter | ||||
s - Transform Type Values - Transform Type 3 - Integrity Algorithm Transform IDs | ||||
</title> | ||||
<author initials="IANA"> | ||||
<organization>Internet Assigned Numbers Authority (I | ||||
ANA)</organization> | ||||
</author> | ||||
<date month="August" day="14" year="2020"/> | ||||
</front> | ||||
<format type="TXT" target="https://www.iana.org/assignments/ | ||||
ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters-7"/> | ||||
</reference> | ||||
<reference anchor="IKEv2-Transform-Type-4" target='https://www.i | <references> | |||
ana.org/assignments/ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters-8'> | <name>References</name> | |||
<front> | <references> | |||
<title>Internet Key Exchange Version 2 (IKEv2) Parameter | <name>Normative References</name> | |||
s - Transform Type Values - Transform Type 4 - Diffie-Hellman Group Transform ID | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
s</title> | FC.2119.xml"/> | |||
<author initials="IANA"> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<organization>Internet Assigned Numbers Authority (I | FC.4301.xml"/> | |||
ANA)</organization> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
</author> | FC.7296.xml"/> | |||
<date month="August" day="14" year="2020"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
</front> | FC.6020.xml"/> | |||
<format type="TXT" target="https://www.iana.org/assignments/ | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters-8"/> | FC.8446.xml"/> | |||
</reference> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
FC.6241.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.6242.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8341.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8040.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7950.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8247.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8342.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8340.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.3947.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.4303.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.5280.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.5915.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7383.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7427.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7619.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8017.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8174.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8221.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.6991.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.5322.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.3948.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8229.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.6960.xml"/> | ||||
<reference anchor="IKEv2-Auth-Method" target='https://www.iana.o | <reference anchor="IKEv2-Parameters" target="https://www.iana.org/assign | |||
rg/assignments/ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters-12'> | ments/ikev2-parameters/"> | |||
<front> | <front> | |||
<title>Internet Key Exchange Version 2 (IKEv2) Parameter | <title>Internet Key Exchange Version 2 (IKEv2) Parameters </title> | |||
s - IKEv2 Authentication Method</title> | <author> | |||
<author initials="IANA"> | <organization>IANA</organization> | |||
<organization>Internet Assigned Numbers Authority (I | </author> | |||
ANA)</organization> | </front> | |||
</author> | </reference> | |||
<date month="August" day="14" year="2020"/> | ||||
</front> | ||||
<format type="TXT" target="https://www.iana.org/assignments/ | ||||
ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters-12"/> | ||||
</reference> | ||||
<reference anchor="IANA-Protocols-Number" target='https://www.ia | <reference anchor="IKEv2-Transform-Type-1" target="https://www.iana.org/ | |||
na.org/assignments/protocol-numbers/protocol-numbers.xhtml'> | assignments/ikev2-parameters/"> | |||
<front> | <front> | |||
<title>Protocol Numbers</title> | <title>Transform Type 1 - Encryption Algorithm Transform IDs</title> | |||
<author initials="IANA"> | <author> | |||
<organization>Internet Assigned Numbers Authority (I | <organization>IANA</organization> | |||
ANA)</organization> | </author> | |||
</author> | </front> | |||
<date month="January" day="31" year="2020"/> | </reference> | |||
</front> | ||||
<format type="TXT" target="https://www.iana.org/assignments/ | ||||
protocol-numbers/protocol-numbers.xhtml"/> | ||||
</reference> | ||||
<reference anchor="IANA-Method-Type" target='https://www.iana.or | <reference anchor="IKEv2-Transform-Type-3" target="https://www.iana.org/ | |||
g/assignments/eap-numbers/eap-numbers.xhtml#eap-numbers-4'> | assignments/ikev2-parameters/"> | |||
<front> | <front> | |||
<title>Method Type</title> | <title>Transform Type 3 - Integrity Algorithm Transform IDs</title> | |||
<author initials="IANA"> | <author> | |||
<organization>Internet Assigned Numbers Authority (I | <organization>IANA</organization> | |||
ANA)</organization> | </author> | |||
</author> | </front> | |||
<date month="April" day="14" year="2020"/> | </reference> | |||
</front> | ||||
<format type="TXT" target="https://www.iana.org/assignments/ | ||||
protocol-numbers/protocol-numbers.xhtml"/> | ||||
</reference> | ||||
<reference anchor="ITU-T.X.690"> | <reference anchor="IKEv2-Transform-Type-4" target="https://www.iana.org/ | |||
<front> | assignments/ikev2-parameters/"> | |||
<title>Recommendation ITU-T X.690</title> | <front> | |||
<author/> | <title>Transform Type 4 - Diffie-Hellman Group Transform IDs</title> | |||
<date month="August" year="2015"/> | <author> | |||
</front> | <organization>IANA</organization> | |||
</reference> | </author> | |||
</front> | ||||
</reference> | ||||
</references> | <reference anchor="IKEv2-Auth-Method" target="https://www.iana.org/assig | |||
nments/ikev2-parameters/"> | ||||
<front> | ||||
<title>IKEv2 Authentication Method</title> | ||||
<author> | ||||
<organization>IANA</organization> | ||||
</author> | ||||
</front> | ||||
</reference> | ||||
<references title="Informative References"> | <reference anchor="IANA-Protocols-Number" target="https://www.iana.org/a | |||
&RFC7149; | ssignments/protocol-numbers/"> | |||
&RFC2367; | <front> | |||
&RFC6071; | <title>Protocol Numbers</title> | |||
&RFC7426; | <author> | |||
&RFC3688; | <organization>IANA</organization> | |||
&RFC6437; | </author> | |||
&RFC8192; | </front> | |||
&RFC8329; | </reference> | |||
&RFC6040; | ||||
<reference anchor="I-D.tran-ipsecme-yang"> | ||||
<front> | ||||
<title>Yang Data Model for Internet Protocol | ||||
Security (IPsec)</title> | ||||
<author initials="K" surname="Tran" fullname="Khanh Tran | ||||
"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="H" surname="Wang" fullname="Honglei Wa | ||||
ng"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="V" surname="Nagaraj" fullname="Vijay K | ||||
umar Nagaraj"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="X" surname="Chen" fullname="Xia Chen"> | ||||
<organization/> | ||||
</author> | ||||
<date month="June" day="15" year="2015"/> | ||||
<abstract> | ||||
<t> | ||||
This document describes a YANG data model | ||||
for the IPsec(Internet Protocol Security) | ||||
protocol. The model covers the IPsec | ||||
protocol operational state and remote | ||||
procedural calls. | ||||
</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-tran-ipsecme- | ||||
yang-01"/> | ||||
<format type="TXT" target="https://tools.ietf.org/html/draft | ||||
-tran-ipsecme-yang-01"/> | ||||
</reference> | ||||
<reference anchor="I-D.carrel-ipsecme-controller-ike"> | <reference anchor="IANA-Method-Type" target="https://www.iana.org/assign | |||
<front> | ments/eap-numbers/"> | |||
<title>IPsec Key Exchange using a | <front> | |||
Controller</title> | <title>Method Type</title> | |||
<author initials="D" surname="Carrel" fullname="David Ca | <author> | |||
rrel"> | <organization>IANA</organization> | |||
<organization/> | </author> | |||
</author> | </front> | |||
<author initials="B" surname="Weiss" fullname="Brian Wei | </reference> | |||
ss"> | <reference anchor="ITU-T.X.690"> | |||
<organization/> | <front> | |||
</author> | <title>Information Technology - ASN.1 encoding rules: Specification | |||
<date month="March" day="11" year="2019"/> | of Basic | |||
<abstract> | Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguishe | |||
<t> | d Encoding | |||
This document presents a key exchange | Rules (DER)</title> | |||
method allowing devices managed by a | <author><organization>International Telecommunication | |||
controller (e.g., an SDN management | Union</organization></author> | |||
station) to create private | <date month="February" year="2021"/> | |||
pair-wise IPsec SAs without IKEv2 or any | </front> | |||
other direct peer-to-peer | <refcontent>ITU-T Recommendation X.690</refcontent> | |||
session establishment messages. The | <refcontent>ISO/IEC 8825-1</refcontent> | |||
method can be used when a full | </reference> | |||
mesh of IKEv2 sessions between IPsec | </references> | |||
devices is not appropriate. | <references> | |||
</t> | <name>Informative References</name> | |||
</abstract> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
</front> | FC.7149.xml"/> | |||
<seriesInfo name="Internet-Draft" value="draft-carrel-ipsecm | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
e-controller-ike-01"/> | FC.2367.xml"/> | |||
<format type="TXT" target="https://tools.ietf.org/html/draft | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
-carrel-ipsecme-controller-ike-01"/> | FC.6071.xml"/> | |||
</reference> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
FC.7426.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.3688.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.6437.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8192.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8329.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.6040.xml"/> | ||||
<reference anchor="ITU-T.Y.3300" target='https://www.itu.int/rec | <xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D | |||
/T-REC-Y.3300/en'> | .tran-ipsecme-yang.xml"/> | |||
<front> | ||||
<title>Recommendation ITU-T Y.3300</title> | ||||
<author/> | ||||
<date month="June" year="2014"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="ONF-SDN-Architecture" target='https://www.ope | <xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D | |||
nnetworking.org/wp-content/uploads/2013/02/TR_SDN_ARCH_1.0_06062014.pdf | .carrel-ipsecme-controller-ike.xml"/> | |||
'> | ||||
<front> | ||||
<title>SDN Architecture</title> | ||||
<author/> | ||||
<date month="June" year="2014"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="ONF-OpenFlow" target='https://www.opennetwork | <reference anchor="ITU-T.Y.3300" target="https://www.itu.int/rec/T-REC-Y | |||
ing.org/wp-content/uploads/2014/10/openflow-spec-v1.4.0.pdf | .3300/en"> | |||
'> | <front> | |||
<front> | <title>Y.3300: Framework of software-defined networking</title> | |||
<title>OpenFlow Switch Specification (Version | <author> | |||
1.4.0)</title> | <organization>International Telecommunications Union</organization> | |||
<author> | </author> | |||
<organization>ONF</organization> | <date month="June" year="2014"/> | |||
</author> | </front> | |||
<date month="October" year="2013"/> | </reference> | |||
</front> | ||||
</reference> | ||||
<!--<reference anchor="ITU-T.X.1252"> | <reference anchor="ONF-SDN-Architecture" target="https://www.opennetwork | |||
<front> | ing.org/wp-content/uploads/2013/02/TR_SDN_ARCH_1.0_06062014.pdf "> | |||
<title>Baseline Identity Management Terms and | <front> | |||
Definitions</title> | <title>SDN architecture</title> | |||
<author/> | <author> | |||
<date month="April" year="2010"/> | <organization>Open Networking Foundation</organization> | |||
</front> | </author> | |||
</reference>--> | <date month="June" year="2014"/> | |||
</front> | ||||
<seriesInfo name="Issue" value="1"/> | ||||
</reference> | ||||
<!--<reference anchor="ITU-T.X.800"> | <reference anchor="ONF-OpenFlow" target="https://www.opennetworking.org/ | |||
<front> | wp-content/uploads/2014/10/openflow-spec-v1.4.0.pdf "> | |||
<title>Security Architecture for Open Systems | <front> | |||
Interconnection for CCITT | <title>OpenFlow Switch Specification</title> | |||
Applications</title> | <author> | |||
<author/> | <organization>Open Networking Foundation</organization> | |||
<date month="March" year="1991"/> | </author> | |||
</front> | <date month="October" year="2013"/> | |||
</reference>--> | </front> | |||
<reference anchor="netconf-vpn" target='https://ripe68.ripe.net/ | <seriesInfo name="Version" value="1.4.0 (Wire Protocol 0x05)"/> | |||
presentations/181-NETCONF-YANG-tutorial-43.pdf'> | </reference> | |||
<front> | <reference anchor="netconf-vpn" target="https://ripe68.ripe.net/ | |||
<title>Tutorial: NETCONF and YANG</title> | presentations/181-NETCONF-YANG-tutorial-43.pdf"> | |||
<author> | <front> | |||
<organization>Stefan Wallin</organization> | <title>Tutorial: NETCONF and YANG</title> | |||
</author> | <author> | |||
<date month="January" year="2014"/> | <organization>Stefan Wallin</organization> | |||
</front> | </author> | |||
</reference> | <date month="January" year="2014"/> | |||
</front> | ||||
</reference> | ||||
<reference anchor="strongswan" target='https://www.strongswan.or | <reference anchor="strongswan" target="https://www.strongswan.org/"> | |||
g/'> | <front> | |||
<front> | <title>strongSwan: the OpenSource IPsec-based VPN | |||
<title>StrongSwan: the OpenSource IPsec-based VPN | ||||
Solution</title> | Solution</title> | |||
<author initials="CESNET"> | <author initials="CESNET"> | |||
<organization>CESNET</organization> | <organization>CESNET</organization> | |||
</author> | </author> | |||
<date month="September" day="07" year="2020"/> | </front> | |||
</front> | <format type="TXT" target="https://www.strongswan.org"/> | |||
<format type="TXT" target="https://www.strongswan.org"/> | </reference> | |||
</reference> | ||||
<reference anchor="libreswan" target='https://libreswan.org/'> | ||||
<front> | ||||
<title>Libreswan VPN software</title> | ||||
<author initials="The Libreswan Project"> | ||||
<organization>The Libreswan Project</organization> | ||||
</author> | ||||
<date month="September" day="7" year="2020"/> | ||||
</front> | ||||
<format type="TXT" target="https://libreswan.org/"/> | ||||
</reference> | ||||
<reference anchor="SDNSecurity"> | ||||
<front> | ||||
<title>Towards secure and dependable software-defined ne | ||||
tworks. HotSDN 2013 - Proceedings of the 2013 ACM SIGCOMM Workshop on Hot Topics | ||||
in Software Defined Networking. 55-60. 10.1145/2491185.2491199. | ||||
</title> | ||||
<author initials="D" surname="Kreutz" fullname="D. Kreut | ||||
z"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="F" surname="Ramos" fullname="F. Ramos" | ||||
> | ||||
<organization/> | ||||
</author> | ||||
<author initials="P" surname="Verissimo" fullname="P. Ve | ||||
rissimo"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2013"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="SDNSecServ"> | ||||
<front> | ||||
<title>SDN Security: A Survey. IEEE SDN for Future Netwo | ||||
rks and Services (SDN4FNS), Trento, 2013, pp. 1-7, doi: 10.1109/SDN4FNS.2013.670 | ||||
2553.</title> | ||||
<author initials="S" surname="Scott-Hayward" fullname="S | ||||
. Scott-Hayward"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="G" surname="O'Callaghan" fullname="G. | ||||
O'Callaghan"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="P" surname="Sezer" fullname="P. Sezer" | ||||
> | ||||
<organization/> | ||||
</author> | ||||
<date year="2013"/> | ||||
</front> | ||||
</reference> | ||||
</references> | ||||
<section anchor="appendix-d" title="XML configuration example for IK | <reference anchor="libreswan" target="https://libreswan.org/"> | |||
E case (gateway-to-gateway)"> | <front> | |||
<title>Libreswan VPN software</title> | ||||
<author initials="The Libreswan Project"> | ||||
<organization>The Libreswan Project</organization> | ||||
</author> | ||||
</front> | ||||
</reference> | ||||
<t>This example shows a XML configuration file sent by the I2NSF | <reference anchor="SDNSecurity"> | |||
Controller to establish a IPsec SA between two NSFs (see <xref target="fig:exam | <front> | |||
ple-ike"/>) in tunnel mode (gateway-to-gateway) with ESP, authentication based o | <title>Towards secure and dependable software-defined networks</titl | |||
n X.509 certificates (simplified for brevity with "base64encodedvalue==") and ap | e> | |||
plying the IKE case.</t> | <author initials="D" surname="Kreutz" fullname="D. Kreutz"> | |||
<organization/> | ||||
</author> | ||||
<author initials="F" surname="Ramos" fullname="F. Ramos"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="P" surname="Verissimo" fullname="P. Verissimo"> | ||||
<organization/> | ||||
</author> | ||||
<date month="August" year="2013"/> | ||||
</front> | ||||
<refcontent>Proceedings of the second ACM SIGCOMM workshop on Hot Topic | ||||
s in software defined networking, pp. 55-60</refcontent> | ||||
<seriesInfo name="DOI" value="10.1145/2491185.2491199"/> | ||||
</reference> | ||||
<t> | <reference anchor="SDNSecServ"> | |||
<figure align="center" anchor="fig:example-ike" title="IKE c | <front> | |||
ase, tunnel mode , X.509 certificate authentication."> | <title>Sdn Security: A Survey</title> | |||
<artwork align="center"> | <author initials="S" surname="Scott-Hayward" fullname="S. Scott-Hayw | |||
<![CDATA[ | ard"> | |||
<organization/> | ||||
</author> | ||||
<author initials="G" surname="O'Callaghan" fullname="G. O'Callaghan" | ||||
> | ||||
<organization/> | ||||
</author> | ||||
<author initials="P" surname="Sezer" fullname="P. Sezer"> | ||||
<organization/> | ||||
</author> | ||||
<date month="November" year="2013"/> | ||||
</front> | ||||
<refcontent>2013 IEEE SDN for Future Networks and Services (SDN4FNS), p | ||||
p. 1-7</refcontent> | ||||
<seriesInfo name="DOI" value="10.1109/SDN4FNS.2013.6702553"/> | ||||
</reference> | ||||
</references> | ||||
</references> | ||||
<section anchor="appendix-d" numbered="true" toc="default"> | ||||
<name>XML Configuration Example for IKE Case (Gateway-to-Gateway)</name> | ||||
<t>This example shows an XML configuration file sent by the I2NSF Controll | ||||
er to establish an IPsec SA between two NSFs (see <xref target="fig_example-ike" | ||||
format="default"/>) in tunnel mode (gateway-to-gateway) with ESP, with authenti | ||||
cation based on X.509 certificates (simplified for brevity with "base64encodedva | ||||
lue==") and applying the IKE case.</t> | ||||
<figure anchor="fig_example-ike"> | ||||
<name>IKE Case, Tunnel Mode, X.509 Certificate Authentication</name> | ||||
<artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
+------------------+ | +------------------+ | |||
| I2NSF Controller | | | I2NSF Controller | | |||
+------------------+ | +------------------+ | |||
I2NSF NSF-Facing | | I2NSF NSF-Facing | | |||
Interface | | Interface | | |||
/-----------------+---------------\ | /-----------------+---------------\ | |||
/ \ | / \ | |||
/ \ | / \ | |||
+----+ +--------+ +--------+ +----+ | +----+ +--------+ +--------+ +----+ | |||
| h1 |--| nsf_h1 |== IPsec_ESP_Tunnel_mode == | nsf_h2 |--| h2 | | | h1 |--| nsf_h1 |== IPsec_ESP_Tunnel_mode == | nsf_h2 |--| h2 | | |||
+----+ +--------+ +--------+ +----+ | +----+ +--------+ +--------+ +----+ | |||
:1 :100 :200 :1 | :1 :100 :200 :1 | |||
(2001:db8:1:/64) (2001:db8:123:/64) (2001:db8:2:/64) | (2001:db8:1:/64) (2001:db8:123:/64) (2001:db8:2:/64) | |||
]]> | ]]></artwork> | |||
</artwork> | </figure> | |||
</figure> | <sourcecode type="xml"><![CDATA[ | |||
</t> | ||||
<t> | ||||
<figure> | ||||
<artwork> | ||||
<![CDATA[ | ||||
<ipsec-ike xmlns="urn:ietf:params:xml:ns:yang:ietf-i2nsf-ike" | <ipsec-ike xmlns="urn:ietf:params:xml:ns:yang:ietf-i2nsf-ike" | |||
xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"> | xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"> | |||
<pad> | <pad> | |||
<pad-entry> | <pad-entry> | |||
<name>nsf_h1_pad</name> | <name>nsf_h1_pad</name> | |||
<ipv6-address>2001:db8:123::100</ipv6-address> | <ipv6-address>2001:db8:123::100</ipv6-address> | |||
<peer-authentication> | <peer-authentication> | |||
<auth-method>digital-signature</auth-method> | <auth-method>digital-signature</auth-method> | |||
<digital-signature> | <digital-signature> | |||
<cert-data>base64encodedvalue==</cert-data> | <cert-data>base64encodedvalue==</cert-data> | |||
skipping to change at line 4325 ¶ | skipping to change at line 4000 ¶ | |||
<ca-data>base64encodedvalue==</ca-data> | <ca-data>base64encodedvalue==</ca-data> | |||
</digital-signature> | </digital-signature> | |||
</peer-authentication> | </peer-authentication> | |||
</pad-entry> | </pad-entry> | |||
</pad> | </pad> | |||
<conn-entry> | <conn-entry> | |||
<name>nsf_h1-nsf_h2</name> | <name>nsf_h1-nsf_h2</name> | |||
<autostartup>start</autostartup> | <autostartup>start</autostartup> | |||
<version>ikev2</version> | <version>ikev2</version> | |||
<initial-contact>false</initial-contact> | <initial-contact>false</initial-contact> | |||
<fragmentation><enable>false</enable></fragmentation> | <fragmentation><enabled>false</enabled></fragmentation> | |||
<ike-sa-lifetime-soft> | <ike-sa-lifetime-soft> | |||
<rekey-time>60</rekey-time> | <rekey-time>60</rekey-time> | |||
<reauth-time>120</reauth-time> | <reauth-time>120</reauth-time> | |||
</ike-sa-lifetime-soft> | </ike-sa-lifetime-soft> | |||
<ike-sa-lifetime-hard> | <ike-sa-lifetime-hard> | |||
<over-time>3600</over-time> | <over-time>3600</over-time> | |||
</ike-sa-lifetime-hard> | </ike-sa-lifetime-hard> | |||
<!--AUTH_HMAC_SHA2_512_256--> | <!--AUTH_HMAC_SHA2_512_256--> | |||
<ike-sa-intr-alg>14</ike-sa-intr-alg> | <ike-sa-intr-alg>14</ike-sa-intr-alg> | |||
<!--ENCR_AES_CBC - 128 bits--> | <!--ENCR_AES_CBC - 128 bits--> | |||
skipping to change at line 4416 ¶ | skipping to change at line 4091 ¶ | |||
</child-sa-lifetime-soft> | </child-sa-lifetime-soft> | |||
<child-sa-lifetime-hard> | <child-sa-lifetime-hard> | |||
<bytes>2000000</bytes> | <bytes>2000000</bytes> | |||
<packets>2000</packets> | <packets>2000</packets> | |||
<time>60</time> | <time>60</time> | |||
<idle>120</idle> | <idle>120</idle> | |||
</child-sa-lifetime-hard> | </child-sa-lifetime-hard> | |||
</child-sa-info> | </child-sa-info> | |||
</conn-entry> | </conn-entry> | |||
</ipsec-ike> | </ipsec-ike> | |||
]]> | ]]></sourcecode> | |||
</artwork> | </section> | |||
</figure> | <section anchor="appendix-e" numbered="true" toc="default"> | |||
</t> | <name>XML Configuration Example for IKE-less Case (Host-to-Host)</name> | |||
</section> | <t>This example shows an XML configuration file sent by the I2NSF Controll | |||
<section anchor="appendix-e" title="XML configuration example for IK | er to establish an IPsec SA between two NSFs (see <xref target="fig_example-ikel | |||
E-less case (host-to-host)"> | ess" format="default"/>) in transport mode (host-to-host) with ESP in the IKE-le | |||
<t>This example shows a XML configuration file sent by the I2NSF | ss case.</t> | |||
Controller to establish a IPsec SA between two NSFs (see <xref target="fig:exam | <figure anchor="fig_example-ikeless"> | |||
ple-ikeless"/>) in transport mode (host-to-host) with ESP in the IKE-less case.< | <name>IKE-less Case, Transport Mode</name> | |||
/t> | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
<t> | ||||
<figure align="center" anchor="fig:example-ikeless" title="I | ||||
KE-less case, transport mode."> | ||||
<artwork align="center"> | ||||
<![CDATA[ | ||||
+------------------+ | +------------------+ | |||
| I2NSF Controller | | | I2NSF Controller | | |||
+------------------+ | +------------------+ | |||
I2NSF NSF-Facing | | I2NSF NSF-Facing | | |||
Interface | | Interface | | |||
/--------------------+-------------------\ | /--------------------+-------------------\ | |||
/ \ | / \ | |||
/ \ | / \ | |||
+--------+ +--------+ | +--------+ +--------+ | |||
| nsf_h1 |===== IPsec_ESP_Transport_mode =====| nsf_h2 | | | nsf_h1 |===== IPsec_ESP_Transport_mode =====| nsf_h2 | | |||
+--------+ +--------+ | +--------+ +--------+ | |||
:100 (2001:db8:123:/64) :200 | :100 (2001:db8:123:/64) :200 | |||
]]></artwork> | ||||
]]> | </figure> | |||
</artwork> | <sourcecode type="xml"><![CDATA[ | |||
</figure> | ||||
</t> | ||||
<t> | ||||
<figure> | ||||
<artwork> | ||||
<![CDATA[ | ||||
<ipsec-ikeless | <ipsec-ikeless | |||
xmlns="urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless" | xmlns="urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless" | |||
xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"> | xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"> | |||
<spd> | <spd> | |||
<spd-entry> | <spd-entry> | |||
<name> | <name> | |||
in/trans/2001:db8:123::200/2001:db8:123::100 | in/trans/2001:db8:123::200/2001:db8:123::100 | |||
</name> | </name> | |||
<direction>inbound</direction> | <direction>inbound</direction> | |||
<reqid>1</reqid> | <reqid>1</reqid> | |||
skipping to change at line 4601 ¶ | skipping to change at line 4267 ¶ | |||
<bytes>1000000</bytes> | <bytes>1000000</bytes> | |||
<packets>1000</packets> | <packets>1000</packets> | |||
<time>30</time> | <time>30</time> | |||
<idle>60</idle> | <idle>60</idle> | |||
<action>replace</action> | <action>replace</action> | |||
</sa-lifetime-soft> | </sa-lifetime-soft> | |||
</ipsec-sa-config> | </ipsec-sa-config> | |||
</sad-entry> | </sad-entry> | |||
</sad> | </sad> | |||
</ipsec-ikeless> | </ipsec-ikeless> | |||
]]> | ]]></sourcecode> | |||
</artwork> | </section> | |||
</figure> | <section anchor="appendix-f" numbered="true" toc="default"> | |||
</t> | <name>XML Notification Examples</name> | |||
</section> | <t>In the following, several XML files are shown to | |||
<section anchor="appendix-f" title="XML notification examples"> | ||||
<t>In the following, several XML files are shown to | ||||
illustrate different types of notifications defined | illustrate different types of notifications defined | |||
in the IKE-less YANG model, which are sent by the | in the IKE-less YANG data model, which are sent by the | |||
NSF to the I2NSF Controller. The notifications | NSF to the I2NSF Controller. The notifications | |||
happen in the IKE-less case.</t> | happen in the IKE-less case.</t> | |||
<t> | <figure anchor="sadb-expire-not"> | |||
<figure align="center" anchor="fig:expire-example" title="Ex | <name>Example of the sadb-expire Notification</name> | |||
ample of sadb-expire notification."> | <sourcecode type="xml"><![CDATA[ | |||
<artwork> | ||||
<![CDATA[ | ||||
<sadb-expire xmlns="urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless"> | <sadb-expire xmlns="urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless"> | |||
<ipsec-sa-name>in/trans/2001:db8:123::200/2001:db8:123::100 | <ipsec-sa-name>in/trans/2001:db8:123::200/2001:db8:123::100 | |||
</ipsec-sa-name> | </ipsec-sa-name> | |||
<soft-lifetime-expire>true</soft-lifetime-expire> | <soft-lifetime-expire>true</soft-lifetime-expire> | |||
<lifetime-current> | <lifetime-current> | |||
<bytes>1000000</bytes> | <bytes>1000000</bytes> | |||
<packets>1000</packets> | <packets>1000</packets> | |||
<time>30</time> | <time>30</time> | |||
<idle>60</idle> | <idle>60</idle> | |||
</lifetime-current> | </lifetime-current> | |||
</sadb-expire> | </sadb-expire> | |||
]]> | ]]></sourcecode> | |||
</artwork> | </figure> | |||
</figure> | <figure anchor="sadb-acquire-not"> | |||
</t> | <name>Example of the sadb-acquire Notification</name> | |||
<t> | <sourcecode type="xml"><![CDATA[ | |||
<figure align="center" anchor="fig:acquire-example" title="E | ||||
xample of sadb-acquire notification."> | ||||
<artwork> | ||||
<![CDATA[ | ||||
<sadb-acquire xmlns="urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless"> | <sadb-acquire xmlns="urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless"> | |||
<ipsec-policy-name>in/trans/2001:db8:123::200/2001:db8:123::100 | <ipsec-policy-name>in/trans/2001:db8:123::200/2001:db8:123::100 | |||
</ipsec-policy-name> | </ipsec-policy-name> | |||
<traffic-selector> | <traffic-selector> | |||
<local-prefix>2001:db8:123::200/128</local-prefix> | <local-prefix>2001:db8:123::200/128</local-prefix> | |||
<remote-prefix>2001:db8:123::100/128</remote-prefix> | <remote-prefix>2001:db8:123::100/128</remote-prefix> | |||
<inner-protocol>any</inner-protocol> | <inner-protocol>any</inner-protocol> | |||
<local-ports> | <local-ports> | |||
<start>0</start> | <start>0</start> | |||
<end>0</end> | <end>0</end> | |||
</local-ports> | </local-ports> | |||
<remote-ports> | <remote-ports> | |||
<start>0</start> | <start>0</start> | |||
<end>0</end> | <end>0</end> | |||
</remote-ports> | </remote-ports> | |||
</traffic-selector> | </traffic-selector> | |||
</sadb-acquire> | </sadb-acquire> | |||
]]> | ]]></sourcecode> | |||
</artwork> | </figure> | |||
</figure> | <figure anchor="sadb-seq-overflow-not"> | |||
</t> | <name>Example of the sadb-seq-overflow Notification</name> | |||
<t> | <sourcecode type="xml"><![CDATA[ | |||
<figure align="center" anchor="fig:seqoverflow-example" titl | ||||
e="Example of sadb-seq-overflow notification."> | ||||
<artwork> | ||||
<![CDATA[ | ||||
<sadb-seq-overflow | <sadb-seq-overflow | |||
xmlns="urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless"> | xmlns="urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless"> | |||
<ipsec-sa-name>in/trans/2001:db8:123::200/2001:db8:123::100 | <ipsec-sa-name>in/trans/2001:db8:123::200/2001:db8:123::100 | |||
</ipsec-sa-name> | </ipsec-sa-name> | |||
</sadb-seq-overflow> | </sadb-seq-overflow> | |||
]]> | ]]></sourcecode> | |||
</artwork> | </figure> | |||
</figure> | <figure anchor="sadb-bad-spi-not"> | |||
</t> | <name>Example of the sadb-bad-spi Notification</name> | |||
<t> | <sourcecode type="xml"><![CDATA[ | |||
<figure align="center" anchor="fig:bad-spi-example" title="E | ||||
xample of sadb-bad-spi notification."> | ||||
<artwork> | ||||
<![CDATA[ | ||||
<sadb-bad-spi | <sadb-bad-spi | |||
xmlns="urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless"> | xmlns="urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless"> | |||
<spi>666</spi> | <spi>666</spi> | |||
</sadb-bad-spi> | </sadb-bad-spi> | |||
]]> | ]]></sourcecode> | |||
</artwork> | </figure> | |||
</figure> | </section> | |||
</t> | <section anchor="appendix-g" numbered="true" toc="default"> | |||
</section> | <name>Operational Use Case Examples</name> | |||
<section anchor="appendix-g1" numbered="true" toc="default"> | ||||
<section anchor="appendix-g" title="Operational use cases examples"> | <name>Example of IPsec SA Establishment</name> | |||
<t>This appendix exemplifies the applicability of the IKE case and | ||||
<section anchor="appendix-g1" title="Example of IPsec SA establishment"> | ||||
<t>This appendix exemplifies the applicability of IKE case and | ||||
IKE-less case to traditional IPsec configurations, that is, | IKE-less case to traditional IPsec configurations, that is, | |||
host-to-host and gateway-to-gateway. The following examples assume | host-to-host and gateway-to-gateway. The following examples assume | |||
the existence of two NSFs needing to establish an | the existence of two NSFs needing to establish an | |||
end-to-end IPsec SA to protect their communications. Both NSFs | end-to-end IPsec SA to protect their communications. Both NSFs | |||
could be two hosts that exchange traffic (host-to-host) or gateways | could be two hosts that exchange traffic (host-to-host) or gateways | |||
(gateway-to-gateway), for example, within an enterprise that needs | (gateway-to-gateway), for example, within an enterprise that needs | |||
to protect the traffic between the networks of two branch | to protect the traffic between the networks of two branch | |||
offices.</t> | offices.</t> | |||
<t>Applicability of these configurations appear in current and new | ||||
<t>Applicability of these configurations appear in current and new | networking scenarios. | |||
networking scenarios. For example, SD-WAN technologies are | For example, SD-WAN technologies are | |||
providing dynamic and on-demand VPN connections between branch | providing dynamic and on-demand VPN connections between branch | |||
offices, or between branches and SaaS cloud services. Besides, IaaS | offices or between branches and Software as a Service (SaaS) | |||
cloud services. Besides, | ||||
Infrastructure as a Service (IaaS) | ||||
services providing virtualization environments are deployments that | services providing virtualization environments are deployments that | |||
often rely on IPsec to provide secure channels between virtual | often rely on IPsec to provide secure channels between virtual | |||
instances (host-to-host) and providing VPN solutions for | instances (host-to-host) and providing VPN solutions for | |||
virtualized networks (gateway-to-gateway).</t> | virtualized networks (gateway-to-gateway).</t> | |||
<t>As can be observed in the following, the I2NSF-based | ||||
<t>As can be observed in the following, the I2NSF-based | IPsec management system (for IKE and IKE-less cases) | |||
IPsec management system (for IKE and IKE-less cases), | exhibits various advantages: | |||
exhibits various | </t> | |||
advantages: | <ol spacing="normal" type="1"><li> | |||
<list style="numbers"> | It allows creating IPsec SAs among two NSFs, | |||
<t> | ||||
It allows to create IPsec SAs among two NSFs, | ||||
based only on the application | based only on the application | |||
of general Flow-based Protection Policies at the | of general flow-based protection policies at the | |||
I2NSF User. Thus, administrators can | I2NSF User. Thus, administrators can | |||
manage all security associations in a | manage all security associations in a | |||
centralized point with an abstracted view of the | centralized point with an abstracted view of the | |||
network. | network. | |||
</t> | </li> | |||
<t> | <li> | |||
Any NSF deployed in the system does not need | Any NSF deployed in the system does not need | |||
manual configuration, therefore allowing its | manual configuration, therefore, allowing its | |||
deployment in an automated manner. | deployment in an automated manner. | |||
</t> | </li> | |||
</list> | </ol> | |||
</t> | <section anchor="sec-example-ikecase" numbered="true" toc="default"> | |||
<name>IKE Case</name> | ||||
<section anchor="sec-example-ikecase" title="IKE case"> | <figure anchor="fig_g2gsinglecontroller1"> | |||
<name>Host-to-Host/Gateway-to-Gateway for the IKE Case</name> | ||||
<!-- maximum wide of the figure | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
--> | ||||
<figure align="center" anchor="fig:g2gsinglecontroller1" title="H | ||||
ost-to-host / gateway-to-gateway for the IKE case."> | ||||
<artwork align="center"> | ||||
<![CDATA[ | ||||
+----------------------------------------+ | +----------------------------------------+ | |||
| I2NSF User (IPsec Management System) | | | I2NSF User (IPsec Management System) | | |||
+----------------------------------------+ | +----------------------------------------+ | |||
| | | | |||
(1) Flow-based I2NSF Consumer-Facing | (1) Flow-based I2NSF Consumer-Facing | |||
Protection Policy Interface | Protection Policy Interface | |||
| | | | |||
+---------|------------------------------+ | +---------|------------------------------+ | |||
| | | | | | | | |||
| | I2NSF Controller | | | | I2NSF Controller | | |||
skipping to change at line 4762 ¶ | skipping to change at line 4409 ¶ | |||
+--------------------------|-----|-------+ | +--------------------------|-----|-------+ | |||
| | | | | | |||
I2NSF NSF-Facing Interface | | | I2NSF NSF-Facing Interface | | | |||
| (3) | | | (3) | | |||
|-------------------------+ +---| | |-------------------------+ +---| | |||
V V | V V | |||
+----------------------+ +----------------------+ | +----------------------+ +----------------------+ | |||
| NSF A | | NSF B | | | NSF A | | NSF B | | |||
| IKEv2/IPsec(SPD/PAD) | | IKEv2/IPsec(SPD/PAD) | | | IKEv2/IPsec(SPD/PAD) | | IKEv2/IPsec(SPD/PAD) | | |||
+----------------------+ +----------------------+ | +----------------------+ +----------------------+ | |||
]]> | ]]></artwork> | |||
</artwork> | </figure> | |||
</figure> | <t> | |||
<t> | <xref target="fig_g2gsinglecontroller1" format="default"/> | |||
<xref target="fig:g2gsinglecontroller1"/> describes the | describes the | |||
application of the IKE case when a data packet needs to be | application of the IKE case when a data packet needs to be | |||
protected in the path between the NSF A and NSF B: | protected in the path between NSF A and NSF B: | |||
</t> | </t> | |||
<t> | <ol spacing="normal" type="1"> | |||
<list style="numbers"> | <li>The I2NSF User defines a general flow-based | |||
<t> | ||||
The I2NSF User defines a general flow-based | ||||
protection policy (e.g., protect data traffic between | protection policy (e.g., protect data traffic between | |||
NSF A and B). The I2NSF Controller looks | NSF A and B). The I2NSF Controller looks | |||
for the NSFs involved (NSF A and NSF B). | for the NSFs involved (NSF A and NSF B). | |||
</t> | </li> | |||
<li>The I2NSF Controller generates IKEv2 | ||||
<t> | ||||
The I2NSF Controller generates IKEv2 | ||||
credentials for them and translates the policies | credentials for them and translates the policies | |||
into SPD and PAD entries. | into SPD and PAD entries. | |||
</t> | </li> | |||
<t> | <li>The I2NSF Controller inserts an IKEv2 | |||
The I2NSF Controller inserts an IKEv2 | ||||
configuration that includes the SPD and PAD | configuration that includes the SPD and PAD | |||
entries in both NSF A and NSF B. If some of | entries in both NSF A and NSF B. If some of | |||
operations with NSF A and NSF B fail the | operations with NSF A and NSF B fail, the | |||
I2NSF Controller will stop the process and | I2NSF Controller will stop the process and | |||
perform a rollback operation by deleting any | perform a rollback operation by deleting any | |||
IKEv2, SPD and PAD configuration that had been | IKEv2, SPD, and PAD configuration that had been | |||
successfully installed in NSF A or B. | successfully installed in NSF A or B. | |||
</t> | </li> | |||
</list> | </ol> | |||
</t> | <t> If the previous steps are successful, the flow is | |||
<t> If the previous steps are successful, the flow is | ||||
protected by means of the IPsec SA established with IKEv2 | protected by means of the IPsec SA established with IKEv2 | |||
between NSF A and NSF B.</t> | between NSF A and NSF B.</t> | |||
</section> | </section> | |||
<section anchor="sec-example-ikeless-case" title="IKE-less case"> | <section anchor="sec-example-ikeless-case" numbered="true" toc="default" | |||
> | ||||
<!-- maximum wide of the figure | <name>IKE-less Case</name> | |||
--> | <figure anchor="fig_g2gsinglecontroller2"> | |||
<figure align="center" anchor="fig:g2gsinglecontroller2" title="Ho | <name>Host-to-Host/Gateway-to-Gateway for the IKE-less Case</name> | |||
st-to-host / gateway-to-gateway for IKE-less case."> | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
<artwork align="center"> | ||||
<![CDATA[ | ||||
+----------------------------------------+ | +----------------------------------------+ | |||
| I2NSF User (IPsec Management System) | | | I2NSF User (IPsec Management System) | | |||
+----------------------------------------+ | +----------------------------------------+ | |||
| | | | |||
(1) Flow-based I2NSF Consumer-Facing | (1) Flow-based I2NSF Consumer-Facing | |||
Protection Policy Interface | Protection Policy Interface | |||
| | | | |||
+---------|------------------------------+ | +---------|------------------------------+ | |||
| | | | | | | | |||
| | I2NSF Controller | | | | I2NSF Controller | | |||
skipping to change at line 4832 ¶ | skipping to change at line 4471 ¶ | |||
+-------------------------|-----|--------+ | +-------------------------|-----|--------+ | |||
| | | | | | |||
I2NSF NSF-Facing Interface | | | I2NSF NSF-Facing Interface | | | |||
| (3) | | | (3) | | |||
|----------------------+ +--| | |----------------------+ +--| | |||
V V | V V | |||
+----------------+ +----------------+ | +----------------+ +----------------+ | |||
| NSF A | | NSF B | | | NSF A | | NSF B | | |||
| IPsec(SPD/SAD) | | IPsec(SPD/SAD) | | | IPsec(SPD/SAD) | | IPsec(SPD/SAD) | | |||
+----------------+ +----------------+ | +----------------+ +----------------+ | |||
]]> | ]]></artwork> | |||
</artwork> | </figure> | |||
</figure> | <t> | |||
<xref target="fig_g2gsinglecontroller2" format="default"/> descri | ||||
<t> | bes the | |||
<xref target="fig:g2gsinglecontroller2"/> describes the | ||||
application of the IKE-less case when a data packet needs to be | application of the IKE-less case when a data packet needs to be | |||
protected in the path between the NSF A and NSF B: | protected in the path between NSF A and NSF B: | |||
</t> | </t> | |||
<t> | <ol spacing="normal" type="1"> | |||
<list style="numbers"> | <li>The I2NSF User establishes a general flow-based | |||
<t>The I2NSF User establishes a general Flow-based | protection policy, and the I2NSF Controller | |||
Protection Policy and the I2NSF Controller | looks for the involved NSFs.</li> | |||
looks for the involved NSFs.</t> | <li> The I2NSF Controller translates the flow-based security | |||
<t> The I2NSF Controller translates the flow-based security | policies into IPsec SPD and SAD entries.</li> | |||
policies into IPsec SPD and SAD entries.</t> | <li> | |||
<t>The I2NSF Controller inserts these entries | <t>The I2NSF Controller inserts these entries | |||
in both NSF A and NSF B IPsec databases (i.e., SPD and | in both NSF A and NSF B IPsec databases (i.e., SPD and | |||
SAD). The following text describes how this | SAD). The following text describes how this | |||
would happen: | would happen:</t> | |||
<list style="symbols"> | <ul spacing="normal"> | |||
<t>The I2NSF Controller chooses two random | <li>The I2NSF Controller chooses two random | |||
values as SPIs: for example, SPIa1 for the | values as SPIs, for example, SPIa1 for the | |||
inbound IPsec SA in the NSF A and SPIb1 for | inbound IPsec SA in NSF A and SPIb1 for | |||
the inbound IPsec SA in NSF B. The value of | the inbound IPsec SA in NSF B. The value of | |||
the SPIa1 MUST NOT be the same as any inbound | the SPIa1 <bcp14>MUST NOT</bcp14> be the same as any inbo und | |||
SPI in A. In the same way, the value of the | SPI in A. In the same way, the value of the | |||
SPIb1 MUST NOT be the same as any inbound SPI | SPIb1 <bcp14>MUST NOT</bcp14> be the same as any inbound | |||
in B. Moreover, the SPIa1 MUST be used in B | SPI | |||
in B. Moreover, the SPIa1 <bcp14>MUST</bcp14> be used in | ||||
B | ||||
for the outbound IPsec SA to A, while SPIb1 | for the outbound IPsec SA to A, while SPIb1 | |||
MUST be used in A for the outbound IPsec SA | <bcp14>MUST</bcp14> be used in A for the outbound IPsec S A | |||
to B. | to B. | |||
It also generates fresh cryptographic | It also generates fresh cryptographic | |||
material for the new inbound/outbound IPsec | material for the new inbound/outbound IPsec | |||
SAs and their parameters.</t> | SAs and their parameters.</li> | |||
<li> After that, the I2NSF Controller simultaneously sends | ||||
<t> After that, the I2NSF Controller sends | the new inbound IPsec SA with SPIa1 and | |||
simultaneously the new inbound IPsec SA with SPIa1 and | new outbound IPsec SA with SPIb1 to NSF A and the new | |||
new outbound IPsec SA with SPIb1 to NSF A; and the new | ||||
inbound IPsec SA with SPIb1 and new outbound | inbound IPsec SA with SPIb1 and new outbound | |||
IPsec SA with SPIa1 to B, together with the | IPsec SA with SPIa1 to B, together with the | |||
corresponding IPsec policies. </t> | corresponding IPsec policies. </li> | |||
<li>Once the I2NSF Controller receives confirmation from | ||||
<t>Once the I2NSF Controller receives confirmation from | ||||
NSF A and NSF B, it knows that the IPsec SAs are | NSF A and NSF B, it knows that the IPsec SAs are | |||
correctly installed and ready.</t> | correctly installed and ready.</li> | |||
</list> | </ul> | |||
<t> Another alternative to this operation is | ||||
Other alternative to this operation is: | the I2NSF Controller first sends the IPsec | |||
the I2NSF Controller sends first the IPsec | policies and new inbound IPsec SAs to A and B. | |||
policies and new inbound IPsec SAs to A and B | Once it obtains a successful confirmation of | |||
and, once it obtains a successful confirmation of | ||||
these operations from NSF A and NSF B, it | these operations from NSF A and NSF B, it | |||
proceeds with installing the new outbound | proceeds with installing the new outbound | |||
IPsec SAs. Even though this procedure may increase the | IPsec SAs. Even though this procedure may increase the | |||
latency to complete the process, no traffic is sent | latency to complete the process, no traffic is sent | |||
over the network until the IPsec SAs are | over the network until the IPsec SAs are | |||
completely operative. In any case other | completely operative. In any case, other | |||
alternatives MAY be possible to implement step 3. | alternatives <bcp14>MAY</bcp14> be possible to implement st | |||
</t> | ep 3.</t> | |||
</li> | ||||
<t>If some of the operations described above fail | <li>If some of the operations described above fail | |||
(e.g., the NSF A reports an error when the | (e.g., NSF A reports an error when the | |||
I2NSF Controller is trying to install the SPD | I2NSF Controller is trying to install the SPD | |||
entry, the new inbound or outbound IPsec SAs) | entry, the new inbound or outbound IPsec SAs), | |||
the I2NSF Controller MUST perform rollback | the I2NSF Controller <bcp14>MUST</bcp14> perform rollback | |||
operations by deleting any new inbound or | operations by deleting any new inbound or | |||
outbound IPsec SA and SPD entry that had been | outbound IPsec SA and SPD entry that had been | |||
successfully installed in any of the NSFs | successfully installed in any of the NSFs | |||
(e.g., NSF B) and stop the process. Note that the | (e.g., NSF B) and stop the process. Note that the | |||
I2NSF Controller MAY retry several | I2NSF Controller <bcp14>MAY</bcp14> retry several | |||
times before giving up.</t> | times before giving up.</li> | |||
<li> Otherwise, if the steps 1 to 3 are successful, the flow | ||||
<t> Otherwise, if the steps 1 to 3 are successful, the flow | ||||
between NSF A and NSF B is protected by means of the IPsec SAs | between NSF A and NSF B is protected by means of the IPsec SAs | |||
established by the I2NSF Controller. It is worth mentioning that | established by the I2NSF Controller. It is worth mentioning that | |||
the I2NSF Controller associates a lifetime to the new IPsec SAs. | the I2NSF Controller associates a lifetime to the new IPsec SAs. | |||
When this lifetime expires, the NSF will send a sadb-expire | When this lifetime expires, the NSF will send a sadb-expire | |||
notification to the I2NSF Controller in order to start the | notification to the I2NSF Controller in order to start the | |||
rekeying process.</t> | rekeying process.</li> | |||
</list> | </ol> | |||
</t> | <t>Instead of installing IPsec policies (in the SPD) and IPsec | |||
<t>Instead of installing IPsec policies (in the SPD) and IPsec | ||||
SAs (in the SAD) in step 3 (proactive mode), it is also | SAs (in the SAD) in step 3 (proactive mode), it is also | |||
possible that the I2NSF Controller only installs the SPD | possible that the I2NSF Controller only installs the SPD | |||
entries in step 3 (reactive mode). In such a case, when a | entries in step 3 (reactive mode). In such a case, when a | |||
data packet requires to be protected with IPsec, the NSF | data packet requires to be protected with IPsec, the NSF | |||
that saw first the data packet will send a sadb-acquire | that first saw the data packet will send a sadb-acquire | |||
notification that informs the I2NSF Controller that needs | notification that informs the I2NSF Controller that needs | |||
SAD entries with the IPsec SAs to process the data | SAD entries with the IPsec SAs to process the data | |||
packet. Again, if some of the operations installing | packet. Again, if some of the operations installing | |||
the new inbound/outbound IPsec SAs fail, the I2NSF Controller stops the | the new inbound/outbound IPsec SAs fail, the I2NSF Controller stops the | |||
process and performs a rollback operation by deleting any new | process and performs a rollback operation by deleting any new | |||
inbound/outbound SAs that had been successfully installed.</t> | inbound/outbound SAs that had been successfully installed.</t> | |||
</section> | ||||
</section> | </section> | |||
</section> | <section anchor="appendix-g2" numbered="true" toc="default"> | |||
<name>Example of the Rekeying Process in IKE-less Case</name> | ||||
<section anchor="appendix-g2" title="Example of the rekeying process in IKE- | ||||
less case"> | ||||
<t>To explain an example of the rekeying process between two | <t>To explain an example of the rekeying process between two | |||
IPsec NSFs A and B, let assume that SPIa1 | IPsec NSFs, A and B, assume that SPIa1 | |||
identifies the inbound IPsec SA in A, and SPIb1 | identifies the inbound IPsec SA in A and SPIb1 identifies | |||
the inbound IPsec SA in B. The rekeying process | the inbound IPsec SA in B. The rekeying process | |||
will take the following steps:</t> | will take the following steps:</t> | |||
<t> | <ol spacing="normal" type="1"> | |||
<list style="numbers"> | <li>The I2NSF Controller chooses two | |||
<t>The I2NSF Controller chooses two | ||||
random values as SPI for the new inbound | random values as SPI for the new inbound | |||
IPsec SAs: for example, SPIa2 for the | IPsec SAs, for example, SPIa2 for the | |||
inbound IPsec SA in A and SPIb2 for the | inbound IPsec SA in A and SPIb2 for the | |||
inbound IPsec SA in B. The value of the | inbound IPsec SA in B. The value of the | |||
SPIa1 MUST NOT be the same as any | SPIa1 <bcp14>MUST NOT</bcp14> be the same as any | |||
inbound SPI in A. In the same way, the | inbound SPI in A. In the same way, the | |||
value of the SPIb1 MUST NOT be the same | value of the SPIb1 <bcp14>MUST NOT</bcp14> be the sa me | |||
as any inbound SPI in B. Then, | as any inbound SPI in B. Then, | |||
the I2NSF Controller creates an inbound IPsec SA | the I2NSF Controller creates an inbound IPsec SA | |||
with SPIa2 in A and another inbound IPsec SA in B | with SPIa2 in A and another inbound IPsec SA in B | |||
with SPIb2. It can send this information | with SPIb2. It can send this information | |||
simultaneously to A and B.</t> | simultaneously to A and B.</li> | |||
<li> Once the I2NSF Controller receives | ||||
<t> Once the I2NSF Controller receives | ||||
confirmation from A and B, the controller knows that | confirmation from A and B, the controller knows that | |||
the inbound IPsec SAs are correctly installed. Then | the inbound IPsec SAs are correctly installed. Then, | |||
it proceeds to send in parallel to A and B, the | it proceeds to send, in parallel to A and B, the | |||
outbound IPsec SAs: the outbound IPsec SA | outbound IPsec SAs: the outbound IPsec SA | |||
to A with SPIb2, and the outbound IPsec SA to B with | to A with SPIb2 and the outbound IPsec SA to B with | |||
SPIa2. At this point the new IPsec SAs are | SPIa2. At this point, the new IPsec SAs are | |||
ready.</t> | ready.</li> | |||
<li> Once the I2NSF Controller receives | ||||
<t> Once the I2NSF Controller receives | ||||
confirmation from A and B that the outbound IPsec | confirmation from A and B that the outbound IPsec | |||
SAs have been installed, the I2NSF Controller, in | SAs have been installed, the I2NSF Controller, in | |||
parallel, deletes the old IPsec SAs from A (inbound | parallel, deletes the old IPsec SAs from A (inbound | |||
SPIa1 and outbound SPIb1) and B (outbound SPIa1 and | SPIa1 and outbound SPIb1) and B (outbound SPIa1 and | |||
inbound SPIb1).</t> | inbound SPIb1).</li> | |||
</list> | </ol> | |||
</t> | <t>If some of the operations in step 1 fail (e.g., | |||
<t>If some of the operations in step 1 fail (e.g., the | ||||
NSF A reports an error when the I2NSF Controller is | NSF A reports an error when the I2NSF Controller is | |||
trying to install a new inbound IPsec SA) the | trying to install a new inbound IPsec SA), the | |||
I2NSF Controller MUST perform rollback operations by | I2NSF Controller <bcp14>MUST</bcp14> perform rollback operat | |||
ions by | ||||
removing any new inbound SA that had been successfully | removing any new inbound SA that had been successfully | |||
installed during step 1. | installed during step 1. | |||
</t> | </t> | |||
<t>If step 1 is successful but some of the operations in | <t>If step 1 is successful but some of the operations in | |||
step 2 fail (e.g., the NSF A reports an error when the | step 2 fail (e.g., NSF A reports an error when the | |||
I2NSF Controller is trying to install the new | I2NSF Controller is trying to install the new | |||
outbound IPsec SA), the I2NSF Controller MUST perform | outbound IPsec SA), the I2NSF Controller <bcp14>MUST</bcp14> perform | |||
a rollback operation by deleting any new outbound SA | a rollback operation by deleting any new outbound SA | |||
that had been successfully installed during step 2 and | that had been successfully installed during step 2 and | |||
by deleting the inbound SAs created in step 1, | by deleting the inbound SAs created in step 1, | |||
in that order. | in that order. | |||
</t> | </t> | |||
<t>If the steps 1 and 2 are successful but the step 3 | <t>If the steps 1 and 2 are successful but the step 3 | |||
fails, the I2NSF Controller will avoid any rollback of | fails, the I2NSF Controller will avoid any rollback of | |||
the operations carried out in step 1 and step 2 since | the operations carried out in steps 1 and 2, since | |||
new and valid IPsec SAs were created and are functional. | new and valid IPsec SAs were created and are functional. | |||
The I2NSF Controller MAY reattempt to remove the old | The I2NSF Controller <bcp14>MAY</bcp14> reattempt to remove the old | |||
inbound and outbound IPsec SAs in NSF A and NSF B several ti mes | inbound and outbound IPsec SAs in NSF A and NSF B several ti mes | |||
until it receives a success or it gives up. In the last | until it receives a success or it gives up. In the last | |||
case, the old IPsec SAs will be removed when their | case, the old IPsec SAs will be removed when their | |||
corresponding hard lifetime is reached. | corresponding hard lifetime is reached. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="appendix-g3" numbered="true" toc="default"> | ||||
<section anchor="appendix-g3" title="Example of managing NSF sta | <name>Example of Managing NSF State Loss in the IKE-less Case</name> | |||
te loss in IKE-less case"> | <t> In the IKE-less case, if the I2NSF Controller detects | |||
<t> In the IKE-less case, if the I2NSF Controller detects | that an NSF has lost the IPsec state, it could follow the | |||
that a NSF has lost the IPsec state, it could follow the | ||||
next steps: | next steps: | |||
<list style="numbers"> | </t> | |||
<t> The I2NSF Controller SHOULD delete the old | <ol spacing="normal" type="1"> | |||
<li> The I2NSF Controller <bcp14>SHOULD</bcp14> delete the old | ||||
IPsec SAs on the non-failed nodes, established with | IPsec SAs on the non-failed nodes, established with | |||
the failed node. This prevents the non-failed nodes | the failed node. This prevents the non-failed nodes | |||
from leaking plaintext.</t> | from leaking plaintext.</li> | |||
<t>If the affected node restarts, the I2NSF | <li>If the affected node restarts, the I2NSF | |||
Controller configures the new inbound IPsec SAs | Controller configures the new inbound IPsec SAs | |||
between the affected node and all the nodes it was | between the affected node and all the nodes it was | |||
talking to. </t> | talking to. </li> | |||
<t> After these inbound IPsec SAs have been | <li> After these inbound IPsec SAs have been | |||
established, the I2NSF Controller configures the | established, the I2NSF Controller configures the | |||
outbound IPsec SAs in parallel. </t> | outbound IPsec SAs in parallel. </li> | |||
</list> | </ol> | |||
</t> | <t>Steps 2 and 3 can be performed at the same time at | |||
<t>Step 2 and step 3 can be performed at the same time at | ||||
the cost of a potential packet loss. If this is not | the cost of a potential packet loss. If this is not | |||
critical then it is an optimization since the number of | critical, then it is an optimization since the number of | |||
exchanges between I2NSF Controller and NSFs is lower.</t> | exchanges between the I2NSF Controller and NSFs is lower.</ | |||
t> | ||||
</section> | </section> | |||
</section> | ||||
</section> | <section anchor="ack" numbered="false" toc="default"> | |||
</back> | <name>Acknowledgements</name> | |||
</rfc> | <t> | |||
Authors want to thank <contact fullname="Paul Wouters"/>, <contact full | ||||
name="Valery | ||||
Smyslov"/>,<contact fullname="Sowmini Varadhan"/>, <contact fullname="D | ||||
avid Carrel"/>, | ||||
<contact fullname="Yoav Nir"/>, <contact fullname="Tero Kivinen"/>, | ||||
<contact fullname="Martin Bjorklund"/>, <contact fullname="Graham Bartl | ||||
ett"/>, | ||||
<contact fullname="Sandeep Kampati"/>, <contact fullname="Linda | ||||
Dunbar"/>, <contact fullname="Mohit Sethi"/>, <contact fullname="Martin | ||||
Bjorklund"/>, | ||||
<contact fullname="Tom Petch"/>, <contact fullname="Christian | ||||
Hopps"/>, <contact fullname="Rob Wilton"/>, <contact fullname="Carlos J | ||||
. Bernardos"/>, | ||||
<contact fullname="Alejandro Perez-Mendez"/>, <contact fullname="Alejand | ||||
ro | ||||
Abad-Carrascosa"/>, <contact fullname="Ignacio | ||||
Martinez"/>, <contact fullname="Ruben Ricart"/>, and all IESG members | ||||
that have reviewed this document for their | ||||
valuable comments. | ||||
</t> | ||||
</section> | ||||
</back> | ||||
</rfc> | ||||
End of changes. 514 change blocks. | ||||
3680 lines changed or deleted | 3299 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |