| draft-ietf-netconf-server-model-07.txt | | draft-ietf-netconf-server-model-08.txt | |
| | | | |
| NETCONF Working Group K. Watsen | | NETCONF Working Group K. Watsen | |
| Internet-Draft Juniper Networks | | Internet-Draft Juniper Networks | |
| Intended status: Standards Track J. Schoenwaelder | | Intended status: Standards Track J. Schoenwaelder | |
|
| Expires: January 7, 2016 Jacobs University Bremen | | Expires: April 11, 2016 Jacobs University Bremen | |
| July 6, 2015 | | October 9, 2015 | |
| | | | |
| NETCONF Server and RESTCONF Server Configuration Models | | NETCONF Server and RESTCONF Server Configuration Models | |
|
| draft-ietf-netconf-server-model-07 | | draft-ietf-netconf-server-model-08 | |
| | | | |
| Abstract | | Abstract | |
| | | | |
| This draft defines a NETCONF server configuration data model and a | | This draft defines a NETCONF server configuration data model and a | |
| RESTCONF server configuration data model. These data models enable | | RESTCONF server configuration data model. These data models enable | |
| configuration of the NETCONF and RESTCONF services themselves, | | configuration of the NETCONF and RESTCONF services themselves, | |
| including which transports are supported, what ports the servers | | including which transports are supported, what ports the servers | |
|
| listen on, call-home parameters, client authentication, and other | | listen on, call-home parameters, client authentication, and related | |
| related configuration parameters. | | parameters. | |
| | | | |
| Editorial Note (To be removed by RFC Editor) | | Editorial Note (To be removed by RFC Editor) | |
| | | | |
| This draft contains many placeholder values that need to be replaced | | This draft contains many placeholder values that need to be replaced | |
| with finalized values at the time of publication. This note | | with finalized values at the time of publication. This note | |
| summarizes all of the substitutions that are needed. Please note | | summarizes all of the substitutions that are needed. Please note | |
| that no other RFC Editor instructions are specified anywhere else in | | that no other RFC Editor instructions are specified anywhere else in | |
| this document. | | this document. | |
| | | | |
| This document contains references to other drafts in progress, both | | This document contains references to other drafts in progress, both | |
| | | | |
| skipping to change at page 1, line 47 | | skipping to change at page 1, line 47 | |
| | | | |
| Artwork in this document contains shorthand references to drafts in | | Artwork in this document contains shorthand references to drafts in | |
| progress. Please apply the following replacements: | | progress. Please apply the following replacements: | |
| | | | |
| o "VVVV" --> the assigned RFC value for this draft | | o "VVVV" --> the assigned RFC value for this draft | |
| | | | |
| o "XXXX" --> the assigned RFC value for draft-ietf-netconf-restconf | | o "XXXX" --> the assigned RFC value for draft-ietf-netconf-restconf | |
| | | | |
| o "YYYY" --> the assigned RFC value for draft-ietf-netconf-call-home | | o "YYYY" --> the assigned RFC value for draft-ietf-netconf-call-home | |
| | | | |
|
| o "ZZZZ" --> the assigned RFC value for draft-thomson-httpbis-cant | | | |
| Artwork in this document contains placeholder values for ports | | Artwork in this document contains placeholder values for ports | |
| pending IANA assignment from "draft-ietf-netconf-call-home". Please | | pending IANA assignment from "draft-ietf-netconf-call-home". Please | |
| apply the following replacements: | | apply the following replacements: | |
| | | | |
| o "7777" --> the assigned port value for "netconf-ch-ssh" | | o "7777" --> the assigned port value for "netconf-ch-ssh" | |
| | | | |
| o "8888" --> the assigned port value for "netconf-ch-tls" | | o "8888" --> the assigned port value for "netconf-ch-tls" | |
| | | | |
| o "9999" --> the assigned port value for "restconf-ch-tls" | | o "9999" --> the assigned port value for "restconf-ch-tls" | |
| | | | |
| Artwork in this document contains placeholder values for the date of | | Artwork in this document contains placeholder values for the date of | |
| publication of this draft. Please apply the following replacement: | | publication of this draft. Please apply the following replacement: | |
| | | | |
|
| o "2015-07-06" --> the publication date of this draft | | o "2015-10-09" --> the publication date of this draft | |
| | | | |
| The following two Appendix sections are to be removed prior to | | The following two Appendix sections are to be removed prior to | |
| publication: | | publication: | |
| | | | |
| o Appendix B. Change Log | | o Appendix B. Change Log | |
| | | | |
| o Appendix C. Open Issues | | o Appendix C. Open Issues | |
| | | | |
| Status of This Memo | | Status of This Memo | |
| | | | |
| | | | |
| skipping to change at page 2, line 41 | | skipping to change at page 2, line 38 | |
| Internet-Drafts are working documents of the Internet Engineering | | Internet-Drafts are working documents of the Internet Engineering | |
| Task Force (IETF). Note that other groups may also distribute | | Task Force (IETF). Note that other groups may also distribute | |
| working documents as Internet-Drafts. The list of current Internet- | | working documents as Internet-Drafts. The list of current Internet- | |
| Drafts is at http://datatracker.ietf.org/drafts/current/. | | Drafts is at http://datatracker.ietf.org/drafts/current/. | |
| | | | |
| Internet-Drafts are draft documents valid for a maximum of six months | | Internet-Drafts are draft documents valid for a maximum of six months | |
| and may be updated, replaced, or obsoleted by other documents at any | | and may be updated, replaced, or obsoleted by other documents at any | |
| time. It is inappropriate to use Internet-Drafts as reference | | time. It is inappropriate to use Internet-Drafts as reference | |
| material or to cite them other than as "work in progress." | | material or to cite them other than as "work in progress." | |
| | | | |
|
| This Internet-Draft will expire on January 7, 2016. | | This Internet-Draft will expire on April 11, 2016. | |
| | | | |
| Copyright Notice | | Copyright Notice | |
| | | | |
| Copyright (c) 2015 IETF Trust and the persons identified as the | | Copyright (c) 2015 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 | |
| (http://trustee.ietf.org/license-info) in effect on the date of | | (http://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 . . . . . . . . . . . . . . . . . . . . . . . . 4 | | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |
| 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 4 | | 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 4 | |
|
| 1.2. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 5 | | 1.2. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 4 | |
| 2. Objectives . . . . . . . . . . . . . . . . . . . . . . . . . 5 | | 2. Objectives . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |
| 2.1. Support all NETCONF and RESTCONF transports . . . . . . . 5 | | 2.1. Support all NETCONF and RESTCONF transports . . . . . . . 5 | |
| 2.2. Enable each transport to select which keys to use . . . . 5 | | 2.2. Enable each transport to select which keys to use . . . . 5 | |
| 2.3. Support authenticating NETCONF/RESTCONF clients | | 2.3. Support authenticating NETCONF/RESTCONF clients | |
|
| certificates . . . . . . . . . . . . . . . . . . . . . . 6 | | certificates . . . . . . . . . . . . . . . . . . . . . . 5 | |
| 2.4. Support mapping authenticated NETCONF/RESTCONF client | | 2.4. Support mapping authenticated NETCONF/RESTCONF client | |
|
| certificates to usernames . . . . . . . . . . . . . . . . 6 | | certificates to usernames . . . . . . . . . . . . . . . . 5 | |
| 2.5. Support both listening for connections and call home . . 6 | | 2.5. Support both listening for connections and call home . . 6 | |
| 2.6. For Call Home connections . . . . . . . . . . . . . . . . 6 | | 2.6. For Call Home connections . . . . . . . . . . . . . . . . 6 | |
| 2.6.1. Support more than one NETCONF/RESTCONF client . . . . 6 | | 2.6.1. Support more than one NETCONF/RESTCONF client . . . . 6 | |
| 2.6.2. Support NETCONF/RESTCONF clients having more than one | | 2.6.2. Support NETCONF/RESTCONF clients having more than one | |
| endpoint . . . . . . . . . . . . . . . . . . . . . . 6 | | endpoint . . . . . . . . . . . . . . . . . . . . . . 6 | |
|
| 2.6.3. Support a reconnection strategy . . . . . . . . . . . 7 | | 2.6.3. Support a reconnection strategy . . . . . . . . . . . 6 | |
| 2.6.4. Support both persistent and periodic connections . . 7 | | 2.6.4. Support both persistent and periodic connections . . 6 | |
| 2.6.5. Reconnection strategy for periodic connections . . . 7 | | 2.6.5. Reconnection strategy for periodic connections . . . 7 | |
| 2.6.6. Keep-alives for persistent connections . . . . . . . 7 | | 2.6.6. Keep-alives for persistent connections . . . . . . . 7 | |
|
| 2.6.7. Customizations for periodic connections . . . . . . . 8 | | 2.6.7. Customizations for periodic connections . . . . . . . 7 | |
| 3. The NETCONF Server Model . . . . . . . . . . . . . . . . . . 8 | | 3. High-Level Design . . . . . . . . . . . . . . . . . . . . . . 7 | |
| 3.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . . . 8 | | 4. Solution . . . . . . . . . . . . . . . . . . . . . . . . . . 8 | |
| 3.2. Example Usage . . . . . . . . . . . . . . . . . . . . . . 9 | | 4.1. The Keychain Model . . . . . . . . . . . . . . . . . . . 8 | |
| 3.2.1. Configuring SSH Transport . . . . . . . . . . . . . . 10 | | 4.1.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . 9 | |
| 3.2.2. Configuring TLS Transport . . . . . . . . . . . . . . 11 | | 4.1.2. Example Usage . . . . . . . . . . . . . . . . . . . . 9 | |
| 3.3. YANG Model . . . . . . . . . . . . . . . . . . . . . . . 13 | | 4.1.3. YANG Model . . . . . . . . . . . . . . . . . . . . . 15 | |
| 4. The RESTCONF Server Model . . . . . . . . . . . . . . . . . . 26 | | 4.2. The SSH Server Model . . . . . . . . . . . . . . . . . . 20 | |
| 4.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . . . 26 | | 4.2.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . 21 | |
| 4.2. Example Usage . . . . . . . . . . . . . . . . . . . . . . 27 | | 4.2.2. Example Usage . . . . . . . . . . . . . . . . . . . . 21 | |
| 4.2.1. Configuring TLS Transport . . . . . . . . . . . . . . 27 | | 4.2.3. YANG Model . . . . . . . . . . . . . . . . . . . . . 22 | |
| 4.3. YANG Model . . . . . . . . . . . . . . . . . . . . . . . 28 | | 4.3. The TLS Server Model . . . . . . . . . . . . . . . . . . 26 | |
| 5. Security Considerations . . . . . . . . . . . . . . . . . . . 37 | | 4.3.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . 26 | |
| 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 38 | | 4.3.2. Example Usage . . . . . . . . . . . . . . . . . . . . 27 | |
| 7. Other Considerations . . . . . . . . . . . . . . . . . . . . 39 | | 4.3.3. YANG Model . . . . . . . . . . . . . . . . . . . . . 27 | |
| 8. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 39 | | 4.4. The NETCONF Server Model . . . . . . . . . . . . . . . . 31 | |
| 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 39 | | 4.4.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . 31 | |
| 9.1. Normative References . . . . . . . . . . . . . . . . . . 39 | | 4.4.2. Example Usage . . . . . . . . . . . . . . . . . . . . 33 | |
| 9.2. Informative References . . . . . . . . . . . . . . . . . 40 | | 4.4.3. YANG Model . . . . . . . . . . . . . . . . . . . . . 37 | |
| Appendix A. Alternative solution addressing Issue #49 . . . . . 41 | | 4.5. The RESTCONF Server Model . . . . . . . . . . . . . . . . 47 | |
| A.1. The Keychain Model . . . . . . . . . . . . . . . . . . . 41 | | 4.5.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . 47 | |
| A.1.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . 41 | | 4.5.2. Example Usage . . . . . . . . . . . . . . . . . . . . 49 | |
| A.1.2. Example Usage . . . . . . . . . . . . . . . . . . . . 42 | | 4.5.3. YANG Model . . . . . . . . . . . . . . . . . . . . . 51 | |
| A.1.3. YANG Model . . . . . . . . . . . . . . . . . . . . . 45 | | 5. Security Considerations . . . . . . . . . . . . . . . . . . . 59 | |
| A.2. The SSH Server Model . . . . . . . . . . . . . . . . . . 52 | | 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 59 | |
| A.2.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . 52 | | 7. Other Considerations . . . . . . . . . . . . . . . . . . . . 60 | |
| A.2.2. Example Usage . . . . . . . . . . . . . . . . . . . . 53 | | 8. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 60 | |
| A.2.3. YANG Model . . . . . . . . . . . . . . . . . . . . . 53 | | 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 60 | |
| A.3. The TLS Server Model . . . . . . . . . . . . . . . . . . 56 | | 9.1. Normative References . . . . . . . . . . . . . . . . . . 61 | |
| A.3.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . 56 | | 9.2. Informative References . . . . . . . . . . . . . . . . . 61 | |
| A.3.2. Example Usage . . . . . . . . . . . . . . . . . . . . 57 | | Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 62 | |
| A.3.3. YANG Model . . . . . . . . . . . . . . . . . . . . . 57 | | A.1. 00 to 01 . . . . . . . . . . . . . . . . . . . . . . . . 62 | |
| A.4. The NETCONF Server Model . . . . . . . . . . . . . . . . 60 | | A.2. 01 to 02 . . . . . . . . . . . . . . . . . . . . . . . . 62 | |
| A.4.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . 60 | | A.3. 02 to 03 . . . . . . . . . . . . . . . . . . . . . . . . 62 | |
| A.4.2. Example Usage . . . . . . . . . . . . . . . . . . . . 62 | | A.4. 03 to 04 . . . . . . . . . . . . . . . . . . . . . . . . 62 | |
| A.4.3. YANG Model . . . . . . . . . . . . . . . . . . . . . 64 | | A.5. 04 to 05 . . . . . . . . . . . . . . . . . . . . . . . . 63 | |
| A.5. The RESTCONF Server Model . . . . . . . . . . . . . . . . 75 | | A.6. 05 to 06 . . . . . . . . . . . . . . . . . . . . . . . . 63 | |
| A.5.1. Tree Diagram . . . . . . . . . . . . . . . . . . . . 75 | | A.7. 06 to 07 . . . . . . . . . . . . . . . . . . . . . . . . 63 | |
| A.5.2. Example Usage . . . . . . . . . . . . . . . . . . . . 76 | | A.8. 07 to 08 . . . . . . . . . . . . . . . . . . . . . . . . 64 | |
| A.5.3. YANG Model . . . . . . . . . . . . . . . . . . . . . 76 | | Appendix B. Open Issues . . . . . . . . . . . . . . . . . . . . 65 | |
| Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 84 | | | |
| B.1. 00 to 01 . . . . . . . . . . . . . . . . . . . . . . . . 84 | | | |
| B.2. 01 to 02 . . . . . . . . . . . . . . . . . . . . . . . . 84 | | | |
| B.3. 02 to 03 . . . . . . . . . . . . . . . . . . . . . . . . 84 | | | |
| B.4. 03 to 04 . . . . . . . . . . . . . . . . . . . . . . . . 84 | | | |
| B.5. 04 to 05 . . . . . . . . . . . . . . . . . . . . . . . . 85 | | | |
| B.6. 05 to 06 . . . . . . . . . . . . . . . . . . . . . . . . 85 | | | |
| B.7. 06 to 07 . . . . . . . . . . . . . . . . . . . . . . . . 86 | | | |
| Appendix C. Open Issues . . . . . . . . . . . . . . . . . . . . 87 | | | |
| | | | |
| 1. Introduction | | 1. Introduction | |
| | | | |
| This draft defines a NETCONF [RFC6241] server configuration data | | This draft defines a NETCONF [RFC6241] server configuration data | |
| model and a RESTCONF [draft-ietf-netconf-restconf] server | | model and a RESTCONF [draft-ietf-netconf-restconf] server | |
| configuration data model. These data models enable configuration of | | configuration data model. These data models enable configuration of | |
| the NETCONF and RESTCONF services themselves, including which | | the NETCONF and RESTCONF services themselves, including which | |
| transports are supported, what ports the servers listen on, call-home | | transports are supported, what ports the servers listen on, call-home | |
|
| parameters, client authentication, and other related configuration | | parameters, client authentication, and related parameters. | |
| parameters. | | | |
| | | | |
| 1.1. Terminology | | 1.1. Terminology | |
| | | | |
| The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | | The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |
| document are to be interpreted as described in RFC 2119 [RFC2119]. | | document are to be interpreted as described in RFC 2119 [RFC2119]. | |
| | | | |
| 1.2. Tree Diagrams | | 1.2. Tree Diagrams | |
| | | | |
| A simplified graphical representation of the data models is used in | | A simplified graphical representation of the data models is used in | |
| | | | |
| skipping to change at page 7, line 14 | | skipping to change at page 6, line 46 | |
| server to initiate call home connections, it should be able to | | server to initiate call home connections, it should be able to | |
| connect to any of the client's endpoints. | | connect to any of the client's endpoints. | |
| | | | |
| 2.6.3. Support a reconnection strategy | | 2.6.3. Support a reconnection strategy | |
| | | | |
| Assuming a NETCONF/RESTCONF client has more than one endpoint, then | | Assuming a NETCONF/RESTCONF client has more than one endpoint, then | |
| it becomes necessary to configure how a NETCONF/RESTCONF server | | it becomes necessary to configure how a NETCONF/RESTCONF server | |
| should reconnect to the client should it lose its connection to one | | should reconnect to the client should it lose its connection to one | |
| the client's endpoints. For instance, the NETCONF/RESTCONF server | | the client's endpoints. For instance, the NETCONF/RESTCONF server | |
| may start with first endpoint defined in a user-ordered list of | | may start with first endpoint defined in a user-ordered list of | |
|
| endpoints or with thei last endpoints it was connected to. | | endpoints or with the last endpoints it was connected to. | |
| | | | |
| 2.6.4. Support both persistent and periodic connections | | 2.6.4. Support both persistent and periodic connections | |
| | | | |
| NETCONF/RESTCONF clients may vary greatly on how frequently they need | | NETCONF/RESTCONF clients may vary greatly on how frequently they need | |
| to interact with a NETCONF/RESTCONF server, how responsive | | to interact with a NETCONF/RESTCONF server, how responsive | |
| interactions need to be, and how many simultaneous connections they | | interactions need to be, and how many simultaneous connections they | |
| can support. Some clients may need a persistent connection to | | can support. Some clients may need a persistent connection to | |
| servers to optimize real-time interactions, while others prefer | | servers to optimize real-time interactions, while others prefer | |
| periodic interactions in order to minimize resource requirements. | | periodic interactions in order to minimize resource requirements. | |
| Therefore, when it is necessary for server to initiate connections, | | Therefore, when it is necessary for server to initiate connections, | |
| | | | |
| skipping to change at page 8, line 14 | | skipping to change at page 7, line 41 | |
| | | | |
| 2.6.7. Customizations for periodic connections | | 2.6.7. Customizations for periodic connections | |
| | | | |
| If a periodic connection is desired, it is necessary for the NETCONF/ | | If a periodic connection is desired, it is necessary for the NETCONF/ | |
| RESTCONF server to know how often it should connect. This frequency | | RESTCONF server to know how often it should connect. This frequency | |
| determines the maximum amount of time a NETCONF/RESTCONF client may | | determines the maximum amount of time a NETCONF/RESTCONF client may | |
| have to wait to send data to a server. A server may connect to a | | have to wait to send data to a server. A server may connect to a | |
| client before this interval expires if desired (e.g., to send data to | | client before this interval expires if desired (e.g., to send data to | |
| a client). | | a client). | |
| | | | |
|
| 3. The NETCONF Server Model | | 3. High-Level Design | |
| | | | |
| 3.1. Tree Diagram | | | |
| | | | |
| module: ietf-netconf-server | | | |
| +--rw netconf-server | | | |
| +--rw session-options | | | |
| | +--rw hello-timeout? uint16 | | | |
| +--rw listen {(ssh-listen or tls-listen)}? | | | |
| | +--rw max-sessions? uint16 | | | |
| | +--rw idle-timeout? uint16 | | | |
| | +--rw endpoint* [name] | | | |
| | +--rw name string | | | |
| | +--rw (transport) | | | |
| | +--:(ssh) {ssh-listen}? | | | |
| | | +--rw ssh | | | |
| | | +--rw address? inet:ip-address | | | |
| | | +--rw port? inet:port-number | | | |
| | | +--rw host-keys | | | |
| | | +--rw host-key* string | | | |
| | +--:(tls) {tls-listen}? | | | |
| | +--rw tls | | | |
| | +--rw address? inet:ip-address | | | |
| | +--rw port? inet:port-number | | | |
| | +--rw certificates | | | |
| | +--rw certificate* string | | | |
| +--rw call-home {(ssh-call-home or tls-call-home)}? | | | |
| | +--rw netconf-client* [name] | | | |
| | +--rw name string | | | |
| | +--rw (transport) | | | |
| | | +--:(ssh) {ssh-call-home}? | | | |
| | | | +--rw ssh | | | |
| | | | +--rw endpoints | | | |
| | | | | +--rw endpoint* [name] | | | |
| | | | | +--rw name string | | | |
| | | | | +--rw address inet:host | | | |
| | | | | +--rw port? inet:port-number | | | |
| | | | +--rw host-keys | | | |
| | | | +--rw host-key* string | | | |
| | | +--:(tls) {tls-call-home}? | | | |
| | | +--rw tls | | | |
| | | +--rw endpoints | | | |
| | | | +--rw endpoint* [name] | | | |
| | | | +--rw name string | | | |
| | | | +--rw address inet:host | | | |
| | | | +--rw port? inet:port-number | | | |
| | | +--rw certificates | | | |
| | | +--rw certificate* string | | | |
| | +--rw connection-type | | | |
| | | +--rw (connection-type)? | | | |
| | | +--:(persistent-connection) | | | |
| | | | +--rw persistent! | | | |
| | | | +--rw idle-timeout? uint32 | | | |
| | | | +--rw keep-alives | | | |
| | | | +--rw max-wait? uint16 | | | |
| | | | +--rw max-attempts? uint8 | | | |
| | | +--:(periodic-connection) | | | |
| | | +--rw periodic! | | | |
| | | +--rw idle-timeout? uint16 | | | |
| | | +--rw reconnect_timeout? uint16 | | | |
| | +--rw reconnect-strategy | | | |
| | +--rw start-with? enumeration | | | |
| | +--rw max-attempts? uint8 | | | |
| +--rw ssh {(ssh-listen or ssh-call-home)}? | | | |
| | +--rw x509 {ssh-x509-certs}? | | | |
| | +--rw trusted-ca-certs | | | |
| | | +--rw trusted-ca-cert* binary | | | |
| | +--rw trusted-client-certs | | | |
| | +--rw trusted-client-cert* binary | | | |
| +--rw tls {(tls-listen or tls-call-home)}? | | | |
| +--rw client-auth | | | |
| +--rw trusted-ca-certs | | | |
| | +--rw trusted-ca-cert* binary | | | |
| +--rw trusted-client-certs | | | |
| | +--rw trusted-client-cert* binary | | | |
| +--rw cert-maps | | | |
| +--rw cert-to-name* [id] | | | |
| +--rw id uint32 | | | |
| +--rw fingerprint x509c2n:tls-fingerprint | | | |
| +--rw map-type identityref | | | |
| +--rw name string | | | |
| | | | |
| 3.2. Example Usage | | | |
| 3.2.1. Configuring SSH Transport | | | |
| | | | |
| The following example illustrates the <get> response from a NETCONF | | | |
| server that only supports SSH, both listening for incoming | | | |
| connections as well as calling home to a single NETCONF/RESTCONF | | | |
| client having two endpoints. | | | |
| | | | |
| <netconf-server xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server"> | | | |
| <listen> | | | |
| <endpoint> | | | |
| <name>netconf/ssh</name> | | | |
| <ssh> | | | |
| <address>11.22.33.44</address> | | | |
| <host-keys> | | | |
| <host-key>my-rsa-key</host-key> | | | |
| <host-key>my-dss-key</host-key> | | | |
| </host-keys> | | | |
| </ssh> | | | |
| </endpoint> | | | |
| </listen> | | | |
| <call-home> | | | |
| <netconf-client> | | | |
| <name>config-mgr</name> | | | |
| <ssh> | | | |
| <endpoints> | | | |
| <endpoint> | | | |
| <name>east-data-center</name> | | | |
| <address>11.22.33.44</address> | | | |
| </endpoint> | | | |
| <endpoint> | | | |
| <name>west-data-center</name> | | | |
| <address>55.66.77.88</address> | | | |
| </endpoint> | | | |
| </endpoints> | | | |
| <host-keys> | | | |
| <host-key>my-call-home-x509-key</host-key> | | | |
| </host-keys> | | | |
| </ssh> | | | |
| </netconf-client> | | | |
| </call-home> | | | |
| <ssh> | | | |
| <x509> | | | |
| <trusted-ca-certs> | | | |
| <trusted-ca-cert> | | | |
| QW4gRWFzdGVyIGVnZywgZm9yIHRob3NlIHdobyBtaWdodCBsb29rICA6KQo= | | | |
| </trusted-ca-cert> | | | |
| </trusted-ca-certs> | | | |
| <trusted-client-certs> | | | |
| <trusted-client-cert> | | | |
| SSBhbSB0aGUgZWdnIG1hbiwgdGhleSBhcmUgdGhlIGVnZyBtZW4uCg== | | | |
| </trusted-client-cert> | | | |
| <trusted-client-cert> | | | |
| SSBhbSB0aGUgd2FscnVzLCBnb28gZ29vIGcnam9vYi4K | | | |
| </trusted-client-cert> | | | |
| </trusted-client-certs> | | | |
| </x509> | | | |
| </ssh> | | | |
| </netconf-server> | | | |
| | | | |
| 3.2.2. Configuring TLS Transport | | | |
| | | | |
| The following example illustrates the <get> response from a NETCONF | | | |
| server that only supports TLS, both listening for incoming | | | |
| connections as well as calling home to a single NETCONF/RESTCONF | | | |
| client having two endpoints. Please note also the configurations for | | | |
| authenticating client certificates and mappings authenticated | | | |
| certificates to NETCONF user names. | | | |
| | | | |
| <netconf-server xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server" | | | |
| xmlns:x509c2n="urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name"> | | | |
| <listen> | | | |
| <endpoint> | | | |
| <name>netconf/tls</name> | | | |
| <tls> | | | |
| <address>11.22.33.44</address> | | | |
| <certificates> | | | |
| <certificate>fw1.east.example.com</certificate> | | | |
| </certificates> | | | |
| </tls> | | | |
| </endpoint> | | | |
| </listen> | | | |
| <call-home> | | | |
| <netconf-client> | | | |
| <name>config-mgr</name> | | | |
| <tls> | | | |
| <endpoints> | | | |
| <endpoint> | | | |
| <name>east-data-center</name> | | | |
| <address>22.33.44.55</address> | | | |
| </endpoint> | | | |
| <endpoint> | | | |
| <name>west-data-center</name> | | | |
| <address>33.44.55.66</address> | | | |
| </endpoint> | | | |
| </endpoints> | | | |
| <certificates> | | | |
| <certificate>IDevID Certificate</certificate> | | | |
| </certificates> | | | |
| </tls> | | | |
| </netconf-client> | | | |
| </call-home> | | | |
| <tls> | | | |
| <client-auth> | | | |
| <trusted-ca-certs> | | | |
| <trusted-ca-cert> | | | |
| WmdsK2gyTTg3QmtGMjhWbW1CdFFVaWc3OEgrRkYyRTFwdSt4ZVRJbVFFM | | | |
| lLQllsdWpOcjFTMnRLR05EMUc2OVJpK2FWNGw2NTdZNCtadVJMZgpRYjk | | | |
| zSFNwSDdwVXBCYnA4dmtNanFtZjJma3RqZHBxeFppUUtTbndWZTF2Zwot | | | |
| NGcEk3UE90cnNFVjRwTUNBd0VBQWFPQ0FSSXdnZ0VPCk1CMEdBMVVkRGd | | | |
| VEJiZ0JTWEdlbUEKMnhpRHVOTVkvVHFLNWd4cFJBZ1ZOYUU0cERZd05ER | | | |
| V6QVJCZ05WQkFNVENrTlNUQ0JKYzNOMVpYS0NDUUNVRHBNSll6UG8zREF | | | |
| NQmdOVkhSTUJBZjhFCkFqQUFNQTRHQTFVZER3RUIvd1FFQXdJSGdEQnBC | | | |
| Z05WSFI4RVlqQmdNRjZnSXFBZ2hoNW9kSFJ3T2k4dlpYaGgKYlhCc1pTN | | | |
| WpiMjB2WlhoaGJYQnNaUzVqY215aU9LUTJNRFF4Q3pBSkJnTlZCQVlUQW | | | |
| QmdOVkJBWVRBbFZUTVJBd0RnWURWUVFLRXdkbAplR0Z0Y0d4bE1RNHdEQ | | | |
| MkF6a3hqUDlVQWtHR0dvS1U1eUc1SVR0Wm0vK3B0R2FieXVDMjBRd2kvZ | | | |
| 25PZnpZNEhONApXY0pTaUpZK2xtYWs3RTRORUZXZS9RdGp4NUlXZmdvN2 | | | |
| RJSUJQFRStS0Cg== | | | |
| </trusted-ca-cert> | | | |
| </trusted-ca-certs> | | | |
| <trusted-client-certs> | | | |
| <trusted-client-cert> | | | |
| QmdOVkJBWVRBbFZUTVJBd0RnWURWUVFLRXdkbAplR0Z0Y0d4bE1RNHdEQ | | | |
| MkF6a3hqUDlVQWtHR0dvS1U1eUc1SVR0Wm0vK3B0R2FieXVDMjBRd2kvZ | | | |
| 25PZnpZNEhONApXY0pTaUpZK2xtYWs3RTRORUZXZS9RdGp4NUlXZmdvN2 | | | |
| RV0JCU2t2MXI2SFNHeUFUVkpwSmYyOWtXbUU0NEo5akJrQmdOVkhTTUVY | | | |
| VEJiZ0JTWEdlbUEKMnhpRHVOTVkvVHFLNWd4cFJBZ1ZOYUU0cERZd05ER | | | |
| UxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQW9UQjJWNApZVzF3YkdVeE | | | |
| V6QVJCZ05WQkFNVENrTlNUQ0JKYzNOMVpYS0NDUUNVRHBNSll6UG8zREF | | | |
| NQmdOVkhSTUJBZjhFCkFqQUFNQTRHQTFVZER3RUIvd1FFQXdJSGdEQnBC | | | |
| Z05WSFI4RVlqQmdNRjZnSXFBZ2hoNW9kSFJ3T2k4dlpYaGgKYlhCc1pTN | | | |
| WpiMjB2WlhoaGJYQnNaUzVqY215aU9LUTJNRFF4Q3pBSkJnTlZCQVlUQW | | | |
| xWVE1SQXdEZ1lEVlFRSwpFd2RsZUdGdGNHeGxNUk13RVFZRFZRUURFd3B | | | |
| EVWt3Z1NYTnpkV1Z5TUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCCkFFc3BK | | | |
| WmdsK2gyTTg3QmtGMjhWbW1CdFFVaWc3OEgrRkYyRTFwdSt4ZVRJbVFFM | | | |
| TQzcjFZSjk0M1FQLzV5eGUKN2QxMkxCV0dxUjUrbEl5N01YL21ka2M4al | | | |
| zSFNwSDdwVXBCYnA4dmtNanFtZjJma3RqZHBxeFppUUtTbndWZTF2Zwot | | | |
| LS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== | | | |
| </trusted-client-cert> | | | |
| <trusted-client-cert> | | | |
| VlEVlFRREV3Vm9ZWEJ3ZVRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQm | | | |
| pRQXdnWWtDCmdZRUE1RzRFSWZsS1p2bDlXTW44eUhyM2hObUFRaUhVUzV | | | |
| rRUpPQy9hSFA3eGJXQW1ra054ZStUa2hrZnBsL3UKbVhsTjhSZUd1ODhG | | | |
| NGcEk3UE90cnNFVjRwTUNBd0VBQWFPQ0FSSXdnZ0VPCk1CMEdBMVVkRGd | | | |
| VEJiZ0JTWEdlbUEKMnhpRHVOTVkvVHFLNWd4cFJBZ1ZOYUU0cERZd05ER | | | |
| V6QVJCZ05WQkFNVENrTlNUQ0JKYzNOMVpYS0NDUUNVRHBNSll6UG8zREF | | | |
| NQmdOVkhSTUJBZjhFCkFqQUFNQTRHQTFVZER3RUIvd1FFQXdJSGdEQnBC | | | |
| Z05WSFI4RVlqQmdNRjZnSXFBZ2hoNW9kSFJ3T2k4dlpYaGgKYlhCc1pTN | | | |
| WpiMjB2WlhoaGJYQnNaUzVqY215aU9LUTJNRFF4Q3pBSkJnTlZCQVlUQW | | | |
| xWVE1SQXdEZ1lEVlFRSwpFd2RsZUdGdGNHeGxNUk13RVFZRFZRUURFd3B | | | |
| EVWt3Z1NYTnpkV1Z5TUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCCkFFc3BK | | | |
| WmdsK2gyTTg3QmtGMjhWbW1CdFFVaWc3OEgrRkYyRTFwdSt4ZVRJbVFFM | | | |
| lLQllsdWpOcjFTMnRLR05EMUc2OVJpK2FWNGw2NTdZNCtadVJMZgpRYjk | | | |
| zSFNwSDdwVXBCYnA4dmtNanFtZjJma3RqZHBxeFppUUtTbndWZTF2Zwot | | | |
| QWtUOCBDRVUUZJ0RUF== | | | |
| </trusted-client-cert> | | | |
| </trusted-client-certs> | | | |
| <cert-maps> | | | |
| <cert-to-name> | | | |
| <id>1</id> | | | |
| <fingerprint>11:0A:05:11:00</fingerprint> | | | |
| <map-type>x509c2n:san-any</map-type> | | | |
| </cert-to-name> | | | |
| <cert-to-name> | | | |
| <id>2</id> | | | |
| <fingerprint>B3:4F:A1:8C:54</fingerprint> | | | |
| <map-type>x509c2n:specified</map-type> | | | |
| <name>scooby-doo</name> | | | |
| </cert-to-name> | | | |
| </cert-maps> | | | |
| </client-auth> | | | |
| </tls> | | | |
| </netconf-server> | | | |
| | | | |
| 3.3. YANG Model | | | |
| | | | |
| This YANG module imports YANG types from [RFC6991] and [RFC7407]. | | | |
| | | | |
| <CODE BEGINS> file "ietf-netconf-server@2015-07-06.yang" | | | |
| | | | |
| module ietf-netconf-server { | | | |
| yang-version 1.1; | | | |
| | | | |
| namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-server"; | | | |
| prefix "ncserver"; | | | |
| | | | |
| import ietf-netconf-acm { | | | |
| prefix nacm; // RFC 6536 | | | |
| } | | | |
| import ietf-inet-types { // RFC 6991 | | | |
| prefix inet; | | | |
| } | | | |
| import ietf-x509-cert-to-name { // RFC 7407 | | | |
| prefix x509c2n; | | | |
| } | | | |
| | | | |
| organization | | | |
| "IETF NETCONF (Network Configuration) Working Group"; | | | |
| | | | |
| contact | | | |
| "WG Web: <http://tools.ietf.org/wg/netconf/> | | | |
| WG List: <mailto:netconf@ietf.org> | | | |
| | | | |
| WG Chair: Mehmet Ersue | | | |
| <mailto:mehmet.ersue@nsn.com> | | | |
| | | | |
| WG Chair: Mahesh Jethanandani | | | |
| <mailto:mjethanandani@gmail.com> | | | |
| | | | |
| Editor: Kent Watsen | | | |
| <mailto:kwatsen@juniper.net>"; | | | |
| | | | |
| description | | | |
| "This module contains a collection of YANG definitions for | | | |
| configuring NETCONF servers. | | | |
| | | | |
| Copyright (c) 2014 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 | | | |
| (http://trustee.ietf.org/license-info). | | | |
| | | | |
| This version of this YANG module is part of RFC VVVV; see | | | |
| the RFC itself for full legal notices."; | | | |
| | | | |
| revision "2015-07-06" { | | | |
| description | | | |
| "Initial version"; | | | |
| reference | | | |
| "RFC VVVV: NETCONF Server and RESTCONF Server Configuration | | | |
| Models"; | | | |
| } | | | |
| // Features | | | |
| | | | |
| feature ssh-listen { | | | |
| description | | | |
| "The ssh-listen feature indicates that the NETCONF server | | | |
| supports opening a port to accept NETCONF over SSH | | | |
| client connections."; | | | |
| reference | | | |
| "RFC 6242: Using the NETCONF Protocol over Secure Shell (SSH)"; | | | |
| } | | | |
| | | | |
| feature ssh-call-home { | | | |
| description | | | |
| "The ssh-call-home feature indicates that the NETCONF | | | |
| server supports initiating a NETCONF over SSH call | | | |
| home connection to NETCONF clients."; | | | |
| reference | | | |
| "RFC YYYY: NETCONF Call Home and RESTCONF Call Home"; | | | |
| } | | | |
| | | | |
| feature tls-listen { | | | |
| description | | | |
| "The tls-listen feature indicates that the NETCONF server | | | |
| supports opening a port to accept NETCONF over TLS | | | |
| client connections."; | | | |
| reference | | | |
| "RFC 5539: Using the NETCONF Protocol over Transport | | | |
| Layer Security (TLS) with Mutual X.509 | | | |
| Authentication"; | | | |
| } | | | |
| | | | |
| feature tls-call-home { | | | |
| description | | | |
| "The tls-call-home feature indicates that the NETCONF | | | |
| server supports initiating a NETCONF over TLS call | | | |
| home connection to NETCONF clients."; | | | |
| reference | | | |
| "RFC YYYY: NETCONF Call Home and RESTCONF Call Home"; | | | |
| } | | | |
| | | | |
| feature ssh-x509-certs { | | | |
| description | | | |
| "The ssh-x509-certs feature indicates that the NETCONF server | | | |
| supports RFC 6187"; | | | |
| reference | | | |
| "RFC 6187: X.509v3 Certificates for Secure Shell Authentication"; | | | |
| } | | | |
| // top-level container (groupings below) | | | |
| container netconf-server { | | | |
| description | | | |
| "Top-level container for NETCONF server configuration."; | | | |
| | | | |
| container session-options { // SHOULD WE REMOVE THIS ALTOGETHER? | | | |
| description | | | |
| "NETCONF session options, independent of transport | | | |
| or connection strategy."; | | | |
| leaf hello-timeout { | | | |
| type uint16; | | | |
| units "seconds"; | | | |
| default 600; | | | |
| description | | | |
| "Specifies the maximum number of seconds that a SSH/TLS | | | |
| connection may wait for a hello message to be received. | | | |
| A connection will be dropped if no hello message is | | | |
| received before this number of seconds elapses. If set | | | |
| to zero, then the server will wait forever for a hello | | | |
| message."; | | | |
| } | | | |
| } | | | |
| | | | |
| container listen { | | | |
| description | | | |
| "Configures listen behavior"; | | | |
| if-feature "(ssh-listen or tls-listen)"; | | | |
| leaf max-sessions { | | | |
| type uint16; | | | |
| default 0; | | | |
| description | | | |
| "Specifies the maximum number of concurrent sessions | | | |
| that can be active at one time. The value 0 indicates | | | |
| that no artificial session limit should be used."; | | | |
| } | | | |
| leaf idle-timeout { | | | |
| type uint16; | | | |
| units "seconds"; | | | |
| default 3600; // one hour | | | |
| description | | | |
| "Specifies the maximum number of seconds that a NETCONF | | | |
| session may remain idle. A NETCONF session will be dropped | | | |
| if it is idle for an interval longer than this number of | | | |
| seconds. If set to zero, then the server will never drop | | | |
| a session because it is idle. Sessions that have a | | | |
| notification subscription active are never dropped."; | | | |
| } | | | |
| list endpoint { | | | |
| key name; | | | |
| description | | | |
| "List of endpoints to listen for NETCONF connections on."; | | | |
| leaf name { | | | |
| type string; | | | |
| description | | | |
| "An arbitrary name for the NETCONF listen endpoint."; | | | |
| } | | | |
| choice transport { | | | |
| mandatory true; | | | |
| description | | | |
| "Selects between available transports."; | | | |
| case ssh { | | | |
| if-feature ssh-listen; | | | |
| container ssh { | | | |
| description | | | |
| "SSH-specific listening configuration for inbound | | | |
| connections."; | | | |
| uses address-and-port-grouping { | | | |
| refine port { | | | |
| default 830; | | | |
| } | | | |
| } | | | |
| uses host-keys-grouping; | | | |
| } | | | |
| } | | | |
| case tls { | | | |
| if-feature tls-listen; | | | |
| container tls { | | | |
| description | | | |
| "TLS-specific listening configuration for inbound | | | |
| connections."; | | | |
| uses address-and-port-grouping { | | | |
| refine port { | | | |
| default 6513; | | | |
| } | | | |
| } | | | |
| uses certificates-grouping; | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
| container call-home { | | | |
| if-feature "(ssh-call-home or tls-call-home)"; | | | |
| description | | | |
| "Configures call-home behavior"; | | | |
| | | | |
| list netconf-client { | | | |
| key name; | | | |
| description | | | |
| "List of NETCONF clients the NETCONF server is to initiate | | | |
| call-home connections to."; | | | |
| leaf name { | | | |
| type string; | | | |
| description | | | |
| "An arbitrary name for the remote NETCONF client."; | | | |
| } | | | |
| choice transport { | | | |
| mandatory true; | | | |
| description | | | |
| "Selects between available transports."; | | | |
| case ssh { | | | |
| if-feature ssh-call-home; | | | |
| container ssh { | | | |
| description | | | |
| "Specifies SSH-specific call-home transport | | | |
| configuration."; | | | |
| uses endpoints-container { | | | |
| refine endpoints/endpoint/port { | | | |
| default 7777; | | | |
| } | | | |
| } | | | |
| uses host-keys-grouping; | | | |
| } | | | |
| } | | | |
| case tls { | | | |
| if-feature tls-call-home; | | | |
| container tls { | | | |
| description | | | |
| "Specifies TLS-specific call-home transport | | | |
| configuration."; | | | |
| uses endpoints-container { | | | |
| refine endpoints/endpoint/port { | | | |
| default 8888; | | | |
| } | | | |
| } | | | |
| uses certificates-grouping; | | | |
| } | | | |
| } | | | |
| } | | | |
| container connection-type { | | | |
| description | | | |
| "Indicates the kind of connection to use."; | | | |
| choice connection-type { | | | |
| description | | | |
| "Selects between available connection types."; | | | |
| case persistent-connection { | | | |
| container persistent { | | | |
| presence true; | | | |
| description | | | |
| "Maintain a persistent connection to the NETCONF | | | |
| client. If the connection goes down, immediately | | | |
| start trying to reconnect to it, using the | | | |
| reconnection strategy. | | | |
| | | | |
| This connection type minimizes any NETCONF client | | | |
| to NETCONF server data-transfer delay, albeit at | | | |
| the expense of holding resources longer."; | | | |
| leaf idle-timeout { | | | |
| type uint32; | | | |
| units "seconds"; | | | |
| default 86400; // one day; | | | |
| description | | | |
| "Specifies the maximum number of seconds that a | | | |
| a NETCONF session may remain idle. A NETCONF | | | |
| session will be dropped if it is idle for an | | | |
| interval longer than this number of seconds. | | | |
| If set to zero, then the server will never drop | | | |
| a session because it is idle. Sessions that | | | |
| have a notification subscription active are | | | |
| never dropped."; | | | |
| } | | | |
| container keep-alives { | | | |
| description | | | |
| "Configures the keep-alive policy, to proactively | | | |
| test the aliveness of the SSH/TLS client. An | | | |
| unresponsive SSH/TLS client will be dropped after | | | |
| approximately (max-attempts * max-wait) seconds."; | | | |
| reference | | | |
| "RFC YYYY: NETCONF Call Home and RESTCONF Call Home, | | | |
| Section 3.1, item S6"; | | | |
| leaf max-wait { | | | |
| type uint16 { | | | |
| range "1..max"; | | | |
| } | | | |
| units seconds; | | | |
| default 30; | | | |
| description | | | |
| "Sets the amount of time in seconds after which | | | |
| if no data has been received from the SSH/TLS | | | |
| client, a SSH/TLS-level message will be sent | | | |
| to test the aliveness of the SSH/TLS client."; | | | |
| } | | | |
| leaf max-attempts { | | | |
| type uint8; | | | |
| default 3; | | | |
| description | | | |
| "Sets the number of sequential keep-alive messages | | | |
| that can fail to obtain a response from the SSH/TLS | | | |
| client before assuming the SSH/TLS client is no | | | |
| longer alive."; | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| case periodic-connection { | | | |
| container periodic { | | | |
| presence true; | | | |
| description | | | |
| "Periodically connect to the NETCONF client, so that | | | |
| the NETCONF client may deliver messages pending for | | | |
| the NETCONF server. The NETCONF client is expected | | | |
| to close the connection when it is ready to release | | | |
| it, thus starting the NETCONF server's timer until | | | |
| next connection."; | | | |
| leaf idle-timeout { | | | |
| type uint16; | | | |
| units "seconds"; | | | |
| default 300; // five minutes | | | |
| description | | | |
| "Specifies the maximum number of seconds that a | | | |
| a NETCONF session may remain idle. A NETCONF | | | |
| session will be dropped if it is idle for an | | | |
| interval longer than this number of seconds. | | | |
| If set to zero, then the server will never drop | | | |
| a session because it is idle. Sessions that | | | |
| have a notification subscription active are | | | |
| never dropped."; | | | |
| } | | | |
| leaf reconnect_timeout { | | | |
| type uint16 { | | | |
| range "1..max"; | | | |
| } | | | |
| units minutes; | | | |
| default 60; | | | |
| description | | | |
| "The maximum amount of unconnected time the NETCONF | | | |
| server will wait before establishing a connection | | | |
| to the NETCONF client. The NETCONF server may | | | |
| initiate a connection before this time if desired | | | |
| (e.g., to deliver a notification)."; | | | |
| | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| container reconnect-strategy { | | | |
| description | | | |
| "The reconnection strategy guides how a NETCONF server | | | |
| reconnects to an NETCONF client, after losing a connection | | | |
| to it, even if due to a reboot. The NETCONF server starts | | | |
| with the specified endpoint and tries to connect to it | | | |
| max-attempts times before trying the next endpoint in the | | | |
| list (round robin)."; | | | |
| leaf start-with { | | | |
| type enumeration { | | | |
| enum first-listed { | | | |
| description | | | |
| "Indicates that reconnections should start with | | | |
| the first endpoint listed."; | | | |
| } | | | |
| enum last-connected { | | | |
| description | | | |
| "Indicates that reconnections should start with | | | |
| the endpoint last connected to. If no previous | | | |
| connection has ever been established, then the | | | |
| first endpoint configured is used. NETCONF | | | |
| servers SHOULD be able to remember the last | | | |
| endpoint connected to across reboots."; | | | |
| } | | | |
| } | | | |
| default first-listed; | | | |
| description | | | |
| "Specifies which of the NETCONF client's endpoints the | | | |
| NETCONF server should start with when trying to connect | | | |
| to the NETCONF client."; | | | |
| } | | | |
| leaf max-attempts { | | | |
| type uint8 { | | | |
| range "1..max"; | | | |
| } | | | |
| default 3; | | | |
| description | | | |
| "Specifies the number times the NETCONF server tries to | | | |
| connect to a specific endpoint before moving on to the | | | |
| next endpoint in the list (round robin)."; | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
| } | | | |
| | | | |
| container ssh { | | | |
| description | | | |
| "Configures SSH properties not specific to the listen | | | |
| or call-home use-cases"; | | | |
| if-feature "(ssh-listen or ssh-call-home)"; | | | |
| container x509 { | | | |
| if-feature ssh-x509-certs; | | | |
| uses trusted-certs-grouping; | | | |
| } | | | |
| } | | | |
| | | | |
| container tls { | | | |
| description | | | |
| "Configures TLS properties for authenticating clients."; | | | |
| if-feature "(tls-listen or tls-call-home)"; | | | |
| container client-auth { | | | |
| description | | | |
| "Container for TLS client authentication configuration."; | | | |
| uses trusted-certs-grouping; | | | |
| container cert-maps { | | | |
| uses x509c2n:cert-to-name; | | | |
| description | | | |
| "The cert-maps container is used by a NETCONF server to | | | |
| map the NETCONF client's presented X.509 certificate to a | | | |
| NETCONF username. If no matching and valid cert-to-name | | | |
| list entry can be found, then the NETCONF server MUST | | | |
| close the connection, and MUST NOT accept NETCONF | | | |
| messages over it."; | | | |
| reference | | | |
| "RFC WWWW: NETCONF over TLS, Section 7"; | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
| grouping trusted-certs-grouping { | | | |
| description | | | |
| "This grouping is used by both the ssh and tls containers."; | | | |
| container trusted-ca-certs { | | | |
| description | | | |
| "A list of Certificate Authority (CA) certificates that | | | |
| a NETCONF server can use to authenticate NETCONF client | | | |
| certificates."; | | | |
| reference | | | |
| "RFC WWWW: NETCONF over TLS, Sections 5 and 7. | | | |
| RFC 4253: The Secure Shell (SSH) Transport Layer Protocol, | | | |
| Section 8, #3. | | | |
| RFC 6187: X.509v3 Certificates for Secure Shell | | | |
| Authentication."; | | | |
| leaf-list trusted-ca-cert { | | | |
| type binary; | | | |
| nacm:default-deny-write; | | | |
| description | | | |
| "The binary certificate structure as specified by RFC | | | |
| 5246, Section 7.4.6, i.e.,: opaque ASN.1Cert<1..2^24>; | | | |
| "; | | | |
| reference | | | |
| "RFC 5246: The Transport Layer Security (TLS) | | | |
| Protocol Version 1.2"; | | | |
| } | | | |
| } | | | |
| container trusted-client-certs { | | | |
| description | | | |
| "A list of client certificates that a NETCONF server can | | | |
| use to authenticate a NETCONF client's certificate. A | | | |
| client's certificate is authenticated if it is an exact | | | |
| match to a configured trusted client certificate."; | | | |
| leaf-list trusted-client-cert { | | | |
| type binary; | | | |
| nacm:default-deny-write; | | | |
| description | | | |
| "The binary certificate structure, as | | | |
| specified by RFC 5246, Section 7.4.6, i.e.,: | | | |
| | | | |
| opaque ASN.1Cert<1..2^24>; | | | |
| | | | |
| "; | | | |
| reference | | | |
| "RFC 5246: The Transport Layer Security (TLS) | | | |
| Protocol Version 1.2"; | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
| grouping host-keys-grouping { | | | |
| description | | | |
| "This grouping is used by both the listen and | | | |
| call-home containers"; | | | |
| container host-keys { | | | |
| description | | | |
| "Parent container for the list of host-keys."; | | | |
| leaf-list host-key { | | | |
| type string; | | | |
| min-elements 1; | | | |
| ordered-by user; | | | |
| description | | | |
| "A user-ordered list of host-keys the SSH server | | | |
| considers when composing the list of server host | | | |
| key algorithms it will send to the client in its | | | |
| SSH_MSG_KEXINIT message. The value of the string | | | |
| is the unique identifier for a host-key configured | | | |
| on the system. How valid values are discovered is | | | |
| outside the scope of this module, but they are | | | |
| envisioned to be the keys for a list of host-keys | | | |
| provided by another YANG module"; | | | |
| reference | | | |
| "RFC 4253: The SSH Transport Layer Protocol, Section 7"; | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
| grouping certificates-grouping { | | | |
| description | | | |
| "This grouping is used by both the listen and | | | |
| call-home containers"; | | | |
| container certificates { | | | |
| description | | | |
| "Parent container for the list of certificates."; | | | |
| leaf-list certificate { | | | |
| type string; | | | |
| min-elements 1; | | | |
| description | | | |
| "An unordered list of certificates the TLS server can pick | | | |
| from when sending its Server Certificate message. The value | | | |
| of the string is the unique identifier for a certificate | | | |
| configured on the system. How valid values are discovered | | | |
| is outside the scope of this module, but they are envisioned | | | |
| to be the keys for a list of certificates provided | | | |
| by another YANG module"; | | | |
| reference | | | |
| "RFC 5246: The TLS Protocol, Section 7.4.2"; | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
| grouping address-and-port-grouping { | | | |
| description | | | |
| "This grouping is used by both the ssh and tls containers | | | |
| for listen configuration."; | | | |
| leaf address { | | | |
| type inet:ip-address; | | | |
| description | | | |
| "The IP address of the interface to listen on. The NETCONF | | | |
| server will listen on all interfaces if no value is | | | |
| specified."; | | | |
| } | | | |
| leaf port { | | | |
| type inet:port-number; | | | |
| description | | | |
| "The local port number on this interface the NETCONF server | | | |
| listens on. The NETCONF server will use the IANA-assigned | | | |
| well-known port if no value is specified."; | | | |
| } | | | |
| } | | | |
| | | | |
| grouping endpoints-container { | | | |
| description | | | |
| "This grouping is used by both the ssh and tls containers | | | |
| for call-home configurations."; | | | |
| container endpoints { | | | |
| description | | | |
| "Container for the list of endpoints."; | | | |
| list endpoint { | | | |
| key name; | | | |
| min-elements 1; | | | |
| ordered-by user; | | | |
| description | | | |
| "User-ordered list of endpoints for this NETCONF client. | | | |
| Defining more than one enables high-availability."; | | | |
| leaf name { | | | |
| type string; | | | |
| description | | | |
| "An arbitrary name for this endpoint."; | | | |
| } | | | |
| leaf address { | | | |
| type inet:host; | | | |
| mandatory true; | | | |
| description | | | |
| "The IP address or hostname of the endpoint. If a | | | |
| hostname is configured and the DNS resolution results | | | |
| in more than one IP address, the NETCONF server | | | |
| will process the IP addresses as if they had been | | | |
| explicitly configured in place of the hostname."; | | | |
| } | | | |
| leaf port { | | | |
| type inet:port-number; | | | |
| description | | | |
| "The IP port for this endpoint. The NETCONF server will | | | |
| use the IANA-assigned well-known port if no value is | | | |
| specified."; | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
| } | | | |
| | | | |
| <CODE ENDS> | | | |
| | | | |
| 4. The RESTCONF Server Model | | | |
| | | | |
| 4.1. Tree Diagram | | | |
| | | | |
| module: ietf-restconf-server | | | |
| +--rw restconf-server | | | |
| +--rw listen {tls-listen}? | | | |
| | +--rw max-sessions? uint16 | | | |
| | +--rw endpoint* [name] | | | |
| | +--rw name string | | | |
| | +--rw (transport) | | | |
| | +--:(tls) | | | |
| | +--rw tls | | | |
| | +--rw address? inet:ip-address | | | |
| | +--rw port? inet:port-number | | | |
| | +--rw certificates | | | |
| | +--rw certificate* string | | | |
| +--rw call-home {tls-call-home}? | | | |
| | +--rw restconf-client* [name] | | | |
| | +--rw name string | | | |
| | +--rw (transport) | | | |
| | | +--:(tls) | | | |
| | | +--rw tls | | | |
| | | +--rw endpoints | | | |
| | | | +--rw endpoint* [name] | | | |
| | | | +--rw name string | | | |
| | | | +--rw address inet:host | | | |
| | | | +--rw port? inet:port-number | | | |
| | | +--rw certificates | | | |
| | | +--rw certificate* string | | | |
| | +--rw connection-type | | | |
| | | +--rw (connection-type)? | | | |
| | | +--:(persistent-connection) | | | |
| | | | +--rw persistent! | | | |
| | | | +--rw keep-alives | | | |
| | | | +--rw max-wait? uint16 | | | |
| | | | +--rw max-attempts? uint8 | | | |
| | | +--:(periodic-connection) | | | |
| | | +--rw periodic! | | | |
| | | +--rw reconnect-timeout? uint16 | | | |
| | +--rw reconnect-strategy | | | |
| | +--rw start-with? enumeration | | | |
| | +--rw max-attempts? uint8 | | | |
| +--rw client-cert-auth {client-cert-auth}? | | | |
| +--rw trusted-ca-certs | | | |
| | +--rw trusted-ca-cert* binary | | | |
| +--rw trusted-client-certs | | | |
| | +--rw trusted-client-cert* binary | | | |
| +--rw cert-maps | | | |
| +--rw cert-to-name* [id] | | | |
| +--rw id uint32 | | | |
| +--rw fingerprint x509c2n:tls-fingerprint | | | |
| +--rw map-type identityref | | | |
| +--rw name string | | | |
| | | | |
| 4.2. Example Usage | | | |
| | | | |
| 4.2.1. Configuring TLS Transport | | | |
| | | | |
| The following example illustrates the <get> response from a RESTCONF | | | |
| server that only supports TLS, both listening for incoming | | | |
| connections as well as calling home to a single RESTCONF client | | | |
| having two endpoints. | | | |
| | | | |
| <restconf-server xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf-server"> | | | |
| <listen> | | | |
| <endpoint> | | | |
| <name>primary-restconf-endpoint</name> | | | |
| <tls> | | | |
| <address>11.22.33.44</address> | | | |
| <certificates> | | | |
| <certificate>fw1.east.example.com</certificate> | | | |
| </certificates> | | | |
| </tls> | | | |
| </endpoint> | | | |
| </listen> | | | |
| <call-home> | | | |
| <restconf-client> | | | |
| <name>config-mgr</name> | | | |
| <tls> | | | |
| <endpoints> | | | |
| <endpoint> | | | |
| <name>east-data-center</name> | | | |
| <address>11.22.33.44</address> | | | |
| </endpoint> | | | |
| <endpoint> | | | |
| <name>west-data-center</name> | | | |
| <address>55.66.77.88</address> | | | |
| </endpoint> | | | |
| </endpoints> | | | |
| <certificates> | | | |
| <certificate>fw1.east.example.com</certificate> | | | |
| </certificates> | | | |
| </tls> | | | |
| </restconf-client> | | | |
| </call-home> | | | |
| </restconf-server> | | | |
| | | | |
| 4.3. YANG Model | | | |
| | | | |
| This YANG module imports YANG types from [RFC6991] and [RFC7407]. | | | |
| | | | |
| <CODE BEGINS> file "ietf-restconf-server@2015-07-06.yang" | | | |
| | | | |
| module ietf-restconf-server { | | | |
| yang-version 1.1; | | | |
| | | | |
| namespace "urn:ietf:params:xml:ns:yang:ietf-restconf-server"; | | | |
| prefix "rcserver"; | | | |
| | | | |
| import ietf-netconf-acm { | | | |
| prefix nacm; // RFC 6536 | | | |
| } | | | |
| import ietf-inet-types { // RFC 6991 | | | |
| prefix inet; | | | |
| } | | | |
| import ietf-x509-cert-to-name { // RFC 7407 | | | |
| prefix x509c2n; | | | |
| } | | | |
| | | | |
| organization | | | |
| "IETF NETCONF (Network Configuration) Working Group"; | | | |
| | | | |
| contact | | | |
| "WG Web: <http://tools.ietf.org/wg/netconf/> | | | |
| WG List: <mailto:netconf@ietf.org> | | | |
| | | | |
| WG Chair: Mehmet Ersue | | | |
| <mailto:mehmet.ersue@nsn.com> | | | |
| | | | |
| WG Chair: Mahesh Jethanandani | | | |
| <mailto:mjethanandani@gmail.com> | | | |
| | | | |
| Editor: Kent Watsen | | | |
| <mailto:kwatsen@juniper.net>"; | | | |
| | | | |
| description | | | |
| "This module contains a collection of YANG definitions for | | | |
| configuring RESTCONF servers. | | | |
| | | | |
| Copyright (c) 2014 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 | | | |
| (http://trustee.ietf.org/license-info). | | | |
| | | | |
| This version of this YANG module is part of RFC VVVV; see | | | |
| the RFC itself for full legal notices."; | | | |
| | | | |
| revision "2015-07-06" { | | | |
| description | | | |
| "Initial version"; | | | |
| reference | | | |
| "RFC VVVV: NETCONF Server and RESTCONF Server Configuration | | | |
| Models"; | | | |
| } | | | |
| | | | |
| // Features | | | |
| | | | |
| feature tls-listen { | | | |
| description | | | |
| "The listen feature indicates that the RESTCONF server | | | |
| supports opening a port to listen for incoming RESTCONF | | | |
| client connections."; | | | |
| reference | | | |
| "RFC XXXX: RESTCONF Protocol"; | | | |
| } | | | |
| | | | |
| feature tls-call-home { | | | |
| description | | | |
| "The call-home feature indicates that the RESTCONF server | | | |
| supports initiating connections to RESTCONF clients."; | | | |
| reference | | | |
| "RFC YYYY: NETCONF Call Home and RESTCONF Call Home"; | | | |
| } | | | |
| | | | |
| feature client-cert-auth { | | | |
| description | | | |
| "The client-cert-auth feature indicates that the RESTCONF | | | |
| server supports the ClientCertificate authentication scheme."; | | | |
| reference | | | |
| "RFC ZZZZ: Client Authentication over New TLS Connection"; | | | |
| } | | | |
| | | | |
| // top-level container (groupings below) | | | |
| container restconf-server { | | | |
| description | | | |
| "Top-level container for RESTCONF server configuration."; | | | |
| | | | |
| container listen { | | | |
| description | | | |
| "Configures listen behavior"; | | | |
| if-feature tls-listen; | | | |
| leaf max-sessions { | | | |
| type uint16; | | | |
| default 0; // should this be 'max'? | | | |
| description | | | |
| "Specifies the maximum number of concurrent sessions | | | |
| that can be active at one time. The value 0 indicates | | | |
| that no artificial session limit should be used."; | | | |
| | | | |
| } | | | |
| list endpoint { | | | |
| key name; | | | |
| description | | | |
| "List of endpoints to listen for RESTCONF connections on."; | | | |
| leaf name { | | | |
| type string; | | | |
| description | | | |
| "An arbitrary name for the RESTCONF listen endpoint."; | | | |
| } | | | |
| choice transport { | | | |
| mandatory true; | | | |
| description | | | |
| "Selects between available transports."; | | | |
| case tls { | | | |
| container tls { | | | |
| description | | | |
| "TLS-specific listening configuration for inbound | | | |
| connections."; | | | |
| leaf address { | | | |
| type inet:ip-address; | | | |
| description | | | |
| "The IP address of the interface to listen on. The | | | |
| RESTCONF server will listen on all interfaces if | | | |
| no value is specified."; | | | |
| } | | | |
| leaf port { | | | |
| type inet:port-number; | | | |
| default 443; | | | |
| description | | | |
| "The port number the RESTCONF server will listen on."; | | | |
| } | | | |
| uses certificates-grouping; | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
| container call-home { | | | |
| if-feature tls-call-home; | | | |
| description | | | |
| "Configures call-home behavior"; | | | |
| list restconf-client { | | | |
| key name; | | | |
| description | | | |
| "List of RESTCONF clients the RESTCONF server is to | | | |
| initiate call-home connections to."; | | | |
| | | | |
| leaf name { | | | |
| type string; | | | |
| description | | | |
| "An arbitrary name for the remote RESTCONF client."; | | | |
| } | | | |
| choice transport { | | | |
| mandatory true; | | | |
| description | | | |
| "Selects between TLS and any transports augmented in."; | | | |
| case tls { | | | |
| container tls { | | | |
| description | | | |
| "Specifies TLS-specific call-home transport | | | |
| configuration."; | | | |
| container endpoints { | | | |
| description | | | |
| "Container for the list of endpoints."; | | | |
| list endpoint { | | | |
| key name; | | | |
| min-elements 1; | | | |
| ordered-by user; | | | |
| description | | | |
| "User-ordered list of endpoints for this RESTCONF | | | |
| client. More than one enables high-availability."; | | | |
| leaf name { | | | |
| type string; | | | |
| description | | | |
| "An arbitrary name for this endpoint."; | | | |
| } | | | |
| leaf address { | | | |
| type inet:host; | | | |
| mandatory true; | | | |
| description | | | |
| "The IP address or hostname of the endpoint. If | | | |
| a hostname is configured and the DNS resolution | | | |
| results in more than one IP address, the RESTCONF | | | |
| server will process the IP addresses as if they | | | |
| had been explicitly configured in place of the | | | |
| hostname."; | | | |
| } | | | |
| leaf port { | | | |
| type inet:port-number; | | | |
| default 9999; | | | |
| description | | | |
| "The IP port for this endpoint. The RESTCONF | | | |
| server will use the IANA-assigned well-known | | | |
| port if no value is specified."; | | | |
| } | | | |
| | | | |
| } | | | |
| } | | | |
| uses certificates-grouping; | | | |
| } | | | |
| } | | | |
| } | | | |
| container connection-type { | | | |
| description | | | |
| "Indicates the RESTCONF client's preference for how the | | | |
| RESTCONF server's connection is maintained."; | | | |
| choice connection-type { | | | |
| description | | | |
| "Selects between available connection types."; | | | |
| case persistent-connection { | | | |
| container persistent { | | | |
| presence true; | | | |
| description | | | |
| "Maintain a persistent connection to the RESTCONF | | | |
| client. If the connection goes down, immediately | | | |
| start trying to reconnect to it, using the | | | |
| reconnection strategy. | | | |
| | | | |
| This connection type minimizes any RESTCONF client | | | |
| to RESTCONF server data-transfer delay, albeit at | | | |
| the expense of holding resources longer."; | | | |
| | | | |
| container keep-alives { | | | |
| description | | | |
| "Configures the keep-alive policy, to proactively | | | |
| test the aliveness of the TLS client. An | | | |
| unresponsive TLS client will be dropped after | | | |
| approximately (max-attempts * max-wait) seconds."; | | | |
| reference | | | |
| "RFC YYYY: NETCONF Call Home and RESTCONF Call Home, | | | |
| Section 3.1, item S6"; | | | |
| leaf max-wait { | | | |
| type uint16 { | | | |
| range "1..max"; | | | |
| } | | | |
| units seconds; | | | |
| default 30; | | | |
| description | | | |
| "Sets the amount of time in seconds after which | | | |
| if no data has been received from the TLS | | | |
| client, a TLS-level message will be sent to | | | |
| test the aliveness of the TLS client."; | | | |
| } | | | |
| leaf max-attempts { | | | |
| type uint8; | | | |
| default 3; | | | |
| description | | | |
| "Sets the number of sequential keep-alive messages | | | |
| that can fail to obtain a response from the TLS | | | |
| client before assuming the TLS client is no | | | |
| longer alive."; | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| case periodic-connection { | | | |
| container periodic { | | | |
| presence true; | | | |
| description | | | |
| "Periodically connect to the RESTCONF client, so that | | | |
| the RESTCONF client may deliver messages pending for | | | |
| the RESTCONF server. The RESTCONF client is expected | | | |
| to close the connection when it is ready to release | | | |
| it, thus starting the RESTCONF server's timer until | | | |
| next connection."; | | | |
| leaf reconnect-timeout { | | | |
| type uint16 { | | | |
| range "1..max"; | | | |
| } | | | |
| units minutes; | | | |
| default 60; | | | |
| description | | | |
| "The maximum amount of unconnected time the RESTCONF | | | |
| server will wait before re-establishing a connection | | | |
| to the RESTCONF client. The RESTCONF server may | | | |
| initiate a connection before this time if desired | | | |
| (e.g., to deliver a notification)."; | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| container reconnect-strategy { | | | |
| description | | | |
| "The reconnection strategy guides how a RESTCONF server | | | |
| reconnects to an RESTCONF client, after losing a connection | | | |
| to it, even if due to a reboot. The RESTCONF server starts | | | |
| with the specified endpoint and tries to connect to it | | | |
| max-attempts times before trying the next endpoint in the | | | |
| list (round robin)."; | | | |
| leaf start-with { | | | |
| type enumeration { | | | |
| enum first-listed { | | | |
| description | | | |
| "Indicates that reconnections should start with | | | |
| the first endpoint listed."; | | | |
| } | | | |
| enum last-connected { | | | |
| description | | | |
| "Indicates that reconnections should start with | | | |
| the endpoint last connected to. If no previous | | | |
| connection has ever been established, then the | | | |
| first endpoint configured is used. RESTCONF | | | |
| servers SHOULD be able to remember the last | | | |
| endpoint connected to across reboots."; | | | |
| } | | | |
| } | | | |
| default first-listed; | | | |
| description | | | |
| "Specifies which of the RESTCONF client's endpoints the | | | |
| RESTCONF server should start with when trying to connect | | | |
| to the RESTCONF client."; | | | |
| } | | | |
| leaf max-attempts { | | | |
| type uint8 { | | | |
| range "1..max"; | | | |
| } | | | |
| default 3; | | | |
| description | | | |
| "Specifies the number times the RESTCONF server tries to | | | |
| connect to a specific endpoint before moving on to the | | | |
| next endpoint in the list (round robin)."; | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
| container client-cert-auth { | | | |
| if-feature client-cert-auth; | | | |
| description | | | |
| "Container for TLS client certificate authentication | | | |
| configuration."; | | | |
| container trusted-ca-certs { | | | |
| description | | | |
| "A list of Certificate Authority (CA) certificates that | | | |
| a RESTCONF server can use to authenticate RESTCONF client | | | |
| certificates."; | | | |
| reference | | | |
| "RFC XXXX: RESTCONF Protocol, Sections 2.3 and 2.5."; | | | |
| leaf-list trusted-ca-cert { | | | |
| type binary; | | | |
| nacm:default-deny-write; | | | |
| description | | | |
| "The binary certificate structure as specified by RFC | | | |
| 5246, Section 7.4.6, i.e.,: opaque ASN.1Cert<1..2^24>; | | | |
| "; | | | |
| reference | | | |
| "RFC 5246: The Transport Layer Security (TLS) | | | |
| Protocol Version 1.2"; | | | |
| } | | | |
| } | | | |
| container trusted-client-certs { | | | |
| description | | | |
| "A list of client certificates that a RESTCONF server can | | | |
| use to authenticate a RESTCONF client's certificate. A | | | |
| client's certificate is authenticated if it is an exact | | | |
| match to a configured trusted client certificate."; | | | |
| leaf-list trusted-client-cert { | | | |
| type binary; | | | |
| nacm:default-deny-write; | | | |
| description | | | |
| "The binary certificate structure, as specified by RFC | | | |
| 5246, Section 7.4.6, i.e.,: opaque ASN.1Cert<1..2^24>; | | | |
| "; | | | |
| reference | | | |
| "RFC 5246: The Transport Layer Security (TLS) | | | |
| Protocol Version 1.2"; | | | |
| } | | | |
| } | | | |
| container cert-maps { | | | |
| uses x509c2n:cert-to-name; | | | |
| description | | | |
| "The cert-maps container is used by a RESTCONF server to | | | |
| map the RESTCONF client's presented X.509 certificate to a | | | |
| RESTCONF username. If no matching and valid cert-to-name | | | |
| list entry can be found, then the RESTCONF server MUST | | | |
| close the connection, and MUST NOT accept RESTCONF | | | |
| messages over it."; | | | |
| reference | | | |
| "RFC XXXX: RESTCONF Protocol, Section 2.5"; | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
| grouping certificates-grouping { | | | |
| description | | | |
| "This grouping is used by both the listen and | | | |
| call-home containers"; | | | |
| container certificates { | | | |
| description | | | |
| "Parent container for the list of certificates."; | | | |
| leaf-list certificate { | | | |
| type string; | | | |
| min-elements 1; | | | |
| description | | | |
| "An unordered list of certificates the TLS server can pick | | | |
| from when sending its Server Certificate message. The value | | | |
| of the string is the unique identifier for a certificate | | | |
| configured on the system. How valid values are discovered | | | |
| is outside the scope of this module, but they are envisioned | | | |
| to be the keys for a list of certificates provided | | | |
| by another YANG module"; | | | |
| reference | | | |
| "RFC 5246: The TLS Protocol, Section 7.4.2"; | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
| } | | | |
| | | | |
| <CODE ENDS> | | | |
| | | | |
| 5. Security Considerations | | | |
| | | | |
| There are a number of data nodes defined in the "ietf-netconf-server" | | | |
| YANG module which are readable and/or writable that may be considered | | | |
| sensitive or vulnerable in some network environments. Write and read | | | |
| operations to these data nodes can have a negative effect on network | | | |
| operations. It is thus important to control write and read access to | | | |
| these data nodes. Below are the data nodes and their sensitivity/ | | | |
| vulnerability. | | | |
| | | | |
| netconf-server/tls/client-auth/trusted-ca-certs: | | | |
| | | | |
| o This container contains certificates that a NETCONF server is to | | | |
| use as trust anchors for authenticating X.509-based client | | | |
| certificates. Write access to this node is protected using an | | | |
| nacm:default-deny-write statement. | | | |
| | | | |
| netconf-server/tls/client-auth/trusted-client-certs: | | | |
| | | | |
| o This container contains certificates that a NETCONF server is to | | | |
| trust directly when authenticating X.509-based client | | | |
| certificates. Write access to this node is protected using an | | | |
| nacm:default-deny-write statement. | | | |
| | | | |
| restconf-server/tls/client-auth/trusted-ca-certs: | | | |
| | | | |
| o This container contains certificates that a RESTCONF server is to | | | |
| use as trust anchors for authenticating X.509-based client | | | |
| certificates. Write access to this node is protected using an | | | |
| nacm:default-deny-write statement. | | | |
| | | | |
| restconf-server/tls/client-auth/trusted-client-certs: | | | |
| | | | |
| o This container contains certificates that a RESTCONF server is to | | | |
| trust directly when authenticating X.509-based client | | | |
| certificates. Write access to this node is protected using an | | | |
| nacm:default-deny-write statement. | | | |
| | | | |
| 6. IANA Considerations | | | |
| | | | |
| This document registers two URIs in the IETF XML registry [RFC2119]. | | | |
| Following the format in [RFC3688], the following registrations are | | | |
| requested: | | | |
| | | | |
| URI: urn:ietf:params:xml:ns:yang:ietf-netconf-server | | | |
| Registrant Contact: The NETCONF WG of the IETF. | | | |
| XML: N/A, the requested URI is an XML namespace. | | | |
| | | | |
| URI: urn:ietf:params:xml:ns:yang:ietf-restconf-server | | | |
| Registrant Contact: The NETCONF WG of the IETF. | | | |
| XML: N/A, the requested URI is an XML namespace. | | | |
| | | | |
| This document registers two YANG modules in the YANG Module Names | | | |
| registry [RFC6020]. Following the format in [RFC6020], the the | | | |
| following registrations are requested: | | | |
| | | | |
| name: ietf-netconf-server | | | |
| namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-server | | | |
| prefix: ncserver | | | |
| reference: RFC VVVV | | | |
| | | | |
| name: ietf-restconf-server | | | |
| namespace: urn:ietf:params:xml:ns:yang:ietf-restconf-server | | | |
| prefix: rcserver | | | |
| reference: RFC VVVV | | | |
| | | | |
| 7. Other Considerations | | | |
| | | | |
| The YANG modules define herein do not themselves support virtual | | | |
| routing and forwarding (VRF). It is expected that external modules | | | |
| will augment in VRF designations when needed. | | | |
| | | | |
|
| 8. Acknowledgements | | The solution presented in this document defines a configurable | |
| | | keychain object, reusable groupings for SSH and TLS based servers, | |
| | | and, finally, the configurable NETCONF and RESTCONF server objects, | |
| | | which are the primary purpose for this draft. Each of these are | |
| | | defined in a distinct YANG module, thus a total of five YANG modules | |
| | | are defined in this document. The relationship between these five | |
| | | YANG modules is illustrated by the tree diagram below. | |
| | | | |
|
| The authors would like to thank for following for lively discussions | | +-------------+ | |
| on list and in the halls (ordered by last name): Andy Bierman, Martin | | |ietf-keychain| | |
| Bjorklund, Benoit Claise, Mehmet Ersue, David Lamparter, Alan Luchuk, | | +-------------+ | |
| Ladislav Lhotka, Radek Krejci, Tom Petch, Phil Shafer, and Bert | | ^ ^ | |
| Wijnen. | | | | | |
| | | <leafref> | | <leafref> | |
| | | +------------+ +------------+ | |
| | | | | | |
| | | +---------------+ +------------------+ | |
| | | |ietf-ssh-server| | ietf-tls-server | | |
| | | +---------------+ +------------------+ | |
| | | ^ ^ ^ | |
| | | | <uses> | | | |
| | | | <augments> | | | |
| | | | +--------------------+ | <augments> | |
| | | | | | | |
| | | +-------------------+ +--------------------+ | |
| | | |ietf-netconf-server| |ietf-restconf-server| | |
| | | +-------------------+ +--------------------+ | |
| | | | |
|
| Juergen Schoenwaelder and was partly funded by Flamingo, a Network of | | 4. Solution | |
| Excellence project (ICT-318488) supported by the European Commission | | | |
| under its Seventh Framework Programme. | | | |
| | | | |
|
| 9. References | | Each of the following five sections relate to one of the YANG modules | |
| | | depicted by the figure above. | |
| | | | |
|
| 9.1. Normative References | | 4.1. The Keychain Model | |
| | | | |
|
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | | The keychain model depicted in this section provides a configurable | |
| Requirement Levels", BCP 14, RFC 2119, March 1997. | | object having the following characteristics: | |
| | | | |
|
| [RFC4253] Ylonen, T. and C. Lonvick, "The Secure Shell (SSH) | | o A semi-configurable list of private keys, each with one or more | |
| Transport Layer Protocol", RFC 4253, January 2006. | | associated certificates. Though private keys can only be created | |
| | | via an RPC (see bullet #3 below), the entries of the list may be | |
| | | renamed and have certificates associated with them after creation. | |
| | | | |
|
| [RFC6020] Bjorklund, M., "YANG - A Data Modeling Language for the | | o A configurable list of lists of trust anchor certificates. This | |
| Network Configuration Protocol (NETCONF)", RFC 6020, | | enables the server to have use-specific trust anchors. For | |
| October 2010. | | instance, one list of trust anchors might be used to authenticate | |
| | | management connections (e.g., client certificate-based | |
| | | authentication for NETCONF or RESTCONF connections), and a | |
| | | different list of trust anchors might be used for when connecting | |
| | | to a specific Internet-based service (e.g., a zero touch bootstrap | |
| | | server). | |
| | | | |
|
| [RFC6187] Igoe, K. and D. Stebila, "X.509v3 Certificates for Secure | | o An RPC to request the server to generate a new private key using | |
| Shell Authentication", RFC 6187, March 2011. | | the specified algorithm and key length. | |
| | | | |
|
| [RFC6241] Enns, R., Bjorklund, M., Schoenwaelder, J., and A. | | o An RPC to generate a certificate signing request for an existing | |
| Bierman, "Network Configuration Protocol (NETCONF)", RFC | | private key, a passed subject, and an optional attributes. The | |
| 6241, June 2011. | | signed certificate returned from an external certificate authority | |
| | | (CA) can be set using a standard configuration change request | |
| | | (e.g., <edit-config>). | |
| | | | |
|
| [RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure | | 4.1.1. Tree Diagram | |
| Shell (SSH)", RFC 6242, June 2011. | | | |
| | | | |
|
| [RFC6536] Bierman, A. and M. Bjorklund, "Network Configuration | | module: ietf-keychain | |
| Protocol (NETCONF) Access Control Model", RFC 6536, March | | +--rw keychain | |
| 2012. | | +--rw private-keys | |
| | | | +--rw private-key* [name] | |
| | | | | +--rw name string | |
| | | | | +--ro algorithm? enumeration | |
| | | | | +--ro key-length? uint32 | |
| | | | | +--ro public-key? string | |
| | | | | +--rw certificates | |
| | | | | | +--rw certificate* [name] | |
| | | | | | +--rw name string | |
| | | | | | +--rw chain? binary | |
| | | | | +---x generate-certificate-signing-request | |
| | | | | +---w input | |
| | | | | | +---w subject binary | |
| | | | | | +---w attributes? binary | |
| | | | | +--ro output | |
| | | | | +--ro certificate-signing-request binary | |
| | | | +---x generate-private-key | |
| | | | +---w input | |
| | | | +---w name string | |
| | | | +---w algorithm enumeration | |
| | | | +---w key-length? uint32 | |
| | | +--rw trusted-certificates* [name] | |
| | | +--rw name string | |
| | | +--rw description? string | |
| | | +--rw trusted-certificate* [name] | |
| | | +--rw name string | |
| | | +--rw certificate? binary | |
| | | | |
|
| [RFC6991] Schoenwaelder, J., "Common YANG Data Types", RFC 6991, | | 4.1.2. Example Usage | |
| July 2013. | | | |
| | | | |
|
| [RFC7407] Bjorklund, M. and J. Schoenwaelder, "A YANG Data Model for | | The following example illustrates the "generate-private-key" RPC in | |
| SNMP Configuration", RFC 7407, December 2014. | | use with the RESTCONF protocol and JSON encoding. | |
| | | | |
|
| [RFC7589] Badra, M., Luchuk, A., and J. Schoenwaelder, "Using the | | REQUEST | |
| NETCONF Protocol over Transport Layer Security (TLS) with | | ------- | |
| Mutual X.509 Authentication", RFC 7589, June 2015. | | | |
| | | | |
|
| [draft-ietf-netconf-call-home] | | ['\' line wrapping added for formatting only] | |
| Watsen, K., "NETCONF Call Home and RESTCONF Call Home", | | | |
| draft-ieft-netconf-call-home-02 (work in progress), 2014. | | | |
| | | | |
|
| [draft-ietf-netconf-restconf] | | POST https://example.com/restconf/data/ietf-keychain:keychain/\ | |
| Bierman, A., Bjorklund, M., and K. Watsen, "RESTCONF | | private-keys/generate-private-key HTTP/1.1 | |
| Protocol", draft-ieft-netconf-restconf-04 (work in | | HOST: example.com | |
| progress), 2014. | | Content-Type: application/yang.operation+json | |
| | | | |
|
| 9.2. Informative References | | { | |
| | | "ietf-keychain:input" : { | |
| | | "name" : "ex-key-sect571r1", | |
| | | "algorithm" : "sect571r1" | |
| | | } | |
| | | } | |
| | | | |
|
| [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, | | RESPONSE | |
| January 2004. | | -------- | |
| | | | |
|
| Appendix A. Alternative solution addressing Issue #49 | | HTTP/1.1 204 No Content | |
| | | Date: Mon, 31 Oct 2015 11:01:00 GMT | |
| | | Server: example-server | |
| | | | |
|
| Option #4 for Issue #49 proposed to define configuration for a | | The following example illustrates the action statement "generate- | |
| keychain and on-going discussion proposed to create reusable | | certificate-signing-request" action in use with the NETCONF protocol. | |
| groupings for SSH/TLS servers (referencing keys and certificates held | | | |
| in the keychain) that the NETCONF/RESTCONF servers would uses. This | | | |
| relationship is illustrated by the diagram below. | | | |
| | | | |
|
| +-------------+ | | REQUEST | |
| |ietf-keychain| | | ------- | |
| +-------------+ | | | |
| ^ ^ | | | |
| | | | | | |
| <leafref> | | <leafref> | | | |
| +------------+ +------------+ | | | |
| | | | | | |
| +---------------+ +------------------+ | | | |
| |ietf-ssh-server| | ietf-tls-server | | | | |
| +---------------+ +------------------+ | | | |
| ^ ^ ^ | | | |
| | <uses> | | | | | |
| | <augments> | | | | | |
| | +--------------------+ | <augments> | | | |
| | | | | | | |
| +-------------------+ +--------------------+ | | | |
| |ietf-netconf-server| |ietf-restconf-server| | | | |
| +-------------------+ +--------------------+ | | | |
| | | | |
|
| The following sections each of the five YANG modules above. | | <rpc message-id="101" | |
| | | xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> | |
| | | <action xmlns="urn:ietf:params:xml:ns:yang:1"> | |
| | | <keychain xmlns="urn:ietf:params:xml:ns:yang:ietf-keychain"> | |
| | | <private-keys> | |
| | | <private-key> | |
| | | <name>ex-key-sect571r1</name> | |
| | | <generate-certificate-signing-request> | |
| | | <subject> | |
| | | cztvaWRoc2RmZ2tqaHNkZmdramRzZnZzZGtmam5idnNvO2R | |
| | | manZvO3NkZmJpdmhzZGZpbHVidjtvc2lkZmhidml1bHNlmO | |
| | | Z2aXNiZGZpYmhzZG87ZmJvO3NkZ25iO29pLmR6Zgo= | |
| | | </subject> | |
| | | <attributes> | |
| | | bwtakWRoc2RmZ2tqaHNkZmdramRzZnZzZGtmam5idnNvut4 | |
| | | arnZvO3NkZmJpdmhzZGZpbHVidjtvc2lkZmhidml1bHNkYm | |
| | | Z2aXNiZGZpYmhzZG87ZmJvO3NkZ25iO29pLmC6Rhp= | |
| | | </attributes> | |
| | | </generate-certificate-signing-request> | |
| | | </private-key> | |
| | | </private-keys> | |
| | | </keychain> | |
| | | </action> | |
| | | </rpc> | |
| | | | |
|
| A.1. The Keychain Model | | RESPONSE | |
| | | -------- | |
| | | | |
|
| A.1.1. Tree Diagram | | <rpc-reply message-id="101" | |
| module: ietf-keychain | | xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> | |
| +--rw keychain | | <certificate-signing-request | |
| +--rw private-keys | | xmlns="urn:ietf:params:xml:ns:yang:ietf-keychain"> | |
| | +--rw private-key* [name] | | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNrekNDQWZ5Z | |
| | +--rw name string | | 0F3SUJBZ0lKQUpRT2t3bGpNK2pjTUEwR0NTcUdTSWIzRFFFQkJRVU | |
| | +--ro algorithm? enumeration | | FNRFF4Q3pBSkJnTlYKQkFZVEFsVlRNUkF3RGdZRFZRUUtFd2RsZUd | |
| | +--ro key-length? uint32 | | GdGNHeGxNUk13RVFZRFZRUURFd3BEVWt3Z1NYTnpkV1Z5TUI0WApE | |
| | +--ro public-key? string | | diR1V4RXpBUkJnTlZCQU1UQ2tOU1RDQkpjM04xWlhJd2daOHdEUVl | |
| | +--rw certificates | | KS29aSWh2Y04KQVFFQkJRQURnWTBBTUlHSkFvR0JBTXVvZmFPNEV3 | |
| | +--rw certificate* [name] | | El1QWMrQ1RsTkNmc0d6cEw1Um5ydXZsOFRIcUJTdGZQY3N0Zk1KT1 | |
| | +--rw name string | | FaNzlnNlNWVldsMldzaHE1bUViCkJNNitGNzdjbTAvU25FcFE0TnV | |
| | +--rw chain? binary | | bXBDT2YKQWdNQkFBR2pnYXd3Z2Frd0hRWURWUjBPQkJZRUZKY1o2W | |
| +--rw trusted-certificates* [name] | | URiR0lPNDB4ajlPb3JtREdsRUNCVTFNR1FHQTFVZApJd1JkTUZ1QU | |
| +--rw name string | | ZKY1o2WURiR0lPNDB4ajlPb3JtREdsRUNCVTFvVGlrTmpBME1Rc3d | |
| +--rw trusted-certificate* [name] | | mMKTUE0R0ExVWREd0VCL3dRRUF3SUNCREFTQmdOVkhSTUJBZjhFQ0 | |
| +--rw name string | | RBR0FRSC9BZ0VBTUEwR0NTcUdTSWIzRFFFQgpCUVVBQTRHQkFMMmx | |
| +--rw certificate? binary | | rWmFGNWcyaGR6MVNhZnZPbnBneHA4eG00SHRhbStadHpLazFlS3Bx | |
| rpcs: | | TXp4YXJCbFpDSHlLCklVbC9GVzRtV1RQS1VDeEtFTE40NEY2Zmk2d | |
| +---x generate-certificate-signing-request | | c4d0tSSElkYW1WL0pGTmlQS0VXSTF4K1I1aDZmazcrQzQ1QXg1RWV | |
| | +---w input | | SWHgzZjdVM2xZTgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== | |
| | | +---w private-key? -> /keychain/private-keys/private-key/name | | </certificate-signing-request> | |
| | | +---w subject binary | | </rpc-reply> | |
| | | +---w attributes? binary | | | |
| | +--ro output | | | |
| | +--ro certificate-signing-request binary | | | |
| +---x generate-private-key | | | |
| +---w input | | | |
| +---w name string | | | |
| +---w algorithm enumeration | | | |
| +---w key-length uint32 | | | |
| | | | |
|
| A.1.2. Example Usage | | The following example illustrates what a fully configured keychain | |
| | | object might look like. The private-key shown below is consistent | |
| | | with the generate-private-key and generate-certificate-signing- | |
| | | request examples above. This example also assumes that the resulting | |
| | | CA-signed certificate has been configured back onto the server. | |
| | | Lastly, this example shows that three lists of trusted certificates | |
| | | having been configured. | |
| | | | |
| <keychain xmlns="urn:ietf:params:xml:ns:yang:ietf-keychain"> | | <keychain xmlns="urn:ietf:params:xml:ns:yang:ietf-keychain"> | |
|
| | | | |
| <!-- private keys and associated certificates --> | | <!-- private keys and associated certificates --> | |
| <private-keys> | | <private-keys> | |
| <private-key> | | <private-key> | |
|
| <name>TPM key</name> | | <name>ex-key-sect571r1</name> | |
| <algorithm>rsa</algorithm> | | <algorithm>sect571r1</algorithm> | |
| <key-length>2048</key-length> | | | |
| <public-key> | | <public-key> | |
| cztvaWRoc2RmZ2tqaHNkZmdramRzZnZzZGtmam5idnNvO2RmanZvO3NkZ | | cztvaWRoc2RmZ2tqaHNkZmdramRzZnZzZGtmam5idnNvO2RmanZvO3NkZ | |
| mJpdmhzZGZpbHVidjtvc2lkZmhidml1bHNkYmZ2aXNiZGZpYmhzZG87Zm | | mJpdmhzZGZpbHVidjtvc2lkZmhidml1bHNkYmZ2aXNiZGZpYmhzZG87Zm | |
| JvO3NkZ25iO29pLmR6Zgo= | | JvO3NkZ25iO29pLmR6Zgo= | |
| </public-key> | | </public-key> | |
| <certificates> | | <certificates> | |
| <certificate> | | <certificate> | |
|
| <name>IDevID Certificate</name> | | <name>ex-key-sect571r1-cert</name> | |
| <chain> | | <data> | |
| LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNrekNDQWZ5Z | | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNrekNDQWZ5Z | |
| 0F3SUJBZ0lKQUpRT2t3bGpNK2pjTUEwR0NTcUdTSWIzRFFFQkJRVU | | 0F3SUJBZ0lKQUpRT2t3bGpNK2pjTUEwR0NTcUdTSWIzRFFFQkJRVU | |
| FNRFF4Q3pBSkJnTlYKQkFZVEFsVlRNUkF3RGdZRFZRUUtFd2RsZUd | | FNRFF4Q3pBSkJnTlYKQkFZVEFsVlRNUkF3RGdZRFZRUUtFd2RsZUd | |
| GdGNHeGxNUk13RVFZRFZRUURFd3BEVWt3Z1NYTnpkV1Z5TUI0WApE | | GdGNHeGxNUk13RVFZRFZRUURFd3BEVWt3Z1NYTnpkV1Z5TUI0WApE | |
| diR1V4RXpBUkJnTlZCQU1UQ2tOU1RDQkpjM04xWlhJd2daOHdEUVl | | diR1V4RXpBUkJnTlZCQU1UQ2tOU1RDQkpjM04xWlhJd2daOHdEUVl | |
| KS29aSWh2Y04KQVFFQkJRQURnWTBBTUlHSkFvR0JBTXVvZmFPNEV3 | | KS29aSWh2Y04KQVFFQkJRQURnWTBBTUlHSkFvR0JBTXVvZmFPNEV3 | |
| El1QWMrQ1RsTkNmc0d6cEw1Um5ydXZsOFRIcUJTdGZQY3N0Zk1KT1 | | El1QWMrQ1RsTkNmc0d6cEw1Um5ydXZsOFRIcUJTdGZQY3N0Zk1KT1 | |
| FaNzlnNlNWVldsMldzaHE1bUViCkJNNitGNzdjbTAvU25FcFE0TnV | | FaNzlnNlNWVldsMldzaHE1bUViCkJNNitGNzdjbTAvU25FcFE0TnV | |
| bXBDT2YKQWdNQkFBR2pnYXd3Z2Frd0hRWURWUjBPQkJZRUZKY1o2W | | bXBDT2YKQWdNQkFBR2pnYXd3Z2Frd0hRWURWUjBPQkJZRUZKY1o2W | |
| URiR0lPNDB4ajlPb3JtREdsRUNCVTFNR1FHQTFVZApJd1JkTUZ1QU | | URiR0lPNDB4ajlPb3JtREdsRUNCVTFNR1FHQTFVZApJd1JkTUZ1QU | |
| ZKY1o2WURiR0lPNDB4ajlPb3JtREdsRUNCVTFvVGlrTmpBME1Rc3d | | ZKY1o2WURiR0lPNDB4ajlPb3JtREdsRUNCVTFvVGlrTmpBME1Rc3d | |
| mMKTUE0R0ExVWREd0VCL3dRRUF3SUNCREFTQmdOVkhSTUJBZjhFQ0 | | mMKTUE0R0ExVWREd0VCL3dRRUF3SUNCREFTQmdOVkhSTUJBZjhFQ0 | |
| RBR0FRSC9BZ0VBTUEwR0NTcUdTSWIzRFFFQgpCUVVBQTRHQkFMMmx | | RBR0FRSC9BZ0VBTUEwR0NTcUdTSWIzRFFFQgpCUVVBQTRHQkFMMmx | |
| rWmFGNWcyaGR6MVNhZnZPbnBneHA4eG00SHRhbStadHpLazFlS3Bx | | rWmFGNWcyaGR6MVNhZnZPbnBneHA4eG00SHRhbStadHpLazFlS3Bx | |
| TXp4YXJCbFpDSHlLCklVbC9GVzRtV1RQS1VDeEtFTE40NEY2Zmk2d | | TXp4YXJCbFpDSHlLCklVbC9GVzRtV1RQS1VDeEtFTE40NEY2Zmk2d | |
| c4d0tSSElkYW1WL0pGTmlQS0VXSTF4K1I1aDZmazcrQzQ1QXg1RWV | | c4d0tSSElkYW1WL0pGTmlQS0VXSTF4K1I1aDZmazcrQzQ1QXg1RWV | |
| SWHgzZjdVM2xZTgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== | | SWHgzZjdVM2xZTgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== | |
|
| </chain> | | </data> | |
| </certificate> | | </certificate> | |
| </certificates> | | </certificates> | |
| </private-key> | | </private-key> | |
| </private-keys> | | </private-keys> | |
| | | | |
| <!-- trusted netconf/restconf client certificates --> | | <!-- trusted netconf/restconf client certificates --> | |
| <trusted-certificates> | | <trusted-certificates> | |
|
| <name>Trusted certificates for netconf/restconf client</name> | | <name>explicitly-trusted-client-certs</name> | |
| | | <description> | |
| | | Specific client authentication certificates that are to be | |
| | | explicitly trusted NETCONF/RESTCONF clients. These are | |
| | | needed for client certificates not signed by our CA. | |
| | | </description> | |
| <trusted-certificate> | | <trusted-certificate> | |
| <name>George Jetson</name> | | <name>George Jetson</name> | |
| <certificate> | | <certificate> | |
| QmdOVkJBWVRBbFZUTVJBd0RnWURWUVFLRXdkbAplR0Z0Y0d4bE1RNHdEQ | | QmdOVkJBWVRBbFZUTVJBd0RnWURWUVFLRXdkbAplR0Z0Y0d4bE1RNHdEQ | |
| MkF6a3hqUDlVQWtHR0dvS1U1eUc1SVR0Wm0vK3B0R2FieXVDMjBRd2kvZ | | MkF6a3hqUDlVQWtHR0dvS1U1eUc1SVR0Wm0vK3B0R2FieXVDMjBRd2kvZ | |
| 25PZnpZNEhONApXY0pTaUpZK2xtYWs3RTRORUZXZS9RdGp4NUlXZmdvN2 | | 25PZnpZNEhONApXY0pTaUpZK2xtYWs3RTRORUZXZS9RdGp4NUlXZmdvN2 | |
| RV0JCU2t2MXI2SFNHeUFUVkpwSmYyOWtXbUU0NEo5akJrQmdOVkhTTUVY | | RV0JCU2t2MXI2SFNHeUFUVkpwSmYyOWtXbUU0NEo5akJrQmdOVkhTTUVY | |
| VEJiZ0JTWEdlbUEKMnhpRHVOTVkvVHFLNWd4cFJBZ1ZOYUU0cERZd05ER | | VEJiZ0JTWEdlbUEKMnhpRHVOTVkvVHFLNWd4cFJBZ1ZOYUU0cERZd05ER | |
| UxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQW9UQjJWNApZVzF3YkdVeE | | UxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQW9UQjJWNApZVzF3YkdVeE | |
| V6QVJCZ05WQkFNVENrTlNUQ0JKYzNOMVpYS0NDUUNVRHBNSll6UG8zREF | | V6QVJCZ05WQkFNVENrTlNUQ0JKYzNOMVpYS0NDUUNVRHBNSll6UG8zREF | |
| | | | |
| skipping to change at page 44, line 30 | | skipping to change at page 13, line 46 | |
| WmdsK2gyTTg3QmtGMjhWbW1CdFFVaWc3OEgrRkYyRTFwdSt4ZVRJbVFFM | | WmdsK2gyTTg3QmtGMjhWbW1CdFFVaWc3OEgrRkYyRTFwdSt4ZVRJbVFFM | |
| lLQllsdWpOcjFTMnRLR05EMUc2OVJpK2FWNGw2NTdZNCtadVJMZgpRYjk | | lLQllsdWpOcjFTMnRLR05EMUc2OVJpK2FWNGw2NTdZNCtadVJMZgpRYjk | |
| zSFNwSDdwVXBCYnA4dmtNanFtZjJma3RqZHBxeFppUUtTbndWZTF2Zwot | | zSFNwSDdwVXBCYnA4dmtNanFtZjJma3RqZHBxeFppUUtTbndWZTF2Zwot | |
| QWtUOCBDRVUUZJ0RUF== | | QWtUOCBDRVUUZJ0RUF== | |
| </certificate> | | </certificate> | |
| </trusted-certificate> | | </trusted-certificate> | |
| </trusted-certificates> | | </trusted-certificates> | |
| | | | |
| <!-- trust anchors for netconf/restconf clients --> | | <!-- trust anchors for netconf/restconf clients --> | |
| <trusted-certificates> | | <trusted-certificates> | |
|
| <name>Trust anchors for netconf/restconf clients</name> | | <name>deployment-specific-ca-certs</name> | |
| | | <description> | |
| | | Trust anchors used only to authenticate NETCONF/RESTCONF | |
| | | client connections. Since our security policy only allows | |
| | | authentication for clients having a certificate signed by | |
| | | our CA, we only configure its certificate below. | |
| | | | |
| | | </description> | |
| <trusted-certificate> | | <trusted-certificate> | |
|
| <name>Example.com</name> | | <name>ca.example.com</name> | |
| <certificate> | | <certificate> | |
| WmdsK2gyTTg3QmtGMjhWbW1CdFFVaWc3OEgrRkYyRTFwdSt4ZVRJbVFFM | | WmdsK2gyTTg3QmtGMjhWbW1CdFFVaWc3OEgrRkYyRTFwdSt4ZVRJbVFFM | |
| lLQllsdWpOcjFTMnRLR05EMUc2OVJpK2FWNGw2NTdZNCtadVJMZgpRYjk | | lLQllsdWpOcjFTMnRLR05EMUc2OVJpK2FWNGw2NTdZNCtadVJMZgpRYjk | |
| zSFNwSDdwVXBCYnA4dmtNanFtZjJma3RqZHBxeFppUUtTbndWZTF2Zwot | | zSFNwSDdwVXBCYnA4dmtNanFtZjJma3RqZHBxeFppUUtTbndWZTF2Zwot | |
| NGcEk3UE90cnNFVjRwTUNBd0VBQWFPQ0FSSXdnZ0VPCk1CMEdBMVVkRGd | | NGcEk3UE90cnNFVjRwTUNBd0VBQWFPQ0FSSXdnZ0VPCk1CMEdBMVVkRGd | |
| VEJiZ0JTWEdlbUEKMnhpRHVOTVkvVHFLNWd4cFJBZ1ZOYUU0cERZd05ER | | VEJiZ0JTWEdlbUEKMnhpRHVOTVkvVHFLNWd4cFJBZ1ZOYUU0cERZd05ER | |
| V6QVJCZ05WQkFNVENrTlNUQ0JKYzNOMVpYS0NDUUNVRHBNSll6UG8zREF | | V6QVJCZ05WQkFNVENrTlNUQ0JKYzNOMVpYS0NDUUNVRHBNSll6UG8zREF | |
| NQmdOVkhSTUJBZjhFCkFqQUFNQTRHQTFVZER3RUIvd1FFQXdJSGdEQnBC | | NQmdOVkhSTUJBZjhFCkFqQUFNQTRHQTFVZER3RUIvd1FFQXdJSGdEQnBC | |
| Z05WSFI4RVlqQmdNRjZnSXFBZ2hoNW9kSFJ3T2k4dlpYaGgKYlhCc1pTN | | Z05WSFI4RVlqQmdNRjZnSXFBZ2hoNW9kSFJ3T2k4dlpYaGgKYlhCc1pTN | |
| WpiMjB2WlhoaGJYQnNaUzVqY215aU9LUTJNRFF4Q3pBSkJnTlZCQVlUQW | | WpiMjB2WlhoaGJYQnNaUzVqY215aU9LUTJNRFF4Q3pBSkJnTlZCQVlUQW | |
| QmdOVkJBWVRBbFZUTVJBd0RnWURWUVFLRXdkbAplR0Z0Y0d4bE1RNHdEQ | | QmdOVkJBWVRBbFZUTVJBd0RnWURWUVFLRXdkbAplR0Z0Y0d4bE1RNHdEQ | |
| MkF6a3hqUDlVQWtHR0dvS1U1eUc1SVR0Wm0vK3B0R2FieXVDMjBRd2kvZ | | MkF6a3hqUDlVQWtHR0dvS1U1eUc1SVR0Wm0vK3B0R2FieXVDMjBRd2kvZ | |
| 25PZnpZNEhONApXY0pTaUpZK2xtYWs3RTRORUZXZS9RdGp4NUlXZmdvN2 | | 25PZnpZNEhONApXY0pTaUpZK2xtYWs3RTRORUZXZS9RdGp4NUlXZmdvN2 | |
| RJSUJQFRStS0Cg== | | RJSUJQFRStS0Cg== | |
| </certificate> | | </certificate> | |
| </trusted-certificate> | | </trusted-certificate> | |
| </trusted-certificates> | | </trusted-certificates> | |
| | | | |
| <!-- trust anchors for random HTTPS servers on Internet --> | | <!-- trust anchors for random HTTPS servers on Internet --> | |
| <trusted-certificates> | | <trusted-certificates> | |
|
| <name>Trust anchors for random HTTPS servers</name> | | <name>common-ca-certs</name> | |
| | | <description> | |
| | | Trusted certificates to authenticate common HTTPS servers. | |
| | | These certificates are similar to those that might be | |
| | | shipped with a web browser. | |
| | | </description> | |
| <trusted-certificate> | | <trusted-certificate> | |
|
| <name>Example.com</name> | | <name>ex-certificate-authority</name> | |
| <certificate> | | <certificate> | |
| NGcEk3UE90cnNFVjRwTUNBd0VBQWFPQ0FSSXdnZ0VPCk1CMEdBMVVkRGd | | NGcEk3UE90cnNFVjRwTUNBd0VBQWFPQ0FSSXdnZ0VPCk1CMEdBMVVkRGd | |
| VEJiZ0JTWEdlbUEKMnhpRHVOTVkvVHFLNWd4cFJBZ1ZOYUU0cERZd05ER | | VEJiZ0JTWEdlbUEKMnhpRHVOTVkvVHFLNWd4cFJBZ1ZOYUU0cERZd05ER | |
| V6QVJCZ05WQkFNVENrTlNUQ0JKYzNOMVpYS0NDUUNVRHBNSll6UG8zREF | | V6QVJCZ05WQkFNVENrTlNUQ0JKYzNOMVpYS0NDUUNVRHBNSll6UG8zREF | |
| Z05WSFI4RVlqQmdNRjZnSXFBZ2hoNW9kSFJ3T2k4dlpYaGgKYlhCc1pTN | | Z05WSFI4RVlqQmdNRjZnSXFBZ2hoNW9kSFJ3T2k4dlpYaGgKYlhCc1pTN | |
| QmdOVkJBWVRBbFZUTVJBd0RnWURWUVFLRXdkbAplR0Z0Y0d4bE1RNHdEQ | | QmdOVkJBWVRBbFZUTVJBd0RnWURWUVFLRXdkbAplR0Z0Y0d4bE1RNHdEQ | |
| MkF6a3hqUDlVQWtHR0dvS1U1eUc1SVR0Wm0vK3B0R2FieXVDMjBRd2kvZ | | MkF6a3hqUDlVQWtHR0dvS1U1eUc1SVR0Wm0vK3B0R2FieXVDMjBRd2kvZ | |
| NQmdOVkhSTUJBZjhFCkFqQUFNQTRHQTFVZER3RUIvd1FFQXdJSGdEQnBC | | NQmdOVkhSTUJBZjhFCkFqQUFNQTRHQTFVZER3RUIvd1FFQXdJSGdEQnBC | |
| WmdsK2gyTTg3QmtGMjhWbW1CdFFVaWc3OEgrRkYyRTFwdSt4ZVRJbVFFM | | WmdsK2gyTTg3QmtGMjhWbW1CdFFVaWc3OEgrRkYyRTFwdSt4ZVRJbVFFM | |
| lLQllsdWpOcjFTMnRLR05EMUc2OVJpK2FWNGw2NTdZNCtadVJMZgpRYjk | | lLQllsdWpOcjFTMnRLR05EMUc2OVJpK2FWNGw2NTdZNCtadVJMZgpRYjk | |
| zSFNwSDdwVXBCYnA4dmtNanFtZjJma3RqZHBxeFppUUtTbndWZTF2Zwot | | zSFNwSDdwVXBCYnA4dmtNanFtZjJma3RqZHBxeFppUUtTbndWZTF2Zwot | |
| 25PZnpZNEhONApXY0pTaUpZK2xtYWs3RTRORUZXZS9RdGp4NUlXZmdvN2 | | 25PZnpZNEhONApXY0pTaUpZK2xtYWs3RTRORUZXZS9RdGp4NUlXZmdvN2 | |
| WpiMjB2WlhoaGJYQnNaUzVqY215aU9L= | | WpiMjB2WlhoaGJYQnNaUzVqY215aU9L= | |
| </certificate> | | </certificate> | |
| </trusted-certificate> | | </trusted-certificate> | |
| </trusted-certificates> | | </trusted-certificates> | |
| | | | |
| </keychain> | | </keychain> | |
| | | | |
|
| A.1.3. YANG Model | | 4.1.3. YANG Model | |
| | | | |
| <CODE BEGINS> file "ietf-keychain@2015-07-06.yang" | | | |
| | | | |
|
| module ietf-keychain { | | <CODE BEGINS> file "ietf-keychain@2015-10-09.yang" | |
| yang-version 1.1; | | | |
| | | | |
|
| namespace "urn:ietf:params:xml:ns:yang:ietf-keychain"; | | module ietf-keychain { | |
| prefix "kc"; | | yang-version 1.1; | |
| | | | |
|
| organization | | namespace "urn:ietf:params:xml:ns:yang:ietf-keychain"; | |
| "IETF NETCONF (Network Configuration) Working Group"; | | prefix "kc"; | |
| | | | |
|
| contact | | organization | |
| "WG Web: <http://tools.ietf.org/wg/netconf/> | | "IETF NETCONF (Network Configuration) Working Group"; | |
| WG List: <mailto:netconf@ietf.org> | | | |
| | | | |
|
| WG Chair: Mehmet Ersue | | contact | |
| <mailto:mehmet.ersue@nsn.com> | | "WG Web: <http://tools.ietf.org/wg/netconf/> | |
| | | WG List: <mailto:netconf@ietf.org> | |
| | | | |
|
| WG Chair: Mahesh Jethanandani | | WG Chair: Mehmet Ersue | |
| <mailto:mjethanandani@gmail.com> | | <mailto:mehmet.ersue@nsn.com> | |
| | | | |
|
| Editor: Kent Watsen | | WG Chair: Mahesh Jethanandani | |
| <mailto:kwatsen@juniper.net>"; | | <mailto:mjethanandani@gmail.com> | |
| | | | |
|
| description | | Editor: Kent Watsen | |
| "This module defines a keychain to centralize management of | | <mailto:kwatsen@juniper.net>"; | |
| security credentials. | | | |
| | | | |
|
| Copyright (c) 2014 IETF Trust and the persons identified as | | description | |
| authors of the code. All rights reserved. | | "This module defines a keychain to centralize management of | |
| | | security credentials. | |
| | | | |
|
| Redistribution and use in source and binary forms, with or | | Copyright (c) 2014 IETF Trust and the persons identified as | |
| without modification, is permitted pursuant to, and subject | | authors of the code. All rights reserved. | |
| 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 | | | |
| (http://trustee.ietf.org/license-info). | | | |
| | | | |
|
| This version of this YANG module is part of RFC VVVV; see | | Redistribution and use in source and binary forms, with or | |
| the RFC itself for full legal notices."; | | 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 | |
| | | (http://trustee.ietf.org/license-info). | |
| | | | |
|
| revision "2015-07-06" { | | This version of this YANG module is part of RFC VVVV; see | |
| description | | the RFC itself for full legal notices."; | |
| "Initial version"; | | | |
| reference | | | |
| "RFC VVVV: NETCONF Server and RESTCONF Server Configuration | | | |
| Models"; | | | |
| } | | | |
| | | | |
|
| container keychain { | | revision "2015-10-09" { | |
| description | | description | |
| "A list of private-keys and their associated certificates, as | | "Initial version"; | |
| well as lists of trusted certificates for client certificate | | reference | |
| authentication. RPCs are provided to generate a new private | | "RFC VVVV: NETCONF Server and RESTCONF Server Configuration | |
| key and to generate a certificate signing requests."; | | Models"; | |
| | | } | |
| | | | |
|
| container private-keys { | | container keychain { | |
| description | | description | |
|
| "A list of private key maintained by the keychain."; | | "A list of private-keys and their associated certificates, as | |
| list private-key { | | well as lists of trusted certificates for client certificate | |
| key name; | | authentication. RPCs are provided to generate a new private | |
| description | | key and to generate a certificate signing requests."; | |
| "A private key."; | | | |
| leaf name { | | | |
| type string; | | | |
| description | | | |
| "An arbitrary name for the private key."; | | | |
| } | | | |
| leaf algorithm { | | | |
| type enumeration { | | | |
| enum rsa { description "TBD"; } | | | |
| enum dsa { description "TBD"; } | | | |
| enum secp192r1 { description "TBD"; } | | | |
| enum sect163k1 { description "TBD"; } | | | |
| enum sect163r2 { description "TBD"; } | | | |
| enum secp224r1 { description "TBD"; } | | | |
| enum sect233k1 { description "TBD"; } | | | |
| enum sect233r1 { description "TBD"; } | | | |
| enum secp256r1 { description "TBD"; } | | | |
| enum sect283k1 { description "TBD"; } | | | |
| enum sect283r1 { description "TBD"; } | | | |
| enum secp384r1 { description "TBD"; } | | | |
| enum sect409k1 { description "TBD"; } | | | |
| enum sect409r1 { description "TBD"; } | | | |
| enum secp521r1 { description "TBD"; } | | | |
| enum sect571k1 { description "TBD"; } | | | |
| enum sect571r1 { description "TBD"; } | | | |
| } | | | |
| config false; | | | |
| description | | | |
| "The algorithm used by the private key."; | | | |
| } | | | |
| leaf key-length { | | | |
| type uint32; | | | |
| config false; | | | |
| description | | | |
| "The key-length used by the private key."; | | | |
| } | | | |
| leaf public-key { | | | |
| type string; | | | |
| config false; | | | |
| description | | | |
| "The public-key matching the private key."; | | | |
| } | | | |
| container certificates { | | | |
| list certificate { | | | |
| key name; | | | |
| description | | | |
| "A certificate for this public key."; | | | |
| leaf name { | | | |
| type string; | | | |
| description | | | |
| "An arbitrary name for the certificate."; | | | |
| } | | | |
| leaf chain { | | | |
| type binary; | | | |
| description | | | |
| "The certificate itself, as well as an ordered | | | |
| sequence of intermediate certificates leading | | | |
| to a trust anchor, as specified by RFC 5246, | | | |
| Section 7.4.2."; | | | |
| reference | | | |
| "RFC 5246: The Transport Layer Security (TLS) | | | |
| Protocol Version 1.2"; | | | |
| } | | | |
| } | | | |
| description | | | |
| "A list of certificates for this public key."; | | | |
| } | | | |
| action generate-certificate-signing-request { | | | |
| description | | | |
| "Generates a certificate signing request structure for | | | |
| the associated private key using the passed subject | | | |
| and attribute values."; | | | |
| input { | | | |
| leaf subject { | | | |
| type binary; | | | |
| mandatory true; | | | |
| description | | | |
| "The 'subject' field in the CertificationRequestInfo | | | |
| defined in RFC 2986, Section 4.1."; | | | |
| reference | | | |
| "RFC 2986: PKCS #10: Certification Request Syntax | | | |
| Specification Version 1.7"; | | | |
| } | | | |
| leaf attributes { | | | |
| type binary; | | | |
| description | | | |
| "The 'attributes' field in the CertificationRequestInfo | | | |
| defined in RFC 2986, Section 4.1."; | | | |
| reference | | | |
| "RFC 2986: PKCS #10: Certification Request Syntax | | | |
| Specification Version 1.7"; | | | |
| } | | | |
| } | | | |
| output { | | | |
| leaf certificate-signing-request { | | | |
| type binary; | | | |
| mandatory true; | | | |
| description | | | |
| "The CertificationRequestInfo structure as specified | | | |
| by RFC 2986, Section 4.1."; | | | |
| reference | | | |
| "RFC 2986: PKCS #10: Certification Request Syntax | | | |
| Specification Version 1.7"; | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
|
| } | | container private-keys { | |
| action generate-private-key { | | | |
| description | | description | |
|
| "Generates a private key using the specified algorithm and | | "A list of private key maintained by the keychain."; | |
| key length."; | | list private-key { | |
| input { | | key name; | |
| | | description | |
| | | "A private key."; | |
| leaf name { | | leaf name { | |
| type string; | | type string; | |
|
| mandatory true; | | | |
| description | | description | |
|
| "The name this private-key should have when listed in | | "An arbitrary name for the private key."; | |
| /keychain/private-keys/private-key. As such, the | | | |
| passed value must not match any existing 'name' value."; | | | |
| } | | } | |
| leaf algorithm { | | leaf algorithm { | |
| type enumeration { | | type enumeration { | |
| enum rsa { description "TBD"; } | | enum rsa { description "TBD"; } | |
| enum dsa { description "TBD"; } | | enum dsa { description "TBD"; } | |
| enum secp192r1 { description "TBD"; } | | enum secp192r1 { description "TBD"; } | |
| enum sect163k1 { description "TBD"; } | | enum sect163k1 { description "TBD"; } | |
| enum sect163r2 { description "TBD"; } | | enum sect163r2 { description "TBD"; } | |
| enum secp224r1 { description "TBD"; } | | enum secp224r1 { description "TBD"; } | |
| enum sect233k1 { description "TBD"; } | | enum sect233k1 { description "TBD"; } | |
| | | | |
| skipping to change at page 49, line 39 | | skipping to change at page 16, line 50 | |
| enum secp256r1 { description "TBD"; } | | enum secp256r1 { description "TBD"; } | |
| enum sect283k1 { description "TBD"; } | | enum sect283k1 { description "TBD"; } | |
| enum sect283r1 { description "TBD"; } | | enum sect283r1 { description "TBD"; } | |
| enum secp384r1 { description "TBD"; } | | enum secp384r1 { description "TBD"; } | |
| enum sect409k1 { description "TBD"; } | | enum sect409k1 { description "TBD"; } | |
| enum sect409r1 { description "TBD"; } | | enum sect409r1 { description "TBD"; } | |
| enum secp521r1 { description "TBD"; } | | enum secp521r1 { description "TBD"; } | |
| enum sect571k1 { description "TBD"; } | | enum sect571k1 { description "TBD"; } | |
| enum sect571r1 { description "TBD"; } | | enum sect571r1 { description "TBD"; } | |
| } | | } | |
|
| mandatory true; | | config false; | |
| description | | description | |
|
| "The algorithm to be used."; | | "The algorithm used by the private key."; | |
| } | | } | |
| leaf key-length { | | leaf key-length { | |
| type uint32; | | type uint32; | |
|
| mandatory true; | | config false; | |
| description | | description | |
|
| "The key length to be used."; | | "The key-length used by the private key."; | |
| | | } | |
| | | leaf public-key { | |
| | | type string; | |
| | | config false; | |
| | | description | |
| | | "The public-key matching the private key."; | |
| | | } | |
| | | container certificates { | |
| | | list certificate { | |
| | | key name; | |
| | | description | |
| | | "A certificate for this public key."; | |
| | | leaf name { | |
| | | type string; | |
| | | description | |
| | | "An arbitrary name for the certificate."; | |
| | | } | |
| | | leaf chain { | |
| | | type binary; | |
| | | description | |
| | | "The certificate itself, as well as an ordered | |
| | | sequence of intermediate certificates leading | |
| | | to a trust anchor, as specified by RFC 5246, | |
| | | Section 7.4.2."; | |
| | | reference | |
| | | "RFC 5246: The Transport Layer Security (TLS) | |
| | | Protocol Version 1.2"; | |
| | | } | |
| | | } | |
| | | description | |
| | | "A list of certificates for this public key."; | |
| | | } | |
| | | action generate-certificate-signing-request { | |
| | | description | |
| | | "Generates a certificate signing request structure for | |
| | | the associated private key using the passed subject | |
| | | and attribute values."; | |
| | | input { | |
| | | leaf subject { | |
| | | type binary; | |
| | | mandatory true; | |
| | | description | |
| | | "The distinguished name of the certificate subject | |
| | | (the entity whose public key is to be certified). | |
| | | This field is encoded the same as the 'subject' | |
| | | field in the CertificationRequestInfo type defined | |
| | | in RFC 2986, Section 4.1."; | |
| | | reference | |
| | | "RFC 2986: PKCS #10: Certification Request Syntax | |
| | | Specification Version 1.7"; | |
| | | } | |
| | | leaf attributes { | |
| | | type binary; | |
| | | description | |
| | | "A collection of attributes providing additional | |
| | | information about the subject of the certificate. | |
| | | This field is encoded the same as the 'attributes' | |
| | | field in the CertificationRequestInfo type defined | |
| | | in RFC 2986, Section 4.1."; | |
| | | reference | |
| | | "RFC 2986: PKCS #10: Certification Request Syntax | |
| | | Specification Version 1.7"; | |
| | | } | |
| | | } | |
| | | output { | |
| | | leaf certificate-signing-request { | |
| | | type binary; | |
| | | mandatory true; | |
| | | description | |
| | | "The certificate signing request to be signed by | |
| | | a certificate authority. This field is encoded | |
| | | as the CertificationRequest type defined in | |
| | | RFC 2986, Section 4.2."; | |
| | | reference | |
| | | "RFC 2986: PKCS #10: Certification Request Syntax | |
| | | Specification Version 1.7"; | |
| | | } | |
| | | } | |
| | | } | |
| | | } | |
| | | action generate-private-key { | |
| | | description | |
| | | "Generates a private key using the specified algorithm and | |
| | | key length."; | |
| | | input { | |
| | | leaf name { | |
| | | type string; | |
| | | mandatory true; | |
| | | description | |
| | | "The name this private-key should have when listed | |
| | | in /keychain/private-keys. As such, the passed | |
| | | value must not match any existing 'name' value."; | |
| | | } | |
| | | leaf algorithm { | |
| | | type enumeration { | |
| | | enum rsa { description "TBD"; } | |
| | | enum dsa { description "TBD"; } | |
| | | enum secp192r1 { description "TBD"; } | |
| | | enum sect163k1 { description "TBD"; } | |
| | | enum sect163r2 { description "TBD"; } | |
| | | enum secp224r1 { description "TBD"; } | |
| | | enum sect233k1 { description "TBD"; } | |
| | | enum sect233r1 { description "TBD"; } | |
| | | enum secp256r1 { description "TBD"; } | |
| | | enum sect283k1 { description "TBD"; } | |
| | | enum sect283r1 { description "TBD"; } | |
| | | enum secp384r1 { description "TBD"; } | |
| | | enum sect409k1 { description "TBD"; } | |
| | | enum sect409r1 { description "TBD"; } | |
| | | enum secp521r1 { description "TBD"; } | |
| | | enum sect571k1 { description "TBD"; } | |
| | | enum sect571r1 { description "TBD"; } | |
| | | } | |
| | | mandatory true; | |
| | | description | |
| | | "The algorithm to be used."; | |
| | | } | |
| | | leaf key-length { | |
| | | type uint32; | |
| | | description | |
| | | "For algorithms that need a key length specified | |
| | | when generating the key."; | |
| | | } | |
| } | | } | |
| } | | } | |
| } | | } | |
|
| } | | | |
| list trusted-certificates { | | list trusted-certificates { | |
| key name; | | | |
| description | | | |
| "A list of lists of trusted certificates."; | | | |
| leaf name { | | | |
| type string; | | | |
| description | | | |
| "An arbitrary name for this list of trusted certificates."; | | | |
| } | | | |
| list trusted-certificate { | | | |
| key name; | | key name; | |
| description | | description | |
|
| "A list of trusted certificates for a specific use."; | | "A list of lists of trusted certificates."; | |
| leaf name { | | leaf name { | |
| type string; | | type string; | |
| description | | description | |
|
| "An arbitrary name for this trusted certificate."; | | "An arbitrary name for this list of trusted | |
| | | certificates."; | |
| } | | } | |
|
| leaf certificate { | | leaf description { | |
| type binary; | | type string; | |
| description | | description | |
|
| "The binary certificate structure as specified by RFC | | "An arbitrary description for this list of trusted | |
| 5246, Section 7.4.6, i.e.,: opaque ASN.1Cert<1..2^24>; | | certificates."; | |
| "; | | | |
| reference | | | |
| "RFC 5246: The Transport Layer Security (TLS) | | | |
| Protocol Version 1.2"; | | | |
| } | | } | |
|
| } | | list trusted-certificate { | |
| } | | key name; | |
| } | | description | |
| | | "A list of trusted certificates for a specific use."; | |
| rpc generate-certificate-signing-request { | | leaf name { | |
| description | | type string; | |
| "Generates a certificate signing request structure for | | description | |
| the specified private key using the passed subject | | "An arbitrary name for this trusted certificate."; | |
| and attribute values."; | | } | |
| input { | | leaf certificate { | |
| leaf private-key { | | type binary; | |
| type leafref { | | description | |
| path "/keychain/private-keys/private-key/name"; | | "The binary certificate structure as specified by RFC | |
| | | 5246, Section 7.4.6, i.e.,: opaque ASN.1Cert<1..2^24>; | |
| | | "; | |
| | | reference | |
| | | "RFC 5246: The Transport Layer Security (TLS) | |
| | | Protocol Version 1.2"; | |
| | | } | |
| } | | } | |
|
| description | | | |
| "The private key to generate the certificate signing | | | |
| request for."; | | | |
| } | | | |
| leaf subject { | | | |
| type binary; | | | |
| mandatory true; | | | |
| description | | | |
| "The 'subject' field in the CertificationRequestInfo | | | |
| defined in RFC 2986, Section 4.1."; | | | |
| reference | | | |
| "RFC 2986: PKCS #10: Certification Request Syntax | | | |
| Specification Version 1.7"; | | | |
| } | | | |
| leaf attributes { | | | |
| type binary; | | | |
| description | | | |
| "The 'attributes' field in the CertificationRequestInfo | | | |
| defined in RFC 2986, Section 4.1."; | | | |
| reference | | | |
| "RFC 2986: PKCS #10: Certification Request Syntax | | | |
| Specification Version 1.7"; | | | |
| } | | | |
| } | | | |
| output { | | | |
| leaf certificate-signing-request { | | | |
| type binary; | | | |
| mandatory true; | | | |
| description | | | |
| "The CertificationRequestInfo structure as specified | | | |
| by RFC 2986, Section 4.1."; | | | |
| reference | | | |
| "RFC 2986: PKCS #10: Certification Request Syntax | | | |
| Specification Version 1.7"; | | | |
| } | | } | |
| } | | } | |
| } | | } | |
| | | | |
|
| rpc generate-private-key { | | <CODE ENDS> | |
| description | | | |
| "Generates a private key using the specified algorithm and | | | |
| key length."; | | | |
| input { | | | |
| leaf name { | | | |
| type string; | | | |
| mandatory true; | | | |
| description | | | |
| "The name this private-key should have when listed in | | | |
| /keychain/private-keys/private-key. As such, the | | | |
| passed value must not match any existing 'name' value."; | | | |
| } | | | |
| leaf algorithm { | | | |
| type enumeration { | | | |
| enum rsa { description "TBD"; } | | | |
| enum dsa { description "TBD"; } | | | |
| enum secp192r1 { description "TBD"; } | | | |
| enum sect163k1 { description "TBD"; } | | | |
| enum sect163r2 { description "TBD"; } | | | |
| enum secp224r1 { description "TBD"; } | | | |
| enum sect233k1 { description "TBD"; } | | | |
| enum sect233r1 { description "TBD"; } | | | |
| enum secp256r1 { description "TBD"; } | | | |
| enum sect283k1 { description "TBD"; } | | | |
| enum sect283r1 { description "TBD"; } | | | |
| enum secp384r1 { description "TBD"; } | | | |
| enum sect409k1 { description "TBD"; } | | | |
| enum sect409r1 { description "TBD"; } | | | |
| enum secp521r1 { description "TBD"; } | | | |
| enum sect571k1 { description "TBD"; } | | | |
| enum sect571r1 { description "TBD"; } | | | |
| } | | | |
| mandatory true; | | | |
| description | | | |
| "The algorithm to be used."; | | | |
| } | | | |
| leaf key-length { | | | |
| type uint32; | | | |
| mandatory true; | | | |
| description | | | |
| "The key length to be used."; | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
|
| <CODE ENDS> | | 4.2. The SSH Server Model | |
| | | | |
|
| A.2. The SSH Server Model | | The SSH Server model presented in this section presents two YANG | |
| | | groupings, one for a server that opens a socket to accept TCP | |
| | | connections on, and another for a server that has had the TCP | |
| | | connection opened for it already (e.g., inetd). | |
| | | | |
|
| A.2.1. Tree Diagram | | The SSH Server model (like the TLS Server model presented below) is | |
| | | provided as a grouping so that it can be used in different contexts. | |
| | | For instance, the NETCONF Server model presented in Section 4.4 uses | |
| | | one grouping to configure a NETCONF server listening for connections | |
| | | and the other grouping to configure NETCONF call home. | |
| | | | |
|
| The following tree diagram is faked, as a module having only a | | A shared characteristic between both groupings is the ability to | |
| grouping in it has no tree diagram. However, for illustrative | | configure which host key is presented to clients, the private key for | |
| purposes, a container has been added as nothing more than a "uses" | | which is held in the keychain configuration presented before. | |
| statement of the grouping. | | Another shared characteristic is the ability to configure which | |
| | | trusted CA or client certificates the server should be used to | |
| | | authenticate clients when using X.509 based client certificates | |
| | | [RFC6187]. | |
| | | | |
|
| module: ietf-ssh-server | | 4.2.1. Tree Diagram | |
| +--rw fake-ssh-server | | | |
| +--rw host-keys | | | |
| | +--rw host-key* [name] | | | |
| | +--rw name string | | | |
| | +--rw (type)? | | | |
| | +--:(public-key) | | | |
| | | +--rw public-key? -> /kc:keychain/private-keys/private-key/name | | | |
| | +--:(certificate) | | | |
| | +--rw certificate? -> /kc:keychain/private-keys/private-key/certificates/certificate/name {ssh-x509-certs}? | | | |
| +--rw client-cert-auth {ssh-x509-certs}? | | | |
| +--rw trusted-ca-certs? -> /kc:keychain/trusted-certificates/name | | | |
| +--rw trusted-client-certs? -> /kc:keychain/trusted-certificates/name | | | |
| | | | |
|
| A.2.2. Example Usage | | The following tree diagram represents the data model for the grouping | |
| | | used to configure an SSH server to listen for TCP connections. The | |
| | | tree diagram for the other grouping is not provided, but it is the | |
| | | same except without the "address" and "port" fields. | |
| | | | |
|
| <fake-ssh-server xmlns="urn:ietf:params:xml:ns:yang:ietf-ssh-server"> | | NOTE: the diagram below shows "listening-ssh-server" as a YANG | |
| | | container (not a grouping). This temporary container was created | |
| | | only to enable the `pyang` tool to output the tree diagram, as | |
| | | groupings by themselves have no protocol accessible nodes, and hence | |
| | | `pyang` would output an empty tree diagram. | |
| | | | |
| | | module: ietf-ssh-server | |
| | | +--rw listening-ssh-server | |
| | | +--rw address? inet:ip-address | |
| | | +--rw port inet:port-number | |
| | | +--rw host-keys | |
| | | | +--rw host-key* [name] | |
| | | | +--rw name string | |
| | | | +--rw (type)? | |
| | | | +--:(public-key) | |
| | | | | +--rw public-key? -> /kc:keychain/private-keys/pri | |
| | | vate-key/name | |
| | | | +--:(certificate) | |
| | | | +--rw certificate? -> /kc:keychain/private-keys/pri | |
| | | vate-key/certificates/certificate/name {ssh-x509-certs}? | |
| | | +--rw client-cert-auth {ssh-x509-certs}? | |
| | | +--rw trusted-ca-certs? -> /kc:keychain/trusted-certific | |
| | | ates/name | |
| | | +--rw trusted-client-certs? -> /kc:keychain/trusted-certific | |
| | | ates/name | |
| | | | |
| | | 4.2.2. Example Usage | |
| | | | |
| | | This section shows how it would appear if the temporary listening- | |
| | | ssh-server container just mentioned above were populated with some | |
| | | data. This example is consistent with the examples presented earlier | |
| | | in this document. | |
| | | | |
| | | <listening-ssh-server | |
| | | xmlns="urn:ietf:params:xml:ns:yang:ietf-ssh-server"> | |
| | | <port>830</port> | |
| <host-keys> | | <host-keys> | |
| <host-key> | | <host-key> | |
|
| <name>IDevID</name> | | <name>deployment-specific-certificate</name> | |
| <certificate> | | <certificate>ex-key-sect571r1-cert</certificate> | |
| IDevID Certificate | | | |
| </certificate> | | | |
| </host-key> | | </host-key> | |
| </host-keys> | | </host-keys> | |
| </certificates> | | </certificates> | |
| <client-cert-auth> | | <client-cert-auth> | |
| <trusted-ca-certs> | | <trusted-ca-certs> | |
|
| Trusted certificates for netconf/restconf clients | | deployment-specific-ca-certs | |
| </trusted-ca-certs> | | </trusted-ca-certs> | |
| <trusted-client-certs> | | <trusted-client-certs> | |
|
| Trust anchors for netconf/restconf clients | | explicitly-trusted-client-certs | |
| </trusted-client-certs> | | </trusted-client-certs> | |
| </client-cert-auth> | | </client-cert-auth> | |
|
| </fake-ssh-server> | | </listening-ssh-server> | |
| | | | |
|
| A.2.3. YANG Model | | 4.2.3. YANG Model | |
| | | | |
|
| <CODE BEGINS> file "ietf-ssh-server@2015-07-06.yang" | | <CODE BEGINS> file "ietf-ssh-server@2015-10-09.yang" | |
| | | | |
|
| module ietf-ssh-server { | | module ietf-ssh-server { | |
| yang-version 1.1; | | yang-version 1.1; | |
| | | | |
|
| namespace "urn:ietf:params:xml:ns:yang:ietf-ssh-server"; | | namespace "urn:ietf:params:xml:ns:yang:ietf-ssh-server"; | |
| prefix "ts"; | | prefix "ts"; | |
| import ietf-keychain { | | | |
| prefix kc; // RFC VVVV | | | |
| } | | | |
| | | | |
|
| organization | | import ietf-inet-types { // RFC 6991 | |
| "IETF NETCONF (Network Configuration) Working Group"; | | prefix inet; | |
| | | } | |
| | | import ietf-keychain { | |
| | | prefix kc; // RFC VVVV | |
| | | revision-date 2015-10-09; | |
| | | } | |
| | | | |
|
| contact | | organization | |
| "WG Web: <http://tools.ietf.org/wg/netconf/> | | "IETF NETCONF (Network Configuration) Working Group"; | |
| WG List: <mailto:netconf@ietf.org> | | | |
| | | | |
|
| WG Chair: Mehmet Ersue | | contact | |
| <mailto:mehmet.ersue@nsn.com> | | "WG Web: <http://tools.ietf.org/wg/netconf/> | |
| | | WG List: <mailto:netconf@ietf.org> | |
| | | | |
|
| WG Chair: Mahesh Jethanandani | | WG Chair: Mehmet Ersue | |
| <mailto:mjethanandani@gmail.com> | | <mailto:mehmet.ersue@nsn.com> | |
| | | | |
|
| Editor: Kent Watsen | | WG Chair: Mahesh Jethanandani | |
| <mailto:kwatsen@juniper.net>"; | | <mailto:mjethanandani@gmail.com> | |
| | | | |
|
| description | | Editor: Kent Watsen | |
| "This module defines a reusable grouping for a SSH server that | | <mailto:kwatsen@juniper.net>"; | |
| can be used as a basis for specific SSH server instances. | | | |
| | | | |
|
| Copyright (c) 2014 IETF Trust and the persons identified as | | description | |
| authors of the code. All rights reserved. | | "This module defines a reusable grouping for a SSH server that | |
| | | can be used as a basis for specific SSH server instances. | |
| | | | |
|
| Redistribution and use in source and binary forms, with or | | Copyright (c) 2014 IETF Trust and the persons identified as | |
| without modification, is permitted pursuant to, and subject | | authors of the code. All rights reserved. | |
| 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 | | | |
| (http://trustee.ietf.org/license-info). | | | |
| | | | |
|
| This version of this YANG module is part of RFC VVVV; see | | Redistribution and use in source and binary forms, with or | |
| the RFC itself for full legal notices."; | | 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 | |
| | | (http://trustee.ietf.org/license-info). | |
| | | | |
|
| revision "2015-07-06" { | | This version of this YANG module is part of RFC VVVV; see | |
| description | | the RFC itself for full legal notices."; | |
| "Initial version"; | | | |
| reference | | | |
| "RFC VVVV: NETCONF Server and RESTCONF Server Configuration | | | |
| Models"; | | | |
| } | | | |
| | | | |
|
| // features | | revision "2015-10-09" { | |
| feature ssh-x509-certs { | | description | |
| description | | "Initial version"; | |
| "The ssh-x509-certs feature indicates that the NETCONF server | | reference | |
| supports RFC 6187"; | | "RFC VVVV: NETCONF Server and RESTCONF Server Configuration | |
| reference | | Models"; | |
| "RFC 6187: X.509v3 Certificates for Secure Shell Authentication"; | | } | |
| } | | | |
| | | | |
|
| // grouping | | // features | |
| grouping ssh-server-grouping { | | feature ssh-x509-certs { | |
| description | | description | |
| "A reusable grouping for a SSH server that can be used as a | | "The ssh-x509-certs feature indicates that the NETCONF | |
| basis for specific SSH server instances."; | | server supports RFC 6187"; | |
| | | reference | |
| | | "RFC 6187: X.509v3 Certificates for Secure Shell | |
| | | Authentication"; | |
| | | } | |
| | | | |
|
| container host-keys { | | // grouping | |
| description | | grouping non-listening-ssh-server-grouping { | |
| "The list of host-keys the SSH server will present when | | description | |
| establishing a SSH connection."; | | "A reusable grouping for a SSH server that can be used as a | |
| list host-key { | | basis for specific SSH server instances."; | |
| key name; | | | |
| min-elements 1; | | | |
| ordered-by user; | | | |
| description | | | |
| "An ordered list of hostkeys the SSH server advertises | | | |
| when sending its ??? message."; | | | |
| reference | | | |
| "RFC ????: ..."; | | | |
| leaf name { | | | |
| type string; | | | |
| mandatory true; | | | |
| description | | | |
| "An arbitrary name for this host-key"; | | | |
| } | | | |
| choice type { | | | |
| leaf public-key { | | | |
| type leafref { | | | |
| path "/kc:keychain/kc:private-keys/kc:private-key/kc:name"; | | | |
| } | | | |
| description | | | |
| "The name of a private-key in the keychain."; | | | |
| } | | | |
| leaf certificate { | | | |
| if-feature ssh-x509-certs; | | | |
| type leafref { | | | |
| path "/kc:keychain/kc:private-keys/kc:private-key/kc:certificates/kc:certificate/kc:name"; | | | |
| } | | | |
| description | | | |
| "The name of a certificate in the keychain."; | | | |
| } | | | |
| | | | |
|
| } | | container host-keys { | |
| } | | description | |
| } | | "The list of host-keys the SSH server will present when | |
| | | establishing a SSH connection."; | |
| | | list host-key { | |
| | | key name; | |
| | | min-elements 1; | |
| | | ordered-by user; | |
| | | description | |
| | | "An ordered list of host keys the SSH server advertises | |
| | | when sending its ??? message."; | |
| | | reference | |
| | | "RFC ????: ..."; | |
| | | leaf name { | |
| | | type string; | |
| | | mandatory true; | |
| | | description | |
| | | "An arbitrary name for this host-key"; | |
| | | } | |
| | | choice type { | |
| | | description | |
| | | "The type of host key being specified"; | |
| | | leaf public-key { | |
| | | type leafref { | |
| | | path "/kc:keychain/kc:private-keys/kc:private-key/" | |
| | | + "kc:name"; | |
| | | } | |
| | | description | |
| | | "The name of a private-key in the keychain."; | |
| | | } | |
| | | leaf certificate { | |
| | | if-feature ssh-x509-certs; | |
| | | type leafref { | |
| | | path "/kc:keychain/kc:private-keys/kc:private-key/" | |
| | | + "kc:certificates/kc:certificate/kc:name"; | |
| | | } | |
| | | description | |
| | | "The name of a certificate in the keychain."; | |
| | | } | |
| | | } | |
| | | } | |
| | | } | |
| | | | |
|
| container client-cert-auth { | | container client-cert-auth { | |
| if-feature ssh-x509-certs; | | if-feature ssh-x509-certs; | |
| description | | description | |
| "A reference to a list of trusted certificate authority (CA) | | "A reference to a list of trusted certificate authority (CA) | |
| certificates and a reference to a list of trusted client | | certificates and a reference to a list of trusted client | |
| certificates."; | | certificates."; | |
| leaf trusted-ca-certs { | | leaf trusted-ca-certs { | |
| type leafref { | | type leafref { | |
| path "/kc:keychain/kc:trusted-certificates/kc:name"; | | path "/kc:keychain/kc:trusted-certificates/kc:name"; | |
| } | | } | |
| description | | description | |
| "A reference to a list of certificate authority (CA) | | "A reference to a list of certificate authority (CA) | |
| certificates used by the SSH server to authenticate | | certificates used by the SSH server to authenticate | |
| SSH client certificates."; | | SSH client certificates."; | |
| } | | } | |
| | | | |
|
| leaf trusted-client-certs { | | leaf trusted-client-certs { | |
| type leafref { | | type leafref { | |
| path "/kc:keychain/kc:trusted-certificates/kc:name"; | | path "/kc:keychain/kc:trusted-certificates/kc:name"; | |
| } | | } | |
| description | | description | |
| "A reference to a list of client certificates used by | | "A reference to a list of client certificates used by | |
| the SSH server to authenticate SSH client certificates. | | the SSH server to authenticate SSH client certificates. | |
| A clients certificate is authenticated if it is an | | A clients certificate is authenticated if it is an | |
| exact match to a configured trusted client certificate."; | | exact match to a configured trusted client certificate."; | |
| } | | } | |
| } | | } | |
| } | | } | |
| } | | | |
| | | | |
|
| <CODE ENDS> | | grouping listening-ssh-server-grouping { | |
| | | description | |
| | | "A reusable grouping for a SSH server that can be used as a | |
| | | basis for specific SSH server instances."; | |
| | | leaf address { | |
| | | type inet:ip-address; | |
| | | description | |
| | | "The IP address of the interface to listen on. The SSH | |
| | | server will listen on all interfaces if no value is | |
| | | specified."; | |
| | | } | |
| | | leaf port { | |
| | | type inet:port-number; | |
| | | mandatory true; // will a default augmented in work? | |
| | | description | |
| | | "The local port number on this interface the SSH server | |
| | | listens on."; | |
| | | } | |
| | | uses non-listening-ssh-server-grouping; | |
| | | } | |
| | | | |
|
| A.3. The TLS Server Model | | // RFC Editor: please remove the following container block | |
| | | // when publishing this document as an RFC. | |
| | | | |
|
| A.3.1. Tree Diagram | | container listening-ssh-server { | |
| | | description | |
| | | "This container is only present to enable `pyang` | |
| | | tree diagram output, as a grouping by itself has | |
| | | no protocol accessible nodes to output."; | |
| | | | |
|
| The following tree diagram is faked, as a module having only a | | uses listening-ssh-server-grouping; | |
| grouping in it has no tree diagram. However, for illustrative | | } | |
| purposes, a container has been added as nothing more than a "uses" | | | |
| statement of the grouping. | | | |
| | | | |
|
| module: ietf-tls-server | | } | |
| +--rw fake-tls-server | | | |
| +--rw certificates | | | |
| | +--rw certificate* [name] | | | |
| | +--rw name -> /kc:keychain/private-keys/private-key/certificates/certificate/name | | | |
| +--rw client-auth | | | |
| +--rw trusted-ca-certs? -> /kc:keychain/trusted-certificates/name | | | |
| +--rw trusted-client-certs? -> /kc:keychain/trusted-certificates/name | | | |
| | | | |
|
| A.3.2. Example Usage | | <CODE ENDS> | |
| | | | |
|
| <fake-tls-server xmlns="urn:ietf:params:xml:ns:yang:ietf-tls-server"> | | 4.3. The TLS Server Model | |
| </certificates> | | | |
| | | The TLS Server model presented in this section presents two YANG | |
| | | groupings, one for a server that opens a socket to accept TCP | |
| | | connections on, and another for a server that has had the TCP | |
| | | connection opened for it already (e.g., inetd). | |
| | | | |
| | | The TLS Server model (like the SSH Server model presented above) is | |
| | | provided as a grouping so that it can be used in different contexts. | |
| | | For instance, the NETCONF Server model presented in Section 4.4 uses | |
| | | one grouping to configure a NETCONF server listening for connections | |
| | | and the other grouping to configure NETCONF call home. | |
| | | | |
| | | A shared characteristic between both groupings is the ability to | |
| | | configure which server certificate is presented to clients, the | |
| | | private key for which is held in the keychain model presented in | |
| | | Section 4.1. Another shared characteristic is the ability to | |
| | | configure which trusted CA or client certificates the server should | |
| | | be used to authenticate clients. | |
| | | | |
| | | 4.3.1. Tree Diagram | |
| | | | |
| | | The following tree diagram represents the data model for the grouping | |
| | | used to configure an TLS server to listen for TCP connections. The | |
| | | tree diagram for the other grouping is not provided, but it is the | |
| | | same except without the "address" and "port" fields. | |
| | | | |
| | | NOTE: the diagram below shows "listening-ssh-server" as a YANG | |
| | | container (not a grouping). This temporary container was created | |
| | | only to enable the `pyang` tool to output the tree diagram, as | |
| | | groupings by themselves have no protocol accessible nodes, and hence | |
| | | `pyang` would output an empty tree diagram. | |
| | | | |
| | | module: ietf-tls-server | |
| | | +--rw listening-tls-server | |
| | | +--rw address? inet:ip-address | |
| | | +--rw port inet:port-number | |
| | | +--rw certificates | |
| | | | +--rw certificate* [name] | |
| | | | +--rw name -> /kc:keychain/private-keys/private-key/cert | |
| | | ificates/certificate/name | |
| | | +--rw client-auth | |
| | | +--rw trusted-ca-certs? -> /kc:keychain/trusted-certific | |
| | | ates/name | |
| | | +--rw trusted-client-certs? -> /kc:keychain/trusted-certific | |
| | | ates/name | |
| | | | |
| | | 4.3.2. Example Usage | |
| | | | |
| | | <listening-tls-server | |
| | | xmlns="urn:ietf:params:xml:ns:yang:ietf-tls-server"> | |
| | | <port>6513</port> | |
| | | <certificates> | |
| <certificate> | | <certificate> | |
|
| IDevID Certificate | | <name>ex-key-sect571r1-cert</name> | |
| </certificate> | | </certificate> | |
| </certificates> | | </certificates> | |
| <client-auth> | | <client-auth> | |
| <trusted-ca-certs> | | <trusted-ca-certs> | |
|
| Trusted certificates for netconf/restconf clients | | deployment-specific-ca-certs | |
| </trusted-ca-certs> | | </trusted-ca-certs> | |
| <trusted-client-certs> | | <trusted-client-certs> | |
|
| Trust anchors for netconf/restconf clients | | explicitly-trusted-client-certs | |
| </trusted-client-certs> | | </trusted-client-certs> | |
| </client-auth> | | </client-auth> | |
|
| </fake-tls-server> | | </listening-tls-server> | |
| | | | |
|
| A.3.3. YANG Model | | 4.3.3. YANG Model | |
| | | | |
|
| <CODE BEGINS> file "ietf-tls-server@2015-07-06.yang" | | <CODE BEGINS> file "ietf-tls-server@2015-10-09.yang" | |
| | | | |
|
| module ietf-tls-server { | | module ietf-tls-server { | |
| yang-version 1.1; | | yang-version 1.1; | |
| | | | |
|
| namespace "urn:ietf:params:xml:ns:yang:ietf-tls-server"; | | namespace "urn:ietf:params:xml:ns:yang:ietf-tls-server"; | |
| prefix "ts"; | | prefix "ts"; | |
| | | | |
|
| import ietf-keychain { | | import ietf-inet-types { // RFC 6991 | |
| prefix kc; // RFC VVVV | | prefix inet; | |
| } | | } | |
| | | import ietf-keychain { | |
| | | prefix kc; // RFC VVVV | |
| | | revision-date 2015-10-09; | |
| | | } | |
| | | | |
|
| organization | | organization | |
| "IETF NETCONF (Network Configuration) Working Group"; | | "IETF NETCONF (Network Configuration) Working Group"; | |
| | | | |
|
| contact | | contact | |
| "WG Web: <http://tools.ietf.org/wg/netconf/> | | "WG Web: <http://tools.ietf.org/wg/netconf/> | |
| WG List: <mailto:netconf@ietf.org> | | WG List: <mailto:netconf@ietf.org> | |
| | | | |
|
| WG Chair: Mehmet Ersue | | WG Chair: Mehmet Ersue | |
| <mailto:mehmet.ersue@nsn.com> | | <mailto:mehmet.ersue@nsn.com> | |
| | | | |
|
| WG Chair: Mahesh Jethanandani | | WG Chair: Mahesh Jethanandani | |
| <mailto:mjethanandani@gmail.com> | | <mailto:mjethanandani@gmail.com> | |
| | | | |
|
| Editor: Kent Watsen | | Editor: Kent Watsen | |
| <mailto:kwatsen@juniper.net>"; | | <mailto:kwatsen@juniper.net>"; | |
| | | | |
|
| description | | description | |
| "This module defines a reusable grouping for a TLS server that | | "This module defines a reusable grouping for a TLS server that | |
| can be used as a basis for specific TLS server instances. | | can be used as a basis for specific TLS server instances. | |
| | | | |
|
| Copyright (c) 2014 IETF Trust and the persons identified as | | Copyright (c) 2014 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 | | to the license terms contained in, the Simplified BSD | |
| License set forth in Section 4.c of the IETF Trust's | | License set forth in Section 4.c of the IETF Trust's | |
| Legal Provisions Relating to IETF Documents | | Legal Provisions 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 VVVV; see | | This version of this YANG module is part of RFC VVVV; see | |
| the RFC itself for full legal notices."; | | the RFC itself for full legal notices."; | |
| | | | |
|
| revision "2015-07-06" { | | revision "2015-10-09" { | |
| description | | description | |
| "Initial version"; | | "Initial version"; | |
| reference | | reference | |
| "RFC VVVV: NETCONF Server and RESTCONF Server Configuration | | "RFC VVVV: NETCONF Server and RESTCONF Server Configuration | |
| Models"; | | Models"; | |
| } | | } | |
| | | // grouping | |
| | | grouping non-listening-tls-server-grouping { | |
| | | description | |
| | | "A reusable grouping for a TLS server that can be used as a | |
| | | basis for specific TLS server instances."; | |
| | | container certificates { | |
| | | description | |
| | | "The list of certificates the TLS server will present when | |
| | | establishing a TLS connection."; | |
| | | list certificate { | |
| | | key name; | |
| | | min-elements 1; | |
| | | description | |
| | | "An unordered list of certificates the TLS server can pick | |
| | | from when sending its Server Certificate message."; | |
| | | reference | |
| | | "RFC 5246: The TLS Protocol, Section 7.4.2"; | |
| | | leaf name { | |
| | | type leafref { | |
| | | path "/kc:keychain/kc:private-keys/kc:private-key/" | |
| | | + "kc:certificates/kc:certificate/kc:name"; | |
| | | } | |
| | | description | |
| | | "The name of the certificate in the keychain."; | |
| | | } | |
| | | } | |
| | | } | |
| | | | |
|
| grouping tls-server-grouping { | | container client-auth { | |
| description | | description | |
| "A reusable grouping for a TLS server that can be used as a | | "A reference to a list of trusted certificate authority (CA) | |
| basis for specific TLS server instances."; | | certificates and a reference to a list of trusted client | |
| | | certificates."; | |
| | | leaf trusted-ca-certs { | |
| | | type leafref { | |
| | | path "/kc:keychain/kc:trusted-certificates/kc:name"; | |
| | | } | |
| | | description | |
| | | "A reference to a list of certificate authority (CA) | |
| | | certificates used by the TLS server to authenticate | |
| | | TLS client certificates."; | |
| | | } | |
| | | | |
|
| container certificates { | | leaf trusted-client-certs { | |
| description | | type leafref { | |
| "The list of certificates the TLS server will present when | | path "/kc:keychain/kc:trusted-certificates/kc:name"; | |
| establishing a TLS connection."; | | } | |
| list certificate { | | description | |
| key name; | | "A reference to a list of client certificates used by | |
| min-elements 1; | | the TLS server to authenticate TLS client certificates. | |
| description | | A clients certificate is authenticated if it is an | |
| "An unordered list of certificates the TLS server can pick | | exact match to a configured trusted client certificate."; | |
| from when sending its Server Certificate message."; | | } | |
| reference | | } | |
| "RFC 5246: The TLS Protocol, Section 7.4.2"; | | } | |
| leaf name { | | | |
| type leafref { | | | |
| path "/kc:keychain/kc:private-keys/kc:private-key/kc:certificates/kc:certificate/kc:name"; | | | |
| } | | | |
| description | | | |
| "The name of the certificate in the keychain."; | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
|
| container client-auth { | | grouping listening-tls-server-grouping { | |
| description | | description | |
| "A reference to a list of trusted certificate authority (CA) | | "A reusable grouping for a TLS server that can be used as a | |
| certificates and a reference to a list of trusted client | | basis for specific TLS server instances."; | |
| certificates."; | | leaf address { | |
| leaf trusted-ca-certs { | | type inet:ip-address; | |
| type leafref { | | description | |
| path "/kc:keychain/kc:trusted-certificates/kc:name"; | | "The IP address of the interface to listen on. The TLS | |
| } | | server will listen on all interfaces if no value is | |
| description | | specified."; | |
| "A reference to a list of certificate authority (CA) | | } | |
| certificates used by the TLS server to authenticate | | leaf port { | |
| TLS client certificates."; | | type inet:port-number; | |
| } | | mandatory true; // will a default augmented in work? | |
| | | description | |
| | | "The local port number on this interface the TLTLS server | |
| | | listens on."; | |
| | | } | |
| | | uses non-listening-tls-server-grouping; | |
| | | } | |
| | | | |
|
| leaf trusted-client-certs { | | // RFC Editor: please remove the following container block | |
| type leafref { | | // when publishing this document as an RFC. | |
| path "/kc:keychain/kc:trusted-certificates/kc:name"; | | container listening-tls-server { | |
| } | | description | |
| description | | "This container is only present to enable `pyang` | |
| "A reference to a list of client certificates used by | | tree diagram output, as a grouping by itself has | |
| the TLS server to authenticate TLS client certificates. | | no protocol accessible nodes to output."; | |
| A clients certificate is authenticated if it is an | | | |
| exact match to a configured trusted client certificate."; | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| <CODE ENDS> | | | |
| | | | |
|
| A.4. The NETCONF Server Model | | uses listening-tls-server-grouping; | |
| | | } | |
| | | | |
|
| A.4.1. Tree Diagram | | } | |
| | | <CODE ENDS> | |
| | | | |
|
| module: ietf-netconf-server-new | | 4.4. The NETCONF Server Model | |
| +--rw netconf-server | | | |
| +--rw session-options | | | |
| | +--rw hello-timeout? uint16 | | | |
| +--rw listen {(ssh-listen or tls-listen)}? | | | |
| | +--rw max-sessions? uint16 | | | |
| | +--rw idle-timeout? uint16 | | | |
| | +--rw endpoint* [name] | | | |
| | +--rw name string | | | |
| | +--rw (transport) | | | |
| | +--:(ssh) {ssh-listen}? | | | |
| | | +--rw ssh | | | |
| | | +--rw address? inet:ip-address | | | |
| | | +--rw port? inet:port-number | | | |
| | | +--rw host-keys | | | |
| | | | +--rw host-key* [name] | | | |
| | | | +--rw name string | | | |
| | | | +--rw (type)? | | | |
| | | | +--:(public-key) | | | |
| | | | | +--rw public-key? -> /kc:keychain/private-keys/private-key/name | | | |
| | | | +--:(certificate) | | | |
| | | | +--rw certificate? -> /kc:keychain/private-keys/private-key/certificates/certificate/name {ssh-x509-certs}? | | | |
| | | +--rw client-cert-auth {ssh-x509-certs}? | | | |
| | | +--rw trusted-ca-certs? -> /kc:keychain/trusted-certificates/name | | | |
| | | +--rw trusted-client-certs? -> /kc:keychain/trusted-certificates/name | | | |
| | +--:(tls) {tls-listen}? | | | |
| | +--rw tls | | | |
| | +--rw address? inet:ip-address | | | |
| | +--rw port? inet:port-number | | | |
| | +--rw certificates | | | |
| | | +--rw certificate* [name] | | | |
| | | +--rw name -> /kc:keychain/private-keys/private-key/certificates/certificate/name | | | |
| | +--rw client-auth | | | |
| | +--rw trusted-ca-certs? -> /kc:keychain/trusted-certificates/name | | | |
| | +--rw trusted-client-certs? -> /kc:keychain/trusted-certificates/name | | | |
| | +--rw cert-maps | | | |
| | +--rw cert-to-name* [id] | | | |
| | +--rw id uint32 | | | |
| | +--rw fingerprint x509c2n:tls-fingerprint | | | |
| | +--rw map-type identityref | | | |
| | +--rw name string | | | |
| +--rw call-home {(ssh-call-home or tls-call-home)}? | | | |
| +--rw netconf-client* [name] | | | |
| +--rw name string | | | |
| +--rw (transport) | | | |
| | +--:(ssh) {ssh-call-home}? | | | |
| | | +--rw ssh | | | |
| | | +--rw endpoints | | | |
| | | | +--rw endpoint* [name] | | | |
| | | | +--rw name string | | | |
| | | | +--rw address inet:host | | | |
| | | | +--rw port? inet:port-number | | | |
| | | +--rw host-keys | | | |
| | | | +--rw host-key* [name] | | | |
| | | | +--rw name string | | | |
| | | | +--rw (type)? | | | |
| | | | +--:(public-key) | | | |
| | | | | +--rw public-key? -> /kc:keychain/private-keys/private-key/name | | | |
| | | | +--:(certificate) | | | |
| | | | +--rw certificate? -> /kc:keychain/private-keys/private-key/certificates/certificate/name {ssh-x509-certs}? | | | |
| | | +--rw client-cert-auth {ssh-x509-certs}? | | | |
| | | +--rw trusted-ca-certs? -> /kc:keychain/trusted-certificates/name | | | |
| | | +--rw trusted-client-certs? -> /kc:keychain/trusted-certificates/name | | | |
| | +--:(tls) {tls-call-home}? | | | |
| | +--rw tls | | | |
| | +--rw endpoints | | | |
| | | +--rw endpoint* [name] | | | |
| | | +--rw name string | | | |
| | | +--rw address inet:host | | | |
| | | +--rw port? inet:port-number | | | |
| | +--rw certificates | | | |
| | | +--rw certificate* [name] | | | |
| | | +--rw name -> /kc:keychain/private-keys/private-key/certificates/certificate/name | | | |
| | +--rw client-auth | | | |
| | +--rw trusted-ca-certs? -> /kc:keychain/trusted-certificates/name | | | |
| | +--rw trusted-client-certs? -> /kc:keychain/trusted-certificates/name | | | |
| | +--rw cert-maps | | | |
| | +--rw cert-to-name* [id] | | | |
| | +--rw id uint32 | | | |
| | +--rw fingerprint x509c2n:tls-fingerprint | | | |
| | +--rw map-type identityref | | | |
| | +--rw name string | | | |
| +--rw connection-type | | | |
| | +--rw (connection-type)? | | | |
| | +--:(persistent-connection) | | | |
| | | +--rw persistent! | | | |
| | | +--rw idle-timeout? uint32 | | | |
| | | +--rw keep-alives | | | |
| | | +--rw max-wait? uint16 | | | |
| | | +--rw max-attempts? uint8 | | | |
| | +--:(periodic-connection) | | | |
| | +--rw periodic! | | | |
| | +--rw idle-timeout? uint16 | | | |
| | +--rw reconnect_timeout? uint16 | | | |
| +--rw reconnect-strategy | | | |
| +--rw start-with? enumeration | | | |
| +--rw max-attempts? uint8 | | | |
| | | | |
|
| A.4.2. Example Usage | | The NETCONF Server model presented in this section supports servers | |
| | | both listening for connections to accept as well as initiating call- | |
| | | home connections. This model also supports both the SSH and TLS | |
| | | transport protocols, using the SSH Server and TLS Server groupings | |
| | | presented in Section 4.2 and Section 4.3 respectively. All private | |
| | | keys and trusted certificates are held in the keychain model | |
| | | presented in Section 4.1. YANG feature statements are used to enable | |
| | | implementations to advertise which parts of the model the NETCONF | |
| | | server supports. | |
| | | | |
|
| Configuring an SSH Server | | 4.4.1. Tree Diagram | |
| | | | |
|
| <netconf-server xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server"> | | The following tree diagram uses line-wrapping in order to comply with | |
| <listen> | | xml2rfc validation. This is annoying as I find that drafts (even txt | |
| <endpoint> | | drafts) look just fine with long lines - maybe xml2rfc should remove | |
| <name>netconf/ssh</name> | | this warning? - or pyang could have an option to suppress printing | |
| <ssh> | | leafref paths? | |
| <address>11.22.33.44</address> | | | |
| <host-keys> | | | |
| <host-key> | | | |
| <public-key>my-rsa-key</public-key> | | | |
| </host-key> | | | |
| <host-key> | | | |
| <certificate>TPM key</certificate> | | | |
| </host-key> | | | |
| </host-keys> | | | |
| <client-cert-auth> | | | |
| <trusted-ca-certs> | | | |
| Trusted netconf/restconf client certificates | | | |
| </trusted-ca-certs> | | | |
| <trusted-client-certs> | | | |
| Trust anchors for netconf/restconf clients | | | |
| </trusted-client-certs> | | | |
| </client-cert-auth> | | | |
| </ssh> | | | |
| </endpoint> | | | |
| </listen> | | | |
| <call-home> | | | |
| <netconf-client> | | | |
| <name>config-mgr</name> | | | |
| <ssh> | | | |
| <endpoints> | | | |
| <endpoint> | | | |
| <name>east-data-center</name> | | | |
| <address>11.22.33.44</address> | | | |
| </endpoint> | | | |
| <endpoint> | | | |
| <name>west-data-center</name> | | | |
| <address>55.66.77.88</address> | | | |
| </endpoint> | | | |
| </endpoints> | | | |
| <host-keys> | | | |
| <host-key> | | | |
| <certificate>TPM key</certificate> | | | |
| </host-key> | | | |
| </host-keys> | | | |
| <client-cert-auth> | | | |
| <trusted-ca-certs> | | | |
| Trusted netconf/restconf client certificates | | | |
| </trusted-ca-certs> | | | |
| <trusted-client-certs> | | | |
| Trust anchors for netconf/restconf clients | | | |
| </trusted-client-certs> | | | |
| </client-cert-auth> | | | |
| </ssh> | | | |
| </netconf-client> | | | |
| </call-home> | | | |
| </netconf-server> | | | |
| | | | |
|
| Configuring a TLS Server | | module: ietf-netconf-server | |
| | | +--rw netconf-server | |
| | | +--rw session-options | |
| | | | +--rw hello-timeout? uint16 | |
| | | +--rw listen {(ssh-listen or tls-listen)}? | |
| | | | +--rw max-sessions? uint16 | |
| | | | +--rw idle-timeout? uint16 | |
| | | | +--rw endpoint* [name] | |
| | | | +--rw name string | |
| | | | +--rw (transport) | |
| | | | +--:(ssh) {ssh-listen}? | |
| | | | | +--rw ssh | |
| | | | | +--rw address? inet:ip-address | |
| | | | | +--rw port inet:port-number | |
| | | | | +--rw host-keys | |
| | | | | | +--rw host-key* [name] | |
| | | | | | +--rw name string | |
| | | | | | +--rw (type)? | |
| | | | | | +--:(public-key) | |
| | | | | | | +--rw public-key? -> /kc:keychain/p | |
| | | rivate-keys/private-key/name | |
| | | | | | +--:(certificate) | |
| | | | | | +--rw certificate? -> /kc:keychain/p | |
| | | rivate-keys/private-key/certificates/certificate/name {ssh-x509-certs}? | |
| | | | | +--rw client-cert-auth {ssh-x509-certs}? | |
| | | | | +--rw trusted-ca-certs? -> /kc:keychain/t | |
| | | | |
|
| <netconf-server xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server" | | rusted-certificates/name | |
| xmlns:x509c2n="urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name"> | | | | +--rw trusted-client-certs? -> /kc:keychain/t | |
| <listen> | | rusted-certificates/name | |
| <endpoint> | | | +--:(tls) {tls-listen}? | |
| <name>netconf/tls</name> | | | +--rw tls | |
| <tls> | | | +--rw address? inet:ip-address | |
| <address>11.22.33.44</address> | | | +--rw port inet:port-number | |
| <certificates> | | | +--rw certificates | |
| <certificate>IDevID Certificate</certificate> | | | | +--rw certificate* [name] | |
| </certificates> | | | | +--rw name -> /kc:keychain/private-keys/p | |
| <client-auth> | | rivate-key/certificates/certificate/name | |
| <trusted-ca-certs> | | | +--rw client-auth | |
| Trusted netconf/restconf client certificates | | | +--rw trusted-ca-certs? -> /kc:keychain/t | |
| </trusted-ca-certs> | | rusted-certificates/name | |
| <trusted-client-certs> | | | +--rw trusted-client-certs? -> /kc:keychain/t | |
| Trust anchors for netconf/restconf clients | | rusted-certificates/name | |
| </trusted-client-certs> | | | +--rw cert-maps | |
| <cert-maps> | | | +--rw cert-to-name* [id] | |
| <cert-to-name> | | | +--rw id uint32 | |
| <id>1</id> | | | +--rw fingerprint x509c2n:tls-fingerpr | |
| <fingerprint>11:0A:05:11:00</fingerprint> | | int | |
| <map-type>x509c2n:san-any</map-type> | | | +--rw map-type identityref | |
| </cert-to-name> | | | +--rw name string | |
| <cert-to-name> | | +--rw call-home {(ssh-call-home or tls-call-home)}? | |
| <id>2</id> | | +--rw netconf-client* [name] | |
| <fingerprint>B3:4F:A1:8C:54</fingerprint> | | +--rw name string | |
| <map-type>x509c2n:specified</map-type> | | +--rw (transport) | |
| <name>scooby-doo</name> | | | +--:(ssh) {ssh-call-home}? | |
| </cert-to-name> | | | | +--rw ssh | |
| </cert-maps> | | | | +--rw endpoints | |
| </client-auth> | | | | | +--rw endpoint* [name] | |
| </tls> | | | | | +--rw name string | |
| </endpoint> | | | | | +--rw address inet:host | |
| </listen> | | | | | +--rw port? inet:port-number | |
| <call-home> | | | | +--rw host-keys | |
| <netconf-client> | | | | | +--rw host-key* [name] | |
| <name>config-mgr</name> | | | | | +--rw name string | |
| <tls> | | | | | +--rw (type)? | |
| <endpoints> | | | | | +--:(public-key) | |
| <endpoint> | | | | | | +--rw public-key? -> /kc:keychain/p | |
| <name>east-data-center</name> | | rivate-keys/private-key/name | |
| <address>22.33.44.55</address> | | | | | +--:(certificate) | |
| </endpoint> | | | | | +--rw certificate? -> /kc:keychain/p | |
| <endpoint> | | rivate-keys/private-key/certificates/certificate/name {ssh-x509-certs}? | |
| <name>west-data-center</name> | | | | +--rw client-cert-auth {ssh-x509-certs}? | |
| <address>33.44.55.66</address> | | | | +--rw trusted-ca-certs? -> /kc:keychain/t | |
| </endpoint> | | rusted-certificates/name | |
| </endpoints> | | | | +--rw trusted-client-certs? -> /kc:keychain/t | |
| <certificates> | | | |
| <certificate>IDevID Certificate</certificate> | | | |
| </certificates> | | | |
| </tls> | | | |
| </netconf-client> | | | |
| </call-home> | | | |
| </netconf-server> | | | |
| | | | |
|
| A.4.3. YANG Model | | rusted-certificates/name | |
| | | | +--:(tls) {tls-call-home}? | |
| | | | +--rw tls | |
| | | | +--rw endpoints | |
| | | | | +--rw endpoint* [name] | |
| | | | | +--rw name string | |
| | | | | +--rw address inet:host | |
| | | | | +--rw port? inet:port-number | |
| | | | +--rw certificates | |
| | | | | +--rw certificate* [name] | |
| | | | | +--rw name -> /kc:keychain/private-keys/p | |
| | | rivate-key/certificates/certificate/name | |
| | | | +--rw client-auth | |
| | | | +--rw trusted-ca-certs? -> /kc:keychain/t | |
| | | rusted-certificates/name | |
| | | | +--rw trusted-client-certs? -> /kc:keychain/t | |
| | | rusted-certificates/name | |
| | | | +--rw cert-maps | |
| | | | +--rw cert-to-name* [id] | |
| | | | +--rw id uint32 | |
| | | | +--rw fingerprint x509c2n:tls-fingerpr | |
| | | int | |
| | | | +--rw map-type identityref | |
| | | | +--rw name string | |
| | | +--rw connection-type | |
| | | | +--rw (connection-type)? | |
| | | | +--:(persistent-connection) | |
| | | | | +--rw persistent! | |
| | | | | +--rw idle-timeout? uint32 | |
| | | | | +--rw keep-alives | |
| | | | | +--rw max-wait? uint16 | |
| | | | | +--rw max-attempts? uint8 | |
| | | | +--:(periodic-connection) | |
| | | | +--rw periodic! | |
| | | | +--rw idle-timeout? uint16 | |
| | | | +--rw reconnect_timeout? uint16 | |
| | | +--rw reconnect-strategy | |
| | | +--rw start-with? enumeration | |
| | | +--rw max-attempts? uint8 | |
| | | | |
|
| This YANG module imports YANG types from [RFC6991] and [RFC7407]. | | 4.4.2. Example Usage | |
| | | | |
|
| <CODE BEGINS> file "ietf-netconf-server-new@2015-07-06.yang" | | Configuring a NETCONF Server to listen for NETCONF client connections | |
| | | using both the SSH and TLS transport protocols, as well as | |
| | | configuring call-home to two NETCONF clients, one using SSH and the | |
| | | other using TLS. | |
| | | | |
|
| module ietf-netconf-server-new { | | This example is consistent with other examples presented in this | |
| yang-version 1.1; | | document. | |
| | | | |
|
| namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-server-new"; | | <netconf-server | |
| prefix "ncserver"; | | xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server"> | |
| | | <listen> | |
| | | | |
|
| import ietf-inet-types { // RFC 6991 | | <!-- listening for SSH connections --> | |
| prefix inet; | | <endpoint> | |
| } | | <name>netconf/ssh</name> | |
| import ietf-x509-cert-to-name { // RFC 7407 | | <ssh> | |
| prefix x509c2n; | | <address>11.22.33.44</address> | |
| } | | <host-keys> | |
| import ietf-ssh-server { // RFC VVVV | | <host-key> | |
| prefix ss; | | <public-key>my-rsa-key</public-key> | |
| } | | </host-key> | |
| import ietf-tls-server { // RFC VVVV | | <host-key> | |
| prefix ts; | | <certificate>TPM key</certificate> | |
| } | | </host-key> | |
| | | </host-keys> | |
| | | <client-cert-auth> | |
| | | <trusted-ca-certs> | |
| | | deployment-specific-ca-certs | |
| | | </trusted-ca-certs> | |
| | | <trusted-client-certs> | |
| | | explicitly-trusted-client-certs | |
| | | </trusted-client-certs> | |
| | | </client-cert-auth> | |
| | | </ssh> | |
| | | </endpoint> | |
| | | | |
|
| organization | | <!-- listening for TLS connections --> | |
| "IETF NETCONF (Network Configuration) Working Group"; | | <endpoint> | |
| | | <name>netconf/tls</name> | |
| | | <tls> | |
| | | <address>11.22.33.44</address> | |
| | | <certificates> | |
| | | <certificate>ex-key-sect571r1-cert</certificate> | |
| | | </certificates> | |
| | | <client-auth> | |
| | | <trusted-ca-certs> | |
| | | deployment-specific-ca-certs | |
| | | </trusted-ca-certs> | |
| | | <trusted-client-certs> | |
| | | explicitly-trusted-client-certs | |
| | | </trusted-client-certs> | |
| | | <cert-maps> | |
| | | <cert-to-name> | |
| | | <id>1</id> | |
| | | <fingerprint>11:0A:05:11:00</fingerprint> | |
| | | <map-type>x509c2n:san-any</map-type> | |
| | | </cert-to-name> | |
| | | <cert-to-name> | |
| | | <id>2</id> | |
| | | <fingerprint>B3:4F:A1:8C:54</fingerprint> | |
| | | <map-type>x509c2n:specified</map-type> | |
| | | <name>scooby-doo</name> | |
| | | </cert-to-name> | |
| | | </cert-maps> | |
| | | </client-auth> | |
| | | </tls> | |
| | | </endpoint> | |
| | | | |
|
| contact | | </listen> | |
| "WG Web: <http://tools.ietf.org/wg/netconf/> | | <call-home> | |
| WG List: <mailto:netconf@ietf.org> | | | |
| | | | |
|
| WG Chair: Mehmet Ersue | | <!-- calling home to an SSH-based NETCONF client --> | |
| <mailto:mehmet.ersue@nsn.com> | | <netconf-client> | |
| | | <name>config-mgr</name> | |
| | | <ssh> | |
| | | <endpoints> | |
| | | <endpoint> | |
| | | <name>east-data-center</name> | |
| | | <address>11.22.33.44</address> | |
| | | </endpoint> | |
| | | <endpoint> | |
| | | <name>west-data-center</name> | |
| | | <address>55.66.77.88</address> | |
| | | </endpoint> | |
| | | </endpoints> | |
| | | <host-keys> | |
| | | <host-key> | |
| | | <certificate>TPM key</certificate> | |
| | | </host-key> | |
| | | </host-keys> | |
| | | <client-cert-auth> | |
| | | <trusted-ca-certs> | |
| | | deployment-specific-ca-certs | |
| | | </trusted-ca-certs> | |
| | | <trusted-client-certs> | |
| | | explicitly-trusted-client-certs | |
| | | </trusted-client-certs> | |
| | | </client-cert-auth> | |
| | | </ssh> | |
| | | <connection-type> | |
| | | <periodic> | |
| | | <idle-timeout>300</idle-timeout> | |
| | | <reconnect-timeout>60</reconnect-timeout> | |
| | | </periodic> | |
| | | </connection-type> | |
| | | <reconnect-strategy> | |
| | | <start-with>last-connected</start-with> | |
| | | <max-attempts>3</max-attempts> | |
| | | </reconnect-strategy> | |
| | | </netconf-client> | |
| | | | |
|
| WG Chair: Mahesh Jethanandani | | <!-- calling home to a TLS-based NETCONF client --> | |
| <mailto:mjethanandani@gmail.com> | | <netconf-client> | |
| | | <name>event-correlator</name> | |
| | | <tls> | |
| | | <endpoints> | |
| | | <endpoint> | |
| | | <name>east-data-center</name> | |
| | | <address>22.33.44.55</address> | |
| | | </endpoint> | |
| | | <endpoint> | |
| | | <name>west-data-center</name> | |
| | | <address>33.44.55.66</address> | |
| | | </endpoint> | |
| | | </endpoints> | |
| | | <certificates> | |
| | | <certificate>ex-key-sect571r1-cert</certificate> | |
| | | </certificates> | |
| | | <client-auth> | |
| | | <trusted-ca-certs> | |
| | | deployment-specific-ca-certs | |
| | | </trusted-ca-certs> | |
| | | <trusted-client-certs> | |
| | | explicitly-trusted-client-certs | |
| | | </trusted-client-certs> | |
| | | <cert-maps> | |
| | | <cert-to-name> | |
| | | <id>1</id> | |
| | | <fingerprint>11:0A:05:11:00</fingerprint> | |
| | | <map-type>x509c2n:san-any</map-type> | |
| | | </cert-to-name> | |
| | | <cert-to-name> | |
| | | <id>2</id> | |
| | | <fingerprint>B3:4F:A1:8C:54</fingerprint> | |
| | | <map-type>x509c2n:specified</map-type> | |
| | | <name>scooby-doo</name> | |
| | | </cert-to-name> | |
| | | </cert-maps> | |
| | | </client-auth> | |
| | | | |
|
| Editor: Kent Watsen | | </tls> | |
| <mailto:kwatsen@juniper.net>"; | | <connection-type> | |
| | | <persistent> | |
| | | <idle-timeout>300</idle-timeout> | |
| | | <keep-alives> | |
| | | <max-wait>30</max-wait> | |
| | | <max-attempts>3</max-attempts> | |
| | | </keep-alives> | |
| | | </persistent> | |
| | | </connection-type> | |
| | | <reconnect-strategy> | |
| | | <start-with>first-listed</start-with> | |
| | | <max-attempts>3</max-attempts> | |
| | | </reconnect-strategy> | |
| | | </netconf-client> | |
| | | | |
|
| description | | </call-home> | |
| "This module contains a collection of YANG definitions for | | </netconf-server> | |
| configuring NETCONF servers. | | | |
| | | | |
|
| Copyright (c) 2014 IETF Trust and the persons identified as | | 4.4.3. YANG Model | |
| authors of the code. All rights reserved. | | | |
| | | | |
|
| Redistribution and use in source and binary forms, with or | | This YANG module imports YANG types from [RFC6991] and [RFC7407]. | |
| 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 | | | |
| (http://trustee.ietf.org/license-info). | | | |
| | | | |
|
| This version of this YANG module is part of RFC VVVV; see | | <CODE BEGINS> file "ietf-netconf-server@2015-10-09.yang" | |
| the RFC itself for full legal notices."; | | | |
| | | | |
|
| revision "2015-07-06" { | | module ietf-netconf-server { | |
| description | | yang-version 1.1; | |
| "Initial version"; | | | |
| | | | |
|
| reference | | namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-server"; | |
| "RFC VVVV: NETCONF Server and RESTCONF Server Configuration | | prefix "ncserver"; | |
| Models"; | | | |
| } | | | |
| | | | |
|
| // Features | | import ietf-inet-types { // RFC 6991 | |
| | | prefix inet; | |
| | | } | |
| | | import ietf-x509-cert-to-name { // RFC 7407 | |
| | | prefix x509c2n; | |
| | | } | |
| | | import ietf-ssh-server { // RFC VVVV | |
| | | prefix ss; | |
| | | revision-date 2015-10-09; | |
| | | } | |
| | | import ietf-tls-server { // RFC VVVV | |
| | | prefix ts; | |
| | | revision-date 2015-10-09; | |
| | | } | |
| | | organization | |
| | | "IETF NETCONF (Network Configuration) Working Group"; | |
| | | | |
|
| feature ssh-listen { | | contact | |
| description | | "WG Web: <http://tools.ietf.org/wg/netconf/> | |
| "The ssh-listen feature indicates that the NETCONF server | | WG List: <mailto:netconf@ietf.org> | |
| supports opening a port to accept NETCONF over SSH | | | |
| client connections."; | | | |
| reference | | | |
| "RFC 6242: Using the NETCONF Protocol over Secure Shell (SSH)"; | | | |
| } | | | |
| | | | |
|
| feature ssh-call-home { | | WG Chair: Mehmet Ersue | |
| description | | <mailto:mehmet.ersue@nsn.com> | |
| "The ssh-call-home feature indicates that the NETCONF | | | |
| server supports initiating a NETCONF over SSH call | | | |
| home connection to NETCONF clients."; | | | |
| reference | | | |
| "RFC YYYY: NETCONF Call Home and RESTCONF Call Home"; | | | |
| } | | | |
| | | | |
|
| feature tls-listen { | | WG Chair: Mahesh Jethanandani | |
| description | | <mailto:mjethanandani@gmail.com> | |
| "The tls-listen feature indicates that the NETCONF server | | | |
| supports opening a port to accept NETCONF over TLS | | | |
| client connections."; | | | |
| reference | | | |
| "RFC 5539: Using the NETCONF Protocol over Transport | | | |
| Layer Security (TLS) with Mutual X.509 | | | |
| Authentication"; | | | |
| } | | | |
| | | | |
|
| feature tls-call-home { | | Editor: Kent Watsen | |
| description | | <mailto:kwatsen@juniper.net>"; | |
| "The tls-call-home feature indicates that the NETCONF | | | |
| server supports initiating a NETCONF over TLS call | | | |
| home connection to NETCONF clients."; | | | |
| reference | | | |
| "RFC YYYY: NETCONF Call Home and RESTCONF Call Home"; | | | |
| } | | | |
| | | | |
|
| feature ssh-x509-certs { | | | |
| description | | description | |
|
| "The ssh-x509-certs feature indicates that the NETCONF server | | "This module contains a collection of YANG definitions for | |
| supports RFC 6187"; | | configuring NETCONF servers. | |
| reference | | | |
| "RFC 6187: X.509v3 Certificates for Secure Shell Authentication"; | | | |
| } | | | |
| | | | |
|
| // top-level container (groupings below) | | Copyright (c) 2014 IETF Trust and the persons identified as | |
| container netconf-server { | | authors of the code. All rights reserved. | |
| description | | | |
| "Top-level container for NETCONF server configuration."; | | | |
| | | | |
|
| container session-options { // SHOULD WE REMOVE THIS ALTOGETHER? | | 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 | |
| | | (http://trustee.ietf.org/license-info). | |
| | | | |
| | | This version of this YANG module is part of RFC VVVV; see | |
| | | the RFC itself for full legal notices."; | |
| | | | |
| | | revision "2015-10-09" { | |
| description | | description | |
|
| "NETCONF session options, independent of transport | | "Initial version"; | |
| or connection strategy."; | | reference | |
| leaf hello-timeout { | | "RFC VVVV: NETCONF Server and RESTCONF Server Configuration | |
| type uint16; | | Models"; | |
| units "seconds"; | | | |
| default 600; | | | |
| description | | | |
| "Specifies the maximum number of seconds that a SSH/TLS | | | |
| connection may wait for a hello message to be received. | | | |
| A connection will be dropped if no hello message is | | | |
| received before this number of seconds elapses. If set | | | |
| to zero, then the server will wait forever for a hello | | | |
| message."; | | | |
| } | | | |
| } | | } | |
| | | | |
|
| container listen { | | // Features | |
| | | | |
| | | feature ssh-listen { | |
| description | | description | |
|
| "Configures listen behavior"; | | "The ssh-listen feature indicates that the NETCONF server | |
| if-feature "(ssh-listen or tls-listen)"; | | supports opening a port to accept NETCONF over SSH | |
| leaf max-sessions { | | client connections."; | |
| type uint16; | | reference | |
| default 0; | | "RFC 6242: Using the NETCONF Protocol over Secure Shell (SSH)"; | |
| description | | } | |
| "Specifies the maximum number of concurrent sessions | | | |
| that can be active at one time. The value 0 indicates | | feature ssh-call-home { | |
| that no artificial session limit should be used."; | | description | |
| } | | "The ssh-call-home feature indicates that the NETCONF | |
| leaf idle-timeout { | | server supports initiating a NETCONF over SSH call | |
| type uint16; | | home connection to NETCONF clients."; | |
| units "seconds"; | | reference | |
| default 3600; // one hour | | "RFC YYYY: NETCONF Call Home and RESTCONF Call Home"; | |
| | | } | |
| | | | |
| | | feature tls-listen { | |
| | | description | |
| | | "The tls-listen feature indicates that the NETCONF server | |
| | | supports opening a port to accept NETCONF over TLS | |
| | | client connections."; | |
| | | reference | |
| | | "RFC 5539: Using the NETCONF Protocol over Transport | |
| | | Layer Security (TLS) with Mutual X.509 | |
| | | Authentication"; | |
| | | } | |
| | | | |
| | | feature tls-call-home { | |
| | | description | |
| | | "The tls-call-home feature indicates that the NETCONF | |
| | | server supports initiating a NETCONF over TLS call | |
| | | home connection to NETCONF clients."; | |
| | | reference | |
| | | "RFC YYYY: NETCONF Call Home and RESTCONF Call Home"; | |
| | | } | |
| | | | |
| | | feature ssh-x509-certs { | |
| | | description | |
| | | "The ssh-x509-certs feature indicates that the NETCONF | |
| | | server supports RFC 6187"; | |
| | | reference | |
| | | "RFC 6187: X.509v3 Certificates for Secure Shell | |
| | | Authentication"; | |
| | | } | |
| | | | |
| | | // top-level container (groupings below) | |
| | | container netconf-server { | |
| | | description | |
| | | "Top-level container for NETCONF server configuration."; | |
| | | | |
| | | container session-options { // SHOULD WE REMOVE THIS ALTOGETHER? | |
| description | | description | |
|
| "Specifies the maximum number of seconds that a NETCONF | | "NETCONF session options, independent of transport | |
| session may remain idle. A NETCONF session will be dropped | | or connection strategy."; | |
| if it is idle for an interval longer than this number of | | leaf hello-timeout { | |
| seconds. If set to zero, then the server will never drop | | type uint16; | |
| a session because it is idle. Sessions that have a | | units "seconds"; | |
| notification subscription active are never dropped."; | | default 600; | |
| | | description | |
| | | "Specifies the maximum number of seconds that a SSH/TLS | |
| | | connection may wait for a hello message to be received. | |
| | | A connection will be dropped if no hello message is | |
| | | received before this number of seconds elapses. If set | |
| | | to zero, then the server will wait forever for a hello | |
| | | message."; | |
| | | } | |
| } | | } | |
|
| list endpoint { | | | |
| key name; | | container listen { | |
| | | if-feature "(ssh-listen or tls-listen)"; | |
| description | | description | |
|
| "List of endpoints to listen for NETCONF connections on."; | | "Configures listen behavior"; | |
| leaf name { | | leaf max-sessions { | |
| type string; | | type uint16; | |
| | | default 0; | |
| description | | description | |
|
| "An arbitrary name for the NETCONF listen endpoint."; | | "Specifies the maximum number of concurrent sessions | |
| | | that can be active at one time. The value 0 indicates | |
| | | that no artificial session limit should be used."; | |
| } | | } | |
|
| choice transport { | | leaf idle-timeout { | |
| mandatory true; | | type uint16; | |
| | | units "seconds"; | |
| | | default 3600; // one hour | |
| description | | description | |
|
| "Selects between available transports."; | | "Specifies the maximum number of seconds that a NETCONF | |
| case ssh { | | session may remain idle. A NETCONF session will be dropped | |
| if-feature ssh-listen; | | if it is idle for an interval longer than this number of | |
| container ssh { | | seconds. If set to zero, then the server will never drop | |
| description | | a session because it is idle. Sessions that have a | |
| "SSH-specific listening configuration for inbound | | notification subscription active are never dropped."; | |
| connections."; | | } | |
| uses address-and-port-grouping { | | list endpoint { | |
| refine port { | | key name; | |
| default 830; | | description | |
| | | "List of endpoints to listen for NETCONF connections on."; | |
| | | | |
| | | leaf name { | |
| | | type string; | |
| | | description | |
| | | "An arbitrary name for the NETCONF listen endpoint."; | |
| | | } | |
| | | choice transport { | |
| | | mandatory true; | |
| | | description | |
| | | "Selects between available transports."; | |
| | | case ssh { | |
| | | if-feature ssh-listen; | |
| | | container ssh { | |
| | | description | |
| | | "SSH-specific listening configuration for inbound | |
| | | connections."; | |
| | | uses ss:listening-ssh-server-grouping { | |
| | | refine port { | |
| | | default 830; | |
| | | } | |
| } | | } | |
| } | | } | |
|
| uses ss:ssh-server-grouping; | | | |
| } | | } | |
|
| } | | case tls { | |
| case tls { | | if-feature tls-listen; | |
| if-feature tls-listen; | | container tls { | |
| container tls { | | description | |
| description | | "TLS-specific listening configuration for inbound | |
| "TLS-specific listening configuration for inbound | | connections."; | |
| connections."; | | uses ts:listening-tls-server-grouping { | |
| uses address-and-port-grouping { | | refine port { | |
| refine port { | | default 6513; | |
| default 6513; | | } | |
| | | augment "client-auth" { | |
| | | description | |
| | | "Augments in the cert-to-name structure."; | |
| | | uses cert-maps-grouping; | |
| | | } | |
| } | | } | |
| } | | } | |
|
| uses tls-server-grouping; | | | |
| } | | } | |
| } | | } | |
| } | | } | |
|
| | | | |
| } | | } | |
|
| } | | | |
| | | | |
|
| container call-home { | | container call-home { | |
| if-feature "(ssh-call-home or tls-call-home)"; | | if-feature "(ssh-call-home or tls-call-home)"; | |
| description | | | |
| "Configures call-home behavior"; | | | |
| list netconf-client { | | | |
| key name; | | | |
| description | | description | |
|
| "List of NETCONF clients the NETCONF server is to initiate | | "Configures call-home behavior"; | |
| call-home connections to."; | | | |
| leaf name { | | list netconf-client { | |
| type string; | | key name; | |
| description | | | |
| "An arbitrary name for the remote NETCONF client."; | | | |
| } | | | |
| choice transport { | | | |
| mandatory true; | | | |
| description | | description | |
|
| "Selects between available transports."; | | "List of NETCONF clients the NETCONF server is to initiate | |
| case ssh { | | call-home connections to."; | |
| if-feature ssh-call-home; | | leaf name { | |
| container ssh { | | type string; | |
| description | | description | |
| "Specifies SSH-specific call-home transport | | "An arbitrary name for the remote NETCONF client."; | |
| configuration."; | | } | |
| uses endpoints-container { | | choice transport { | |
| refine endpoints/endpoint/port { | | mandatory true; | |
| default 7777; | | description | |
| | | "Selects between available transports."; | |
| | | case ssh { | |
| | | if-feature ssh-call-home; | |
| | | container ssh { | |
| | | description | |
| | | "Specifies SSH-specific call-home transport | |
| | | configuration."; | |
| | | uses endpoints-container { | |
| | | refine endpoints/endpoint/port { | |
| | | default 7777; | |
| | | } | |
| } | | } | |
|
| | | uses ss:non-listening-ssh-server-grouping; | |
| } | | } | |
|
| uses ss:ssh-server-grouping; | | | |
| } | | } | |
|
| } | | case tls { | |
| case tls { | | if-feature tls-call-home; | |
| if-feature tls-call-home; | | container tls { | |
| container tls { | | description | |
| description | | "Specifies TLS-specific call-home transport | |
| "Specifies TLS-specific call-home transport | | configuration."; | |
| configuration."; | | uses endpoints-container { | |
| uses endpoints-container { | | refine endpoints/endpoint/port { | |
| refine endpoints/endpoint/port { | | default 8888; | |
| default 8888; | | } | |
| | | } | |
| | | uses ts:non-listening-tls-server-grouping { | |
| | | augment "client-auth" { | |
| | | description | |
| | | "Augments in the cert-to-name structure."; | |
| | | uses cert-maps-grouping; | |
| | | } | |
| } | | } | |
| } | | } | |
|
| uses tls-server-grouping; | | | |
| } | | } | |
| | | | |
| } | | } | |
|
| } | | container connection-type { | |
| container connection-type { | | | |
| description | | | |
| "Indicates the kind of connection to use."; | | | |
| choice connection-type { | | | |
| description | | description | |
|
| "Selects between available connection types."; | | "Indicates the kind of connection to use."; | |
| case persistent-connection { | | choice connection-type { | |
| container persistent { | | description | |
| presence true; | | "Selects between available connection types."; | |
| description | | case persistent-connection { | |
| "Maintain a persistent connection to the NETCONF | | container persistent { | |
| client. If the connection goes down, immediately | | presence true; | |
| start trying to reconnect to it, using the | | | |
| reconnection strategy. | | | |
| | | | |
| This connection type minimizes any NETCONF client | | | |
| to NETCONF server data-transfer delay, albeit at | | | |
| the expense of holding resources longer."; | | | |
| leaf idle-timeout { | | | |
| type uint32; | | | |
| units "seconds"; | | | |
| default 86400; // one day; | | | |
| description | | description | |
|
| "Specifies the maximum number of seconds that a | | "Maintain a persistent connection to the NETCONF | |
| a NETCONF session may remain idle. A NETCONF | | client. If the connection goes down, immediately | |
| session will be dropped if it is idle for an | | start trying to reconnect to it, using the | |
| interval longer than this number of seconds. | | reconnection strategy. | |
| If set to zero, then the server will never drop | | | |
| a session because it is idle. Sessions that | | This connection type minimizes any NETCONF client | |
| have a notification subscription active are | | to NETCONF server data-transfer delay, albeit at | |
| never dropped."; | | the expense of holding resources longer."; | |
| | | leaf idle-timeout { | |
| | | type uint32; | |
| | | units "seconds"; | |
| | | default 86400; // one day; | |
| | | description | |
| | | "Specifies the maximum number of seconds that a | |
| | | a NETCONF session may remain idle. A NETCONF | |
| | | session will be dropped if it is idle for an | |
| | | interval longer than this number of seconds. | |
| | | If set to zero, then the server will never drop | |
| | | a session because it is idle. Sessions that | |
| | | have a notification subscription active are | |
| | | never dropped."; | |
| | | } | |
| | | container keep-alives { | |
| | | description | |
| | | "Configures the keep-alive policy, to proactively | |
| | | test the aliveness of the SSH/TLS client. An | |
| | | unresponsive SSH/TLS client will be dropped after | |
| | | approximately max-attempts * max-wait seconds."; | |
| | | reference | |
| | | "RFC YYYY: NETCONF Call Home and RESTCONF Call | |
| | | Home, Section 3.1, item S6"; | |
| | | leaf max-wait { | |
| | | type uint16 { | |
| | | range "1..max"; | |
| | | } | |
| | | units seconds; | |
| | | default 30; | |
| | | description | |
| | | "Sets the amount of time in seconds after which | |
| | | if no data has been received from the SSH/TLS | |
| | | client, a SSH/TLS-level message will be sent | |
| | | to test the aliveness of the SSH/TLS client."; | |
| | | } | |
| | | leaf max-attempts { | |
| | | type uint8; | |
| | | default 3; | |
| | | description | |
| | | "Sets the number of maximum number of sequential | |
| | | keep-alive messages that can fail to obtain a | |
| | | response from the SSH/TLS client before assuming | |
| | | the SSH/TLS client is no longer alive."; | |
| | | } | |
| | | } | |
| } | | } | |
|
| container keep-alives { | | } | |
| | | case periodic-connection { | |
| | | container periodic { | |
| | | presence true; | |
| description | | description | |
|
| "Configures the keep-alive policy, to proactively | | "Periodically connect to the NETCONF client, so that | |
| test the aliveness of the SSH/TLS client. An | | the NETCONF client may deliver messages pending for | |
| unresponsive SSH/TLS client will be dropped after | | the NETCONF server. The NETCONF client is expected | |
| approximately (max-attempts * max-wait) seconds."; | | to close the connection when it is ready to release | |
| reference | | it, thus starting the NETCONF server's timer until | |
| "RFC YYYY: NETCONF Call Home and RESTCONF Call Home, | | next connection."; | |
| Section 3.1, item S6"; | | leaf idle-timeout { | |
| leaf max-wait { | | type uint16; | |
| | | units "seconds"; | |
| | | default 300; // five minutes | |
| | | description | |
| | | "Specifies the maximum number of seconds that a | |
| | | a NETCONF session may remain idle. A NETCONF | |
| | | session will be dropped if it is idle for an | |
| | | interval longer than this number of seconds. | |
| | | If set to zero, then the server will never drop | |
| | | a session because it is idle. Sessions that | |
| | | have a notification subscription active are | |
| | | never dropped."; | |
| | | } | |
| | | leaf reconnect_timeout { | |
| type uint16 { | | type uint16 { | |
| range "1..max"; | | range "1..max"; | |
| } | | } | |
|
| units seconds; | | units minutes; | |
| default 30; | | default 60; | |
| description | | | |
| "Sets the amount of time in seconds after which | | | |
| if no data has been received from the SSH/TLS | | | |
| client, a SSH/TLS-level message will be sent | | | |
| to test the aliveness of the SSH/TLS client."; | | | |
| } | | | |
| leaf max-attempts { | | | |
| type uint8; | | | |
| default 3; | | | |
| description | | description | |
|
| "Sets the number of sequential keep-alive messages | | "Sets the maximum amount of unconnected time the | |
| that can fail to obtain a response from the SSH/TLS | | NETCONF server will wait before re-establishing | |
| client before assuming the SSH/TLS client is no | | a connection to the NETCONF client. The NETCONF | |
| longer alive."; | | server may initiate a connection before this | |
| | | time if desired (e.g., to deliver an event | |
| | | notification message)."; | |
| } | | } | |
| } | | } | |
| } | | } | |
| } | | } | |
|
| case periodic-connection { | | } | |
| container periodic { | | container reconnect-strategy { | |
| presence true; | | description | |
| description | | "The reconnection strategy guides how a NETCONF server | |
| "Periodically connect to the NETCONF client, so that | | reconnects to a NETCONF client, after discovering its | |
| the NETCONF client may deliver messages pending for | | connection to the client has dropped. The NETCONF | |
| the NETCONF server. The NETCONF client is expected | | server starts with the specified endpoint and tries | |
| to close the connection when it is ready to release | | to connect to it max-attempts times before trying the | |
| it, thus starting the NETCONF server's timer until | | next endpoint in the list (round robin)."; | |
| next connection."; | | leaf start-with { | |
| leaf idle-timeout { | | type enumeration { | |
| type uint16; | | enum first-listed { | |
| units "seconds"; | | | |
| default 300; // five minutes | | | |
| description | | description | |
|
| "Specifies the maximum number of seconds that a | | "Indicates that reconnections should start with | |
| a NETCONF session may remain idle. A NETCONF | | the first endpoint listed."; | |
| session will be dropped if it is idle for an | | | |
| interval longer than this number of seconds. | | | |
| If set to zero, then the server will never drop | | | |
| a session because it is idle. Sessions that | | | |
| have a notification subscription active are | | | |
| never dropped."; | | | |
| } | | } | |
|
| leaf reconnect_timeout { | | enum last-connected { | |
| type uint16 { | | | |
| range "1..max"; | | | |
| } | | | |
| units minutes; | | | |
| default 60; | | | |
| description | | description | |
|
| "The maximum amount of unconnected time the NETCONF | | "Indicates that reconnections should start with | |
| server will wait before re-establishing a connection | | the endpoint last connected to. If no previous | |
| to the NETCONF client. The NETCONF server may | | connection has ever been established, then the | |
| initiate a connection before this time if desired | | first endpoint configured is used. NETCONF | |
| (e.g., to deliver a notification)."; | | servers SHOULD be able to remember the last | |
| | | endpoint connected to across reboots."; | |
| } | | } | |
| } | | } | |
|
| | | default first-listed; | |
| | | description | |
| | | "Specifies which of the NETCONF client's endpoints the | |
| | | NETCONF server should start with when trying to connect | |
| | | to the NETCONF client."; | |
| } | | } | |
|
| } | | leaf max-attempts { | |
| } | | type uint8 { | |
| container reconnect-strategy { | | range "1..max"; | |
| description | | | |
| "The reconnection strategy guides how a NETCONF server | | | |
| reconnects to an NETCONF client, after losing a connection | | | |
| to it, even if due to a reboot. The NETCONF server starts | | | |
| with the specified endpoint and tries to connect to it | | | |
| max-attempts times before trying the next endpoint in the | | | |
| list (round robin)."; | | | |
| leaf start-with { | | | |
| type enumeration { | | | |
| enum first-listed { | | | |
| description | | | |
| "Indicates that reconnections should start with | | | |
| the first endpoint listed."; | | | |
| } | | | |
| enum last-connected { | | | |
| description | | | |
| "Indicates that reconnections should start with | | | |
| the endpoint last connected to. If no previous | | | |
| connection has ever been established, then the | | | |
| first endpoint configured is used. NETCONF | | | |
| servers SHOULD be able to remember the last | | | |
| endpoint connected to across reboots."; | | | |
| } | | } | |
|
| | | default 3; | |
| | | description | |
| | | "Specifies the number times the NETCONF server tries to | |
| | | connect to a specific endpoint before moving on to the | |
| | | next endpoint in the list (round robin)."; | |
| } | | } | |
|
| default first-listed; | | | |
| description | | | |
| "Specifies which of the NETCONF client's endpoints the | | | |
| NETCONF server should start with when trying to connect | | | |
| to the NETCONF client."; | | | |
| } | | | |
| leaf max-attempts { | | | |
| type uint8 { | | | |
| range "1..max"; | | | |
| } | | | |
| default 3; | | | |
| description | | | |
| "Specifies the number times the NETCONF server tries to | | | |
| connect to a specific endpoint before moving on to the | | | |
| next endpoint in the list (round robin)."; | | | |
| } | | } | |
| } | | } | |
| } | | } | |
| } | | } | |
|
| } | | | |
| | | | |
| grouping tls-server-grouping { | | | |
| description | | | |
| "An augmentation of tls-server-grouping, as defined in the | | | |
| ietf-tls-server module, to add in cert-maps."; | | | |
| uses ts:tls-server-grouping { | | | |
| augment "client-auth" { | | | |
| container cert-maps { | | | |
| uses x509c2n:cert-to-name; | | | |
| description | | | |
| "The cert-maps container is used by a NETCONF server to | | | |
| map the NETCONF client's presented X.509 certificate to a | | | |
| NETCONF username. If no matching and valid cert-to-name | | | |
| list entry can be found, then the NETCONF server MUST | | | |
| close the connection, and MUST NOT accept NETCONF | | | |
| messages over it."; | | | |
| reference | | | |
| "RFC WWWW: NETCONF over TLS, Section 7"; | | | |
| } | | | |
| } | | | |
| } | | | |
| } | | | |
| | | | |
|
| grouping address-and-port-grouping { | | grouping cert-maps-grouping { | |
| description | | | |
| "This grouping is used by both the ssh and tls containers | | | |
| for listen configuration."; | | | |
| leaf address { | | | |
| type inet:ip-address; | | | |
| description | | | |
| "The IP address of the interface to listen on. The NETCONF | | | |
| server will listen on all interfaces if no value is | | | |
| specified."; | | | |
| } | | | |
| leaf port { | | | |
| type inet:port-number; | | | |
| description | | description | |
|
| "The local port number on this interface the NETCONF server | | "A grouping that defines a container around the | |
| listens on. The NETCONF server will use the IANA-assigned | | cert-to-name structure defined in RFC 7407."; | |
| well-known port if no value is specified."; | | container cert-maps { | |
| | | uses x509c2n:cert-to-name; | |
| | | description | |
| | | "The cert-maps container is used by a TLS-based NETCONF | |
| | | server to map the NETCONF client's presented X.509 | |
| | | certificate to a NETCONF username. If no matching and | |
| | | valid cert-to-name list entry can be found, then the | |
| | | NETCONF server MUST close the connection, and MUST NOT | |
| | | accept NETCONF messages over it."; | |
| | | reference | |
| | | "RFC WWWW: NETCONF over TLS, Section 7"; | |
| | | } | |
| } | | } | |
|
| } | | | |
| | | | |
|
| grouping endpoints-container { | | grouping endpoints-container { | |
| description | | | |
| "This grouping is used by both the ssh and tls containers | | | |
| for call-home configurations."; | | | |
| container endpoints { | | | |
| description | | description | |
|
| "Container for the list of endpoints."; | | "This grouping is used by both the ssh and tls containers | |
| list endpoint { | | for call-home configurations."; | |
| key name; | | container endpoints { | |
| min-elements 1; | | | |
| ordered-by user; | | | |
| description | | description | |
|
| "User-ordered list of endpoints for this NETCONF client. | | "Container for the list of endpoints."; | |
| Defining more than one enables high-availability."; | | list endpoint { | |
| leaf name { | | key name; | |
| type string; | | min-elements 1; | |
| description | | ordered-by user; | |
| "An arbitrary name for this endpoint."; | | | |
| } | | | |
| leaf address { | | | |
| type inet:host; | | | |
| mandatory true; | | | |
| description | | | |
| "The IP address or hostname of the endpoint. If a | | | |
| hostname is configured and the DNS resolution results | | | |
| in more than one IP address, the NETCONF server | | | |
| will process the IP addresses as if they had been | | | |
| explicitly configured in place of the hostname."; | | | |
| } | | | |
| leaf port { | | | |
| type inet:port-number; | | | |
| description | | description | |
|
| "The IP port for this endpoint. The NETCONF server will | | "User-ordered list of endpoints for this NETCONF client. | |
| use the IANA-assigned well-known port if no value is | | Defining more than one enables high-availability."; | |
| specified."; | | leaf name { | |
| | | type string; | |
| | | description | |
| | | "An arbitrary name for this endpoint."; | |
| | | | |
| | | } | |
| | | leaf address { | |
| | | type inet:host; | |
| | | mandatory true; | |
| | | description | |
| | | "The IP address or hostname of the endpoint. If a | |
| | | hostname is configured and the DNS resolution results | |
| | | in more than one IP address, the NETCONF server | |
| | | will process the IP addresses as if they had been | |
| | | explicitly configured in place of the hostname."; | |
| | | } | |
| | | leaf port { | |
| | | type inet:port-number; | |
| | | description | |
| | | "The IP port for this endpoint. The NETCONF server will | |
| | | use the IANA-assigned well-known port if no value is | |
| | | specified."; | |
| | | } | |
| } | | } | |
| } | | } | |
| } | | } | |
|
| | | | |
| } | | } | |
| | | | |
|
| } | | <CODE ENDS> | |
| <CODE ENDS> | | | |
| | | | |
|
| A.5. The RESTCONF Server Model | | 4.5. The RESTCONF Server Model | |
| | | | |
|
| A.5.1. Tree Diagram | | The RESTCONF Server model presented in this section supports servers | |
| | | both listening for connections to accept as well as initiating call- | |
| | | home connections. This model supports the TLS transport only, as | |
| | | RESTCONF only supports HTTPS, using the TLS Server groupings | |
| | | presented in Section 4.3. All private keys and trusted certificates | |
| | | are held in the keychain model presented in Section 4.1. YANG | |
| | | feature statements are used to enable implementations to advertise | |
| | | which parts of the model the RESTCONF server supports. | |
| | | | |
|
| module: ietf-restconf-server-new | | 4.5.1. Tree Diagram | |
| +--rw restconf-server | | | |
| +--rw listen {tls-listen}? | | | |
| | +--rw max-sessions? uint16 | | | |
| | +--rw endpoint* [name] | | | |
| | +--rw name string | | | |
| | +--rw (transport) | | | |
| | +--:(tls) | | | |
| | +--rw tls | | | |
| | +--rw address? inet:ip-address | | | |
| | +--rw port? inet:port-number | | | |
| | +--rw certificates | | | |
| | | +--rw certificate* [name] | | | |
| | | +--rw name -> /kc:keychain/private-keys/private-key/certificates/certificate/name | | | |
| | +--rw client-auth | | | |
| | +--rw trusted-ca-certs? -> /kc:keychain/trusted-certificates/name | | | |
| | +--rw trusted-client-certs? -> /kc:keychain/trusted-certificates/name | | | |
| | +--rw cert-maps | | | |
| | +--rw cert-to-name* [id] | | | |
| | +--rw id uint32 | | | |
| | +--rw fingerprint x509c2n:tls-fingerprint | | | |
| | +--rw map-type identityref | | | |
| | +--rw name string | | | |
| +--rw call-home {tls-call-home}? | | | |
| +--rw restconf-client* [name] | | | |
| +--rw name string | | | |
| +--rw (transport) | | | |
| | +--:(tls) | | | |
| | +--rw tls | | | |
| | +--rw endpoints | | | |
| | | +--rw endpoint* [name] | | | |
| | | +--rw name string | | | |
| | | +--rw address inet:host | | | |
| | | +--rw port? inet:port-number | | | |
| | +--rw certificates | | | |
| | | +--rw certificate* [name] | | | |
| | | +--rw name -> /kc:keychain/private-keys/private-key/certificates/certificate/name | | | |
| | +--rw client-auth | | | |
| | +--rw trusted-ca-certs? -> /kc:keychain/trusted-certificates/name | | | |
| | +--rw trusted-client-certs? -> /kc:keychain/trusted-certificates/name | | | |
| | +--rw cert-maps | | | |
| | +--rw cert-to-name* [id] | | | |
| | +--rw id uint32 | | | |
| | +--rw fingerprint x509c2n:tls-fingerprint | | | |
| | +--rw map-type identityref | | | |
| | +--rw name string | | | |
| +--rw connection-type | | | |
| | +--rw (connection-type)? | | | |
| | +--:(persistent-connection) | | | |
| | | +--rw persistent! | | | |
| | | +--rw keep-alives | | | |
| | | +--rw max-wait? uint16 | | | |
| | | +--rw max-attempts? uint8 | | | |
| | +--:(periodic-connection) | | | |
| | +--rw periodic! | | | |
| | +--rw reconnect-timeout? uint16 | | | |
| +--rw reconnect-strategy | | | |
| +--rw start-with? enumeration | | | |
| +--rw max-attempts? uint8 | | | |
| | | | |
|
| A.5.2. Example Usage | | The following tree diagram uses line-wrapping in order to comply with | |
| | | xml2rfc validation. This is annoying as I find that drafts (even txt | |
| | | drafts) look just fine with long lines - maybe xml2rfc should remove | |
| | | this warning? - or pyang could have an option to suppress printing | |
| | | leafref paths? | |
| | | | |
|
| TBD | | module: ietf-restconf-server | |
| | | +--rw restconf-server | |
| | | +--rw listen {tls-listen}? | |
| | | | +--rw max-sessions? uint16 | |
| | | | +--rw endpoint* [name] | |
| | | | +--rw name string | |
| | | | +--rw (transport) | |
| | | | +--:(tls) {tls-listen}? | |
| | | | +--rw tls | |
| | | | +--rw address? inet:ip-address | |
| | | | +--rw port inet:port-number | |
| | | | +--rw certificates | |
| | | | | +--rw certificate* [name] | |
| | | | | +--rw name -> /kc:keychain/private-keys/p | |
| | | rivate-key/certificates/certificate/name | |
| | | | +--rw client-auth | |
| | | | +--rw trusted-ca-certs? -> /kc:keychain/t | |
| | | rusted-certificates/name | |
| | | | +--rw trusted-client-certs? -> /kc:keychain/t | |
| | | rusted-certificates/name | |
| | | | +--rw cert-maps | |
| | | | +--rw cert-to-name* [id] | |
| | | | +--rw id uint32 | |
| | | | +--rw fingerprint x509c2n:tls-fingerpr | |
| | | int | |
| | | | +--rw map-type identityref | |
| | | | +--rw name string | |
| | | +--rw call-home {tls-call-home}? | |
| | | +--rw restconf-client* [name] | |
| | | +--rw name string | |
| | | +--rw (transport) | |
| | | | +--:(tls) {tls-call-home}? | |
| | | | +--rw tls | |
| | | | +--rw endpoints | |
| | | | | +--rw endpoint* [name] | |
| | | | | +--rw name string | |
| | | | | +--rw address inet:host | |
| | | | | +--rw port? inet:port-number | |
| | | | +--rw certificates | |
| | | | | +--rw certificate* [name] | |
| | | | | +--rw name -> /kc:keychain/private-keys/p | |
| | | rivate-key/certificates/certificate/name | |
| | | | +--rw client-auth | |
| | | | +--rw trusted-ca-certs? -> /kc:keychain/t | |
| | | rusted-certificates/name | |
| | | | +--rw trusted-client-certs? -> /kc:keychain/t | |
| | | rusted-certificates/name | |
| | | | +--rw cert-maps | |
| | | | +--rw cert-to-name* [id] | |
| | | | +--rw id uint32 | |
| | | | +--rw fingerprint x509c2n:tls-fingerpr | |
| | | int | |
| | | | +--rw map-type identityref | |
| | | | +--rw name string | |
| | | +--rw connection-type | |
| | | | +--rw (connection-type)? | |
| | | | +--:(persistent-connection) | |
| | | | | +--rw persistent! | |
| | | | | +--rw keep-alives | |
| | | | | +--rw max-wait? uint16 | |
| | | | | +--rw max-attempts? uint8 | |
| | | | +--:(periodic-connection) | |
| | | | +--rw periodic! | |
| | | | +--rw reconnect-timeout? uint16 | |
| | | +--rw reconnect-strategy | |
| | | +--rw start-with? enumeration | |
| | | +--rw max-attempts? uint8 | |
| | | | |
|
| A.5.3. YANG Model | | 4.5.2. Example Usage | |
| | | | |
| | | Configuring a RESTCONF Server to listen for RESTCONF client | |
| | | connections, as well as configuring call-home to one RESTCONF client. | |
| | | | |
| | | This example is consistent with other examples presented in this | |
| | | document. | |
| | | | |
| | | <restconf-server | |
| | | xmlns="urn:ietf:params:xml:ns:yang:ietf-restconf-server"> | |
| | | | |
| | | <!-- listening for TLS (HTTPS) connections --> | |
| | | <listen> | |
| | | <endpoint> | |
| | | <name>netconf/tls</name> | |
| | | <tls> | |
| | | <address>11.22.33.44</address> | |
| | | <certificates> | |
| | | <certificate>ex-key-sect571r1-cert</certificate> | |
| | | </certificates> | |
| | | <client-auth> | |
| | | <trusted-ca-certs> | |
| | | deployment-specific-ca-certs | |
| | | </trusted-ca-certs> | |
| | | <trusted-client-certs> | |
| | | explicitly-trusted-client-certs | |
| | | </trusted-client-certs> | |
| | | <cert-maps> | |
| | | <cert-to-name> | |
| | | <id>1</id> | |
| | | <fingerprint>11:0A:05:11:00</fingerprint> | |
| | | <map-type>x509c2n:san-any</map-type> | |
| | | </cert-to-name> | |
| | | <cert-to-name> | |
| | | <id>2</id> | |
| | | <fingerprint>B3:4F:A1:8C:54</fingerprint> | |
| | | <map-type>x509c2n:specified</map-type> | |
| | | <name>scooby-doo</name> | |
| | | </cert-to-name> | |
| | | </cert-maps> | |
| | | </client-auth> | |
| | | </tls> | |
| | | | |
| | | </endpoint> | |
| | | </listen> | |
| | | | |
| | | <!-- calling home to a RESTCONF client --> | |
| | | <call-home> | |
| | | <restconf-client> | |
| | | <name>config-manager</name> | |
| | | <tls> | |
| | | <endpoints> | |
| | | <endpoint> | |
| | | <name>east-data-center</name> | |
| | | <address>22.33.44.55</address> | |
| | | </endpoint> | |
| | | <endpoint> | |
| | | <name>west-data-center</name> | |
| | | <address>33.44.55.66</address> | |
| | | </endpoint> | |
| | | </endpoints> | |
| | | <certificates> | |
| | | <certificate>ex-key-sect571r1-cert</certificate> | |
| | | </certificates> | |
| | | <client-auth> | |
| | | <trusted-ca-certs> | |
| | | deployment-specific-ca-certs | |
| | | </trusted-ca-certs> | |
| | | <trusted-client-certs> | |
| | | explicitly-trusted-client-certs | |
| | | </trusted-client-certs> | |
| | | <cert-maps> | |
| | | <cert-to-name> | |
| | | <id>1</id> | |
| | | <fingerprint>11:0A:05:11:00</fingerprint> | |
| | | <map-type>x509c2n:san-any</map-type> | |
| | | </cert-to-name> | |
| | | <cert-to-name> | |
| | | <id>2</id> | |
| | | <fingerprint>B3:4F:A1:8C:54</fingerprint> | |
| | | <map-type>x509c2n:specified</map-type> | |
| | | <name>scooby-doo</name> | |
| | | </cert-to-name> | |
| | | </cert-maps> | |
| | | </client-auth> | |
| | | </tls> | |
| | | <connection-type> | |
| | | <periodic> | |
| | | <idle-timeout>300</idle-timeout> | |
| | | <reconnect-timeout>60</reconnect-timeout> | |
| | | </periodic> | |
| | | </connection-type> | |
| | | <reconnect-strategy> | |
| | | <start-with>last-connected</start-with> | |
| | | <max-attempts>3</max-attempts> | |
| | | </reconnect-strategy> | |
| | | </restconf-client> | |
| | | </call-home> | |
| | | | |
| | | </restconf-server> | |
| | | | |
| | | 4.5.3. YANG Model | |
| | | | |
| This YANG module imports YANG types from [RFC6991] and [RFC7407]. | | This YANG module imports YANG types from [RFC6991] and [RFC7407]. | |
| | | | |
|
| <CODE BEGINS> file "ietf-restconf-server-new@2015-07-06.yang" | | <CODE BEGINS> file "ietf-restconf-server@2015-10-09.yang" | |
| | | | |
|
| module ietf-restconf-server-new { | | module ietf-restconf-server { | |
| yang-version 1.1; | | yang-version 1.1; | |
| | | | |
|
| namespace "urn:ietf:params:xml:ns:yang:ietf-restconf-server-new"; | | namespace "urn:ietf:params:xml:ns:yang:ietf-restconf-server"; | |
| prefix "rcserver"; | | prefix "rcserver"; | |
| | | | |
|
| import ietf-netconf-acm { | | //import ietf-netconf-acm { | |
| prefix nacm; // RFC 6536 | | // prefix nacm; // RFC 6536 | |
| } | | //} | |
| import ietf-inet-types { // RFC 6991 | | import ietf-inet-types { // RFC 6991 | |
| prefix inet; | | prefix inet; | |
| } | | } | |
| import ietf-x509-cert-to-name { // RFC 7407 | | import ietf-x509-cert-to-name { // RFC 7407 | |
| prefix x509c2n; | | prefix x509c2n; | |
| } | | } | |
| import ietf-tls-server { // RFC VVVV | | import ietf-tls-server { // RFC VVVV | |
| prefix ts; | | prefix ts; | |
|
| | | revision-date 2015-10-09; | |
| | | | |
| } | | } | |
|
| | | | |
| organization | | organization | |
| "IETF NETCONF (Network Configuration) Working Group"; | | "IETF NETCONF (Network Configuration) Working Group"; | |
| | | | |
| contact | | contact | |
| "WG Web: <http://tools.ietf.org/wg/netconf/> | | "WG Web: <http://tools.ietf.org/wg/netconf/> | |
| WG List: <mailto:netconf@ietf.org> | | WG List: <mailto:netconf@ietf.org> | |
| | | | |
| WG Chair: Mehmet Ersue | | WG Chair: Mehmet Ersue | |
| <mailto:mehmet.ersue@nsn.com> | | <mailto:mehmet.ersue@nsn.com> | |
| | | | |
| | | | |
| skipping to change at page 77, line 37 | | skipping to change at page 52, line 40 | |
| 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 | | to the license terms contained in, the Simplified BSD | |
| License set forth in Section 4.c of the IETF Trust's | | License set forth in Section 4.c of the IETF Trust's | |
| Legal Provisions Relating to IETF Documents | | Legal Provisions 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 VVVV; see | | This version of this YANG module is part of RFC VVVV; see | |
| the RFC itself for full legal notices."; | | the RFC itself for full legal notices."; | |
| | | | |
|
| revision "2015-07-06" { | | revision "2015-10-09" { | |
| description | | description | |
| "Initial version"; | | "Initial version"; | |
| reference | | reference | |
| "RFC VVVV: NETCONF Server and RESTCONF Server Configuration | | "RFC VVVV: NETCONF Server and RESTCONF Server Configuration | |
| Models"; | | Models"; | |
| } | | } | |
| | | | |
| // Features | | // Features | |
| | | | |
| feature tls-listen { | | feature tls-listen { | |
| | | | |
| skipping to change at page 78, line 26 | | skipping to change at page 53, line 28 | |
| } | | } | |
| | | | |
| feature client-cert-auth { | | feature client-cert-auth { | |
| description | | description | |
| "The client-cert-auth feature indicates that the RESTCONF | | "The client-cert-auth feature indicates that the RESTCONF | |
| server supports the ClientCertificate authentication scheme."; | | server supports the ClientCertificate authentication scheme."; | |
| reference | | reference | |
| "RFC ZZZZ: Client Authentication over New TLS Connection"; | | "RFC ZZZZ: Client Authentication over New TLS Connection"; | |
| } | | } | |
| | | | |
|
| // top-level container (groupings below) | | // top-level container | |
| container restconf-server { | | container restconf-server { | |
| description | | description | |
| "Top-level container for RESTCONF server configuration."; | | "Top-level container for RESTCONF server configuration."; | |
| | | | |
| container listen { | | container listen { | |
|
| | | if-feature tls-listen; | |
| description | | description | |
| "Configures listen behavior"; | | "Configures listen behavior"; | |
|
| if-feature tls-listen; | | | |
| leaf max-sessions { | | leaf max-sessions { | |
| type uint16; | | type uint16; | |
| default 0; // should this be 'max'? | | default 0; // should this be 'max'? | |
| description | | description | |
| "Specifies the maximum number of concurrent sessions | | "Specifies the maximum number of concurrent sessions | |
| that can be active at one time. The value 0 indicates | | that can be active at one time. The value 0 indicates | |
| that no artificial session limit should be used."; | | that no artificial session limit should be used."; | |
| } | | } | |
| list endpoint { | | list endpoint { | |
| key name; | | key name; | |
| | | | |
| skipping to change at page 79, line 4 | | skipping to change at page 54, line 6 | |
| that no artificial session limit should be used."; | | that no artificial session limit should be used."; | |
| } | | } | |
| list endpoint { | | list endpoint { | |
| key name; | | key name; | |
| description | | description | |
| "List of endpoints to listen for RESTCONF connections on."; | | "List of endpoints to listen for RESTCONF connections on."; | |
| leaf name { | | leaf name { | |
| type string; | | type string; | |
| description | | description | |
| "An arbitrary name for the RESTCONF listen endpoint."; | | "An arbitrary name for the RESTCONF listen endpoint."; | |
|
| | | | |
| } | | } | |
| choice transport { | | choice transport { | |
| mandatory true; | | mandatory true; | |
| description | | description | |
| "Selects between available transports."; | | "Selects between available transports."; | |
| case tls { | | case tls { | |
|
| | | if-feature tls-listen; | |
| container tls { | | container tls { | |
| description | | description | |
| "TLS-specific listening configuration for inbound | | "TLS-specific listening configuration for inbound | |
| connections."; | | connections."; | |
|
| leaf address { | | uses ts:listening-tls-server-grouping { | |
| type inet:ip-address; | | refine port { | |
| description | | default 443; | |
| "The IP address of the interface to listen on. The | | } | |
| RESTCONF server will listen on all interfaces if | | augment "client-auth" { | |
| no value is specified."; | | description | |
| } | | "Augments in the cert-to-name structure."; | |
| leaf port { | | uses cert-maps-grouping; | |
| type inet:port-number; | | } | |
| default 443; | | | |
| description | | | |
| "The port number the RESTCONF server will listen on."; | | | |
| } | | } | |
|
| uses tls-server-grouping; | | | |
| } | | } | |
| } | | } | |
| } | | } | |
| } | | } | |
| } | | } | |
| | | | |
| container call-home { | | container call-home { | |
| if-feature tls-call-home; | | if-feature tls-call-home; | |
| description | | description | |
| "Configures call-home behavior"; | | "Configures call-home behavior"; | |
| | | | |
| skipping to change at page 80, line 4 | | skipping to change at page 54, line 51 | |
| initiate call-home connections to."; | | initiate call-home connections to."; | |
| leaf name { | | leaf name { | |
| type string; | | type string; | |
| description | | description | |
| "An arbitrary name for the remote RESTCONF client."; | | "An arbitrary name for the remote RESTCONF client."; | |
| } | | } | |
| choice transport { | | choice transport { | |
| mandatory true; | | mandatory true; | |
| description | | description | |
| "Selects between TLS and any transports augmented in."; | | "Selects between TLS and any transports augmented in."; | |
|
| | | | |
| case tls { | | case tls { | |
|
| | | if-feature tls-call-home; | |
| container tls { | | container tls { | |
| description | | description | |
| "Specifies TLS-specific call-home transport | | "Specifies TLS-specific call-home transport | |
| configuration."; | | configuration."; | |
|
| container endpoints { | | uses endpoints-container { | |
| description | | refine endpoints/endpoint/port { | |
| "Container for the list of endpoints."; | | default 9999; | |
| list endpoint { | | } | |
| key name; | | } | |
| min-elements 1; | | uses ts:non-listening-tls-server-grouping { | |
| ordered-by user; | | augment "client-auth" { | |
| description | | description | |
|
| "User-ordered list of endpoints for this RESTCONF | | "Augments in the cert-to-name structure."; | |
| client. More than one enables high-availability."; | | uses cert-maps-grouping; | |
| leaf name { | | | |
| type string; | | | |
| description | | | |
| "An arbitrary name for this endpoint."; | | | |
| } | | | |
| leaf address { | | | |
| type inet:host; | | | |
| mandatory true; | | | |
| |