| rfc9061.original | rfc9061.txt | |||
|---|---|---|---|---|
| I2NSF R. Marin-Lopez | Internet Engineering Task Force (IETF) R. Marin-Lopez | |||
| Internet-Draft G. Lopez-Millan | Request for Comments: 9061 G. Lopez-Millan | |||
| Intended status: Standards Track University of Murcia | Category: Standards Track University of Murcia | |||
| Expires: September 26, 2021 F. Pereniguez-Garcia | ISSN: 2070-1721 F. Pereniguez-Garcia | |||
| University Defense Center | University Defense Center | |||
| March 25, 2021 | June 2021 | |||
| Software-Defined Networking (SDN)-based IPsec Flow Protection | A YANG Data Model for IPsec Flow Protection Based on Software-Defined | |||
| draft-ietf-i2nsf-sdn-ipsec-flow-protection-14 | Networking (SDN) | |||
| Abstract | Abstract | |||
| This document describes how to provide IPsec-based flow protection | This document describes how to provide IPsec-based flow protection | |||
| (integrity and confidentiality) by means of an Interface to Network | (integrity and confidentiality) by means of an Interface to Network | |||
| Security Function (I2NSF) controller. It considers two main well- | Security Function (I2NSF) Controller. It considers two main well- | |||
| known scenarios in IPsec: (i) gateway-to-gateway and (ii) host-to- | known scenarios in IPsec: gateway-to-gateway and host-to-host. The | |||
| host. The service described in this document allows the | service described in this document allows the configuration and | |||
| configuration and monitoring of IPsec Security Associations (IPsec | monitoring of IPsec Security Associations (IPsec SAs) from an I2NSF | |||
| SAs) from a I2NSF Controller to one or several flow-based Network | Controller to one or several flow-based Network Security Functions | |||
| Security Functions (NSFs) that rely on IPsec to protect data traffic. | (NSFs) that rely on IPsec to protect data traffic. | |||
| The document focuses on the I2NSF NSF-facing Interface by providing | This document focuses on the I2NSF NSF-Facing Interface by providing | |||
| YANG data models for configuring the IPsec databases, namely Security | YANG data models for configuring the IPsec databases, namely Security | |||
| Policy Database (SPD), Security Association Database (SAD), Peer | Policy Database (SPD), Security Association Database (SAD), Peer | |||
| Authorization Database (PAD), and IKEv2. This allows IPsec SA | Authorization Database (PAD), and Internet Key Exchange Version 2 | |||
| establishment with minimal intervention by the network administrator. | (IKEv2). This allows IPsec SA establishment with minimal | |||
| It defines three YANG modules but it does not define any new | intervention by the network administrator. This document defines | |||
| protocol. | three YANG modules, but it does not define any new protocol. | |||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
| provisions of BCP 78 and BCP 79. | ||||
| Internet-Drafts are working documents of the Internet Engineering | ||||
| Task Force (IETF). Note that other groups may also distribute | ||||
| working documents as Internet-Drafts. The list of current Internet- | ||||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
| Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
| and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
| time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
| material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
| Internet Standards is available in Section 2 of RFC 7841. | ||||
| This Internet-Draft will expire on September 26, 2021. | Information about the current status of this document, any errata, | |||
| and how to provide feedback on it may be obtained at | ||||
| https://www.rfc-editor.org/info/rfc9061. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2021 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
| 2. Requirements Language . . . . . . . . . . . . . . . . . . . . 5 | 2. Terminology | |||
| 3. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 2.1. Requirements Language | |||
| 4. SDN-based IPsec management description . . . . . . . . . . . 7 | 3. SDN-Based IPsec Management Description | |||
| 4.1. IKE case: IKEv2/IPsec in the NSF . . . . . . . . . . . . 7 | 3.1. IKE Case: IKEv2/IPsec in the NSF | |||
| 4.2. IKE-less case: IPsec (no IKEv2) in the NSF. . . . . . . . 8 | 3.2. IKE-less Case: IPsec (No IKEv2) in the NSF | |||
| 5. IKE case vs IKE-less case . . . . . . . . . . . . . . . . . . 10 | 4. IKE Case vs. IKE-less Case | |||
| 5.1. Rekeying process . . . . . . . . . . . . . . . . . . . . 11 | 4.1. Rekeying Process | |||
| 5.2. NSF state loss. . . . . . . . . . . . . . . . . . . . . . 11 | 4.2. NSF State Loss | |||
| 5.3. NAT Traversal . . . . . . . . . . . . . . . . . . . . . . 12 | 4.3. NAT Traversal | |||
| 5.4. NSF registration and discovery . . . . . . . . . . . . . 13 | 4.4. NSF Registration and Discovery | |||
| 6. YANG configuration data models . . . . . . . . . . . . . . . 13 | 5. YANG Configuration Data Models | |||
| 6.1. The 'ietf-i2nsf-ikec' Module . . . . . . . . . . . . . . 13 | 5.1. The 'ietf-i2nsf-ikec' Module | |||
| 6.1.1. Data model overview . . . . . . . . . . . . . . . . . 14 | 5.1.1. Data Model Overview | |||
| 6.1.2. YANG Module . . . . . . . . . . . . . . . . . . . . . 14 | 5.1.2. YANG Module | |||
| 6.2. The 'ietf-i2nsf-ike' Module . . . . . . . . . . . . . . . 28 | 5.2. The 'ietf-i2nsf-ike' Module | |||
| 6.2.1. Data model overview . . . . . . . . . . . . . . . . . 29 | 5.2.1. Data Model Overview | |||
| 6.2.2. Example Usage . . . . . . . . . . . . . . . . . . . . 33 | 5.2.2. Example Usage | |||
| 6.2.3. YANG Module . . . . . . . . . . . . . . . . . . . . . 33 | 5.2.3. YANG Module | |||
| 6.3. The 'ietf-i2nsf-ikeless' Module . . . . . . . . . . . . . 53 | 5.3. The 'ietf-i2nsf-ikeless' Module | |||
| 6.3.1. Data model overview . . . . . . . . . . . . . . . . . 53 | 5.3.1. Data Model Overview | |||
| 6.3.2. Example Usage . . . . . . . . . . . . . . . . . . . . 57 | 5.3.2. Example Usage | |||
| 6.3.3. YANG Module . . . . . . . . . . . . . . . . . . . . . 58 | 5.3.3. YANG Module | |||
| 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 70 | 6. IANA Considerations | |||
| 8. Security Considerations . . . . . . . . . . . . . . . . . . . 71 | 7. Security Considerations | |||
| 8.1. IKE case . . . . . . . . . . . . . . . . . . . . . . . . 72 | 7.1. IKE Case | |||
| 8.2. IKE-less case . . . . . . . . . . . . . . . . . . . . . . 72 | 7.2. IKE-less Case | |||
| 8.3. YANG modules . . . . . . . . . . . . . . . . . . . . . . 73 | 7.3. YANG Modules | |||
| 9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 74 | 8. References | |||
| 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 75 | 8.1. Normative References | |||
| 10.1. Normative References . . . . . . . . . . . . . . . . . . 75 | 8.2. Informative References | |||
| 10.2. Informative References . . . . . . . . . . . . . . . . . 79 | Appendix A. XML Configuration Example for IKE Case | |||
| Appendix A. XML configuration example for IKE case (gateway-to- | (Gateway-to-Gateway) | |||
| gateway) . . . . . . . . . . . . . . . . . . . . . . 81 | Appendix B. XML Configuration Example for IKE-less Case | |||
| Appendix B. XML configuration example for IKE-less case (host- | (Host-to-Host) | |||
| to-host) . . . . . . . . . . . . . . . . . . . . . . 84 | Appendix C. XML Notification Examples | |||
| Appendix C. XML notification examples . . . . . . . . . . . . . 88 | Appendix D. Operational Use Case Examples | |||
| Appendix D. Operational use cases examples . . . . . . . . . . . 89 | D.1. Example of IPsec SA Establishment | |||
| D.1. Example of IPsec SA establishment . . . . . . . . . . . . 89 | D.1.1. IKE Case | |||
| D.1.1. IKE case . . . . . . . . . . . . . . . . . . . . . . 90 | D.1.2. IKE-less Case | |||
| D.1.2. IKE-less case . . . . . . . . . . . . . . . . . . . . 91 | D.2. Example of the Rekeying Process in IKE-less Case | |||
| D.2. Example of the rekeying process in IKE-less case . . . . 93 | D.3. Example of Managing NSF State Loss in the IKE-less Case | |||
| D.3. Example of managing NSF state loss in IKE-less case . . . 94 | Acknowledgements | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 94 | Authors' Addresses | |||
| 1. Introduction | 1. Introduction | |||
| Software-Defined Networking (SDN) is an architecture that enables | Software-Defined Networking (SDN) is an architecture that enables | |||
| administrators to directly program, orchestrate, control and manage | administrators to directly program, orchestrate, control, and manage | |||
| network resources through software. The SDN paradigm relocates the | network resources through software. The SDN paradigm relocates the | |||
| control of network resources to a centralized entity, namely the SDN | control of network resources to a centralized entity, namely the SDN | |||
| Controller. SDN controllers configure and manage distributed network | Controller. SDN Controllers configure and manage distributed network | |||
| resources and provide an abstracted view of the network resources to | resources and provide an abstracted view of the network resources to | |||
| SDN applications. SDN applications can customize and automate the | SDN applications. SDN applications can customize and automate the | |||
| operations (including management) of the abstracted network resources | operations (including management) of the abstracted network resources | |||
| in a programmable manner via this interface [RFC7149] [ITU-T.Y.3300] | in a programmable manner via this interface [RFC7149] [ITU-T.Y.3300] | |||
| [ONF-SDN-Architecture] [ONF-OpenFlow]. | [ONF-SDN-Architecture] [ONF-OpenFlow]. | |||
| Recently, several network scenarios now demand a centralized way of | Recently, several network scenarios now demand a centralized way of | |||
| managing different security aspects, for example, Software-Defined | managing different security aspects, for example, Software-Defined | |||
| WANs (SD-WANs). SD-WANs are an SDN extension providing a software | WANs (SD-WANs). SD-WANs are SDN extensions providing software | |||
| abstraction to create secure network overlays over traditional WAN | abstractions to create secure network overlays over traditional WAN | |||
| and branch networks. SD-WANs utilize IPsec [RFC4301] as an | and branch networks. SD-WANs utilize IPsec [RFC4301] as an | |||
| underlying security protocol. The goal of SD-WANs is to provide | underlying security protocol. The goal of SD-WANs is to provide | |||
| flexible and automated deployment from a centralized point to enable | flexible 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. Additionally, Section 4.3.3 in | Association (IPsec SA) management. Additionally, Section 4.3.3 | |||
| [RFC8192] describes another example use case for Cloud Data Center | ("Client-Specific Security Policy in Cloud VPNs") of [RFC8192] | |||
| Scenario titled "Client-Specific Security Policy in Cloud VPNs". The | describes another example use case for a cloud data center scenario. | |||
| use case in RFC 8192 states that "dynamic key management is critical | The use case in [RFC8192] states that "dynamic key management is | |||
| for securing the VPN and the distribution of policies". These VPNs | critical for securing the VPN and the distribution of policies". | |||
| can be established using IPsec. The management of IPsec SAs in data | These VPNs can be established using IPsec. The management of IPsec | |||
| centers using a centralized entity is a scenario where the current | SAs in data centers using a centralized entity is a scenario where | |||
| specification may be applicable. | the current specification may be applicable. | |||
| Therefore, with the growth of SDN-based scenarios where network | Therefore, with the growth of SDN-based scenarios where network | |||
| resources are deployed in an autonomous manner, a mechanism to manage | resources are deployed in an autonomous manner, a mechanism to manage | |||
| IPsec SAs from a centralized entity becomes more relevant in the | IPsec SAs from a centralized entity becomes more relevant in the | |||
| industry. | industry. | |||
| In response to this need, the Interface to Network Security Functions | In response to this need, the Interface to Network Security Functions | |||
| (I2NSF) charter states that the goal of this working group is "to | (I2NSF) charter states that the goal of this working group is "to | |||
| define set of software interfaces and YANG data models for | define a set of software interfaces and data models for controlling | |||
| controlling and monitoring aspects of physical and virtual Network | and monitoring aspects of physical and virtual NSFs". As defined in | |||
| Security Functions". As defined in [RFC8192] an Network Security | [RFC8192], a Network Security Function (NSF) is "a function that is | |||
| Function (NSF) is "a function that is used to ensure integrity, | used to ensure integrity, confidentiality, or availability of network | |||
| confidentiality, or availability of network communication; to detect | communication; to detect unwanted network activity; or to block, or | |||
| unwanted network activity; or to block, or at least mitigate, the | at least mitigate, the effects of unwanted activity". This document | |||
| effects of unwanted activity". This document pays special attention | pays special attention to flow-based NSFs that ensure integrity and | |||
| to flow-based NSFs that ensure integrity and confidentiality by means | confidentiality by means of IPsec. | |||
| of IPsec. | ||||
| In fact, as Section 3.1.9 in [RFC8192] states "there is a need for a | In fact, Section 3.1.9 of [RFC8192] states that "there is a need for | |||
| controller to create, manage, and distribute various keys to | a controller to create, manage, and distribute various keys to | |||
| distributed NSFs.", however "there is a lack of a standard interface | distributed NSFs"; however, "there is a lack of a standard interface | |||
| to provision and manage security associations". Inspired by the SDN | to provision and manage security associations". Inspired by the SDN | |||
| paradigm, the I2NSF framework [RFC8329] defines a centralized entity, | paradigm, the I2NSF framework [RFC8329] defines a centralized entity, | |||
| the I2NSF Controller, which manages one or multiple NSFs through a | the I2NSF Controller, which manages one or multiple NSFs through an | |||
| I2NSF NSF-Facing Interface. In this document an architecture is | I2NSF NSF-Facing Interface. In this document, an architecture is | |||
| defined for allowing the I2NSF Controller to carry out the key | defined for allowing the I2NSF Controller to carry out the key | |||
| management procedures. More specifically, three YANG data models are | management procedures. More specifically, three YANG data models are | |||
| defined for the I2NSF NSF-Facing Interface that allow the I2NSF | defined for the I2NSF NSF-Facing Interface, which allows the I2NSF | |||
| Controller to configure and monitor IPsec-enabled flow-based NSFs. | Controller to configure and monitor IPsec-enabled, flow-based NSFs. | |||
| The IPsec architecture [RFC4301] defines a clear separation between | The IPsec architecture [RFC4301] defines a clear separation between | |||
| the processing to provide security services to IP packets and the key | the processing to provide security services to IP packets and the key | |||
| management procedures to establish the IPsec SAs, which allows | management procedures to establish the IPsec SAs, which allows | |||
| centralizing the key management procedures in the I2NSF Controller. | centralizing the key management procedures in the I2NSF Controller. | |||
| This document considers two typical scenarios to autonomously manage | This document considers two typical scenarios to autonomously manage | |||
| IPsec SAs: gateway-to-gateway and host-to-host [RFC6071]. In these | IPsec SAs: gateway-to-gateway and host-to-host [RFC6071]. In these | |||
| cases, 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 scenario is out of | complexity, consideration for the host-to-gateway scenario is out of | |||
| scope. The source of this complexity comes from the fact that, in | scope. The source of this complexity comes from the fact that, in | |||
| this scenario, the host may not be under the control of the I2NSF | this scenario, the host may not be under the control of the I2NSF | |||
| controller and, therefore, it is not configurable. Nevertheless, the | Controller and, therefore, it is not configurable. Nevertheless, the | |||
| I2NSF interfaces defined in this document can be considered as a | I2NSF interfaces defined in this document can be considered as a | |||
| starting point to analyze and provide a solution for the host-to- | starting point to analyze and provide a solution for the host-to- | |||
| gateway scenario. | gateway scenario. | |||
| For the definition of the YANG data models for I2NSF NSF-Facing | For the definition of the YANG data models for the I2NSF NSF-Facing | |||
| Interface, this document considers two general cases, namely: | Interface, this document considers two general cases, namely: | |||
| 1) IKE case. The NSF implements the Internet Key Exchange version 2 | 1. IKE case. The NSF implements the Internet Key Exchange Version 2 | |||
| (IKEv2) protocol and the IPsec databases: the Security Policy | (IKEv2) protocol and the IPsec databases: the Security Policy | |||
| Database (SPD), the Security Association Database (SAD) and the | Database (SPD), the Security Association Database (SAD), and the | |||
| Peer Authorization Database (PAD). The I2NSF Controller is in | Peer Authorization Database (PAD). The I2NSF Controller is in | |||
| charge of provisioning the NSF with the required information in | charge of provisioning the NSF with the required information in | |||
| the SPD and PAD (e.g., IKE credentials), and for the IKE protocol | the SPD and PAD (e.g., IKE credentials) and the IKE protocol | |||
| itself (e.g., parameters for the IKE_SA_INIT negotiation). | itself (e.g., parameters for the IKE_SA_INIT negotiation). | |||
| 2) IKE-less case. The NSF only implements the IPsec databases (no | 2. IKE-less case. The NSF only implements the IPsec databases (no | |||
| IKE implementation). The I2NSF Controller will provide the | IKE implementation). The I2NSF Controller will provide the | |||
| required parameters to create valid entries in the SPD and the | required parameters to create valid entries in the SPD and the | |||
| SAD of the NSF. Therefore, the NSF will only have support for | SAD of the NSF. Therefore, the NSF will only have support for | |||
| IPsec while key management functionality is moved to the I2NSF | IPsec whereas key management functionality is moved to the I2NSF | |||
| Controller. | Controller. | |||
| In both cases, a YANG data model for the I2NSF NSF-Facing Interface | In both cases, a YANG data model for the I2NSF NSF-Facing Interface | |||
| is required to carry out this provisioning in a secure manner between | is required to carry out this provisioning in a secure manner between | |||
| the I2NSF Controller and the NSF. Using YANG data modelling language | the I2NSF Controller and the NSF. Using YANG data modeling language | |||
| version 1.1 [RFC7950] and based on YANG data models defined in | version 1.1 [RFC7950] and based on YANG data models defined in | |||
| [netconf-vpn], [I-D.tran-ipsecme-yang], an the data structures | [netconf-vpn] and [TRAN-IPSECME-YANG] and the data structures defined | |||
| defined in RFC 4301 [RFC4301] and RFC 7296 [RFC7296], this document | in [RFC4301] and [RFC7296], this document defines the required | |||
| defines the required interfaces with a YANG data model for | interfaces with a YANG data model for configuration and state data | |||
| configuration and state data for IKE, PAD, SPD and SAD (see | for IKE, PAD, SPD, and SAD (see Sections 5.1, 5.2, and 5.3). The | |||
| Section 6.1, Section 6.2 and Section 6.3). The proposed YANG data | proposed YANG data model conforms to the Network Management Datastore | |||
| model conforms to the Network Management Datastore Architecture | Architecture (NMDA) defined in [RFC8342]. Examples of the usage of | |||
| (NMDA) defined in [RFC8342]. Examples of the usage of these data | these data models can be found in Appendices A, B, and C. | |||
| models can be found in Appendix A, Appendix B and Appendix C. | ||||
| In summary, the objectives of this document are: | In summary, the objectives of this document are: | |||
| o To describe the architecture for I2NSF-based IPsec management, | * To describe the architecture for I2NSF-based IPsec management, | |||
| which allows the establishment and management of IPsec security | which allows for the establishment and management of IPsec | |||
| associations from the I2NSF Controller in order to protect | Security Associations from the I2NSF Controller in order to | |||
| specific data flows between two flow-based NSFs implementing | protect specific data flows between two flow-based NSFs | |||
| IPsec. | implementing IPsec. | |||
| o To map this architecture to the I2NSF Framework. | * To map this architecture to the I2NSF framework. | |||
| o To define the interfaces required to manage and monitor the IPsec | * To define the interfaces required to manage and monitor the IPsec | |||
| SAs in the NSF from a I2NSF Controller. YANG data models are | SAs in the NSF from an I2NSF Controller. YANG data models are | |||
| defined for configuration and state data for IPsec and IKEv2 | defined for configuration and state data for IPsec and IKEv2 | |||
| management through the I2NSF NSF-Facing Interface. The YANG | management through the I2NSF NSF-Facing Interface. The YANG data | |||
| models can be used via existing protocols such as NETCONF | models can be used via existing protocols, such as the Network | |||
| [RFC6241] or RESTCONF [RFC8040]. Thus, this document defines | Configuration Protocol (NETCONF) [RFC6241] or RESTCONF [RFC8040]. | |||
| three YANG modules (see Section 6) but does not define any new | Thus, this document defines three YANG modules (see Section 5) but | |||
| protocol. | does not define any new protocol. | |||
| 2. Requirements Language | ||||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | 2. Terminology | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | ||||
| "OPTIONAL" in this document are to be interpreted as described in BCP | ||||
| 14 [RFC2119] [RFC8174] when, and only when, they appear in all | ||||
| capitals, as shown here. | ||||
| 3. Terminology | This document uses the terminology described in [ITU-T.Y.3300], | |||
| [RFC8192], [RFC4301], [RFC6437], [RFC7296], [RFC6241], and [RFC8329]. | ||||
| This document uses the terminology described in [RFC8329], [RFC8192], | The following term is defined in [ITU-T.Y.3300]: | |||
| [RFC4301],[RFC7296], [RFC6241], [ITU-T.Y.3300]. The following term | ||||
| is defined in [ITU-T.Y.3300]: | ||||
| o Software-Defined Networking. | * Software-Defined Networking (SDN) | |||
| The following terms are defined in [RFC8192]: | The following terms are defined in [RFC8192]: | |||
| o NSF. | * Network Security Function (NSF) | |||
| o Flow-based NSF. | * flow-based NSF | |||
| The following terms are defined in [RFC4301]: | The following terms are defined in [RFC4301]: | |||
| o Peer Authorization Database (PAD). | * Peer Authorization Database (PAD) | |||
| o Security Associations Database (SAD). | * Security Association Database (SAD) | |||
| o Security Policy Database (SPD). | * Security Policy Database (SPD) | |||
| The following two terms that are related or have identical | The following two terms are related or have identical definition/ | |||
| definition/usage in [RFC6437]: | usage in [RFC6437]: | |||
| o Flow or traffic flow. | * flow | |||
| * traffic flow | ||||
| The following term is defined in [RFC7296]: | The following term is defined in [RFC7296]: | |||
| o Internet Key Exchange version 2 (IKEv2). | * Internet Key Exchange Version 2 (IKEv2) | |||
| The following terms are defined in [RFC6241]: | The following terms are defined in [RFC6241]: | |||
| o Configuration data. | * configuration data | |||
| o Configuration datastore. | * configuration datastore | |||
| o State data. | * state data | |||
| o Startup configuration datastore. | * startup configuration datastore | |||
| o Running configuration datastore. | * running configuration datastore | |||
| 4. SDN-based IPsec management description | 2.1. Requirements Language | |||
| 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 [RFC2119] [RFC8174] when, and only when, they appear in all | ||||
| capitals, as shown here. | ||||
| 3. SDN-Based IPsec Management Description | ||||
| As mentioned in Section 1, two cases are considered, depending on | As mentioned in Section 1, two cases are considered, depending on | |||
| whether the NSF implements IKEv2 or not: the IKE case and the IKE- | whether the NSF implements IKEv2 or not: the IKE case and the IKE- | |||
| less case. | less case. | |||
| 4.1. IKE case: IKEv2/IPsec in the NSF | 3.1. IKE Case: IKEv2/IPsec in the NSF | |||
| In this case, the NSF implements IPsec with IKEv2 support. The I2NSF | In this case, the NSF implements IPsec with IKEv2 support. The I2NSF | |||
| Controller is in charge of managing and applying IPsec connection | Controller is in charge of managing and applying IPsec connection | |||
| information (determining which nodes need to start an IKEv2/IPsec | information (determining which nodes need to start an IKEv2/IPsec | |||
| session, identifying the type of traffic to be protected, deriving | session, identifying the type of traffic to be protected, and | |||
| and delivering IKEv2 credentials such as a pre-shared key, | deriving and delivering IKEv2 credentials, such as a pre-shared key | |||
| certificates, etc.), and applying other IKEv2 configuration | (PSK), certificates, etc.) and applying other IKEv2 configuration | |||
| parameters (e.g., cryptographic algorithms for establishing an IKEv2 | parameters (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. | |||
| With these entries, the IKEv2 implementation can operate to establish | With these entries, the IKEv2 implementation can operate to establish | |||
| the IPsec SAs. The I2NSF User establishes the IPsec requirements and | the IPsec SAs. The I2NSF User establishes the IPsec requirements and | |||
| information about the end points (through the I2NSF Consumer-Facing | information about the endpoints (through the I2NSF Consumer-Facing | |||
| Interface, [RFC8329]), and the I2NSF Controller translates these | Interface [RFC8329]), and the I2NSF Controller translates these | |||
| requirements into IKEv2, SPD and PAD entries that will be installed | requirements into IKEv2, SPD, and PAD entries that will be installed | |||
| into the NSF (through the I2NSF NSF-Facing Interface). With that | into the NSF (through the I2NSF NSF-Facing Interface). With that | |||
| information, the NSF can just run IKEv2 to establish the required | information, the NSF can just run IKEv2 to establish the required | |||
| IPsec SA (when the traffic flow needs protection). Figure 1 shows | IPsec SA (when the traffic flow needs protection). Figure 1 shows | |||
| the different layers and corresponding functionality. | the different layers and corresponding functionality. | |||
| +-------------------------------------------+ | +-------------------------------------------+ | |||
| | IPsec Management System | I2NSF User | | IPsec Management System | I2NSF User | |||
| +-------------------------------------------+ | +-------------------------------------------+ | |||
| | | | | |||
| | I2NSF Consumer-Facing | | I2NSF Consumer-Facing | |||
| skipping to change at page 8, line 24 ¶ | skipping to change at line 329 ¶ | |||
| +-------------------------------------------+ | +-------------------------------------------+ | |||
| | | | | |||
| | 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 | |||
| +-------------------------------------------+ | +-------------------------------------------+ | |||
| Figure 1: IKE case: IKE/IPsec in the NSF | Figure 1: IKE Case: IKE/IPsec in the NSF | |||
| I2NSF-based IPsec flow protection services provide dynamic and | I2NSF-based IPsec flow protection services provide dynamic and | |||
| flexible management of IPsec SAs in flow-based NSFs. In order to | flexible management of IPsec SAs in flow-based NSFs. In order to | |||
| support this capability in the IKE case, a YANG data model for IKEv2, | support this capability in the IKE case, a YANG data model for IKEv2, | |||
| SPD and PAD configuration data, and for IKEv2 state data needs to be | SPD, and PAD configuration data and for IKEv2 state data needs to be | |||
| defined for the I2NSF NSF-Facing Interface (see Section 6). | defined for the I2NSF NSF-Facing Interface (see Section 5). | |||
| 4.2. IKE-less case: IPsec (no IKEv2) in the NSF. | 3.2. IKE-less Case: IPsec (No IKEv2) in the NSF | |||
| In this case, the NSF does not deploy IKEv2 and, therefore, the I2NSF | In this case, the NSF does not deploy IKEv2 and, therefore, the I2NSF | |||
| Controller has to perform the IKEv2 security functions and management | Controller has to perform the IKEv2 security functions and management | |||
| of IPsec SAs by populating and managing the SPD and the SAD. | of IPsec SAs by populating and managing the SPD and the SAD. | |||
| As shown in Figure 2, when an I2NSF User enforces flow-based | As shown in Figure 2, when an I2NSF User enforces flow-based | |||
| protection policies through the Consumer-Facing Interface, the I2NSF | protection policies through the Consumer-Facing Interface, the I2NSF | |||
| Controller translates these requirements into SPD and SAD entries, | Controller translates these requirements into SPD and SAD entries, | |||
| which are installed in the NSF. PAD entries are not required since | which are installed in the NSF. PAD entries are not required, since | |||
| there is no IKEv2 in the NSF. | there is no IKEv2 in the NSF. | |||
| +-----------------------------------------+ | +-----------------------------------------+ | |||
| | 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 | |||
| skipping to change at page 9, line 24 ¶ | skipping to change at line 368 ¶ | |||
| +-----------------------------------------+ | +-----------------------------------------+ | |||
| | | | | |||
| | 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 | |||
| +-----------------------------------------+ | +-----------------------------------------+ | |||
| Figure 2: IKE-less case: IPsec (no IKEv2) in the NSF | Figure 2: IKE-less Case: IPsec (No IKEv2) in the NSF | |||
| In order to support the IKE-less case, a YANG data model for SPD and | In order to support the IKE-less case, a YANG data model for SPD and | |||
| SAD configuration data and SAD state data MUST be defined for the | SAD configuration data and SAD state data MUST be defined for the | |||
| NSF-Facing Interface (see Section 6). | NSF-Facing Interface (see Section 5). | |||
| Specifically, the IKE-less case assumes that the I2NSF Controller has | Specifically, the IKE-less case assumes that the I2NSF Controller has | |||
| to perform some security functions that IKEv2 typically does, namely | to perform some security functions that IKEv2 typically does, namely | |||
| (non-exhaustive): | (non-exhaustive list): | |||
| o IV generation. | * Initialization Vector (IV) generation | |||
| o Prevent counter resets for the same key. | * prevention of counter resets for the same key | |||
| o Generation of pseudo-random cryptographic keys for the IPsec SAs. | * generation of pseudorandom cryptographic keys for the IPsec SAs | |||
| o Generation of the IPsec SAs when required based on notifications | * generation of the IPsec SAs when required based on notifications | |||
| (i.e. sadb-acquire) from the NSF. | (i.e., sadb-acquire) from the NSF | |||
| o Rekey of the IPsec SAs based on notifications from the NSF (i.e. | * rekey of the IPsec SAs based on notifications from the NSF (i.e., | |||
| expire). | expire) | |||
| o NAT Traversal discovery and management. | * NAT traversal discovery and management | |||
| Additionally to these functions, another set of tasks must be | Additionally to these functions, another set of tasks must be | |||
| performed by the I2NSF Controller (non-exhaustive list): | performed by the I2NSF Controller (non-exhaustive list): | |||
| o IPsec SA's SPI random generation. | * IPsec SA's Security Parameter Index (SPI) random generation | |||
| o Cryptographic algorithm selection. | * cryptographic algorithm selection | |||
| o Usage of extended sequence numbers. | * usage of extended sequence numbers | |||
| o Establishment of proper traffic selectors. | * establishment of proper Traffic Selectors | |||
| 5. IKE case vs IKE-less case | 4. IKE Case vs. IKE-less Case | |||
| In principle, the IKE case is easier to deploy than the IKE-less case | In principle, the IKE case is easier to deploy than the IKE-less case | |||
| because current flow-based NSFs (either hosts or gateways) have | because current flow-based NSFs (either hosts or gateways) have | |||
| access to IKEv2 implementations. While gateways typically deploy an | access to IKEv2 implementations. While gateways typically deploy an | |||
| IKEv2/IPsec implementation, hosts can easily install it. As a | IKEv2/IPsec implementation, hosts can easily install it. As a | |||
| downside, the NSF needs more resources to use IKEv2 such as memory | downside, the NSF needs more resources to use IKEv2, such as memory | |||
| for the IKEv2 implementation, and computation, since each IPsec | for the IKEv2 implementation and computation, since each IPsec | |||
| security association rekeying MAY involve a Diffie-Hellman exchange. | Security Association rekeying MAY involve a Diffie-Hellman (DH) | |||
| exchange. | ||||
| Alternatively, the IKE-less case benefits the deployment in resource- | Alternatively, the IKE-less case benefits the deployment in resource- | |||
| constrained NSFs. Moreover, IKEv2 does not need to be performed in | constrained NSFs. Moreover, IKEv2 does not need to be performed in | |||
| gateway-to-gateway and host-to-host scenarios under the same I2NSF | gateway-to-gateway and host-to-host scenarios under the same I2NSF | |||
| Controller (see Appendix D.1). On the contrary, the complexity of | Controller (see Appendix D.1). On the contrary, the complexity of | |||
| creating and managing IPsec SAs is shifted to the I2NSF Controller | creating and managing IPsec SAs is shifted to the I2NSF Controller | |||
| since IKEv2 is not in the NSF. As a consequence, this may result in | since IKEv2 is not in the NSF. As a consequence, this may result in | |||
| a more complex implementation in the controller side in comparison | a more complex implementation in the controller side in comparison | |||
| with IKE case. For example, the I2NSF Controller has to deal with | with the IKE case. For example, the I2NSF Controller has to deal | |||
| the latency existing in the path between the I2NSF Controller and the | with the latency existing in the path between the I2NSF Controller | |||
| NSF, in order to solve tasks such as rekey, or creation and | and the NSF (in order to solve tasks, such as rekey) or creation and | |||
| installation of new IPsec SAs. However, this is not specific to this | installation of new IPsec SAs. However, this is not specific to this | |||
| contribution but a general aspect in any SDN-based network. In | contribution but a general aspect in any SDN-based network. In | |||
| summary, this complexity may create some scalability and performance | summary, this complexity may create some scalability and performance | |||
| issues when the number of NSFs is high. | issues when the number of NSFs is high. | |||
| Nevertheless, literature around SDN-based network management using a | Nevertheless, literature around SDN-based network management using a | |||
| centralized controller (like the I2NSF Controller) is aware of | centralized controller (like the I2NSF Controller) is aware of | |||
| scalability and performance issues and solutions have been already | scalability and performance issues, and solutions have been already | |||
| provided and discussed (e.g., hierarchical controllers, having | provided and discussed (e.g., hierarchical controllers, having | |||
| multiple replicated controllers, dedicated high-speed management | multiple replicated controllers, dedicated high-speed management | |||
| networks, etc). In the context of I2SNF-based IPsec management, one | networks, etc.). In the context of I2NSF-based IPsec management, one | |||
| way to reduce the latency and alleviate some performance issues can | way to reduce the latency and alleviate some performance issues can | |||
| be the installation of the IPsec policies and IPsec SAs at the same | be to install the IPsec policies and IPsec SAs at the same time | |||
| time (proactive mode, as described in Appendix D.1) instead of | (proactive mode, as described in Appendix D.1) instead of waiting for | |||
| waiting for notifications (e.g., a sadb-acquire notification received | notifications (e.g., a sadb-acquire notification received from an NSF | |||
| from a NSF requiring a new IPsec SA) to proceed with the IPsec SA | requiring a new IPsec SA) to proceed with the IPsec SA installation | |||
| installation (reactive mode). Another way to reduce the overhead and | (reactive mode). Another way to reduce the overhead and the | |||
| the potential scalability and performance issues in the I2NSF | potential scalability and performance issues in the I2NSF Controller | |||
| Controller is to apply the IKE case described in this document, since | is to apply the IKE case described in this document since the IPsec | |||
| the IPsec SAs are managed between NSFs without the involvement of the | SAs are managed between NSFs without the involvement of the I2NSF | |||
| I2NSF Controller at all, except by the initial configuration (i.e. | Controller at all, except by the initial configuration (i.e., IKEv2, | |||
| IKEv2, PAD and SPD entries) provided by the I2NSF Controller. Other | PAD, and SPD entries) provided by the I2NSF Controller. Other | |||
| solutions, such as Controller-IKE | solutions, such as Controller-IKE [IPSECME-CONTROLLER-IKE], have | |||
| [I-D.carrel-ipsecme-controller-ike], have proposed that NSFs provide | proposed that NSFs provide their DH public keys to the I2NSF | |||
| their DH public keys to the I2NSF Controller, so that the I2NSF | Controller so that the I2NSF Controller distributes all public keys | |||
| Controller distributes all public keys to all peers. All peers can | to all peers. All peers can calculate a unique pairwise secret for | |||
| calculate a unique pairwise secret for each other peer and there is | each other peer, and there is no inter-NSF messages. A rekey | |||
| no inter-NSF messages. A rekey mechanism is further described in | mechanism is further described in [IPSECME-CONTROLLER-IKE]. | |||
| [I-D.carrel-ipsecme-controller-ike]. | ||||
| In terms of security, IKE case provides better security properties | In terms of security, the IKE case provides better security | |||
| than IKE-less case, as discussed in Section 8. The main reason is | properties than the IKE-less case, as discussed in Section 7. The | |||
| that the NSFs generate the session keys and not the I2NSF Controller. | main reason is that the NSFs generate the session keys and not the | |||
| I2NSF Controller. | ||||
| 5.1. Rekeying process | 4.1. Rekeying Process | |||
| Performing a rekey for IPsec SAs is an important operation during the | Performing a rekey for IPsec SAs is an important operation during the | |||
| IPsec SAs management. With the YANG data models defined in this | IPsec SAs management. With the YANG data models defined in this | |||
| document the I2NSF Controller can configure parameters of the rekey | document the I2NSF Controller can configure parameters of the rekey | |||
| process (IKE case) or conduct the rekey process (IKE-less case). | process (IKE case) or conduct the rekey process (IKE-less case). | |||
| Indeed, depending on the case, the rekey process is different. | Indeed, depending on the case, the rekey process is different. | |||
| For the IKE case, the rekeying process is carried out by IKEv2, | For the IKE case, the rekeying process is carried out by IKEv2, | |||
| following the information defined in the SPD and SAD (i.e. based on | following the information defined in the SPD and SAD (i.e., based on | |||
| the IPsec SA lifetime established by the I2NSF Controller using the | the IPsec SA lifetime established by the I2NSF Controller using the | |||
| YANG data model defined in this document). Therefore, IPsec | YANG data model defined in this document). Therefore, IPsec | |||
| connections will live unless something different is required by the | connections will live unless something different is required by the | |||
| I2NSF User or the I2NSF Controller detects something wrong. | I2NSF User or the I2NSF Controller detects something wrong. | |||
| For the IKE-less case, the I2NSF Controller MUST take care of the | For the IKE-less case, the I2NSF Controller MUST take care of the | |||
| rekeying process. When the IPsec SA is going to expire (e.g., IPsec | rekeying process. When the IPsec SA is going to expire (e.g., IPsec | |||
| SA soft lifetime), it MUST create a new IPsec SA and it MAY remove | SA soft lifetime), it MUST create a new IPsec SA and it MAY remove | |||
| the old one (e.g. when the lifetime of the old IPsec SA has not been | the old one (e.g., when the lifetime of the old IPsec SA has not been | |||
| defined). This rekeying process starts when the I2NSF Controller | defined). This rekeying process starts when the I2NSF Controller | |||
| receives a sadb-expire notification or, on the I2NSF Controller's | receives a sadb-expire notification or, on the I2NSF Controller's | |||
| initiative, based on lifetime state data obtained from the NSF. How | initiative, based on lifetime state data obtained from the NSF. How | |||
| the I2NSF Controller implements an algorithm for the rekey process is | the I2NSF Controller implements an algorithm for the rekey process is | |||
| out of the scope of this document. Nevertheless, an example of how | out of the scope of this document. Nevertheless, an example of how | |||
| this rekey could be performed is described in Appendix D.2. | this rekey could be performed is described in Appendix D.2. | |||
| 5.2. NSF state loss. | 4.2. NSF State Loss | |||
| If one of the NSF restarts, it will lose the IPsec state (affected | If one of the NSF restarts, it will lose the IPsec state (affected | |||
| NSF). By default, the I2NSF Controller can assume that all the state | NSF). By default, the I2NSF Controller can assume that all the state | |||
| has been lost and therefore it will have to send IKEv2, SPD and PAD | has been lost and, therefore, it will have to send IKEv2, SPD, and | |||
| information to the NSF in the IKE case, and SPD and SAD information | PAD information to the NSF in the IKE case and SPD and SAD | |||
| in the IKE-less case. | information in the IKE-less case. | |||
| In both cases, the I2NSF Controller is aware of the affected NSF | In both cases, the I2NSF Controller is aware of the affected NSF | |||
| (e.g., the NETCONF/TCP connection is broken with the affected NSF, | (e.g., the NETCONF/TCP connection is broken with the affected NSF, | |||
| the I2NSF Controller is receiving sadb-bad-spi notification from a | the I2NSF Controller is receiving a sadb-bad-spi notification from a | |||
| particular NSF, etc.). Moreover, the I2NSF Controller keeps a list | particular NSF, etc.). Moreover, the I2NSF Controller keeps a list | |||
| of NSFs that have IPsec SAs with the affected NSF. Therefore, it | of NSFs that have IPsec SAs with the affected NSF. Therefore, it | |||
| knows the affected IPsec SAs. | knows the affected IPsec SAs. | |||
| In the IKE case, the I2NSF Controller may need to configure the | In the IKE case, the I2NSF Controller may need to configure the | |||
| affected NSF with the new IKEv2, SPD and PAD information. | affected NSF with the new IKEv2, SPD, and PAD information. | |||
| Alternatively, IKEv2 configuration MAY be made permanent between NSF | Alternatively, IKEv2 configuration MAY be made permanent between NSF | |||
| reboots without compromising security by means of the startup | reboots without compromising security by means of the startup | |||
| configuration datastore in the NSF. This way, each time a NSF | configuration datastore in the NSF. This way, each time an NSF | |||
| reboots it will use that configuration for each rebooting. It would | reboots, it will use that configuration for each rebooting. It would | |||
| imply avoiding contact with the I2NSF Controller. Finally, the I2NSF | imply avoiding contact with the I2NSF Controller. Finally, the I2NSF | |||
| Controller may also need to send new parameters (e.g., a new fresh | Controller may also need to send new parameters (e.g., a new fresh | |||
| PSK for authentication) to the NSFs which had IKEv2 SAs and IPsec SAs | PSK for authentication) to the NSFs that had IKEv2 SAs and IPsec SAs | |||
| with the affected NSF. | with the affected NSF. | |||
| In the IKE-less case, the I2NSF Controller SHOULD delete the old | In the IKE-less case, the I2NSF Controller SHOULD delete the old | |||
| IPsec SAs in the non-failed nodes established with the affected NSF. | IPsec SAs in the non-failed nodes established with the affected NSF. | |||
| Once the affected node restarts, the I2NSF Controller MUST take the | Once the affected node restarts, the I2NSF Controller MUST take the | |||
| necessary actions to reestablish IPsec protected communication | necessary actions to reestablish IPsec-protected communication | |||
| between the failed node and those others having IPsec SAs with the | between the failed node and those others having IPsec SAs with the | |||
| affected NSF. How the I2NSF Controller implements an algorithm for | affected NSF. How the I2NSF Controller implements an algorithm for | |||
| managing a potential NSF state loss is out of the scope of this | managing a potential NSF state loss is out of the scope of this | |||
| document. Nevertheless, an example of how this could be performed is | document. Nevertheless, an example of how this could be performed is | |||
| described in Appendix D.3. | described in Appendix D.3. | |||
| 5.3. NAT Traversal | 4.3. NAT Traversal | |||
| In the IKE case, IKEv2 already provides a mechanism to detect whether | In the IKE case, IKEv2 already provides a mechanism to detect whether | |||
| some of the peers or both are located behind a NAT. In this case, | some of the peers or both are located behind a NAT. In this case, | |||
| UDP or TCP encapsulation for ESP packets ([RFC3948], [RFC8229]) is | UDP or TCP encapsulation for Encapsulating Security Payload (ESP) | |||
| required. Note that IPsec transport mode MUST NOT be used in this | packets [RFC3948] [RFC8229] is required. Note that IPsec transport | |||
| specification when NAT is required. | mode MUST NOT be used in this specification when NAT is required. | |||
| In the IKE-less case, the NSF does not have the assistance of the | In the IKE-less case, the NSF does not have the assistance of the | |||
| IKEv2 implementation to detect if it is located behind a NAT. If the | IKEv2 implementation to detect if it is located behind a NAT. If the | |||
| NSF does not have any other mechanism to detect this situation, the | NSF does not have any other mechanism to detect this situation, the | |||
| I2NSF Controller SHOULD implement a mechanism to detect that case. | I2NSF Controller SHOULD implement a mechanism to detect that case. | |||
| The SDN paradigm generally assumes the I2NSF Controller has a view of | The SDN paradigm generally assumes the I2NSF Controller has a view of | |||
| the network under its control. This view is built either by | the network under its control. This view is built either by | |||
| requesting information from the NSFs under its control, or by | requesting information from the NSFs under its control or information | |||
| information pushed from the NSFs to the I2NSF Controller. Based on | pushed from the NSFs to the I2NSF Controller. Based on this | |||
| this information, the I2NSF Controller MAY guess if there is a NAT | information, the I2NSF Controller MAY guess if there is a NAT | |||
| configured between two hosts, and apply the required policies to both | configured between two hosts and apply the required policies to both | |||
| NSFs besides activating the usage of UDP or TCP encapsulation of ESP | NSFs besides activating the usage of UDP or TCP encapsulation of ESP | |||
| packets ([RFC3948], [RFC8229]). The interface for discovering if the | packets [RFC3948] [RFC8229]. The interface for discovering if the | |||
| NSF is behind a NAT is out of scope of this document. | NSF is behind a NAT is out of scope of this document. | |||
| If the I2NSF Controller does not have any mechanism to know whether a | If the I2NSF Controller does not have any mechanism to know whether a | |||
| host is behind a NAT or not, then the IKE-case MUST be used and not | host is behind a NAT or not, then the IKE case MUST be used and not | |||
| the IKE-less case. | the IKE-less case. | |||
| 5.4. NSF registration and discovery | 4.4. NSF Registration and Discovery | |||
| NSF registration refers to the process of providing the I2NSF | NSF registration refers to the process of providing the I2NSF | |||
| Controller information about a valid NSF such as certificate, IP | Controller information about a valid NSF, such as certificate, IP | |||
| address, etc. This information is incorporated in a list of NSFs | address, etc. This information is incorporated in a list of NSFs | |||
| under its control. | under its control. | |||
| The assumption in this document is that, for both cases, before a NSF | The assumption in this document is that, for both cases, before an | |||
| can operate in this system, it MUST be registered in the I2NSF | NSF can operate in this system, it MUST be registered in the I2NSF | |||
| Controller. In this way, when the NSF starts and establishes a | Controller. In this way, when the NSF starts and establishes a | |||
| connection to the I2NSF Controller, it knows that the NSF is valid | connection to the I2NSF Controller, it knows that the NSF is valid | |||
| for joining the system. | for joining the system. | |||
| Either during this registration process or when the NSF connects with | Either during this registration process or when the NSF connects with | |||
| the I2NSF Controller, the I2NSF Controller MUST discover certain | the I2NSF Controller, the I2NSF Controller MUST discover certain | |||
| capabilities of this NSF, such as what are the cryptographic suites | capabilities of this NSF, such as what are the cryptographic suites | |||
| supported, authentication method, the support of the IKE case and/or | supported, the authentication method, the support of the IKE case | |||
| the IKE-less case, etc. | and/or the IKE-less case, etc. | |||
| The registration and discovery processes are out of the scope of this | The registration and discovery processes are out of the scope of this | |||
| document. | document. | |||
| 6. YANG configuration data models | 5. YANG Configuration Data Models | |||
| In order to support the IKE and IKE-less cases, models are provided | In order to support the IKE and IKE-less cases, models are provided | |||
| for the different parameters and values that must be configured to | for the different parameters and values that must be configured to | |||
| manage IPsec SAs. Specifically, the IKE case requires modeling IKEv2 | manage IPsec SAs. Specifically, the IKE case requires modeling IKEv2 | |||
| configuration parameters, SPD and PAD, while the IKE-less case | configuration parameters, SPD and PAD, while the IKE-less case | |||
| requires configuration YANG data models for the SPD and SAD. Three | requires configuration YANG data models for the SPD and SAD. Three | |||
| modules have been defined: ietf-i2nsf-ikec (Section 6.1, common to | modules have been defined: ietf-i2nsf-ikec (Section 5.1, common to | |||
| both cases), ietf-i2nsf-ike (Section 6.2, IKE case), ietf-i2nsf- | both cases), ietf-i2nsf-ike (Section 5.2, IKE case), and ietf-i2nsf- | |||
| ikeless (Section 6.3, IKE-less case). Since the module ietf-i2nsf- | ikeless (Section 5.3, IKE-less case). Since the module ietf-i2nsf- | |||
| ikec has only typedef and groupings common to the other modules, a | ikec has only typedef and groupings common to the other modules, a | |||
| simplified view of the ietf-i2nsf-ike and ietf-i2nsf-ikeless modules | simplified view of the ietf-i2nsf-ike and ietf-i2nsf-ikeless modules | |||
| is shown. | is shown. | |||
| 6.1. The 'ietf-i2nsf-ikec' Module | 5.1. The 'ietf-i2nsf-ikec' Module | |||
| 6.1.1. Data model overview | ||||
| The module ietf-i2nsf-ikec has only definition of data types | ||||
| (typedef) and groupings which are common to the other modules. | ||||
| 6.1.2. YANG Module | 5.1.1. Data Model Overview | |||
| This module has normative references to [RFC3947], [RFC4301], | The module ietf-i2nsf-ikec only has definitions of data types | |||
| [RFC4303], [RFC8174], [RFC8221], [RFC3948], [RFC8229], | (typedef) and groupings that are common to the other modules. | |||
| [IANA-Protocols-Number], [IKEv2-Parameters], [IKEv2-Transform-Type-1] | ||||
| and [IKEv2-Transform-Type-3]. | ||||
| <CODE BEGINS> file "ietf-i2nsf-ikec@2021-03-18.yang" | 5.1.2. YANG Module | |||
| module ietf-i2nsf-ikec { | This module has normative references to [RFC3947], [RFC4301], | |||
| yang-version 1.1; | [RFC4303], [RFC8174], [RFC8221], [RFC3948], [RFC8229], [RFC6991], | |||
| namespace "urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikec"; | [IANA-Protocols-Number], [IKEv2-Parameters], | |||
| prefix "nsfikec"; | [IKEv2-Transform-Type-1], and [IKEv2-Transform-Type-3]. | |||
| import ietf-inet-types { | <CODE BEGINS> file "ietf-i2nsf-ikec@2021-06-09.yang" | |||
| prefix inet; | module ietf-i2nsf-ikec { | |||
| reference "RFC 6991: Common YANG Data Types"; | yang-version 1.1; | |||
| } | namespace "urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikec"; | |||
| prefix nsfikec; | ||||
| 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 { | } | |||
| type union { | ||||
| type uint8; | typedef ipsec-inner-protocol { | |||
| type enumeration { | type union { | |||
| enum any { | type uint8; | |||
| value 256; | type enumeration { | |||
| description | enum any { | |||
| "Any IP protocol number value."; | value 256; | |||
| } | description | |||
| } | "Any IP protocol number value."; | |||
| } | } | |||
| default any; | } | |||
| description | } | |||
| "IPsec protection can be applied to specific IP | default "any"; | |||
| traffic and layer 4 traffic (TCP, UDP, SCTP, etc.) | description | |||
| or ANY protocol in the IP packet payload. We | "IPsec protection can be applied to specific IP | |||
| The IP protocol number is specified with an uint8 | traffic and Layer 4 traffic (TCP, UDP, SCTP, etc.) | |||
| or ANY protocol in the IP packet payload. | ||||
| 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> | } | |||
| <CODE ENDS> | ||||
| 6.2. The 'ietf-i2nsf-ike' Module | 5.2. The 'ietf-i2nsf-ike' Module | |||
| In this section, the YANG module for the IKE case is described. | In this section, the YANG module for the IKE case is described. | |||
| 6.2.1. Data model overview | 5.2.1. Data Model Overview | |||
| The model related to IKEv2 has been extracted from reading IKEv2 | The model related to IKEv2 has been extracted from reading the IKEv2 | |||
| standard in [RFC7296], and observing some open source | standard in [RFC7296] and observing some open source implementations, | |||
| implementations, such as Strongswan [strongswan] or Libreswan | such as strongSwan [strongswan] or Libreswan [libreswan]. | |||
| [libreswan]. | ||||
| The definition of the PAD model has been extracted from the | The definition of the PAD model has been extracted from the | |||
| specification in section 4.4.3 in [RFC4301] (NOTE: Many | specification in Section 4.4.3 of [RFC4301]. (Note that many | |||
| implementations integrate PAD configuration as part of the IKEv2 | implementations integrate PAD configuration as part of the IKEv2 | |||
| configuration). | configuration.) | |||
| The definition of the SPD model has been mainly extracted from the | The definition of the SPD model has been mainly extracted from the | |||
| specification in section 4.4.1 and Appendix D in [RFC4301]. | specification in Section 4.4.1 and Appendix D of [RFC4301]. | |||
| The YANG data model for the IKE case is defined by the module "ietf- | The YANG data model for the IKE case is defined by the module "ietf- | |||
| i2nsf-ike". Its structure is depicted in the following diagram, | i2nsf-ike". Its structure is depicted in the following diagram, | |||
| using the notation syntax for YANG tree diagrams ([RFC8340]). | using the notation syntax for YANG tree diagrams [RFC8340]. | |||
| 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) | |||
| skipping to change at page 30, line 23 ¶ | skipping to change at line 1383 ¶ | |||
| | +--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 page 31, line 22 ¶ | skipping to change at line 1430 ¶ | |||
| | | | +--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 page 32, line 28 ¶ | skipping to change at line 1484 ¶ | |||
| +--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 | |||
| The YANG data model consists of a unique "ipsec-ike" container | The YANG data model consists of a unique "ipsec-ike" container | |||
| defined as follows. Firstly, it contains a "pad" container that | defined as follows. Firstly, it contains a "pad" container that | |||
| serves to configure the Peer Authentication Database with | serves to configure the Peer Authentication Database with | |||
| authentication information about local and remote peers (NSFs). More | authentication information about local and remote peers (NSFs). More | |||
| precisely, it consists of a list of entries, each one indicating the | precisely, it consists of a list of entries, each one indicating the | |||
| identity, authentication method and credentials that a particular | identity, authentication method, and credentials that a particular | |||
| peer (local or remote) will use. Therefore, each entry contains | peer (local or remote) will use. Therefore, each entry contains | |||
| identity, authentication information, and credentials of either the | identity, authentication information, and credentials of either the | |||
| local NSF or the remote NSF. As a consequence, the I2NF Controller | local NSF or the remote NSF. As a consequence, the I2NF Controller | |||
| can store identity, authentication information and credentials for | can store identity, authentication information, and credentials for | |||
| the local NSF and the remote NSF. | the local NSF and the remote NSF. | |||
| Next, a list "conn-entry" is defined with information about the | Next, a list "conn-entry" is defined with information about the | |||
| different IKE connections a peer can maintain with others. Each | different IKE connections a peer can maintain with others. Each | |||
| connection entry is composed of a wide number of parameters to | connection entry is composed of a wide number of parameters to | |||
| configure different aspects of a particular IKE connection between | configure different aspects of a particular IKE connection between | |||
| two peers: local and remote peer authentication information; IKE SA | two peers: local and remote peer authentication information, IKE SA | |||
| configuration (soft and hard lifetimes, cryptographic algorithms, | configuration (soft and hard lifetimes, cryptographic algorithms, | |||
| etc.); list of IPsec policies describing the type of network traffic | etc.), a list of IPsec policies describing the type of network | |||
| to be secured (local/remote subnet and ports, etc.) and how must be | traffic to be secured (local/remote subnet and ports, etc.) and how | |||
| protected (ESP, tunnel/transport, cryptographic algorithms, etc.); | it must be protected (ESP, tunnel/transport, cryptographic | |||
| CHILD SA configuration (soft and hard lifetimes); and, state | algorithms, etc.), Child SA configuration (soft and hard lifetimes), | |||
| information of the IKE connection (SPIs, usage of NAT, current | and state information of the IKE connection (SPIs, usage of NAT, | |||
| expiration times, etc.). | current expiration times, etc.). | |||
| Lastly, the "ipsec-ike" container declares a "number-ike-sas" | Lastly, the "ipsec-ike" container declares a "number-ike-sas" | |||
| container to specify state information reported by the IKE software | container to specify state information reported by the IKE software | |||
| related to the amount of IKE connections established. | related to the amount of IKE connections established. | |||
| 6.2.2. Example Usage | 5.2.2. Example Usage | |||
| Appendix A shows an example of IKE case configuration for a NSF, in | Appendix A shows an example of IKE case configuration for an NSF, in | |||
| tunnel mode (gateway-to-gateway), with NSFs authentication based on | tunnel mode (gateway-to-gateway), with NSF authentication based on | |||
| X.509 certificates. | X.509 certificates. | |||
| 6.2.3. YANG Module | 5.2.3. YANG Module | |||
| This YANG module has normative references to [RFC2247], [RFC5280], | ||||
| [RFC4301], [RFC5280], [RFC5915], [RFC6991], [RFC7296], [RFC7383], | ||||
| [RFC7427], [RFC7619], [RFC8017], [ITU-T.X.690], [RFC5322], [RFC8229], | ||||
| [RFC8174], [IKEv2-Auth-Method], [IKEv2-Transform-Type-4], | ||||
| [IKEv2-Parameters] and [IANA-Method-Type]. | ||||
| <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 { | This YANG module has normative references to [RFC5280], [RFC4301], | |||
| prefix yang; | [RFC5915], [RFC6991], [RFC7296], [RFC7383], [RFC7427], [RFC7619], | |||
| reference "RFC 6991: Common YANG Data Types"; | [RFC8017], [ITU-T.X.690], [RFC5322], [RFC8229], [RFC8174], [RFC6960], | |||
| } | [IKEv2-Auth-Method], [IKEv2-Transform-Type-4], [IKEv2-Parameters], | |||
| and [IANA-Method-Type]. | ||||
| import ietf-i2nsf-ikec { | <CODE BEGINS> file "ietf-i2nsf-ike@2021-06-09.yang" | |||
| prefix nsfikec; | module ietf-i2nsf-ike { | |||
| reference | yang-version 1.1; | |||
| "RFC XXXX: Software-Defined Networking | namespace "urn:ietf:params:xml:ns:yang:ietf-i2nsf-ike"; | |||
| (SDN)-based IPsec Flow Protection."; | prefix nsfike; | |||
| } | ||||
| import ietf-netconf-acm { | import ietf-inet-types { | |||
| prefix nacm; | prefix inet; | |||
| reference | reference | |||
| "RFC 8341: Network Configuration Access Control | "RFC 6991: Common YANG Data Types."; | |||
| Model."; | } | |||
| } | 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."; | ||||
| } | ||||
| organization "IETF I2NSF Working Group"; | organization | |||
| contact | "IETF I2NSF Working Group"; | |||
| "WG Web: <https://datatracker.ietf.org/wg/i2nsf/> | 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 { | } | |||
| type enumeration { | ||||
| enum ikev2 { | typedef auth-protocol-type { | |||
| value 2; | type enumeration { | |||
| description | enum ikev2 { | |||
| "IKEv2 authentication protocol. It is the | value 2; | |||
| only one defined right now. An enum is | description | |||
| "IKEv2 authentication protocol. It is the | ||||
| 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 | |||
| Protocol, Section 4.4.3.1."; | ||||
| case ipv4-address { | case ipv4-address { | |||
| leaf ipv4-address { | leaf ipv4-address { | |||
| type inet:ipv4-address; | type inet:ipv4-address; | |||
| description | description | |||
| "Specifies the identity as | "Specifies the identity as | |||
| a single four (4) octet IPv4 address."; | a single 4-octet IPv4 address."; | |||
| } | } | |||
| } | } | |||
| case ipv6-address{ | case ipv6-address { | |||
| leaf ipv6-address { | leaf ipv6-address { | |||
| type inet:ipv6-address; | type inet:ipv6-address; | |||
| description | description | |||
| "Specifies the identity as a | "Specifies the identity as a | |||
| single sixteen (16) octet IPv6 | single 16-octet IPv6 | |||
| address. An example is | 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 { | leaf auth-protocol { | |||
| type auth-protocol-type; | type auth-protocol-type; | |||
| default ikev2; | default "ikev2"; | |||
| description | description | |||
| "Only IKEv2 is supported right now but | "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: Internet X.509 Public Key Infrastructure | |||
| "RFC 5280"; | Certificate and Certificate Revocation | |||
| } | List (CRL) Profile."; | |||
| leaf oscp-uri { | } | |||
| type inet:uri; | leaf oscp-uri { | |||
| description | type inet:uri; | |||
| "OCSP URI. | description | |||
| If it is not defined | "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 */ | |||
| } | } | |||
| <CODE ENDS> | ||||
| <CODE ENDS> | ||||
| 6.3. The 'ietf-i2nsf-ikeless' Module | 5.3. The 'ietf-i2nsf-ikeless' Module | |||
| In this section, the YANG module for the IKE-less case is described. | In this section, the YANG module for the IKE-less case is described. | |||
| 6.3.1. Data model overview | 5.3.1. Data Model Overview | |||
| For this case, the definition of the SPD model has been mainly | 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 | extracted from the specification in Section 4.4.1 and Appendix D in | |||
| [RFC4301], though with some changes, namely: | [RFC4301], though with some changes, namely: | |||
| o For simplicity, each IPsec policy (spd-entry) contains one traffic | * For simplicity, each IPsec policy (spd-entry) contains one Traffic | |||
| selector, instead of a list of them. The reason is that actual | Selector, instead of a list of them. The reason is that actual | |||
| kernel implementations only admit a single traffic selector per | kernel implementations only admit a single Traffic Selector per | |||
| IPsec policy. | IPsec policy. | |||
| o Each IPsec policy contains an identifier (reqid) to relate the | * Each IPsec policy contains an identifier (reqid) to relate the | |||
| policy with the IPsec SA. This is common in Linux-based systems. | policy with the IPsec SA. This is common in Linux-based systems. | |||
| o Each IPsec policy has only one name and not a list of names. | * Each IPsec policy has only one name and not a list of names. | |||
| o Combined algorithms have been removed because encryption | * Combined algorithms have been removed because encryption | |||
| algorithms MAY include authenticated encryption with associated | algorithms MAY include Authenticated Encryption with Associated | |||
| data (AEAD). | Data (AEAD). | |||
| o Tunnel information has been extended with information about DSCP | * Tunnel information has been extended with information about DSCP | |||
| mapping. The reason is that certain kernel implementations accept | mapping. The reason is that certain kernel implementations accept | |||
| configuration of these values. | configuration of these values. | |||
| The definition of the SAD model has been mainly extracted from the | The definition of the SAD model has been mainly extracted from the | |||
| specification in section 4.4.2 in [RFC4301] though with some changes, | specification in Section 4.4.2 of [RFC4301], though with some | |||
| namely: | changes, namely: | |||
| o For simplicity, each IPsec SA (sad-entry) contains one traffic | * For simplicity, each IPsec SA (sad-entry) contains one Traffic | |||
| selector, instead of a list of them. The reason is that actual | Selector, instead of a list of them. The reason is that actual | |||
| kernel implementations only admit a single traffic selector per | kernel implementations only admit a single Traffic Selector per | |||
| IPsec SA. | IPsec SA. | |||
| o Each IPsec SA contains a identifier (reqid) to relate the IPsec SA | * Each IPsec SA contains an identifier (reqid) to relate the IPsec | |||
| with the IPsec Policy. The reason is that real kernel | SA with the IPsec policy. The reason is that real kernel | |||
| implementations allow to include this value. | implementations allow this value to be included. | |||
| o Each IPsec SA has also a name in the same way as IPsec policies. | * Each IPsec SA is also named in the same way as IPsec policies. | |||
| o The model allows specifying the algorithm for encryption. This | * The model allows specifying the algorithm for encryption. This | |||
| can be an Authenticated Encryption with Associated Data (AEAD) or | can be Authenticated Encryption with Associated Data (AEAD) or | |||
| non-AEAD. If an AEAD is specified the integrity algorithm is not | non-AEAD. If an AEAD algorithm is specified, the integrity | |||
| required. If an non-AEAD algorithm is specified the integrity | algorithm is not required. If a non-AEAD algorithm is specified, | |||
| algorithm is required [RFC8221]. | the integrity algorithm is required [RFC8221]. | |||
| o Tunnel information has been extended with information about | * Tunnel information has been extended with information about | |||
| Differentiated Services Code Point (DSCP) mapping. It is assumed | Differentiated Services Code Point (DSCP) mapping. It is assumed | |||
| that NSFs involved in this document provide ECN full-functionality | that NSFs involved in this document provide ECN full functionality | |||
| to prevent discarding of ECN congestion indications [RFC6040]. | to prevent discarding of ECN congestion indications [RFC6040]. | |||
| o Lifetime of the IPsec SAs also include idle time and number of IP | * The lifetime of the IPsec SAs also includes idle time and the | |||
| packets as threshold to trigger the lifetime. The reason is that | number of IP packets as a threshold to trigger the lifetime. The | |||
| actual kernel implementations allow to set these types of | reason is that actual kernel implementations allow for setting | |||
| lifetimes. | these types of lifetimes. | |||
| o Information to configure the type of encapsulation (encapsulation- | * Information to configure the type of encapsulation (encapsulation- | |||
| type) for IPsec ESP packets in UDP ([RFC3948]), or TCP ([RFC8229]) | type) for IPsec ESP packets in UDP [RFC3948] or TCP [RFC8229] has | |||
| has been included. | been included. | |||
| The notifications model has been defined using as reference the | The notifications model has been defined using, as reference, the | |||
| PF_KEYv2 specification in [RFC2367]. | PF_KEYv2 specification in [RFC2367]. | |||
| The YANG data model for the IKE-less case is defined by the module | The YANG data model for the IKE-less case is defined by the module | |||
| "ietf-i2nsf-ikeless". Its structure is depicted in the following | "ietf-i2nsf-ikeless". Its structure is depicted in the following | |||
| diagram, using the notation syntax for YANG tree diagrams | diagram, using the notation syntax for YANG tree diagrams [RFC8340]. | |||
| ([RFC8340]). | ||||
| 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: | notifications: | |||
| +---n sadb-acquire {ikeless-notification}? | +---n sadb-acquire {ikeless-notification}? | |||
| | +--ro ipsec-policy-name string | | +--ro ipsec-policy-name string | |||
| | +--ro traffic-selector | | +--ro traffic-selector | |||
| | +--ro local-prefix inet:ip-prefix | | +--ro local-prefix inet:ip-prefix | |||
| | +--ro remote-prefix inet:ip-prefix | | +--ro remote-prefix inet:ip-prefix | |||
| | +--ro inner-protocol? ipsec-inner-protocol | | +--ro inner-protocol? ipsec-inner-protocol | |||
| | +--ro local-ports* [start end] | | +--ro local-ports* [start end] | |||
| | | +--ro start inet:port-number | | | +--ro start inet:port-number | |||
| | | +--ro end inet:port-number | | | +--ro end inet:port-number | |||
| | +--ro remote-ports* [start end] | | +--ro remote-ports* [start end] | |||
| | +--ro start inet:port-number | | +--ro start inet:port-number | |||
| | +--ro end inet:port-number | | +--ro end inet:port-number | |||
| +---n sadb-expire {ikeless-notification}? | +---n sadb-expire {ikeless-notification}? | |||
| | +--ro ipsec-sa-name string | | +--ro ipsec-sa-name string | |||
| | +--ro soft-lifetime-expire? boolean | | +--ro soft-lifetime-expire? boolean | |||
| | +--ro lifetime-current | | +--ro 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 | |||
| +---n sadb-seq-overflow {ikeless-notification}? | +---n sadb-seq-overflow {ikeless-notification}? | |||
| | +--ro ipsec-sa-name string | | +--ro ipsec-sa-name string | |||
| +---n sadb-bad-spi {ikeless-notification}? | +---n sadb-bad-spi {ikeless-notification}? | |||
| +--ro spi uint32 | +--ro spi uint32 | |||
| The YANG data model consists of a unique "ipsec-ikeless" container | The YANG data model consists of a unique "ipsec-ikeless" container, | |||
| which, in turn, is composed of two additional containers: "spd" and | which, in turn, is composed of two additional containers: "spd" and | |||
| "sad". The "spd" container consists of a list of entries that form | "sad". The "spd" container consists of a list of entries that form | |||
| the Security Policy Database. Compared to the IKE case YANG data | the Security Policy Database. Compared to the IKE case YANG data | |||
| model, this part specifies a few additional parameters necessary due | model, this part specifies a few additional parameters necessary due | |||
| to the absence of an IKE software in the NSF: traffic direction to | to the absence of an IKE software in the NSF: traffic direction to | |||
| apply the IPsec policy, and a "reqid" value to link an IPsec policy | apply the IPsec policy and a "reqid" value to link an IPsec policy | |||
| with its associated IPsec SAs since it is otherwise a little hard to | with its associated IPsec SAs since it is otherwise a little hard to | |||
| find by searching. The "sad" container is a list of entries that | find by searching. The "sad" container is a list of entries that | |||
| form the Security Association Database. In general, each entry | form the Security Association Database. In general, each entry | |||
| allows specifying both configuration information (SPI, traffic | allows specifying both configuration information (SPI, Traffic | |||
| selectors, tunnel/transport mode, cryptographic algorithms and keying | Selectors, tunnel/transport mode, cryptographic algorithms and keying | |||
| material, soft/hard lifetimes, etc.) as well as state information | material, soft/hard lifetimes, etc.) as well as stating information | |||
| (time to expire, replay statistics, etc.) of a concrete IPsec SA. | (time to expire, replay statistics, etc.) of a concrete IPsec SA. | |||
| In addition, the module defines a set of notifications to allow the | In addition, the module defines a set of notifications to allow the | |||
| NSF inform I2NSF controller about relevant events such as IPsec SA | NSF to inform the I2NSF Controller about relevant events, such as | |||
| expiration, sequence number overflow or bad SPI in a received packet. | IPsec SA expiration, sequence number overflow, or bad SPI in a | |||
| received packet. | ||||
| 6.3.2. Example Usage | 5.3.2. Example Usage | |||
| Appendix B shows an example of IKE-less case configuration for a NSF, | Appendix B shows an example of an IKE-less case configuration for an | |||
| in transport mode (host-to-host). Additionally, Appendix C shows | NSF in transport mode (host-to-host). Additionally, Appendix C shows | |||
| examples of IPsec SA expire, acquire, sequence number overflow and | examples of IPsec SA expire, acquire, sequence number overflow, and | |||
| bad SPI notifications. | bad SPI notifications. | |||
| 6.3.3. YANG Module | 5.3.3. YANG Module | |||
| This YANG module has normative references to [RFC4301], [RFC6991], | ||||
| [RFC8174] and [RFC8341]. | ||||
| <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 { | This YANG module has normative references to [RFC4301], [RFC4303], | |||
| prefix nacm; | [RFC6991], [RFC8174] and [RFC8341]. | |||
| reference | ||||
| "RFC 8341: Network Configuration Access Control | ||||
| Model."; | ||||
| } | ||||
| organization "IETF I2NSF Working Group"; | <CODE BEGINS> file "ietf-i2nsf-ikeless@2021-06-09.yang" | |||
| 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 { | ||||
| description | container ipsec-ikeless { | |||
| "Container for configuration of the IKE-less | description | |||
| "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 { | leaf protocol-parameters { | |||
| type nsfikec:ipsec-protocol-parameters; | type nsfikec:ipsec-protocol-params; | |||
| default esp; | default "esp"; | |||
| description | description | |||
| "Security protocol of IPsec SA: Only | "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 | |||
| determined by the | ||||
| The key length is | length of the key set in | |||
| determined by the | this leaf. By default, it is | |||
| length of the key set in | 128 bits."; | |||
| this leaf. By default is | } | |||
| 128 bits."; | leaf iv { | |||
| } | nacm:default-deny-all; | |||
| leaf iv { | type yang:hex-string; | |||
| nacm:default-deny-all; | description | |||
| type yang:hex-string; | "ESP encryption IV value. If | |||
| description | this leaf is not defined, the | |||
| "ESP encryption IV value. If | ||||
| 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> | 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> | ||||
| 7. IANA Considerations | 6. IANA Considerations | |||
| This document registers three URIs in the "ns" subregistry of the | IANA has registered the following namespaces in the "ns" subregistry | |||
| IETF XML Registry [RFC3688]. Following the format in [RFC3688], the | within the "IETF XML Registry" [RFC3688]: | |||
| following registrations are requested: | ||||
| URI: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikec | URI: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikec | |||
| Registrant Contact: The IESG. | Registrant Contact: The IESG. | |||
| XML: N/A, the requested URI is an XML namespace. | XML: N/A, the requested URI is an XML namespace. | |||
| URI: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ike | URI: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ike | |||
| Registrant Contact: The IESG. | Registrant Contact: The IESG. | |||
| XML: N/A, the requested URI is an XML namespace. | XML: N/A, the requested URI is an XML namespace. | |||
| URI: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless | URI: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless | |||
| Registrant Contact: The IESG. | Registrant Contact: The IESG. | |||
| XML: N/A, the requested URI is an XML namespace. | XML: N/A, the requested URI is an XML namespace. | |||
| This document registers three YANG modules in the "YANG Module Names" | IANA has registered the following YANG modules in the "YANG Module | |||
| registry [RFC6020]. Following the format in [RFC6020], the following | Names" registry [RFC6020]: | |||
| registrations are requested: | ||||
| Name: ietf-i2nsf-ikec | Name: ietf-i2nsf-ikec | |||
| Namespace: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikec | Maintained by IANA: N | |||
| Prefix: nsfikec | Namespace: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikec | |||
| Reference: RFC XXXX | Prefix: nsfikec | |||
| Reference: RFC 9061 | ||||
| Name: ietf-i2nsf-ike | Name: ietf-i2nsf-ike | |||
| Namespace: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ike | Maintained by IANA: N | |||
| Prefix: nsfike | Namespace: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ike | |||
| Reference: RFC XXXX | Prefix: nsfike | |||
| Reference: RFC 9061 | ||||
| Name: ietf-i2nsf-ikeless | Name: ietf-i2nsf-ikeless | |||
| Namespace: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless | Maintained by IANA: N | |||
| Prefix: nsfikels | Namespace: urn:ietf:params:xml:ns:yang:ietf-i2nsf-ikeless | |||
| Reference: RFC XXXX | Prefix: nsfikels | |||
| Reference: RFC 9061 | ||||
| 8. Security Considerations | 7. Security Considerations | |||
| First of all, this document shares all the security issues of SDN | First of all, this document shares all the security issues of SDN | |||
| that are specified in the "Security Considerations" section of | that are specified in the Security Considerations sections of | |||
| [ITU-T.Y.3300] and [RFC7426]. | [ITU-T.Y.3300] and [RFC7426]. | |||
| On the one hand, it is important to note that there MUST exist a | On the one hand, it is important to note that there MUST exist a | |||
| security association between the I2NSF Controller and the NSFs to | security association between the I2NSF Controller and the NSFs to | |||
| protect the critical information (cryptographic keys, configuration | protect the critical information (cryptographic keys, configuration | |||
| parameter, etc.) exchanged between these entities. The nature of and | parameter, etc.) exchanged between these entities. The nature of and | |||
| means to create that security association is out of the scope of this | means to create that security association is out of the scope of this | |||
| document (i.e., it is part of device provisioning or onboarding). | document (i.e., it is part of device provisioning or onboarding). | |||
| On the other hand, if encryption is mandatory for all traffic of a | On the other hand, if encryption is mandatory for all traffic of an | |||
| NSF, its default policy MUST be to drop (DISCARD) packets to prevent | NSF, its default policy MUST be to drop (DISCARD) packets to prevent | |||
| cleartext packet leaks. This default policy MUST be pre-configured | cleartext packet leaks. This default policy MUST be preconfigured in | |||
| in the startup configuration datastore in the NSF before the NSF | the startup configuration datastore in the NSF before the NSF | |||
| contacts the I2NSF Controller. Moreover, the startup configuration | contacts the I2NSF Controller. Moreover, the startup configuration | |||
| datastore MUST be also pre-configured with the required ALLOW | datastore MUST be also preconfigured with the required ALLOW policies | |||
| policies that allow the NSF to communicate with the I2NSF Controller | that allow the NSF to communicate with the I2NSF Controller once the | |||
| once the NSF is deployed. This pre-configuration step is not carried | NSF is deployed. This preconfiguration step is not carried out by | |||
| out by the I2NSF Controller but by some other entity before the NSF | the I2NSF Controller but by some other entity before the NSF | |||
| deployment. In this manner, when the NSF starts/reboots, it will | deployment. In this manner, when the NSF starts/reboots, it will | |||
| always first apply the configuration in the startup configuration | always first apply the configuration in the startup configuration | |||
| before contacting the I2NSF Controller. | before contacting the I2NSF Controller. | |||
| Finally, this section is divided in two parts in order to analyze | Finally, this section is divided in two parts in order to analyze | |||
| different security considerations for both cases: NSF with IKEv2 (IKE | different security considerations for both cases: NSF with IKEv2 (IKE | |||
| case) and NSF without IKEv2 (IKE-less case). In general, the I2NSF | case) and NSF without IKEv2 (IKE-less case). In general, the I2NSF | |||
| Controller, as typically in the SDN paradigm, is a target for | Controller, as typically in the SDN paradigm, is a target for | |||
| different type of attacks [SDNSecServ] and [SDNSecurity]. Thus, the | different type of attacks; see [SDNSecServ] and [SDNSecurity]. Thus, | |||
| I2NSF Controller is a key entity in the infrastructure and MUST be | the I2NSF Controller is a key entity in the infrastructure and MUST | |||
| protected accordingly. In particular, the I2NSF Controller will | be protected accordingly. In particular, the I2NSF Controller will | |||
| handle cryptographic material thus the attacker may try to access | handle cryptographic material; thus, the attacker may try to access | |||
| this information. The impact is different depending on the IKE case | this information. The impact is different depending on the IKE case | |||
| or the IKE-less case. | or the IKE-less case. | |||
| 8.1. IKE case | 7.1. IKE Case | |||
| In the IKE case, the I2NSF Controller sends IKEv2 credentials (PSK, | In the IKE case, the I2NSF Controller sends IKEv2 credentials (PSK, | |||
| public/private keys, certificates, etc.) to the NSFs using the | public/private keys, certificates, etc.) to the NSFs using the | |||
| security association between I2NSF Controller and NSFs. The I2NSF | security association between the I2NSF Controller and NSFs. The | |||
| Controller MUST NOT store the IKEv2 credentials after distributing | I2NSF Controller MUST NOT store the IKEv2 credentials after | |||
| them. Moreover, the NSFs MUST NOT allow the reading of these values | distributing them. Moreover, the NSFs MUST NOT allow the reading of | |||
| once they have been applied by the I2NSF Controller (i.e. write only | these values once they have been applied by the I2NSF Controller | |||
| operations). One option is to always return the same value (i.e. all | (i.e., write-only operations). One option is to always return the | |||
| 0s) if a read operation is carried out. | same value (i.e., all 0s) if a read operation is carried out. | |||
| If the attacker has access to the I2NSF Controller during the period | If the attacker has access to the I2NSF Controller during the period | |||
| of time that key material is generated, it might have access to the | of time that key material is generated, it might have access to the | |||
| key material. Since these values are used during NSF authentication | key material. Since these values are used during NSF authentication | |||
| in IKEv2, it may impersonate the affected NSFs. Several | in IKEv2, it may impersonate the affected NSFs. Several | |||
| recommendations are important. | recommendations are important. | |||
| o IKEv2 configurations SHOULD adhere to the recommendations in | * IKEv2 configurations SHOULD adhere to the recommendations in | |||
| [RFC8247]. | [RFC8247]. | |||
| o If PSK authentication is used in IKEv2, the I2NSF Controller MUST | * If PSK authentication is used in IKEv2, the I2NSF Controller MUST | |||
| remove the PSK immediately after generating and distributing it. | remove the PSK immediately after generating and distributing it. | |||
| o When public/private keys are used, the I2NSF Controller MAY | * When public/private keys are used, the I2NSF Controller MAY | |||
| generate both public key and private key. In such a case, the | generate both public key and private key. In such a case, the | |||
| I2NSF Controller MUST remove the associated private key | I2NSF Controller MUST remove the associated private key | |||
| immediately after distributing them to the NSFs. Alternatively, | immediately after distributing them to the NSFs. Alternatively, | |||
| the NSF MAY generate the private key and export only the public | the NSF MAY generate the private key and export only the public | |||
| key to the I2NSF Controller. How the NSF generates these | key to the I2NSF Controller. How the NSF generates these | |||
| cryptographic material (public key/ private keys) and exports the | cryptographic materials (public key/ private keys) and exports the | |||
| public key, is out of scope of this document. | public key is out of scope of this document. | |||
| o If certificates are used, the NSF MAY generate the private key and | * If certificates are used, the NSF MAY generate the private key and | |||
| export the public key for certification to the I2NSF Controller. | export the public key for certification to the I2NSF Controller. | |||
| How the NSF generates these cryptographic material (public key/ | How the NSF generates these cryptographic material (public key/ | |||
| private keys) and exports the public key, is out of scope of this | private keys) and exports the public key is out of scope of this | |||
| document. | document. | |||
| 8.2. IKE-less case | 7.2. IKE-less Case | |||
| In the IKE-less case, the I2NSF Controller sends the IPsec SA | In the IKE-less case, the I2NSF Controller sends the IPsec SA | |||
| information to the NSF's SAD that includes the private session keys | information to the NSF's SAD that includes the private session keys | |||
| required for integrity and encryption. The I2NSF Controller MUST NOT | required for integrity and encryption. The I2NSF Controller MUST NOT | |||
| store the keys after distributing them. Moreover, the NSFs receiving | store the keys after distributing them. Moreover, the NSFs receiving | |||
| private key material MUST NOT allow the reading of these values by | private key material MUST NOT allow the reading of these values by | |||
| any other entity (including the I2NSF Controller itself) once they | any other entity (including the I2NSF Controller itself) once they | |||
| have been applied (i.e. write only operations) into the NSFs. | have been applied (i.e., write-only operations) into the NSFs. | |||
| Nevertheless, if the attacker has access to the I2NSF Controller | Nevertheless, if the attacker has access to the I2NSF Controller | |||
| during the period of time that key material is generated, it may | during the period of time that key material is generated, it may | |||
| obtain these values. In other words, the attacker might be able to | obtain these values. In other words, the attacker might be able to | |||
| observe the IPsec traffic and decrypt, or even modify and re-encrypt, | observe the IPsec traffic and decrypt, or even modify and re-encrypt, | |||
| the traffic between peers. | the traffic between peers. | |||
| Finally, the security association between the I2NSF Controller and | Finally, the security association between the I2NSF Controller and | |||
| the NSFs MUST provide, at least, the same degree of protection as the | the NSFs MUST provide, at least, the same degree of protection as the | |||
| one achieved by the IPsec SAs configured in the NSFs. In particular, | one achieved by the IPsec SAs configured in the NSFs. In particular, | |||
| the security association between the I2NSF Controller and the NSFs | the security association between the I2NSF Controller and the NSFs | |||
| MUST provide forward secrecy if this property is to be achieved in | MUST provide forward secrecy if this property is to be achieved in | |||
| the IPsec SAs that the I2NSF Controller configures in the NSFs. | the IPsec SAs that the I2NSF Controller configures in the NSFs. | |||
| Similarly, the encryption algorithms used in the security association | Similarly, the encryption algorithms used in the security association | |||
| between I2NSF Controller and the NSF MUST have, at least, the same | between the I2NSF Controller and the NSF MUST have, at least, the | |||
| strength (minimum strength of a 128-bit key) as the algorithms used | same strength (minimum strength of a 128-bit key) as the algorithms | |||
| to establish the IPsec SAs. | used to establish the IPsec SAs. | |||
| 8.3. YANG modules | 7.3. YANG Modules | |||
| The modules specified in this document define a schema for data that | The YANG modules specified in this document define a schema for data | |||
| is designed to be accessed via network management protocols such as | that is designed to be accessed via network management protocols such | |||
| NETCONF [RFC6241] or RESTCONF [RFC8040]. The lowest NETCONF layer is | as NETCONF [RFC6241] or RESTCONF [RFC8040]. The lowest NETCONF layer | |||
| the secure transport layer, and the mandatory-to-implement secure | is the secure transport layer, and the mandatory-to-implement secure | |||
| transport is Secure Shell (SSH) [RFC6242]. The lowest RESTCONF layer | transport is Secure Shell (SSH) [RFC6242]. The lowest RESTCONF layer | |||
| is HTTPS, and the mandatory-to-implement secure transport is TLS | is HTTPS, and the mandatory-to-implement secure transport is TLS | |||
| [RFC8446]. | [RFC8446]. | |||
| The Network Configuration Access Control Model (NACM) [RFC8341] | The Network Configuration Access Control Model (NACM) [RFC8341] | |||
| provides the means to restrict access for particular NETCONF or | provides the means to restrict access for particular NETCONF or | |||
| RESTCONF users to a preconfigured subset of all available NETCONF or | RESTCONF users to a preconfigured subset of all available NETCONF or | |||
| RESTCONF protocol operations and content. | RESTCONF protocol operations and content. | |||
| There are a number of data nodes defined in these YANG modules that | There are a number of data nodes defined in these YANG modules that | |||
| are writable/creatable/deletable (i.e., config true, which is the | are writable/creatable/deletable (i.e., config true, which is the | |||
| default). These data nodes may be considered sensitive or vulnerable | default). These data nodes may be considered sensitive or vulnerable | |||
| in some network environments. Write operations (e.g., edit-config) | in some network environments. Write operations (e.g., edit-config) | |||
| to these data nodes without proper protection can have a negative | to these data nodes without proper protection can have a negative | |||
| effect on network operations. These are the subtrees and data nodes | effect on network operations. These are the subtrees and data nodes | |||
| and their sensitivity/vulnerability: | and their sensitivity/vulnerability: | |||
| For the IKE case (ietf-i2nsf-ike): | For the IKE case (ietf-i2nsf-ike): | |||
| /ipsec-ike: The entire container in this module is sensitive to | ||||
| /ipsec-ike: The entire container in this module is sensitive to | ||||
| write operations. An attacker may add/modify the credentials | write operations. An attacker may add/modify the credentials | |||
| to be used for the authentication (e.g., to impersonate a NSF), | to be used for the authentication (e.g., to impersonate an | |||
| the trust root (e.g., changing the trusted CA certificates), | NSF), for the trust root (e.g., changing the trusted CA | |||
| the cryptographic algorithms (allowing a downgrading attack), | certificates), for the cryptographic algorithms (allowing a | |||
| the IPsec policies (e.g., by allowing leaking of data traffic | downgrading attack), for the IPsec policies (e.g., by allowing | |||
| by changing to an allow policy), and in general changing the | leaking of data traffic by changing to an allow policy), and in | |||
| IKE SA conditions and credentials between any NSF. | general, changing the IKE SA conditions and credentials between | |||
| any NSF. | ||||
| For the IKE-less case (ietf-i2nsf-ikeless): | For the IKE-less case (ietf-i2nsf-ikeless): | |||
| /ipsec-ikeless: The entire container in this module is sensitive | ||||
| to write operations. An attacker may add/modify/delete any | ||||
| IPsec policies (e.g., by allowing leaking of data traffic by | ||||
| changing to an allow policy) in the /ipsec-ikeless/spd | ||||
| container, add/modify/delete any IPsec SAs between two NSF by | ||||
| means of /ipsec-ikeless/sad container, and, in general, change | ||||
| any IPsec SAs and IPsec policies between any NSF. | ||||
| /ipsec-ikeless: The entire container in this module is | Some of the readable data nodes in these YANG modules may be | |||
| sensitive to write operations. An attacker may add/modify/ | considered sensitive or vulnerable in some network environments. It | |||
| delete any IPsec policies (e.g., by allowing leaking of data | is thus important to control read access (e.g., via get, get-config, | |||
| traffic by changing to a allow policy) in the /ipsec-ikeless/ | or notification) to these data nodes. These are the subtrees and | |||
| spd container, and add/modify/delete any IPsec SAs between two | data nodes and their sensitivity/vulnerability: | |||
| NSF by means of /ipsec-ikeless/sad container and, in general, | ||||
| changing any IPsec SAs and IPsec policies between any NSF. | ||||
| Some of the readable data nodes in this YANG module may be considered | ||||
| sensitive or vulnerable in some network environments. It is thus | ||||
| important to control read access (e.g., via get, get-config, or | ||||
| notification) to these data nodes. These are the subtrees and data | ||||
| nodes and their sensitivity/vulnerability: | ||||
| For the IKE case (ietf-i2nsf-ike): | For the IKE case (ietf-i2nsf-ike): | |||
| /ipsec-ike/pad: This container includes sensitive information to | ||||
| /ipsec-ike/pad: This container includes sensitive information | read operations. This information MUST NOT be returned to a | |||
| to read operations. This information MUST NOT be returned to a | ||||
| client. For example, cryptographic material configured in the | client. For example, cryptographic material configured in the | |||
| NSFs (peer-authentication/pre-shared/secret and peer- | NSFs (peer-authentication/pre-shared/secret and peer- | |||
| authentication/digital-signature/private-key) are already | authentication/digital-signature/private-key) are already | |||
| protected by the NACM extension "default-deny-all" in this | protected by the NACM extension "default-deny-all" in this | |||
| document. | document. | |||
| For the IKE-less case (ietf-i2nsf-ikeless): | For the IKE-less case (ietf-i2nsf-ikeless): | |||
| /ipsec-ikeless/sad/sad-entry/ipsec-sa-config/esp-sa: This | ||||
| /ipsec-ikeless/sad/sad-entry/ipsec-sa-config/esp-sa: This | ||||
| container includes symmetric keys for the IPsec SAs. For | container includes symmetric keys for the IPsec SAs. For | |||
| example, encryption/key contains an ESP encryption key value | example, encryption/key contains an ESP encryption key value | |||
| and encryption/iv contains an initialization vector value. | and encryption/iv contains an Initialization Vector value. | |||
| Similarly, integrity/key has an ESP integrity key value. Those | Similarly, integrity/key has an ESP integrity key value. Those | |||
| values MUST NOT be read by anyone and are protected by the NACM | values MUST NOT be read by anyone and are protected by the NACM | |||
| extension "default-deny-all" in this document. | extension "default-deny-all" in this document. | |||
| 9. Acknowledgements | 8. References | |||
| 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. | ||||
| 10. References | ||||
| 10.1. Normative References | 8.1. Normative References | |||
| [IANA-Method-Type] | [IANA-Method-Type] | |||
| Internet Assigned Numbers Authority (IANA), "Method Type", | IANA, "Method Type", | |||
| April 2020, <https://www.iana.org/assignments/eap-numbers/ | <https://www.iana.org/assignments/eap-numbers/>. | |||
| eap-numbers.xhtml#eap-numbers-4>. | ||||
| [IANA-Protocols-Number] | [IANA-Protocols-Number] | |||
| Internet Assigned Numbers Authority (IANA), "Protocol | IANA, "Protocol Numbers", | |||
| Numbers", January 2020, <https://www.iana.org/assignments/ | <https://www.iana.org/assignments/protocol-numbers/>. | |||
| protocol-numbers/protocol-numbers.xhtml>. | ||||
| [IKEv2-Auth-Method] | [IKEv2-Auth-Method] | |||
| Internet Assigned Numbers Authority (IANA), "Internet Key | IANA, "IKEv2 Authentication Method", | |||
| Exchange Version 2 (IKEv2) Parameters - IKEv2 | <https://www.iana.org/assignments/ikev2-parameters/>. | |||
| Authentication Method", August 2020, | ||||
| <https://www.iana.org/assignments/ikev2-parameters/ | ||||
| ikev2-parameters.xhtml#ikev2-parameters-12>. | ||||
| [IKEv2-Parameters] | [IKEv2-Parameters] | |||
| Internet Assigned Numbers Authority (IANA), "Internet Key | IANA, "Internet Key Exchange Version 2 (IKEv2) | |||
| Exchange Version 2 (IKEv2) Parameters", August 2020, | Parameters", | |||
| <https://www.iana.org/assignments/ikev2-parameters/ | <https://www.iana.org/assignments/ikev2-parameters/>. | |||
| ikev2-parameters.xhtml>. | ||||
| [IKEv2-Transform-Type-1] | [IKEv2-Transform-Type-1] | |||
| Internet Assigned Numbers Authority (IANA), "Internet Key | IANA, "Transform Type 1 - Encryption Algorithm Transform | |||
| Exchange Version 2 (IKEv2) Parameters - Transform Type | IDs", | |||
| Values - Transform Type 1 - Encryption Algorithm Transform | <https://www.iana.org/assignments/ikev2-parameters/>. | |||
| IDs", August 2020, <https://www.iana.org/assignments/ | ||||
| ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters- | ||||
| 5>. | ||||
| [IKEv2-Transform-Type-3] | [IKEv2-Transform-Type-3] | |||
| Internet Assigned Numbers Authority (IANA), "Internet Key | IANA, "Transform Type 3 - Integrity Algorithm Transform | |||
| Exchange Version 2 (IKEv2) Parameters - Transform Type | IDs", | |||
| Values - Transform Type 3 - Integrity Algorithm Transform | <https://www.iana.org/assignments/ikev2-parameters/>. | |||
| IDs", August 2020, <https://www.iana.org/assignments/ | ||||
| ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters- | ||||
| 7>. | ||||
| [IKEv2-Transform-Type-4] | [IKEv2-Transform-Type-4] | |||
| Internet Assigned Numbers Authority (IANA), "Internet Key | IANA, "Transform Type 4 - Diffie-Hellman Group Transform | |||
| Exchange Version 2 (IKEv2) Parameters - Transform Type | IDs", | |||
| Values - Transform Type 4 - Diffie-Hellman Group Transform | <https://www.iana.org/assignments/ikev2-parameters/>. | |||
| IDs", August 2020, <https://www.iana.org/assignments/ | ||||
| ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters- | ||||
| 8>. | ||||
| [ITU-T.X.690] | [ITU-T.X.690] | |||
| "Recommendation ITU-T X.690", August 2015. | International Telecommunication Union, "Information | |||
| Technology - ASN.1 encoding rules: Specification of Basic | ||||
| Encoding Rules (BER), Canonical Encoding Rules (CER) and | ||||
| Distinguished Encoding Rules (DER)", ITU-T Recommendation | ||||
| X.690, ISO/IEC 8825-1, February 2021. | ||||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC2247] Kille, S., Wahl, M., Grimstad, A., Huber, R., and S. | ||||
| Sataluri, "Using Domains in LDAP/X.500 Distinguished | ||||
| Names", RFC 2247, DOI 10.17487/RFC2247, January 1998, | ||||
| <https://www.rfc-editor.org/info/rfc2247>. | ||||
| [RFC3947] Kivinen, T., Swander, B., Huttunen, A., and V. Volpe, | [RFC3947] Kivinen, T., Swander, B., Huttunen, A., and V. Volpe, | |||
| "Negotiation of NAT-Traversal in the IKE", RFC 3947, | "Negotiation of NAT-Traversal in the IKE", RFC 3947, | |||
| DOI 10.17487/RFC3947, January 2005, | DOI 10.17487/RFC3947, January 2005, | |||
| <https://www.rfc-editor.org/info/rfc3947>. | <https://www.rfc-editor.org/info/rfc3947>. | |||
| [RFC3948] Huttunen, A., Swander, B., Volpe, V., DiBurro, L., and M. | [RFC3948] Huttunen, A., Swander, B., Volpe, V., DiBurro, L., and M. | |||
| Stenberg, "UDP Encapsulation of IPsec ESP Packets", | Stenberg, "UDP Encapsulation of IPsec ESP Packets", | |||
| RFC 3948, DOI 10.17487/RFC3948, January 2005, | RFC 3948, DOI 10.17487/RFC3948, January 2005, | |||
| <https://www.rfc-editor.org/info/rfc3948>. | <https://www.rfc-editor.org/info/rfc3948>. | |||
| skipping to change at page 77, line 23 ¶ | skipping to change at line 3621 ¶ | |||
| [RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., | [RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., | |||
| and A. Bierman, Ed., "Network Configuration Protocol | and A. Bierman, Ed., "Network Configuration Protocol | |||
| (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, | (NETCONF)", RFC 6241, DOI 10.17487/RFC6241, June 2011, | |||
| <https://www.rfc-editor.org/info/rfc6241>. | <https://www.rfc-editor.org/info/rfc6241>. | |||
| [RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure | [RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure | |||
| Shell (SSH)", RFC 6242, DOI 10.17487/RFC6242, June 2011, | Shell (SSH)", RFC 6242, DOI 10.17487/RFC6242, June 2011, | |||
| <https://www.rfc-editor.org/info/rfc6242>. | <https://www.rfc-editor.org/info/rfc6242>. | |||
| [RFC6960] Santesson, S., Myers, M., Ankney, R., Malpani, A., | ||||
| Galperin, S., and C. Adams, "X.509 Internet Public Key | ||||
| Infrastructure Online Certificate Status Protocol - OCSP", | ||||
| RFC 6960, DOI 10.17487/RFC6960, June 2013, | ||||
| <https://www.rfc-editor.org/info/rfc6960>. | ||||
| [RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", | [RFC6991] Schoenwaelder, J., Ed., "Common YANG Data Types", | |||
| RFC 6991, DOI 10.17487/RFC6991, July 2013, | RFC 6991, DOI 10.17487/RFC6991, July 2013, | |||
| <https://www.rfc-editor.org/info/rfc6991>. | <https://www.rfc-editor.org/info/rfc6991>. | |||
| [RFC7296] Kaufman, C., Hoffman, P., Nir, Y., Eronen, P., and T. | [RFC7296] Kaufman, C., Hoffman, P., Nir, Y., Eronen, P., and T. | |||
| Kivinen, "Internet Key Exchange Protocol Version 2 | Kivinen, "Internet Key Exchange Protocol Version 2 | |||
| (IKEv2)", STD 79, RFC 7296, DOI 10.17487/RFC7296, October | (IKEv2)", STD 79, RFC 7296, DOI 10.17487/RFC7296, October | |||
| 2014, <https://www.rfc-editor.org/info/rfc7296>. | 2014, <https://www.rfc-editor.org/info/rfc7296>. | |||
| [RFC7383] Smyslov, V., "Internet Key Exchange Protocol Version 2 | [RFC7383] Smyslov, V., "Internet Key Exchange Protocol Version 2 | |||
| skipping to change at page 79, line 5 ¶ | skipping to change at line 3703 ¶ | |||
| [RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., | [RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., | |||
| and R. Wilton, "Network Management Datastore Architecture | and R. Wilton, "Network Management Datastore Architecture | |||
| (NMDA)", RFC 8342, DOI 10.17487/RFC8342, March 2018, | (NMDA)", RFC 8342, DOI 10.17487/RFC8342, March 2018, | |||
| <https://www.rfc-editor.org/info/rfc8342>. | <https://www.rfc-editor.org/info/rfc8342>. | |||
| [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
| Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
| <https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
| 10.2. Informative References | 8.2. Informative References | |||
| [I-D.carrel-ipsecme-controller-ike] | ||||
| Carrel, D. and B. Weiss, "IPsec Key Exchange using a | ||||
| Controller", draft-carrel-ipsecme-controller-ike-01 (work | ||||
| in progress), March 2019. | ||||
| [I-D.tran-ipsecme-yang] | [IPSECME-CONTROLLER-IKE] | |||
| Tran, K., Wang, H., Nagaraj, V., and X. Chen, "Yang Data | Carrel, D. and B. Weis, "IPsec Key Exchange using a | |||
| Model for Internet Protocol Security (IPsec)", draft-tran- | Controller", Work in Progress, Internet-Draft, draft- | |||
| ipsecme-yang-01 (work in progress), June 2015. | carrel-ipsecme-controller-ike-01, 10 March 2019, | |||
| <https://datatracker.ietf.org/doc/html/draft-carrel- | ||||
| ipsecme-controller-ike-01>. | ||||
| [ITU-T.Y.3300] | [ITU-T.Y.3300] | |||
| "Recommendation ITU-T Y.3300", June 2014, | International Telecommunications Union, "Y.3300: Framework | |||
| of software-defined networking", June 2014, | ||||
| <https://www.itu.int/rec/T-REC-Y.3300/en>. | <https://www.itu.int/rec/T-REC-Y.3300/en>. | |||
| [libreswan] | [libreswan] | |||
| The Libreswan Project, "Libreswan VPN software", September | The Libreswan Project, "Libreswan VPN software", | |||
| 2020, <https://libreswan.org/>. | <https://libreswan.org/>. | |||
| [netconf-vpn] | [netconf-vpn] | |||
| Stefan Wallin, "Tutorial: NETCONF and YANG", January 2014, | Stefan Wallin, "Tutorial: NETCONF and YANG", January 2014, | |||
| <https://ripe68.ripe.net/presentations/181-NETCONF-YANG- | <https://ripe68.ripe.net/presentations/181-NETCONF-YANG- | |||
| tutorial-43.pdf>. | tutorial-43.pdf>. | |||
| [ONF-OpenFlow] | [ONF-OpenFlow] | |||
| ONF, "OpenFlow Switch Specification (Version 1.4.0)", | Open Networking Foundation, "OpenFlow Switch | |||
| Specification", Version 1.4.0 (Wire Protocol 0x05), | ||||
| October 2013, <https://www.opennetworking.org/wp- | October 2013, <https://www.opennetworking.org/wp- | |||
| content/uploads/2014/10/openflow-spec-v1.4.0.pdf >. | content/uploads/2014/10/openflow-spec-v1.4.0.pdf>. | |||
| [ONF-SDN-Architecture] | [ONF-SDN-Architecture] | |||
| "SDN Architecture", June 2014, | Open Networking Foundation, "SDN architecture", Issue 1, | |||
| <https://www.opennetworking.org/wp- | June 2014, <https://www.opennetworking.org/wp- | |||
| content/uploads/2013/02/TR_SDN_ARCH_1.0_06062014.pdf >. | content/uploads/2013/02/TR_SDN_ARCH_1.0_06062014.pdf>. | |||
| [RFC2367] McDonald, D., Metz, C., and B. Phan, "PF_KEY Key | [RFC2367] McDonald, D., Metz, C., and B. Phan, "PF_KEY Key | |||
| Management API, Version 2", RFC 2367, | Management API, Version 2", RFC 2367, | |||
| DOI 10.17487/RFC2367, July 1998, | DOI 10.17487/RFC2367, July 1998, | |||
| <https://www.rfc-editor.org/info/rfc2367>. | <https://www.rfc-editor.org/info/rfc2367>. | |||
| [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, | [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, | |||
| DOI 10.17487/RFC3688, January 2004, | DOI 10.17487/RFC3688, January 2004, | |||
| <https://www.rfc-editor.org/info/rfc3688>. | <https://www.rfc-editor.org/info/rfc3688>. | |||
| skipping to change at page 80, line 38 ¶ | skipping to change at line 3783 ¶ | |||
| (I2NSF): Problem Statement and Use Cases", RFC 8192, | (I2NSF): Problem Statement and Use Cases", RFC 8192, | |||
| DOI 10.17487/RFC8192, July 2017, | DOI 10.17487/RFC8192, July 2017, | |||
| <https://www.rfc-editor.org/info/rfc8192>. | <https://www.rfc-editor.org/info/rfc8192>. | |||
| [RFC8329] Lopez, D., Lopez, E., Dunbar, L., Strassner, J., and R. | [RFC8329] Lopez, D., Lopez, E., Dunbar, L., Strassner, J., and R. | |||
| Kumar, "Framework for Interface to Network Security | Kumar, "Framework for Interface to Network Security | |||
| Functions", RFC 8329, DOI 10.17487/RFC8329, February 2018, | Functions", RFC 8329, DOI 10.17487/RFC8329, February 2018, | |||
| <https://www.rfc-editor.org/info/rfc8329>. | <https://www.rfc-editor.org/info/rfc8329>. | |||
| [SDNSecServ] | [SDNSecServ] | |||
| Scott-Hayward, S., O'Callaghan, G., and P. Sezer, "SDN | Scott-Hayward, S., O'Callaghan, G., and P. Sezer, "Sdn | |||
| Security: A Survey. IEEE SDN for Future Networks and | Security: A Survey", 2013 IEEE SDN for Future Networks and | |||
| Services (SDN4FNS), Trento, 2013, pp. 1-7, doi: 10.1109/ | Services (SDN4FNS), pp. 1-7, | |||
| SDN4FNS.2013.6702553.", 2013. | DOI 10.1109/SDN4FNS.2013.6702553, November 2013, | |||
| <https://doi.org/10.1109/SDN4FNS.2013.6702553>. | ||||
| [SDNSecurity] | [SDNSecurity] | |||
| Kreutz, D., Ramos, F., and P. Verissimo, "Towards secure | Kreutz, D., Ramos, F., and P. Verissimo, "Towards secure | |||
| and dependable software-defined networks. HotSDN 2013 - | and dependable software-defined networks", Proceedings of | |||
| Proceedings of the 2013 ACM SIGCOMM Workshop on Hot Topics | the second ACM SIGCOMM workshop on Hot Topics in software | |||
| in Software Defined Networking. 55-60. | defined networking, pp. 55-60, | |||
| 10.1145/2491185.2491199.", 2013. | DOI 10.1145/2491185.2491199, August 2013, | |||
| <https://doi.org/10.1145/2491185.2491199>. | ||||
| [strongswan] | [strongswan] | |||
| CESNET, "StrongSwan: the OpenSource IPsec-based VPN | CESNET, "strongSwan: the OpenSource IPsec-based VPN | |||
| Solution", September 2020, <https://www.strongswan.org/>. | Solution", <https://www.strongswan.org/>. | |||
| Appendix A. XML configuration example for IKE case (gateway-to-gateway) | [TRAN-IPSECME-YANG] | |||
| Tran, K., Wang, H., Nagaraj, V. K., and X. Chen, "Yang | ||||
| Data Model for Internet Protocol Security (IPsec)", Work | ||||
| in Progress, Internet-Draft, draft-tran-ipsecme-yang-01, | ||||
| 18 March 2016, <https://datatracker.ietf.org/doc/html/ | ||||
| draft-tran-ipsecme-yang-01>. | ||||
| This example shows a XML configuration file sent by the I2NSF | Appendix A. XML Configuration Example for IKE Case (Gateway-to-Gateway) | |||
| Controller to establish a IPsec SA between two NSFs (see Figure 3) in | ||||
| tunnel mode (gateway-to-gateway) with ESP, authentication based on | This example shows an XML configuration file sent by the I2NSF | |||
| X.509 certificates (simplified for brevity with | Controller to establish an IPsec SA between two NSFs (see Figure 3) | |||
| in tunnel mode (gateway-to-gateway) with ESP, with authentication | ||||
| based on X.509 certificates (simplified for brevity with | ||||
| "base64encodedvalue==") and applying the IKE case. | "base64encodedvalue==") and applying the IKE case. | |||
| +------------------+ | +------------------+ | |||
| | 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) | |||
| Figure 3: IKE case, tunnel mode , X.509 certificate authentication. | Figure 3: IKE Case, Tunnel Mode, X.509 Certificate Authentication | |||
| <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> | |||
| skipping to change at page 82, line 19 ¶ | skipping to change at line 3868 ¶ | |||
| <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 page 84, line 16 ¶ | skipping to change at line 3960 ¶ | |||
| <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> | |||
| Appendix B. XML configuration example for IKE-less case (host-to-host) | Appendix B. XML Configuration Example for IKE-less Case (Host-to-Host) | |||
| This example shows a XML configuration file sent by the I2NSF | This example shows an XML configuration file sent by the I2NSF | |||
| Controller to establish a IPsec SA between two NSFs (see Figure 4) in | Controller to establish an IPsec SA between two NSFs (see Figure 4) | |||
| transport mode (host-to-host) with ESP in the IKE-less case. | in transport mode (host-to-host) with ESP in the IKE-less case. | |||
| +------------------+ | +------------------+ | |||
| | 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 | |||
| Figure 4: IKE-less case, transport mode. | Figure 4: IKE-less Case, Transport Mode | |||
| <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> | |||
| skipping to change at page 88, line 5 ¶ | skipping to change at line 4135 ¶ | |||
| <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> | |||
| Appendix C. XML notification examples | Appendix C. XML Notification Examples | |||
| In the following, several XML files are shown to illustrate different | In the following, several XML files are shown to illustrate different | |||
| types of notifications defined in the IKE-less YANG model, which are | types of notifications defined in the IKE-less YANG data model, which | |||
| sent by the NSF to the I2NSF Controller. The notifications happen in | are sent by the NSF to the I2NSF Controller. The notifications | |||
| the IKE-less case. | happen in the IKE-less case. | |||
| <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> | |||
| Figure 5: Example of sadb-expire notification. | Figure 5: Example of the sadb-expire Notification | |||
| <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> | |||
| Figure 6: Example of sadb-acquire notification. | Figure 6: Example of the sadb-acquire Notification | |||
| <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> | |||
| Figure 7: Example of sadb-seq-overflow notification. | Figure 7: Example of the sadb-seq-overflow Notification | |||
| <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> | |||
| Figure 8: Example of sadb-bad-spi notification. | Figure 8: Example of the sadb-bad-spi Notification | |||
| Appendix D. Operational use cases examples | Appendix D. Operational Use Case Examples | |||
| D.1. Example of IPsec SA establishment | D.1. Example of IPsec SA Establishment | |||
| This appendix exemplifies the applicability of IKE case and IKE-less | This appendix exemplifies the applicability of the IKE case and IKE- | |||
| case to traditional IPsec configurations, that is, host-to-host and | less case to traditional IPsec configurations, that is, host-to-host | |||
| gateway-to-gateway. The following examples assume the existence of | and gateway-to-gateway. The following examples assume the existence | |||
| two NSFs needing to establish an end-to-end IPsec SA to protect their | of two NSFs needing to establish an end-to-end IPsec SA to protect | |||
| communications. Both NSFs could be two hosts that exchange traffic | their communications. Both NSFs could be two hosts that exchange | |||
| (host-to-host) or gateways (gateway-to-gateway), for example, within | traffic (host-to-host) or gateways (gateway-to-gateway), for example, | |||
| an enterprise that needs to protect the traffic between the networks | within an enterprise that needs to protect the traffic between the | |||
| of two branch offices. | networks of two branch offices. | |||
| Applicability of these configurations appear in current and new | Applicability of these configurations appear in current and new | |||
| networking scenarios. For example, SD-WAN technologies are providing | networking scenarios. For example, SD-WAN technologies are providing | |||
| dynamic and on-demand VPN connections between branch offices, or | dynamic and on-demand VPN connections between branch offices or | |||
| between branches and SaaS cloud services. Besides, IaaS services | between branches and Software as a Service (SaaS) cloud services. | |||
| providing virtualization environments are deployments that often rely | Besides, Infrastructure as a Service (IaaS) services providing | |||
| on IPsec to provide secure channels between virtual instances (host- | virtualization environments are deployments that often rely on IPsec | |||
| to-host) and providing VPN solutions for virtualized networks | to provide secure channels between virtual instances (host-to-host) | |||
| (gateway-to-gateway). | and providing VPN solutions for virtualized networks (gateway-to- | |||
| gateway). | ||||
| As can be observed in the following, the I2NSF-based IPsec management | As can be observed in the following, the I2NSF-based IPsec management | |||
| system (for IKE and IKE-less cases), exhibits various advantages: | system (for IKE and IKE-less cases) exhibits various advantages: | |||
| 1. It allows to create IPsec SAs among two NSFs, based only on the | 1. It allows creating IPsec SAs among two NSFs, based only on the | |||
| application of general Flow-based Protection Policies at the | application of general flow-based protection policies at the | |||
| I2NSF User. Thus, administrators can manage all security | I2NSF User. Thus, administrators can manage all security | |||
| associations in a centralized point with an abstracted view of | associations in a centralized point with an abstracted view of | |||
| the network. | the network. | |||
| 2. Any NSF deployed in the system does not need manual | 2. Any NSF deployed in the system does not need manual | |||
| configuration, therefore allowing its deployment in an automated | configuration, therefore, allowing its deployment in an automated | |||
| manner. | manner. | |||
| D.1.1. IKE case | D.1.1. IKE Case | |||
| +----------------------------------------+ | +----------------------------------------+ | |||
| | 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 | |||
| | | | | |||
| +---------|------------------------------+ | +---------|------------------------------+ | |||
| | | | | | | | | |||
| skipping to change at page 90, line 39 ¶ | skipping to change at line 4257 ¶ | |||
| | | | | | | |||
| 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) | | |||
| +----------------------+ +----------------------+ | +----------------------+ +----------------------+ | |||
| Figure 9: Host-to-host / gateway-to-gateway for the IKE case. | Figure 9: Host-to-Host/Gateway-to-Gateway for the IKE Case | |||
| Figure 9 describes the application of the IKE case when a data packet | Figure 9 describes the application of the IKE case when a data packet | |||
| needs to be protected in the path between the NSF A and NSF B: | needs to be protected in the path between NSF A and NSF B: | |||
| 1. The I2NSF User defines a general flow-based protection policy | 1. The I2NSF User defines a general flow-based protection policy | |||
| (e.g., protect data traffic between NSF A and B). The I2NSF | (e.g., protect data traffic between NSF A and B). The I2NSF | |||
| Controller looks for the NSFs involved (NSF A and NSF B). | Controller looks for the NSFs involved (NSF A and NSF B). | |||
| 2. The I2NSF Controller generates IKEv2 credentials for them and | 2. The I2NSF Controller generates IKEv2 credentials for them and | |||
| translates the policies into SPD and PAD entries. | translates the policies into SPD and PAD entries. | |||
| 3. The I2NSF Controller inserts an IKEv2 configuration that includes | 3. The I2NSF Controller inserts an IKEv2 configuration that includes | |||
| the SPD and PAD entries in both NSF A and NSF B. If some of | the SPD and PAD entries in both NSF A and NSF B. If some of | |||
| operations with NSF A and NSF B fail the I2NSF Controller will | operations with NSF A and NSF B fail, the I2NSF Controller will | |||
| stop the process and perform a rollback operation by deleting any | stop the process and perform a rollback operation by deleting any | |||
| IKEv2, SPD and PAD configuration that had been successfully | IKEv2, SPD, and PAD configuration that had been successfully | |||
| installed in NSF A or B. | installed in NSF A or B. | |||
| If the previous steps are successful, the flow is protected by means | If the previous steps are successful, the flow is protected by means | |||
| of the IPsec SA established with IKEv2 between NSF A and NSF B. | of the IPsec SA established with IKEv2 between NSF A and NSF B. | |||
| D.1.2. IKE-less case | D.1.2. IKE-less Case | |||
| +----------------------------------------+ | +----------------------------------------+ | |||
| | 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 | |||
| | | | | |||
| +---------|------------------------------+ | +---------|------------------------------+ | |||
| | | | | | | | | |||
| skipping to change at page 91, line 44 ¶ | skipping to change at line 4308 ¶ | |||
| | | | | | | |||
| 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) | | |||
| +----------------+ +----------------+ | +----------------+ +----------------+ | |||
| Figure 10: Host-to-host / gateway-to-gateway for IKE-less case. | Figure 10: Host-to-Host/Gateway-to-Gateway for the IKE-less Case | |||
| Figure 10 describes the application of the IKE-less case when a data | Figure 10 describes the application of the IKE-less case when a data | |||
| packet needs to be protected in the path between the NSF A and NSF B: | packet needs to be protected in the path between NSF A and NSF B: | |||
| 1. The I2NSF User establishes a general Flow-based Protection Policy | 1. The I2NSF User establishes a general flow-based protection | |||
| and the I2NSF Controller looks for the involved NSFs. | policy, and the I2NSF Controller looks for the involved NSFs. | |||
| 2. The I2NSF Controller translates the flow-based security policies | 2. The I2NSF Controller translates the flow-based security policies | |||
| into IPsec SPD and SAD entries. | into IPsec SPD and SAD entries. | |||
| 3. The I2NSF Controller inserts these entries in both NSF A and NSF | 3. The I2NSF Controller inserts these entries in both NSF A and NSF | |||
| B IPsec databases (i.e., SPD and SAD). The following text | B IPsec databases (i.e., SPD and SAD). The following text | |||
| describes how this would happen: | describes how this would happen: | |||
| * The I2NSF Controller chooses two random values as SPIs: for | * The I2NSF Controller chooses two random values as SPIs, for | |||
| example, SPIa1 for the inbound IPsec SA in the NSF A and SPIb1 | example, SPIa1 for the inbound IPsec SA in NSF A and SPIb1 for | |||
| for the inbound IPsec SA in NSF B. The value of the SPIa1 | the inbound IPsec SA in NSF B. The value of the SPIa1 MUST | |||
| MUST NOT be the same as any inbound SPI in A. In the same | NOT be the same as any inbound SPI in A. In the same way, the | |||
| way, the value of the SPIb1 MUST NOT be the same as any | value of the SPIb1 MUST NOT be the same as any inbound SPI in | |||
| inbound SPI in B. Moreover, the SPIa1 MUST be used in B for | B. Moreover, the SPIa1 MUST be used in B for the outbound | |||
| the outbound IPsec SA to A, while SPIb1 MUST be used in A for | IPsec SA to A, while SPIb1 MUST be used in A for the outbound | |||
| the outbound IPsec SA to B. It also generates fresh | IPsec SA to B. It also generates fresh cryptographic material | |||
| cryptographic material for the new inbound/outbound IPsec SAs | for the new inbound/outbound IPsec SAs and their parameters. | |||
| and their parameters. | ||||
| * After that, the I2NSF Controller sends simultaneously the new | * After that, the I2NSF Controller simultaneously sends the new | |||
| inbound IPsec SA with SPIa1 and new outbound IPsec SA with | inbound IPsec SA with SPIa1 and new outbound IPsec SA with | |||
| SPIb1 to NSF A; and the new inbound IPsec SA with SPIb1 and | SPIb1 to NSF A and the new inbound IPsec SA with SPIb1 and new | |||
| new outbound IPsec SA with SPIa1 to B, together with the | outbound IPsec SA with SPIa1 to B, together with the | |||
| corresponding IPsec policies. | corresponding IPsec policies. | |||
| * Once the I2NSF Controller receives confirmation from NSF A and | * Once the I2NSF Controller receives confirmation from NSF A and | |||
| NSF B, it knows that the IPsec SAs are correctly installed and | NSF B, it knows that the IPsec SAs are correctly installed and | |||
| ready. | ready. | |||
| Other alternative to this operation is: the I2NSF Controller | Another alternative to this operation is the I2NSF Controller | |||
| sends first the IPsec policies and new inbound IPsec SAs to A and | first sends the IPsec policies and new inbound IPsec SAs to A and | |||
| B and, once it obtains a successful confirmation of these | B. Once it obtains a successful confirmation of these operations | |||
| operations from NSF A and NSF B, it proceeds with installing the | from NSF A and NSF B, it proceeds with installing the new | |||
| new outbound IPsec SAs. Even though this procedure may increase | outbound IPsec SAs. Even though this procedure may increase the | |||
| the latency to complete the process, no traffic is sent over the | latency to complete the process, no traffic is sent over the | |||
| network until the IPsec SAs are completely operative. In any | network until the IPsec SAs are completely operative. In any | |||
| case other alternatives MAY be possible to implement step 3. | case, other alternatives MAY be possible to implement step 3. | |||
| 4. If some of the operations described above fail (e.g., the NSF A | 4. If some of the operations described above fail (e.g., NSF A | |||
| reports an error when the I2NSF Controller is trying to install | reports an error when the I2NSF Controller is trying to install | |||
| the SPD entry, the new inbound or outbound IPsec SAs) the I2NSF | the SPD entry, the new inbound or outbound IPsec SAs), the I2NSF | |||
| Controller MUST perform rollback operations by deleting any new | Controller MUST perform rollback operations by deleting any new | |||
| inbound or outbound IPsec SA and SPD entry that had been | inbound or outbound IPsec SA and SPD entry that had been | |||
| successfully installed in any of the NSFs (e.g., NSF B) and stop | successfully installed in any of the NSFs (e.g., NSF B) and stop | |||
| the process. Note that the I2NSF Controller MAY retry several | the process. Note that the I2NSF Controller MAY retry several | |||
| times before giving up. | times before giving up. | |||
| 5. Otherwise, if the steps 1 to 3 are successful, the flow between | 5. 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 | 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. | rekeying process. | |||
| Instead of installing IPsec policies (in the SPD) and IPsec SAs (in | Instead of installing IPsec policies (in the SPD) and IPsec SAs (in | |||
| the SAD) in step 3 (proactive mode), it is also possible that the | the SAD) in step 3 (proactive mode), it is also possible that the | |||
| I2NSF Controller only installs the SPD entries in step 3 (reactive | I2NSF Controller only installs the SPD entries in step 3 (reactive | |||
| mode). In such a case, when a data packet requires to be protected | mode). In such a case, when a data packet requires to be protected | |||
| with IPsec, the NSF that saw first the data packet will send a sadb- | with IPsec, the NSF that first saw the data packet will send a sadb- | |||
| acquire notification that informs the I2NSF Controller that needs SAD | acquire notification that informs the I2NSF Controller that needs SAD | |||
| entries with the IPsec SAs to process the data packet. Again, if | entries with the IPsec SAs to process the data packet. Again, if | |||
| some of the operations installing the new inbound/outbound IPsec SAs | some of the operations installing the new inbound/outbound IPsec SAs | |||
| fail, the I2NSF Controller stops the process and performs a rollback | fail, the I2NSF Controller stops the process and performs a rollback | |||
| operation by deleting any new inbound/outbound SAs that had been | operation by deleting any new inbound/outbound SAs that had been | |||
| successfully installed. | successfully installed. | |||
| D.2. Example of the rekeying process in IKE-less case | D.2. Example of the Rekeying Process in IKE-less Case | |||
| To explain an example of the rekeying process between two IPsec NSFs | To explain an example of the rekeying process between two IPsec NSFs, | |||
| A and B, let assume that SPIa1 identifies the inbound IPsec SA in A, | A and B, assume that SPIa1 identifies the inbound IPsec SA in A and | |||
| and SPIb1 the inbound IPsec SA in B. The rekeying process will take | SPIb1 identifies the inbound IPsec SA in B. The rekeying process | |||
| the following steps: | will take the following steps: | |||
| 1. The I2NSF Controller chooses two random values as SPI for the new | 1. The I2NSF Controller chooses two random values as SPI for the new | |||
| inbound IPsec SAs: for example, SPIa2 for the inbound IPsec SA in | inbound IPsec SAs, for example, SPIa2 for the inbound IPsec SA in | |||
| A and SPIb2 for the inbound IPsec SA in B. The value of the | A and SPIb2 for the inbound IPsec SA in B. The value of the | |||
| SPIa1 MUST NOT be the same as any inbound SPI in A. In the same | SPIa1 MUST NOT be the same as any inbound SPI in A. In the same | |||
| way, the value of the SPIb1 MUST NOT be the same as any inbound | way, the value of the SPIb1 MUST NOT be the same as any inbound | |||
| SPI in B. Then, the I2NSF Controller creates an inbound IPsec SA | SPI in B. Then, the I2NSF Controller creates an inbound IPsec SA | |||
| with SPIa2 in A and another inbound IPsec SA in B with SPIb2. It | with SPIa2 in A and another inbound IPsec SA in B with SPIb2. It | |||
| can send this information simultaneously to A and B. | can send this information simultaneously to A and B. | |||
| 2. Once the I2NSF Controller receives confirmation from A and B, the | 2. Once the I2NSF Controller receives confirmation from A and B, the | |||
| controller knows that the inbound IPsec SAs are correctly | controller knows that the inbound IPsec SAs are correctly | |||
| installed. Then it proceeds to send in parallel to A and B, the | installed. Then, it proceeds to send, in parallel to A and B, | |||
| outbound IPsec SAs: the outbound IPsec SA to A with SPIb2, and | the outbound IPsec SAs: the outbound IPsec SA to A with SPIb2 and | |||
| the outbound IPsec SA to B with SPIa2. At this point the new | the outbound IPsec SA to B with SPIa2. At this point, the new | |||
| IPsec SAs are ready. | IPsec SAs are ready. | |||
| 3. Once the I2NSF Controller receives confirmation from A and B that | 3. Once the I2NSF Controller receives confirmation from A and B that | |||
| the outbound IPsec SAs have been installed, the I2NSF Controller, | the outbound IPsec SAs have been installed, the I2NSF Controller, | |||
| in parallel, deletes the old IPsec SAs from A (inbound SPIa1 and | in parallel, deletes the old IPsec SAs from A (inbound SPIa1 and | |||
| outbound SPIb1) and B (outbound SPIa1 and inbound SPIb1). | outbound SPIb1) and B (outbound SPIa1 and inbound SPIb1). | |||
| If some of the operations in step 1 fail (e.g., the NSF A reports an | If some of the operations in step 1 fail (e.g., NSF A reports an | |||
| error when the I2NSF Controller is trying to install a new inbound | error when the I2NSF Controller is trying to install a new inbound | |||
| IPsec SA) the I2NSF Controller MUST perform rollback operations by | IPsec SA), the I2NSF Controller MUST perform rollback operations by | |||
| removing any new inbound SA that had been successfully installed | removing any new inbound SA that had been successfully installed | |||
| during step 1. | during step 1. | |||
| If step 1 is successful but some of the operations in step 2 fail | If step 1 is successful but some of the operations in step 2 fail | |||
| (e.g., the NSF A reports an error when the I2NSF Controller is trying | (e.g., NSF A reports an error when the I2NSF Controller is trying to | |||
| to install the new outbound IPsec SA), the I2NSF Controller MUST | install the new outbound IPsec SA), the I2NSF Controller MUST perform | |||
| perform a rollback operation by deleting any new outbound SA that had | a rollback operation by deleting any new outbound SA that had been | |||
| been successfully installed during step 2 and by deleting the inbound | successfully installed during step 2 and by deleting the inbound SAs | |||
| SAs created in step 1, in that order. | created in step 1, in that order. | |||
| If the steps 1 and 2 are successful but the step 3 fails, the I2NSF | If the steps 1 and 2 are successful but the step 3 fails, the I2NSF | |||
| Controller will avoid any rollback of the operations carried out in | Controller will avoid any rollback of the operations carried out in | |||
| step 1 and step 2 since new and valid IPsec SAs were created and are | steps 1 and 2, since new and valid IPsec SAs were created and are | |||
| functional. The I2NSF Controller MAY reattempt to remove the old | functional. The I2NSF Controller MAY reattempt to remove the old | |||
| inbound and outbound IPsec SAs in NSF A and NSF B several times until | inbound and outbound IPsec SAs in NSF A and NSF B several times until | |||
| it receives a success or it gives up. In the last case, the old | it receives a success or it gives up. In the last case, the old | |||
| IPsec SAs will be removed when their corresponding hard lifetime is | IPsec SAs will be removed when their corresponding hard lifetime is | |||
| reached. | reached. | |||
| D.3. Example of managing NSF state loss in IKE-less case | D.3. Example of Managing NSF State Loss in the IKE-less Case | |||
| In the IKE-less case, if the I2NSF Controller detects that a NSF has | In the IKE-less case, if the I2NSF Controller detects that an NSF has | |||
| lost the IPsec state, it could follow the next steps: | lost the IPsec state, it could follow the next steps: | |||
| 1. The I2NSF Controller SHOULD delete the old IPsec SAs on the non- | 1. The I2NSF Controller SHOULD delete the old IPsec SAs on the non- | |||
| failed nodes, established with the failed node. This prevents | failed nodes, established with the failed node. This prevents | |||
| the non-failed nodes from leaking plaintext. | the non-failed nodes from leaking plaintext. | |||
| 2. If the affected node restarts, the I2NSF Controller configures | 2. If the affected node restarts, the I2NSF Controller configures | |||
| the new inbound IPsec SAs between the affected node and all the | the new inbound IPsec SAs between the affected node and all the | |||
| nodes it was talking to. | nodes it was talking to. | |||
| 3. After these inbound IPsec SAs have been established, the I2NSF | 3. After these inbound IPsec SAs have been established, the I2NSF | |||
| Controller configures the outbound IPsec SAs in parallel. | Controller configures the outbound IPsec SAs in parallel. | |||
| Step 2 and step 3 can be performed at the same time at the cost of a | Steps 2 and 3 can be performed at the same time at the cost of a | |||
| potential packet loss. If this is not critical then it is an | potential packet loss. If this is not critical, then it is an | |||
| optimization since the number of exchanges between I2NSF Controller | optimization since the number of exchanges between the I2NSF | |||
| and NSFs is lower. | Controller and NSFs is lower. | |||
| Acknowledgements | ||||
| 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. | ||||
| Authors' Addresses | Authors' Addresses | |||
| Rafa Marin-Lopez | Rafa Marin-Lopez | |||
| University of Murcia | University of Murcia | |||
| Campus de Espinardo S/N, Faculty of Computer Science | Faculty of Computer Science | |||
| Murcia 30100 | Campus de Espinardo S/N | |||
| 30100 Murcia | ||||
| Spain | Spain | |||
| Phone: +34 868 88 85 01 | Phone: +34 868 88 85 01 | |||
| EMail: rafa@um.es | Email: rafa@um.es | |||
| Gabriel Lopez-Millan | Gabriel Lopez-Millan | |||
| University of Murcia | University of Murcia | |||
| Campus de Espinardo S/N, Faculty of Computer Science | Faculty of Computer Science | |||
| Murcia 30100 | Campus de Espinardo S/N | |||
| 30100 Murcia | ||||
| Spain | Spain | |||
| Phone: +34 868 88 85 04 | Phone: +34 868 88 85 04 | |||
| EMail: gabilm@um.es | Email: gabilm@um.es | |||
| Fernando Pereniguez-Garcia | Fernando Pereniguez-Garcia | |||
| University Defense Center | University Defense Center | |||
| Spanish Air Force Academy, MDE-UPCT | Spanish Air Force Academy | |||
| San Javier (Murcia) 30720 | MDE-UPCT | |||
| 30720 San Javier Murcia | ||||
| Spain | Spain | |||
| Phone: +34 968 18 99 46 | Phone: +34 968 18 99 46 | |||
| EMail: fernando.pereniguez@cud.upct.es | Email: fernando.pereniguez@cud.upct.es | |||
| End of changes. 505 change blocks. | ||||
| 2571 lines changed or deleted | 2613 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/ | ||||