draft-ietf-netconf-server-model-03.txt | draft-ietf-netconf-server-model-04.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: March 26, 2015 Jacobs University Bremen | Expires: April 29, 2015 Jacobs University Bremen | |||
September 22, 2014 | October 26, 2014 | |||
NETCONF Server Configuration Model | NETCONF Server Configuration Model | |||
draft-ietf-netconf-server-model-03 | draft-ietf-netconf-server-model-04 | |||
Abstract | Abstract | |||
This draft defines a NETCONF server configuration data model. This | This draft defines a NETCONF server configuration data model. This | |||
data model enables configuration of the NETCONF service itself, | data model enables configuration of the NETCONF service itself, | |||
including which transports it supports, what ports they listen on, | including which transports it supports, what ports they listen on, | |||
whether they support device-initiated connections, and associated | whether call-home is supported, and associated parameters. | |||
parameters. | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
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 March 26, 2015. | This Internet-Draft will expire on April 29, 2015. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2014 IETF Trust and the persons identified as the | Copyright (c) 2014 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 . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3 | 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.2. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 3 | 1.2. Tree Diagrams . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2. Objectives . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 2. Objectives . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2.1. Support all NETCONF Transports . . . . . . . . . . . . . 3 | 2.1. Support all NETCONF transports . . . . . . . . . . . . . 3 | |||
2.2. Align Transport-Specific Configurations . . . . . . . . . 3 | 2.2. Enable each transport to select which keys to use . . . . 4 | |||
2.3. Support both Listening for Connections and Call Home . . 4 | 2.3. Support authenticating client-certificates . . . . . . . 4 | |||
2.4. For Call Home Connections . . . . . . . . . . . . . . . . 4 | 2.4. Support mapping authenticated client-certificates to | |||
2.4.1. Support More than One Application . . . . . . . . . . 4 | usernames . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
2.4.2. Support Applications Having More than One Server . . 4 | 2.5. Support both Listening for connections and Call Home . . 4 | |||
2.4.3. Support a Reconnection Strategy . . . . . . . . . . . 4 | 2.6. For Call Home connections . . . . . . . . . . . . . . . . 4 | |||
2.4.4. Support both Persistent and Periodic Connections . . 4 | 2.6.1. Support more than one application . . . . . . . . . . 4 | |||
2.4.5. Reconnection Strategy for Periodic Connections . . . 5 | 2.6.2. Support applications having more than one server . . 5 | |||
2.4.6. Keep-Alives for Persistent Connections . . . . . . . 5 | 2.6.3. Support a reconnection strategy . . . . . . . . . . . 5 | |||
2.4.7. Customizations for Periodic Connections . . . . . . . 5 | 2.6.4. Support both persistent and periodic connections . . 5 | |||
2.6.5. Reconnection strategy for periodic connections . . . 5 | ||||
2.6.6. Keep-alives for persistent connections . . . . . . . 5 | ||||
2.6.7. Customizations for periodic connections . . . . . . . 6 | ||||
3. Data Model . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 3. Data Model . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
3.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . 6 | 3.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . 6 | |||
3.2. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 8 | 3.1.1. The "session-options" subtree . . . . . . . . . . . . 6 | |||
4. Keep-Alives for SSH and TLS . . . . . . . . . . . . . . . . . 21 | 3.1.2. The "listen" subtree . . . . . . . . . . . . . . . . 6 | |||
4.1. SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 | 3.1.3. The "call-home" subtree . . . . . . . . . . . . . . . 7 | |||
4.2. TLS . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 | 3.1.4. The "ssh" subtree . . . . . . . . . . . . . . . . . . 9 | |||
5. Security Considerations . . . . . . . . . . . . . . . . . . . 22 | 3.1.5. The "tls" subtree . . . . . . . . . . . . . . . . . . 9 | |||
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 23 | 3.2. YANG Module . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
7. Other Considerations . . . . . . . . . . . . . . . . . . . . 23 | 4. Implementation strategy for keep-alives . . . . . . . . . . . 24 | |||
8. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 23 | 4.1. Keep-alives for SSH . . . . . . . . . . . . . . . . . . . 24 | |||
9. References . . . . . . . . . . . . . . . . . . . . . . . . . 24 | 4.2. Keep-alives for TLS . . . . . . . . . . . . . . . . . . . 25 | |||
9.1. Normative References . . . . . . . . . . . . . . . . . . 24 | 5. Security Considerations . . . . . . . . . . . . . . . . . . . 25 | |||
9.2. Informative References . . . . . . . . . . . . . . . . . 25 | 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 26 | |||
Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 26 | 7. Other Considerations . . . . . . . . . . . . . . . . . . . . 26 | |||
A.1. SSH Transport Configuration . . . . . . . . . . . . . . . 26 | 8. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 26 | |||
A.2. TLS Transport Configuration . . . . . . . . . . . . . . . 26 | 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 27 | |||
Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 27 | 9.1. Normative References . . . . . . . . . . . . . . . . . . 27 | |||
B.1. 00 to 01 . . . . . . . . . . . . . . . . . . . . . . . . 28 | 9.2. Informative References . . . . . . . . . . . . . . . . . 28 | |||
B.2. 01 to 02 . . . . . . . . . . . . . . . . . . . . . . . . 28 | Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 29 | |||
B.3. 02 to 03 . . . . . . . . . . . . . . . . . . . . . . . . 28 | A.1. SSH Transport Configuration + State . . . . . . . . . . . 29 | |||
Appendix C. Open Issues . . . . . . . . . . . . . . . . . . . . 28 | A.2. TLS Transport Configuration + State . . . . . . . . . . . 31 | |||
Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 32 | ||||
B.1. 00 to 01 . . . . . . . . . . . . . . . . . . . . . . . . 33 | ||||
B.2. 01 to 02 . . . . . . . . . . . . . . . . . . . . . . . . 33 | ||||
B.3. 02 to 03 . . . . . . . . . . . . . . . . . . . . . . . . 33 | ||||
B.4. 03 to 04 . . . . . . . . . . . . . . . . . . . . . . . . 33 | ||||
Appendix C. Open Issues . . . . . . . . . . . . . . . . . . . . 34 | ||||
1. Introduction | 1. Introduction | |||
This draft defines a NETCONF [RFC6241] server configuration data | This draft defines a NETCONF [RFC6241] server configuration data | |||
model. This data model enables configuration of the NETCONF service | model. This data model enables configuration of the NETCONF service | |||
itself, including which transports are supported, what ports does the | itself, including which transports are supported, what ports the | |||
server listen on, whether call-home is supported, and associated | server listens on, whether call-home is supported, and associated | |||
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 | |||
skipping to change at page 3, line 33 | skipping to change at page 3, line 39 | |||
o Symbols after data node names: "?" means an optional node, "!" | o Symbols after data node names: "?" means an optional node, "!" | |||
means a presence container, and "*" denotes a list and leaf-list. | means a presence container, and "*" denotes a list and leaf-list. | |||
o Parentheses enclose choice and case nodes, and case nodes are also | o Parentheses enclose choice and case nodes, and case nodes are also | |||
marked with a colon (":"). | marked with a colon (":"). | |||
2. Objectives | 2. Objectives | |||
The primary purpose of the YANG module defined herein is to enable | The primary purpose of the YANG module defined herein is to enable | |||
the configuration of the NETCONF service on the device. This scope | the configuration of the NETCONF server service on the device. This | |||
includes the following objectives: | scope includes the following objectives: | |||
2.1. Support all NETCONF Transports | 2.1. Support all NETCONF transports | |||
The YANG module should support all current NETCONF transports, namely | The YANG module should support all current NETCONF transports, namely | |||
NETCONF over SSH [RFC6242] and NETCONF over TLS [rfc5539bis], and be | NETCONF over SSH [RFC6242] and NETCONF over TLS [rfc5539bis], and be | |||
extensible to support future transports as necessary. | extensible to support future transports as necessary. | |||
Since implementations may not support all transports, the module | Because implementations may not support all transports, the module | |||
should use YANG "feature" statements so that implementations can | should use YANG "feature" statements so that implementations can | |||
accurately advertise which transports are supported. | accurately advertise which transports are supported. | |||
2.2. Align Transport-Specific Configurations | 2.2. Enable each transport to select which keys to use | |||
While each transport is unique in its protocol and may have some | Systems may have a multiplicity of host-keys or server-certificates | |||
distinct configurations, there remains a significant overlap between | from which subsets are configured for specific uses. For instance, a | |||
them. Thus the YANG module should use "grouping" statements so that | system may want to use one set of SSH host-keys when listening on | |||
the common aspects can be configured similarly. | port 830, and a different set of SSH host-keys when calling home. | |||
2.3. Support both Listening for Connections and Call Home | 2.3. Support authenticating client-certificates | |||
When certificates are used to authenticate NETCONF clients, there is | ||||
a need to configure the system to know how to authenticate the | ||||
certificates. The system should be able to do this either by using | ||||
path-validation to a configured trust anchor or by matching the | ||||
client-certificate to one previously configured. | ||||
2.4. Support mapping authenticated client-certificates to usernames | ||||
Some transports (e.g., TLS) need additional support to map | ||||
authenticated transport-level sessions to a NETCONF username. The | ||||
NETCONF server model defined herein should define an ability for this | ||||
mapping to be configured." | ||||
2.5. Support both Listening for connections and Call Home | ||||
NETCONF has always supported the server opening a port to listen for | NETCONF has always supported the server opening a port to listen for | |||
client connections. More recently the NETCONF working group defined | client connections. More recently the NETCONF working group defined | |||
support for call-home ([draft-ietf-netconf-call-home]). The module | support for call-home ([draft-ietf-netconf-call-home]). The module | |||
should configure both listening for connections and call-home. | should configure both listening for connections and call-home. | |||
Since implementations may not support both listening for connections | Because implementations may not support both listening for | |||
and call home, YANG "feature" statements should be used so that | connections and call home, YANG "feature" statements should be used | |||
implementation can accurately advertise the connection types it | so that implementation can accurately advertise the connection types | |||
supports. | it supports. | |||
2.4. For Call Home Connections | 2.6. For Call Home connections | |||
The following objectives only pertain to call home connections. | The following objectives only pertain to call home connections. | |||
2.4.1. Support More than One Application | 2.6.1. Support more than one application | |||
A device may be managed by more than one northbound application. For | A device may be managed by more than one northbound application. For | |||
instance, a deployment may have one application for provisioning and | instance, a deployment may have one application for provisioning and | |||
another for fault monitoring. Therefore, when it is desired for a | another for fault monitoring. Therefore, when it is desired for a | |||
device to initiate call home connections, it should be able to do so | device to initiate call home connections, it should be able to do so | |||
for more than one application. | for more than one application. | |||
2.4.2. Support Applications Having More than One Server | 2.6.2. Support applications having more than one server | |||
An application managing a device may implement a high-availability | An application managing a device may implement a high-availability | |||
strategy employing a multiplicity of active and/or passive servers. | strategy employing a multiplicity of active and/or passive servers. | |||
Therefore, when it is desired for a device to initiate call home | Therefore, when it is desired for a device to initiate call home | |||
connections, it should be able to connect to any of the applications | connections, it should be able to connect to any of the application's | |||
servers. | servers. | |||
2.4.3. Support a Reconnection Strategy | 2.6.3. Support a reconnection strategy | |||
Assuming an application has more than one server, then it becomes | Assuming an application has more than one server, then it becomes | |||
necessary to configure how a device should reconnect to the | necessary to configure how a device should reconnect to the | |||
application should it lose its connection to the application's | application should it lose its connection to the application's | |||
servers. Of primary interest is if the device should start with | servers. Of primary interest is if the device should start with | |||
first server defined in a user-ordered list of servers or with the | first server defined in a user-ordered list of servers or with the | |||
last server it was connected to. Secondary settings might specify | last server it was connected to. Secondary settings might specify | |||
the frequency of attempts and number of attempts per server. | the frequency of attempts and number of attempts per server. | |||
Therefore, a reconnection strategy should be configurable. | Therefore, a reconnection strategy should be configurable. | |||
2.4.4. Support both Persistent and Periodic Connections | 2.6.4. Support both persistent and periodic connections | |||
Applications may vary greatly on how frequently they need to interact | Applications may vary greatly on how frequently they need to interact | |||
with a device, how responsive interactions with devices need to be, | with a device, how responsive interactions with devices need to be, | |||
and how many simultaneous connections they can support. Some | and how many simultaneous connections they can support. Some | |||
applications may need a persistent connection to devices to optimize | applications may need a persistent connection to devices to optimize | |||
real-time interactions, while others are satisfied with periodic | real-time interactions, while others are satisfied with periodic | |||
interactions and reduced resources required. Therefore, when it is | interactions and reduced resources required. Therefore, when it is | |||
necessary for devices to initiate connections, the type of connection | necessary for devices to initiate connections, the type of connection | |||
desired should be configured. | desired should be configured. | |||
2.4.5. Reconnection Strategy for Periodic Connections | 2.6.5. Reconnection strategy for periodic connections | |||
The reconnection strategy should apply to both persistent and | The reconnection strategy should apply to both persistent and | |||
periodic connections. How it applies to periodic connections becomes | periodic connections. How it applies to periodic connections becomes | |||
clear when considering that a periodic "connection" is a logical | clear when considering that a periodic "connection" is a logical | |||
connection to a single server. That is, the periods of | connection to a single server. That is, the periods of | |||
unconnectedness are intentional as opposed to due to external | unconnectedness are intentional as opposed to due to external | |||
reasons. A periodic "connection" should always reconnect to the same | reasons. A periodic "connection" should always reconnect to the same | |||
server until it is no longer able to, at which time the reconnection | server until it is no longer able to, at which time the reconnection | |||
strategy guides how to connect to another server. | strategy guides how to connect to another server. | |||
2.4.6. Keep-Alives for Persistent Connections | 2.6.6. Keep-alives for persistent connections | |||
If a persistent connection is desired, it is the responsibility of | If a persistent connection is desired, it is the responsibility of | |||
the connection-initiator to actively test the aliveness of the | the connection-initiator to actively test the "aliveness" of the | |||
connection. The connection initiator must immediately work to | connection. The connection initiator must immediately work to | |||
reestablish a persistent connection as soon as the connection is | reestablish a persistent connection as soon as the connection is | |||
lost. How often the connection should be tested is driven by | lost. How often the connection should be tested is driven by | |||
applications requirements, and therefore keep-alive settings should | application requirements, and therefore keep-alive settings should be | |||
be configurable on a per-application basis. | configurable on a per-application basis. | |||
2.4.7. Customizations for Periodic Connections | 2.6.7. Customizations for periodic connections | |||
If a periodic connection is desired, it is necessary for the device | If a periodic connection is desired, it is necessary for the device | |||
to know how often it should connect. This delay essentially | to know how often it should connect. This delay essentially | |||
determines how long the application might have to wait to send data | determines how long the application might have to wait to send data | |||
to the device. This setting does not constrain how often the device | to the device. This setting does not constrain how often the device | |||
must wait to send data to the application, as the device should | must wait to send data to the application, as the device should | |||
immediately connect to the application whenever it has data to send | immediately connect to the application whenever it has data to send | |||
to it. | to it. | |||
A common communication pattern is that one data transmission is many | A common communication pattern is that one data transmission is many | |||
skipping to change at page 6, line 9 | skipping to change at page 6, line 29 | |||
to send a notification message, there's a high probability that it | to send a notification message, there's a high probability that it | |||
will send another shortly thereafter. Likewise, the application may | will send another shortly thereafter. Likewise, the application may | |||
have a sequence of pending messages to send. Thus, it should be | have a sequence of pending messages to send. Thus, it should be | |||
possible for a device to hold a connection open until some amount of | possible for a device to hold a connection open until some amount of | |||
time of no data being transmitted as transpired. | time of no data being transmitted as transpired. | |||
3. Data Model | 3. Data Model | |||
3.1. Overview | 3.1. Overview | |||
The following subtree illustrates how this YANG module enables | 3.1.1. The "session-options" subtree | |||
module: ietf-netconf-server | ||||
+--rw netconf-server | ||||
+--rw session-options | ||||
+--rw hello-timeout? uint32 | ||||
+--rw idle-timeout? uint32 | ||||
The above subtree illustrates how this YANG module enables | ||||
configuration of NETCONF session options, independent of any | ||||
transport or connection strategy. Please see the YANG module | ||||
(Section 3.2) for a complete description of these configuration | ||||
knobs. | ||||
3.1.2. The "listen" subtree | ||||
module: ietf-netconf-server | ||||
+--rw netconf-server | ||||
+--rw listen {"(ssh-listen or tls-listen)"}? // YANG 1.1 syntax | ||||
+--rw max-sessions? 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 keep-alives | ||||
+--rw interval-secs? uint8 | ||||
+--rw count-max? uint8 | ||||
The above subtree illustrates how this YANG module enables | ||||
configuration for listening for remote connections, as described in | configuration for listening for remote connections, as described in | |||
[RFC6242] and [rfc5539bis]. Feature statements are used to limit | [RFC6242] and [rfc5539bis]. Feature statements are used to limit | |||
both if listening is supported at all as well as for which | both if listening is supported at all as well as for which | |||
transports. If listening for connections is supported, then the | transports. If listening for connections is supported, then the | |||
model enables configuring a list of listening endpoints, each | model enables configuring a list of listening endpoints, each | |||
configured with a user-specified name (the key field), the transport | configured with a user-specified name (the key field), the transport | |||
to use (i.e. SSH, TLS), and the IP address and port to listen on. | to use (i.e. SSH, TLS), and the IP address and port to listen on. | |||
The port field is optional, defaulting to the transport-specific port | The port field is optional, defaulting to the transport-specific port | |||
when not configured. | when not configured. | |||
module: ietf-netconf-server | 3.1.3. The "call-home" subtree | |||
+--rw netconf-server | module: ietf-netconf-server | |||
+--rw listen* [name] | +--rw netconf-server | |||
+--rw name string | +--rw call-home {"(ssh-call-home or tls-call-home)"}? // YANG 1.1 syntax | |||
+--rw (transport) | +--rw application* [name] | |||
+--:(ssh) {ssh-listen}? | ||||
| +--rw ssh | ||||
| +--rw address inet:host | ||||
| +--rw port? inet:port-number | ||||
+--:(tls) {tls-listen}? | ||||
+--rw tls | ||||
+--rw address inet:host | ||||
+--rw port? inet:port-number | ||||
The following subtree illustrates how this YANG module enables | ||||
configuration for call home, as described in | ||||
[draft-ietf-netconf-call-home]. Feature statements are used to limit | ||||
both if call-home is supported at all as well as for which | ||||
transports, if it is. If call-home is supported, then the model | ||||
supports configuring a list of applications to connect to. Each | ||||
application is configured with a user-specified name (the key field), | ||||
the transport to be used (i.e. SSH, TLS), and a list of remote | ||||
endpoints, each having a name, an IP address, and an optional port. | ||||
Additionally, the configuration for each remote application indicates | ||||
the connection-type (persistent vs. periodic) and associated | ||||
parameters, as well as the reconnection strategy to use. | ||||
module: ietf-netconf-server | ||||
+--rw netconf-server | ||||
+--rw call-home* [name] | ||||
+--rw name string | +--rw name string | |||
+--rw (transport) | +--rw (transport) | |||
| +--:(ssh) {ssh-call-home}? | | +--:(ssh) {ssh-call-home}? | |||
| | +--rw ssh | | | +--rw ssh | |||
| | +--rw endpoints | | | +--rw endpoints | |||
| | | +--rw endpoint* [name] | | | | +--rw endpoint* [name] | |||
| | | +--rw name string | | | | +--rw name string | |||
| | | +--rw address inet:host | | | | +--rw address inet:host | |||
| | | +--rw port? inet:port-number | | | | +--rw port? inet:port-number | |||
| | +--rw host-key* [name] | | | +--rw host-keys | |||
| | +--rw name string | | | +--rw host-key* string | |||
| +--:(tls) {tls-call-home}? | | +--:(tls) {tls-call-home}? | |||
| +--rw tls | | +--rw tls | |||
| +--rw endpoints | | +--rw endpoints | |||
| +--rw endpoint* [name] | | | +--rw endpoint* [name] | |||
| +--rw name string | | | +--rw name string | |||
| +--rw address inet:host | | | +--rw address inet:host | |||
| +--rw port? inet:port-number | | | +--rw port? inet:port-number | |||
| +--rw certificates | ||||
| +--rw certificate* string | ||||
+--rw connection-type | +--rw connection-type | |||
| +--rw (connection-type)? | | +--rw (connection-type)? | |||
| +--:(persistent-connection) | | +--:(persistent-connection) | |||
| | +--rw persistent | | | +--rw persistent | |||
| | +--rw keep-alives | | | +--rw keep-alives | |||
| | +--rw interval-secs? uint8 | | | +--rw interval-secs? uint8 | |||
| | +--rw count-max? uint8 | | | +--rw count-max? uint8 | |||
| +--:(periodic-connection) | | +--:(periodic-connection) | |||
| +--rw periodic | | +--rw periodic | |||
| +--rw timeout-mins? uint8 | | +--rw timeout-mins? uint8 | |||
| +--rw linger-secs? uint8 | | +--rw linger-secs? uint8 | |||
+--rw reconnect-strategy | +--rw reconnect-strategy | |||
+--rw start-with? enumeration | +--rw start-with? enumeration | |||
+--rw interval-secs? uint8 | +--rw interval-secs? uint8 | |||
+--rw count-max? uint8 | +--rw count-max? uint8 | |||
The following subtree illustrates how this YANG module enables | The above subtree illustrates how this YANG module enables | |||
authentication of TLS client certificates and mapping TLS clients to | configuration for call home, as described in | |||
NETCONF user names. More specifically, the "trusted-ca-certs" and | [draft-ietf-netconf-call-home]. Feature statements are used to limit | |||
"trusted-client-certs" containers are used to authenticate TLS client | both if call-home is supported at all as well as for which | |||
certificates, while "cert-maps" and "psk-maps" are used to map TLS | transports, if it is. If call-home is supported, then the model | |||
clients to NETCONF user names. | supports configuring a list of applications to connect to. Each | |||
application is configured with a user-specified name (the key field), | ||||
the transport to be used (i.e. SSH, TLS), and a list of remote | ||||
endpoints, each having a name, an IP address, and an optional port. | ||||
Additionally, the configuration for each remote application indicates | ||||
the connection-type (persistent vs. periodic) and associated | ||||
parameters, as well as the reconnection strategy to use. | ||||
3.1.4. The "ssh" subtree | ||||
module: ietf-netconf-server | module: ietf-netconf-server | |||
+--rw netconf-server | +--rw netconf-server | |||
+--rw tls-client-auth | +--rw ssh | |||
+--rw trusted-ca-certs | +--ro host-keys | |||
| +--rw trusted-ca-cert* binary | +--ro host-key* [name] | |||
+--rw trusted-client-certs | +--ro name string | |||
| +--rw trusted-client-cert* binary | +--ro format-identifier string | |||
+--rw cert-maps {tls-map-certificates}? | +--ro data binary | |||
| +--rw cert-to-name* [id] | +--ro fingerprint string | |||
| +--rw id uint32 | ||||
| +--rw fingerprint x509c2n:tls-fingerprint | The above subtree illustrates how this YANG module provides SSH state | |||
| +--rw map-type identityref | independent of if the NETCONF server if listening or calling home. | |||
| +--rw name string | This data-model provides a read-only listing of currently configured | |||
+--rw psk-maps {tls-map-pre-shared-keys}? | TLC certificates. | |||
+--rw psk-map* [psk-identity] | ||||
+--rw psk-identity string | 3.1.5. The "tls" subtree | |||
+--rw user-name nacm:user-name-type | ||||
+--rw not-valid-before? yang:date-and-time | module: ietf-netconf-server | |||
+--rw not-valid-after? yang:date-and-time | +--rw netconf-server | |||
+--rw key yang:hex-string | +--rw tls | |||
+--ro certificates | ||||
| +--ro certificate* [name] | ||||
| +--ro name string | ||||
| +--ro data binary | ||||
+--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 | ||||
The above subtree illustrates how this YANG module provides TLS state | ||||
and enables TLS configuration independent of if the NETCONF server if | ||||
listening or calling home. This data-model provides 1) a read-only | ||||
listing of currently configured TLC certificates and 2) an ability to | ||||
configure how client-certificates are authenicated and how | ||||
authenticated client-certificates are mapped to NETCONF user names. | ||||
3.2. YANG Module | 3.2. YANG Module | |||
This YANG module imports YANG types from [RFC6991], [RFC6536], and | This YANG module imports YANG types from [RFC6991], and | |||
[draft-ietf-netmod-snmp-cfg]. | [draft-ietf-netmod-snmp-cfg]. | |||
RFC Ed.: update the date below with the date of RFC publication | RFC Ed.: update the date below with the date of RFC publication | |||
and remove this note. | and remove this note. | |||
<CODE BEGINS> file "ietf-netconf-server@YYYY-MM-DD.yang" | <CODE BEGINS> file "ietf-netconf-server@2014-10-26.yang" | |||
module ietf-netconf-server { | module ietf-netconf-server { | |||
namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-server"; | namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-server"; | |||
prefix "ncserver"; | prefix "ncserver"; | |||
import ietf-inet-types { | import ietf-inet-types { | |||
prefix inet; // RFC 6991 | prefix inet; // RFC 6991 | |||
} | } | |||
import ietf-yang-types { | ||||
prefix yang; // RFC 6991 | ||||
} | ||||
import ietf-netconf-acm { | ||||
prefix nacm; // RFC 6536 | ||||
} | ||||
import ietf-x509-cert-to-name { | import ietf-x509-cert-to-name { | |||
prefix x509c2n; // draft-ietf-netmod-snmp-cfg | prefix x509c2n; // draft-ietf-netmod-snmp-cfg | |||
} | } | |||
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 9, line 41 | skipping to change at page 11, line 19 | |||
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 XXXX; see | This version of this YANG module is part of RFC XXXX; see | |||
the RFC itself for full legal notices."; | the RFC itself for full legal notices."; | |||
// RFC Ed.: replace XXXX with actual RFC number and | // RFC Ed.: replace XXXX with actual RFC number and | |||
// remove this note | // remove this note | |||
// RFC Ed.: please update the date to the date of publication | // RFC Ed.: please update the date to the date of publication | |||
revision "YYYY-MM-DD" { | revision "2014-10-26" { // YYYY-MM-DD | |||
description | description | |||
"Initial version"; | "Initial version"; | |||
reference | reference | |||
"RFC XXXX: NETCONF Server Configuration Model"; | "RFC XXXX: NETCONF Server Configuration Model"; | |||
} | } | |||
// Features | // Features | |||
feature ssh-listen { | feature ssh-listen { | |||
description | description | |||
"The ssh-listen feature indicates that the NETCONF server can | "The ssh-listen feature indicates that the NETCONF server can | |||
open a port to listen for incoming client connections."; | open a port to listen for incoming client connections."; | |||
} | } | |||
feature ssh-call-home { | feature ssh-call-home { | |||
description | description | |||
"The ssh-call-home feature indicates that the NETCONF server can | "The ssh-call-home feature indicates that the NETCONF server can | |||
connect to a client."; | connect to a client."; | |||
skipping to change at page 10, line 28 | skipping to change at page 12, line 4 | |||
feature tls-listen { | feature tls-listen { | |||
description | description | |||
"The tls-listen feature indicates that the NETCONF server can | "The tls-listen feature indicates that the NETCONF server can | |||
open a port to listen for incoming client connections."; | open a port to listen for incoming client connections."; | |||
} | } | |||
feature tls-call-home { | feature tls-call-home { | |||
description | description | |||
"The tls-call-home feature indicates that the NETCONF server can | "The tls-call-home feature indicates that the NETCONF server can | |||
connect to a client."; | connect to a client."; | |||
} | ||||
feature tls-map-certificates { | ||||
description | ||||
"The tls-map-certificates feature indicates that the | ||||
NETCONF server implements mapping X.509 certificates to NETCONF | ||||
usernames."; | ||||
} | } | |||
feature tls-map-pre-shared-keys { | // top-level container (groupings below) | |||
description | ||||
"The tls-map-pre-shared-keys feature indicates that the | ||||
NETCONF server implements mapping TLS pre-shared keys | ||||
to NETCONF usernames."; | ||||
} | ||||
// Module's top-level container | ||||
container netconf-server { | container netconf-server { | |||
description | description | |||
"Top-level container for NETCONF server configuration."; | "Top-level container for NETCONF server configuration."; | |||
list listen { | ||||
key name; | ||||
description | ||||
"List of endpoints to listen for connections on."; | ||||
//if-feature "(ssh-listen or tls-listen)"; | ||||
uses listen-config; | ||||
} | ||||
list call-home { | ||||
key name; | ||||
description | ||||
"List of applications to call-home to."; | ||||
//if-feature "(ssh-call-home or tls-call-home)"; | ||||
uses call-home-config; | ||||
} | ||||
container tls-client-auth { | ||||
//if-feature "(tls-listen or tls-call-home)"; | ||||
description | ||||
"Container for TLS client authentication configuration."; | ||||
uses trusted-ca-certs-grouping; | ||||
uses trusted-client-certs-grouping; | ||||
uses cert-maps-grouping; | ||||
uses psk-maps-grouping; | ||||
} | ||||
} | ||||
// Groupings | uses session-options-container; | |||
uses listen-container; | ||||
uses call-home-container; | ||||
uses ssh-container; | ||||
uses tls-container; | ||||
grouping listen-config { | } | |||
grouping session-options-container { | ||||
description | description | |||
"Grouping for listen configuration."; | ""; | |||
leaf name { | container session-options { | |||
type string; | ||||
description | ||||
"An arbitrary name for the listen endpoint."; | ||||
} | ||||
choice transport { | ||||
mandatory true; | ||||
description | description | |||
"Selects between SSH and TLS transports."; | "NETCONF session options, independent of transport | |||
case ssh { | or connection strategy."; | |||
if-feature ssh-listen; | leaf hello-timeout { | |||
container ssh { | type uint32 { | |||
description | range "0 | 10 .. 3600"; | |||
"SSH-specific listening configuration for inbound | ||||
connections."; | ||||
uses listen-per-transport-config { | ||||
refine port { | ||||
default 830; | ||||
} | ||||
} | ||||
} | } | |||
units "seconds"; | ||||
default '600'; | ||||
description | ||||
"Specifies the number of seconds that a session | ||||
may exist before the hello PDU is received. | ||||
A session will be dropped if no hello PDU | ||||
is received before this number of seconds elapses. | ||||
If this parameter is set to zero, then the server | ||||
will wait forever for a hello message, and not | ||||
drop any sessions stuck in 'hello-wait' state. | ||||
Setting this parameter to zero may permit | ||||
denial of service attacks, since only a limited | ||||
number of concurrent sessions are supported | ||||
by the server."; | ||||
} | } | |||
case tls { | leaf idle-timeout { | |||
if-feature tls-listen; | type uint32 { | |||
container tls { | range "0 | 10 .. 360000"; | |||
description | ||||
"TLS-specific listening configuration for inbound | ||||
connections."; | ||||
uses listen-per-transport-config { | ||||
refine port { | ||||
default 6513; | ||||
} | ||||
} | ||||
} | } | |||
} | units "seconds"; | |||
} | default '3600'; | |||
} | description | |||
"Specifies the number of seconds that a session | ||||
may remain idle without issuing any RPC requests. | ||||
A session will be dropped if it is idle for an | ||||
interval longer than this number of seconds. | ||||
grouping listen-per-transport-config { | Sessions that have a notification subscription | |||
description | active are never dropped. | |||
"Provides the configuration of the NETCONF server to | ||||
open one or more ports to listen for incoming client | ||||
connections."; | ||||
leaf address { | ||||
type inet:host; | ||||
mandatory true; | ||||
description | ||||
"The local IP address/name of the interface to listen on."; | ||||
} | ||||
leaf port { | ||||
type inet:port-number; | ||||
description | ||||
"The local port number on this interface the | ||||
NETCONF server listens on."; | ||||
} | ||||
} | ||||
grouping call-home-config { | If this parameter is set to zero, then the server | |||
description | will never drop a session because it is idle."; | |||
"Grouping for call-home configuration."; | } | |||
leaf name { | ||||
type string; | ||||
description | ||||
"An arbitrary name for the remote application."; | ||||
} | } | |||
uses call-home-transport-config; | ||||
uses call-home-connection-type-config; | ||||
uses call-home-reconnection-strategy-config; | ||||
} | } | |||
grouping call-home-transport-config { | grouping listen-container { | |||
description | description | |||
"Grouping for call-home specific transport selection."; | ""; | |||
choice transport { | container listen { | |||
mandatory true; | ||||
description | description | |||
"Selects between SSH and TLS transports."; | "Configures listen behavior"; | |||
case ssh { | //if-feature "(ssh-listen or tls-listen)"; | |||
if-feature ssh-call-home; | leaf max-sessions { | |||
container ssh { | type uint16 { | |||
range "0 .. 1024"; | ||||
} | ||||
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."; | ||||
} | ||||
list endpoint { | ||||
key name; | ||||
description | ||||
"List of endpoints to listen for connections on."; | ||||
leaf name { | ||||
type string; | ||||
description | description | |||
"Specifies SSH-specific call-home transport | "An arbitrary name for the listen endpoint."; | |||
configuration."; | } | |||
uses call-home-per-transport-config { | choice transport { | |||
refine endpoints/endpoint/port { | mandatory true; | |||
default 9999; // pending IANA assignment | description | |||
"Selects between SSH and TLS 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-container; | ||||
} | } | |||
} | } | |||
list host-key { | case tls { | |||
key name; | if-feature tls-listen; | |||
min-elements 1; | container tls { | |||
ordered-by user; | ||||
description | ||||
"User-ordered list of host-keys the SSH server | ||||
should advertise."; | ||||
leaf name { | ||||
type string; | ||||
mandatory true; | ||||
description | description | |||
"The name of a host key the device should | "TLS-specific listening configuration for inbound | |||
advertise during the SSH key exchange."; | connections."; | |||
uses address-and-port-grouping { | ||||
refine port { | ||||
default 6513; | ||||
} | ||||
} | ||||
uses certificates-container; | ||||
} | } | |||
} | } | |||
} | } | |||
} | uses keep-alives-container { | |||
case tls { | refine keep-alives/interval-secs { | |||
if-feature tls-call-home; | default 0; // disabled by default for listen connections | |||
container tls { | ||||
description | ||||
"Specifies TLS-specific call-home transport | ||||
configuration."; | ||||
uses call-home-per-transport-config { | ||||
refine endpoints/endpoint/port { | ||||
default 9999; // pending IANA assignment | ||||
} | ||||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
grouping call-home-per-transport-config { | grouping call-home-container { | |||
description | description | |||
"Grouping for transport-specific configuration for | ""; | |||
call-home connections."; | container call-home { | |||
container endpoints { | //if-feature "(ssh-call-home or tls-call-home)"; | |||
description | description | |||
"Container for the list of endpoints."; | "Configures call-home behavior"; | |||
list endpoint { | list application { | |||
key name; | key name; | |||
min-elements 1; | ||||
ordered-by user; | ||||
description | description | |||
"User-ordered list of endpoints for this application. | "List of applications to call-home to."; | |||
Defining more than one enables high-availability."; | ||||
leaf name { | leaf name { | |||
type string; | type string; | |||
description | description | |||
"An arbitrary name for the endpoint to connect to."; | "An arbitrary name for the remote application."; | |||
} | } | |||
leaf address { | choice transport { | |||
type inet:host; | ||||
mandatory true; | mandatory true; | |||
description | description | |||
"The hostname or IP address of the endpoint. | "Selects between SSH and TLS transports."; | |||
If a hostname is provided and DNS resolves to | case ssh { | |||
more than one IP address, the device SHOULD | if-feature ssh-call-home; | |||
try all of the ones it can based on how its | container ssh { | |||
networking stack is configured (e.g. v4, v6, | description | |||
dual-stack)."; | "Specifies SSH-specific call-home transport | |||
configuration."; | ||||
uses endpoints-container { | ||||
refine endpoints/endpoint/port { | ||||
default 8888; // pending IANA assignment | ||||
} | ||||
} | ||||
uses host-keys-container; | ||||
} | ||||
} | ||||
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 9999; // pending IANA assignment | ||||
} | ||||
} | ||||
uses certificates-container; | ||||
} | ||||
} | ||||
} | } | |||
leaf port { | container connection-type { | |||
type inet:port-number; | ||||
description | description | |||
"The IP port for this endpoint. The device will use | "Indicates the NETCONF client's preference for how the | |||
the IANA-assigned well-known port if not specified."; | device's connection is maintained."; | |||
} | choice connection-type { | |||
} | default persistent-connection; | |||
} | ||||
} | ||||
grouping call-home-connection-type-config { | ||||
description | ||||
"Grouping to define connection-type for call-home | ||||
based connections."; | ||||
container connection-type { | ||||
description | ||||
"Indicates the network manager's preference for how the | ||||
device's connection is maintained."; | ||||
choice connection-type { | ||||
default persistent-connection; | ||||
description | ||||
"Selects between persistent and periodic connections."; | ||||
case persistent-connection { | ||||
container persistent { | ||||
description | description | |||
"Maintain a persistent connection to the | "Selects between persistent and periodic connections."; | |||
network manager. If the connection goes down, | ||||
immediately start trying to reconnect to it, | ||||
using the reconnection strategy. | ||||
This connection type minimizes any | case persistent-connection { | |||
manager-to-device data-transfer delay, | container persistent { | |||
albeit at the expense of holding resources | ||||
longer."; | ||||
container keep-alives { | ||||
description | ||||
"Configures keep-alive policy, to proactively | ||||
detect when a persistent connection to an | ||||
endpoint has dropped."; | ||||
leaf interval-secs { | ||||
type uint8; | ||||
units seconds; | ||||
default 15; | ||||
description | description | |||
"Sets a timeout interval in seconds after which | "Maintain a persistent connection to the | |||
if no data has been received from the manager's | NETCONF client. If the connection goes down, | |||
endpoint, a message will be sent to request a | immediately start trying to reconnect to it, | |||
response from the endpoint. A value of '0' | using the reconnection strategy. | |||
indicates that no keep-alive messages should | ||||
be sent."; | This connection type minimizes any NETCONF | |||
client to NETCONF server data-transfer delay, | ||||
albeit at the expense of holding resources | ||||
longer."; | ||||
uses keep-alives-container { | ||||
refine keep-alives/interval-secs { | ||||
default 15; // 15 seconds for call-home sessions | ||||
} | ||||
} | ||||
} | } | |||
leaf count-max { | } | |||
type uint8; | case periodic-connection { | |||
default 3; | container periodic { | |||
description | description | |||
"Sets the number of keep-alive messages that may | "Periodically connect to NETCONF client, using the | |||
be sent without receiving any data from the | reconnection strategy, so the NETCONF client can | |||
manager's endpoint before assuming the endpoint | deliver pending messages to the NETCONF server. | |||
is no longer alive. If this threshold is | ||||
reached, the transport-level connection will be | For messages the NETCONF server wants to send to | |||
disconnected (thus triggering the reconnection | to the NETCONF client, the NETCONF server should | |||
strategy). The interval timer is reset after | proactively connect to the NETCONF client, if | |||
each transmission, thus an unresponsive | not already, to send the messages immediately."; | |||
endpoint will be disconnected after about | leaf timeout-mins { | |||
count-max * interval-secs seconds."; | type uint8; | |||
units minutes; | ||||
default 5; | ||||
description | ||||
"The maximum amount of unconnected time the | ||||
device will wait until establishing a | ||||
connection to the NETCONF client again. The | ||||
device MAY establish a connection before this | ||||
time if it has data it needs to send to the | ||||
NETCONF client. Note: this value differs from | ||||
the reconnection strategy's interval-secs | ||||
value."; | ||||
} | ||||
leaf linger-secs { | ||||
type uint8; | ||||
units seconds; | ||||
default 30; | ||||
description | ||||
"The amount of time the device should wait after | ||||
last receiving data from or sending data to the | ||||
NETCONF client's endpoint before closing its | ||||
connection to it. This is an optimization to | ||||
prevent unnecessary connections."; | ||||
} | ||||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
case periodic-connection { | container reconnect-strategy { | |||
container periodic { | description | |||
description | "The reconnection strategy guides how a device reconnects | |||
"Periodically connect to network manager, using the | to an application, after losing a connection to it, | |||
reconnection strategy, so it can flush any pending | even if due to a reboot. The device starts with the | |||
data it may be holding. This connection type | specified endpoint, tries to connect to it count-max | |||
minimizes resources held open, albeit at the | times, waiting interval-secs between each connection | |||
expense of longer manager-to-device data-transfer | attempt, before trying the next endpoint in the list | |||
delay. Note that for device-to-manager data, the | (round robin)."; | |||
data should be sent immediately, connecting to | leaf start-with { | |||
network manager first if not already."; | type enumeration { | |||
leaf timeout-mins { | enum first-listed { | |||
type uint8; | description | |||
units minutes; | "Indicates that reconnections should start with | |||
default 5; | the first endpoint listed."; | |||
description | } | |||
"The maximum amount of unconnected time the | enum last-connected { | |||
device will wait until establishing a | description | |||
connection to the network manager again. The | "Indicates that reconnections should start with | |||
device MAY establish a connection before this | the endpoint last connected to. NETCONF servers | |||
time if it has data it needs to send to the | SHOULD support this flag across reboots."; | |||
network manager. Note: this value differs from | } | |||
the reconnection strategy's interval-secs | ||||
value."; | ||||
} | ||||
leaf linger-secs { | ||||
type uint8; | ||||
units seconds; | ||||
default 30; | ||||
description | ||||
"The amount of time the device should wait after | ||||
last receiving data from or sending data to the | ||||
network manager's endpoint before closing its | ||||
connection to it. This is an optimization to | ||||
prevent unnecessary connections."; | ||||
} | } | |||
default first-listed; | ||||
description | ||||
"Specifies which of the application's endpoints the | ||||
device should start with when trying to connect to | ||||
the application. If no previous connection has | ||||
ever been established, last-connected defaults to | ||||
the first endpoint listed."; | ||||
} | ||||
leaf interval-secs { | ||||
type uint8; | ||||
units seconds; | ||||
default 5; | ||||
description | ||||
"Specifies the time delay between connection attempts | ||||
to the same endpoint. Note: this value differs from | ||||
the periodic-connection's timeout-mins value."; | ||||
} | ||||
leaf count-max { | ||||
type uint8; | ||||
default 3; | ||||
description | ||||
"Specifies the number times the device tries to | ||||
connect to a specific endpoint before moving on to | ||||
the next endpoint in the list (round robin)."; | ||||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
grouping call-home-reconnection-strategy-config { | grouping ssh-container { | |||
description | description | |||
"Grouping for reconnection strategy."; | ""; | |||
container reconnect-strategy { | container ssh { | |||
description | description | |||
"The reconnection strategy guides how a device reconnects | "Configures SSH properties not specific to the listen | |||
to an application, after losing a connection to it, | or call-home use-cases"; | |||
even if due to a reboot. The device starts with the | //if-feature "(ssh-listen or ssh-call-home)"; | |||
specified endpoint, tries to connect to it count-max | container host-keys { | |||
times, waiting interval-secs between each connection | config false; | |||
attempt, before trying the next endpoint in the list | description | |||
(round robin)."; | "Parent container for a list of host keys"; | |||
leaf start-with { | list host-key { | |||
type enumeration { | key name; | |||
enum first-listed { | description | |||
"A read-only list of host-keys supported by server"; | ||||
leaf name { | ||||
type string; | ||||
description | description | |||
"Indicates that reconnections should start with | "Common name for the host-key"; | |||
the first endpoint listed."; | ||||
} | } | |||
enum last-connected { | leaf format-identifier { | |||
type string; | ||||
mandatory true; | ||||
description | description | |||
"Indicates that reconnections should start with | "ssh-dss, ssh-rsa, x509v3-rsa2048-sha256, etc."; | |||
the endpoint last connected to."; | reference | |||
"RFC 4253: SSH Transport Layer Protocol, section 6.6 | ||||
RFC 6187: X.509v3 Certificates for SSH, section 3"; | ||||
} | ||||
leaf data { | ||||
type binary; | ||||
mandatory true; | ||||
description | ||||
"Key-specific binary encoding."; | ||||
reference | ||||
"RFC 4253: SSH Transport Layer Protocol, section 6.6"; | ||||
} | ||||
leaf fingerprint { | ||||
type string; | ||||
mandatory true; | ||||
description | ||||
"c1:b1:30:29:d7:b8:de:6c:97:77:10:d7:46:41:63:87"; | ||||
reference | ||||
"RFC 4716: The Secure Shell (SSH) Public Key File | ||||
Format, section 4"; | ||||
} | } | |||
} | } | |||
default first-listed; | ||||
description | ||||
"Specifies which of the application's endpoints the | ||||
device should start with when trying to connect to | ||||
the application. If no previous connection has | ||||
ever been established, last-connected defaults to | ||||
the first endpoint listed."; | ||||
} | } | |||
leaf interval-secs { | } | |||
type uint8; | } | |||
units seconds; | ||||
default 5; | grouping tls-container { | |||
description | ||||
""; | ||||
container tls { | ||||
description | ||||
"Configures TLS properties not specific to the listen | ||||
or call-home use-cases"; | ||||
//if-feature "(tls-listen or tls-call-home)"; | ||||
container certificates { | ||||
config false; | ||||
description | description | |||
"Specifies the time delay between connection attempts | "Parent container for a list of certificates"; | |||
to the same endpoint. Note: this value differs from | list certificate { | |||
the periodic-connection's timeout-mins value."; | key name; | |||
description | ||||
"A list of certificates"; | ||||
leaf name { | ||||
type string; | ||||
description | ||||
"the certificate's common name"; | ||||
} | ||||
leaf data { | ||||
type binary; | ||||
mandatory true; | ||||
description | ||||
"The binary certificate structure, as specified | ||||
by RFC 5246, Section 7.4.2, i.e.,: opaque | ||||
ASN.1Cert<1..2^24-1>;"; | ||||
} | ||||
} | ||||
} | } | |||
leaf count-max { | container client-auth { | |||
type uint8; | ||||
default 3; | ||||
description | description | |||
"Specifies the number times the device tries to | "Container for TLS client authentication configuration."; | |||
connect to a specific endpoint before moving on to | container trusted-ca-certs { | |||
the next endpoint in the list (round robin)."; | description | |||
"A list of Certificate Authority (CA) certificates that | ||||
a NETCONF server can use to authenticate NETCONF client | ||||
certificates. A client's certificate is authenticated | ||||
if there is a chain of trust to a configured trusted CA | ||||
certificate. Note, in the TLS protocol, the client | ||||
certificate MAY be accompanied with additional | ||||
certificates forming a chain of trust. The client's | ||||
certificate is authenticated if there is path-validation | ||||
from any of the certificates it presents to a configured | ||||
trust anchor."; | ||||
leaf-list trusted-ca-cert { | ||||
type binary; | ||||
ordered-by system; | ||||
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 certificates."; | ||||
leaf-list trusted-client-cert { | ||||
type binary; | ||||
ordered-by system; | ||||
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 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."; | ||||
} | ||||
} | } | |||
} | } | |||
} | } | |||
grouping trusted-ca-certs-grouping { | grouping host-keys-container { | |||
description | description | |||
"Grouping for trusted-ca-certs container."; | ""; | |||
container trusted-ca-certs { | container host-keys { | |||
description | description | |||
"A list of Certificate Authority (CA) certificates that a | "Parent container for the list of host-keys."; | |||
NETCONF server can use to authenticate a NETCONF client's | leaf-list host-key { | |||
certificate. A client's certificate is authenticated if | type string; | |||
its Issuer matches one of the configured trusted CA | min-elements 1; | |||
certificates."; | ordered-by user; | |||
leaf-list trusted-ca-cert { | ||||
type binary; | ||||
ordered-by system; | ||||
description | description | |||
"The binary certificate structure, as | "User-ordered list of host-keys the SSH server | |||
specified by RFC 5246, Section 7.4.6, i.e.,: | considers when composing the list of server | |||
host key algorithms it will send to the client. | ||||
opaque ASN.1Cert<1..2^24>; | The value of the string is the name of a | |||
host-key configured on the system, as returned | ||||
"; | by /netconf-server/ssh/host-keys/host-key/name."; | |||
reference | reference | |||
"RFC 5246: The Transport Layer Security (TLS) | "RFC 4253: The SSH Transport Layer Protocol, Section 7"; | |||
Protocol Version 1.2"; | ||||
} | } | |||
} | } | |||
} | } | |||
grouping trusted-client-certs-grouping { | grouping certificates-container { | |||
description | description | |||
"Grouping for trusted-client-certs container."; | ""; | |||
container trusted-client-certs { | container certificates { | |||
description | description | |||
"A list of client certificates that a NETCONF server can | "Parent container for the list of certificates."; | |||
use to authenticate a NETCONF client's certificate. A | leaf-list certificate { | |||
client's certificate is authenticated if it is an exact | type string; | |||
match to a configured trusted client certificates."; | min-elements 1; | |||
leaf-list trusted-client-cert { | ||||
type binary; | ||||
ordered-by system; | ||||
description | description | |||
"The binary certificate structure, as | "Unordered list of certificates the TLS server can | |||
specified by RFC 5246, Section 7.4.6, i.e.,: | pick from when sending its Server Certificate | |||
message. The value of the string is the name of a | ||||
opaque ASN.1Cert<1..2^24>; | certificate configured on the system, as returned by | |||
/netconf-server/tls/certificates/certificate/name"; | ||||
"; | ||||
reference | reference | |||
"RFC 5246: The Transport Layer Security (TLS) | "RFC 5246: The TLS Protocol, Section 7.4.2"; | |||
Protocol Version 1.2"; | ||||
} | } | |||
} | } | |||
} | } | |||
// Objects for deriving NETCONF usernames from X.509 | grouping address-and-port-grouping { | |||
// certificates. | ||||
grouping cert-maps-grouping { | ||||
description | description | |||
"Grouping for cert-maps container."; | "a common grouping"; | |||
container cert-maps { | leaf address { | |||
if-feature tls-map-certificates; | type inet:ip-address; | |||
uses x509c2n:cert-to-name; | ||||
description | description | |||
"The cert-maps container is used by a NETCONF server to | "The IP address of the interface to listen on."; | |||
map the NETCONF client's presented X.509 certificate to | } | |||
a NETCONF username. | leaf port { | |||
type inet:port-number; | ||||
If no matching and valid cert-to-name list entry can be | description | |||
found, then the NETCONF server MUST close the connection, | "The local port number on this interface the | |||
and MUST NOT accept NETCONF messages over it."; | NETCONF server listens on."; | |||
} | } | |||
} | } | |||
// Objects for deriving NETCONF usernames from TLS | grouping endpoints-container { | |||
// pre-shared keys. | ||||
grouping psk-maps-grouping { | ||||
description | description | |||
"Grouping for psk-maps container."; | "Grouping for transport-specific configuration for | |||
container psk-maps { | call-home connections."; | |||
if-feature tls-map-pre-shared-keys; | container endpoints { | |||
description | description | |||
"During the TLS Handshake, the client indicates which | "Container for the list of endpoints."; | |||
key to use by including a PSK identity in the TLS | list endpoint { | |||
ClientKeyExchange message. On the NETCONF server side, | key name; | |||
this PSK identity is used to look up an entry in the psk-map | min-elements 1; | |||
list. If such an entry is found, and the pre-shared keys | ordered-by user; | |||
match, then the client is authenticated. The NETCONF | ||||
server uses the value from the user-name leaf in the | ||||
psk-map list as the NETCONF username. If the NETCONF | ||||
server cannot find an entry in the psk-map list, or if | ||||
the pre-shared keys do not match, then the NETCONF | ||||
server terminates the connection."; | ||||
reference | ||||
"RFC 4279: Pre-Shared Key Ciphersuites for Transport Layer | ||||
Security (TLS)"; | ||||
list psk-map { | ||||
key psk-identity; | ||||
description | description | |||
"List a pre-shared key mappings."; | "User-ordered list of endpoints for this application. | |||
Defining more than one enables high-availability."; | ||||
leaf psk-identity { | leaf name { | |||
type string; | type string; | |||
description | description | |||
"The PSK identity encoded as a UTF-8 string. For | "An arbitrary name for the endpoint to connect to."; | |||
details how certain common PSK identity formats can | ||||
be encoded in UTF-8, see section 5.1. of RFC 4279."; | ||||
reference | ||||
"RFC 4279: Pre-Shared Key Ciphersuites for Transport | ||||
Layer Security (TLS)"; | ||||
} | } | |||
leaf user-name { | leaf address { | |||
type nacm:user-name-type; | type inet:host; | |||
mandatory true; | mandatory true; | |||
description | description | |||
"The NETCONF username associated with this PSK | "The hostname or IP address or hostname of the | |||
identity."; | endpoint. If a hostname is provided and DNS | |||
} | resolves to more than one IP address, the device | |||
leaf not-valid-before { | SHOULD try all of the ones it can based on how | |||
type yang:date-and-time; | its networking stack is configured (e.g. v4, v6, | |||
description | dual-stack)."; | |||
"This PSK identity is not valid before the given date | ||||
and time."; | ||||
} | ||||
leaf not-valid-after { | ||||
type yang:date-and-time; | ||||
description | ||||
"This PSK identity is not valid after the given date | ||||
and time."; | ||||
} | } | |||
leaf key { | leaf port { | |||
type yang:hex-string; | type inet:port-number; | |||
mandatory true; | ||||
nacm:default-deny-all; | ||||
description | description | |||
"The key associated with the PSK identity"; | "The IP port for this endpoint. The device will use | |||
reference | the IANA-assigned well-known port if not specified."; | |||
"RFC 4279: Pre-Shared Key Ciphersuites for Transport | ||||
Layer Security (TLS)"; | ||||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
grouping keep-alives-container { | ||||
description | ||||
""; | ||||
container keep-alives { | ||||
description | ||||
"Configures the keep-alive policy, to proactively | ||||
test the aliveness of the NETCONF client, in | ||||
order to know when a new call home connection | ||||
should be established. Keepalive implementation | ||||
is described in RFC XXXX, section 4."; | ||||
reference | ||||
"RFC XXXX: NETCONF Server Configuration Model | ||||
Section 4"; | ||||
leaf interval-secs { | ||||
type uint8; | ||||
units seconds; | ||||
description | ||||
"Sets a timeout interval in seconds after which | ||||
if no data has been received from the NETCONF | ||||
client, a message will be sent to request a | ||||
response from the NETCONF client. A value of | ||||
'0' indicates that no keep-alive messages | ||||
should be sent."; | ||||
} | ||||
leaf count-max { | ||||
type uint8; | ||||
default 3; | ||||
description | ||||
"Sets the number of keep-alive messages that | ||||
may be sent without receiving any data from | ||||
the NETCONF client before assuming the NETCONF | ||||
client is no longer alive. If this threshold | ||||
is reached, the transport-level connection | ||||
will be disconnected, which will trigger the | ||||
reconnection strategy). The interval timer is | ||||
reset after each transmission, thus an | ||||
unresponsive NETCONF client will be dropped | ||||
after ~count-max * interval-secs seconds."; | ||||
} | ||||
} | ||||
} | ||||
} | } | |||
<CODE ENDS> | <CODE ENDS> | |||
4. Keep-Alives for SSH and TLS | 4. Implementation strategy for keep-alives | |||
One the objectives listed above, Keep-Alives for Persistent | One of the objectives listed above, Keep-alives for persistent | |||
Connections (Section 2.4.6) indicates a need for a "keep-alive" | connections (Section 2.6.6), indicates a need for a "keep-alive" | |||
mechanism. This section specifies how the NETCONF keep-alive | mechanism. This section specifies how the NETCONF keep-alive | |||
mechanism is to be implemented. | mechanism is to be implemented for both the SSH and TLS transports. | |||
Both SSH and TLS have the ability to support keep-alives. Using | Both SSH and TLS have the ability to support keep-alives securely. | |||
these mechanisms, the keep-alive messages are sent inside the | Using the strategies listed below, the keep-alive messages are sent | |||
encrypted tunnel, thus thwarting spoof attacks. | inside the encrypted transport sessions. | |||
4.1. SSH | 4.1. Keep-alives for SSH | |||
The SSH keep-alive solution that is expected to be used when | The SSH keep-alive solution that is expected to be used is ubiquitous | |||
configured using the data model defined in this document is | in practice, though never being explicitly defined in an RFC. The | |||
ubiquitous in practice, though never being explicitly defined in an | strategy used is to purposely send a malformed request message with a | |||
RFC. The strategy used is to purposely send a malformed request | flag set to ensure a response. More specifically, per section 4 of | |||
message with a flag set to ensure a response. More specifically, per | [RFC4253], either SSH peer can send a SSH_MSG_GLOBAL_REQUEST message | |||
section 4 of [RFC4253], either SSH peer can send a | with "want reply" set to '1' and that, if there is an error, will get | |||
SSH_MSG_GLOBAL_REQUEST message with "want reply" set to '1' and that, | back a SSH_MSG_REQUEST_FAILURE response. Similarly, section 5 of | |||
if there is an error, will get back a SSH_MSG_REQUEST_FAILURE | [RFC4253] says that either SSH peer can send a | |||
response. Similarly, section 5 of [RFC4253] says that either SSH | SSH_MSG_CHANNEL_REQUEST message with "want reply" set to '1' and | |||
peer can send a SSH_MSG_CHANNEL_REQUEST message with "want reply" set | that, if there is an error, will get back a SSH_MSG_CHANNEL_FAILURE | |||
to '1' and that, if there is an error, will get back a | response. | |||
SSH_MSG_CHANNEL_FAILURE response. | ||||
To ensure that the request will fail, current implementations send an | To ensure that the request will fail, current implementations of this | |||
invalid "request name" or "request type", respectively. Abiding to | keep-alive strategy (e.g. OpenSSH's `sshd` server) send an invalid | |||
the extensibility guidelines specified in Section 6 of [RFC4251], | "request name" or "request type", respectively. Abiding to the | |||
these implementations use the "name@domain". For instance, when | extensibility guidelines specified in Section 6 of [RFC4251], these | |||
configured to send keep-alives, OpenSSH sends the string | implementations use the "name@domain". For instance, when configured | |||
to send keep-alives, OpenSSH sends the string | ||||
"keepalive@openssh.com". In order to remain compatible with existing | "keepalive@openssh.com". In order to remain compatible with existing | |||
implementations, this draft does not require a specific "request | implementations, this draft does not require a specific "request | |||
name" or "request type" string be used. | name" or "request type" string be used, implementations are free to | |||
pick values of their choosing. | ||||
4.2. TLS | 4.2. Keep-alives for TLS | |||
The TLS keep-alive solution is defined in [RFC6520]. This solution | The TLS keep-alive solution that is expected to be used is defined in | |||
allows both peers to advertise if they can receive heartbeat request | [RFC6520]. This solution allows both peers to advertise if they can | |||
messages from its peer. For standard NETCONF over TLS connections, | receive heartbeat request messages from its peer. For standard | |||
devices SHOULD advertise "peer_allowed_to_send", as per [RFC6520]. | NETCONF over TLS connections, devices SHOULD advertise | |||
This advertisement is not a "MUST" in order to grandfather existing | "peer_allowed_to_send", as per [RFC6520]. This advertisement is not | |||
NETCONF over TLS implementations. For NETCONF over TLS Call Home, | a "MUST" in order to grandfather existing NETCONF over TLS | |||
the network management system MUST advertise "peer_allowed_to_send" | implementations. For NETCONF Call Home, the network management | |||
per [RFC6520]. This is a "MUST" so as to ensure devices can depend | system MUST advertise "peer_allowed_to_send" per [RFC6520]. This is | |||
in it always being there for call home connections, which is | a "MUST" so as to ensure devices can depend in it always being there | |||
conveniently when keep-alives are needed the most. | for call home connections, which is when keep-alives are needed the | |||
most. | ||||
5. Security Considerations | 5. Security Considerations | |||
The YANG modules defined in this memo are designed to be accessed via | The YANG modules defined in this memo are designed to be accessed via | |||
the NETCONF protocol [RFC6241]. Authorization for access to specific | the NETCONF protocol [RFC6241]. Authorization for access to specific | |||
portions of conceptual data and operations within this module is | portions of conceptual data and operations within this module is | |||
provided by the NETCONF access control model (NACM) [RFC6536]. | provided by the NETCONF access control model (NACM) [RFC6536]. | |||
There are a number of data nodes defined in the "ietf-netconf-server" | There are a number of data nodes defined in the "ietf-netconf-server" | |||
and "ietf-system-tls-auth" YANG modules which are writable/creatable/ | YANG module which are readable and/or writable that may be considered | |||
deletable (i.e., config true, which is the default). These data | sensitive or vulnerable in some network environments. Write and read | |||
nodes may be considered sensitive or vulnerable in some network | operations to these data nodes can have a negative effect on network | |||
environments. Write and read operations to these data nodes can have | operations. It is thus important to control write and read access to | |||
a negative effect on network operations. It is thus important to | these data nodes. Below are the data nodes and their sensitivity/ | |||
control write and read access to these data nodes. Below are the | vulnerability. | |||
data nodes and their sensitivity/vulnerability. | ||||
ietf-netconf-server: | netconf-server/tls/client-auth/trusted-ca-certs: | |||
o None. | o This container contains certificates that the system is to use as | |||
trust anchors for authenticating TLS-specific client certificates. | ||||
Write access to this node should be protected. | ||||
ietf-system-tls-auth: | netconf-server/tls/client-auth/trusted-client-certs: | |||
o /system/authentication/tls/psk-maps/psk-map/user-name: This leaf | o This container contains certificates that the system is to trust | |||
node contains a user name that some deployments may consider | directly when authenticating TLS-specific client certificates. | |||
sensitive information. | Write access to this node should be protected. | |||
o /system/authentication/tls/psk-maps/psk-map/key: This leaf node | netconf-server/tls/client-auth/cert-map: | |||
contains a shared key that remote clients use to authenticate | ||||
themselves to the system. This value should not be readable or | o This container contains a user name that some deployments may | |||
writable by anyone by default. | consider sensitive information. Read access to this node may need | |||
to be guarded. | ||||
6. IANA Considerations | 6. IANA Considerations | |||
This document registers two URIs in the IETF XML registry [RFC2119]. | This document registers two URIs in the IETF XML registry [RFC2119]. | |||
Following the format in [RFC3688], the following registrations are | Following the format in [RFC3688], the following registrations are | |||
requested: | requested: | |||
URI: urn:ietf:params:xml:ns:yang:ietf-netconf-server | URI: urn:ietf:params:xml:ns:yang:ietf-netconf-server | |||
Registrant Contact: The NETCONF WG of the IETF. | Registrant Contact: The NETCONF WG of the IETF. | |||
XML: N/A, the requested URI is an XML namespace. | XML: N/A, the requested URI is an XML namespace. | |||
skipping to change at page 24, line 46 | skipping to change at page 28, line 7 | |||
[RFC6991] Schoenwaelder, J., "Common YANG Data Types", RFC 6991, | [RFC6991] Schoenwaelder, J., "Common YANG Data Types", RFC 6991, | |||
July 2013. | July 2013. | |||
[draft-ietf-netconf-call-home] | [draft-ietf-netconf-call-home] | |||
Watsen, K., "NETCONF Call Home", draft-ieft-netconf-call- | Watsen, K., "NETCONF Call Home", draft-ieft-netconf-call- | |||
home-00 (work in progress), 2014. | home-00 (work in progress), 2014. | |||
[draft-ietf-netmod-snmp-cfg] | [draft-ietf-netmod-snmp-cfg] | |||
Bjorklund, M. and J. Schoenwaelder, "A YANG Data Model for | Bjorklund, M. and J. Schoenwaelder, "A YANG Data Model for | |||
SNMP Configuration", draft-ietf-netmod-snmp-cfg-03 (work | SNMP Configuration", draft-ietf-netmod-snmp-cfg-08 (work | |||
in progress), November 2013. | in progress), September 2014. | |||
[rfc5539bis] | [rfc5539bis] | |||
Badra, M., Luchuk, A., and J. Schoenwaelder, "Using the | Badra, M., Luchuk, A., and J. Schoenwaelder, "Using the | |||
NETCONF Protocol over Transport Layer Security (TLS)", | NETCONF Protocol over Transport Layer Security (TLS)", | |||
draft-ietf-netconf-rfc5539bis-04 (work in progress), | draft-ietf-netconf-rfc5539bis-04 (work in progress), | |||
October 2013. | October 2013. | |||
9.2. Informative References | 9.2. Informative References | |||
[RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, | [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, | |||
January 2004. | January 2004. | |||
Appendix A. Examples | Appendix A. Examples | |||
A.1. SSH Transport Configuration | A.1. SSH Transport Configuration + State | |||
The following example illustrastes the <get> response from a NETCONF | ||||
server that only supports SSH, both listening for incoming | ||||
connections as well as calling home to a single application having | ||||
two endpoints. Please also note that the list of host-keys at the | ||||
end is read-only operational state. | ||||
<netconf-server xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server"> | <netconf-server xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server"> | |||
<listen> | <listen> | |||
<name>foo bar</name> | <endpoint> | |||
<ssh> | <name>foo bar</name> | |||
<port>831</port> | <ssh> | |||
</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> | </listen> | |||
<call-home> | <call-home> | |||
<name>config-mgr</name> | <application> | |||
<ssh> | <name>config-mgr</name> | |||
<endpoints> | <ssh> | |||
<endpoint> | <endpoints> | |||
<name>east-data-center</name> | <endpoint> | |||
<address>11.22.33.44</address> | <name>east-data-center</name> | |||
</endpoint> | <address>11.22.33.44</address> | |||
<endpoint> | </endpoint> | |||
<name>west-data-center</name> | <endpoint> | |||
<address>55.66.77.88</address> | <name>west-data-center</name> | |||
</endpoint> | <address>55.66.77.88</address> | |||
</endpoints> | </endpoint> | |||
</ssh> | </endpoints> | |||
<host-keys> | ||||
<host-key>my-call-home-x509-key</host-key> | ||||
</host-keys> | ||||
</ssh> | ||||
</application> | ||||
</call-home> | </call-home> | |||
<ssh> | ||||
<host-keys> | ||||
<host-key> | ||||
<name>my-rsa-key</name> | ||||
<format-identifier>ssh-rsa</format-identifier> | ||||
<data> <!-- base64 reformated for draft --> | ||||
AAAAB3NzaC1yc2EAAAABIwAAAQEA7D2lxYg3+WD97RZqZtO8bUU8QpIl6g9 | ||||
X11kZHZ8NgSIR+x2H1MHCD5sEjmx/B6JIouK5eBvbJE9FFV3phsl62fupN6 | ||||
Y4EmXosC6iqpuI41dcGA63XCQ1OenWG4ppdq1f8tlecSrmEcLw7MKPzBHK6 | ||||
rNQTciqMuVuLPOKwBu/54QAiUwvvHKAsk8bkN9YxEJ1NTV1FFQmvMOADVcD | ||||
2qqPangETwV5zInW8AEkBbLccM/mmHucGNS81axXR3V9R5KgXF2DyGB47d2 | ||||
k6iOnGa3LBIOYi/5Q+O8IFUlO+kytfqwuFgUc+Mx7aKReSIAPov3owVjeBL | ||||
KWsvjD24UO68qtwQ== | ||||
</data> | ||||
<fingerprint> | ||||
c1:b1:30:29:d7:b8:de:6c:97:77:10:d7:46:41:63:87 | ||||
</fingerprint> | ||||
</host-key> | ||||
<host-key> | ||||
<name>my-dss-key</name> | ||||
<format-identifier>ssh-dss</format-identifier> | ||||
<data> <!-- base64 reformated for draft --> | ||||
AAAAB3NzaC1kc3MAAACBAIq7XfGmZKJgibJEIMzj70YMVfpeewBCj89VrUS | ||||
gLsJmxP/TrXFuhzW2UIaI8sePMYUXj/Vgp5DUD+eBSBkHMH4ga0U5t/clqn | ||||
y73x8Vg6LQg9f0OTaUnpRWbWrdac7U5/BRBTtMA3amHZhHrKs7BrCepS/y8 | ||||
cUbxBCPF3aYMK/5AAAAFQC7wetEbDwghYtz8Z3xIwDdxs6mOwAAAIBursEk | ||||
jnvs5zzyUH7iNiyBojDoyrsq81jPM6KopkfA5Ypp2KTySPev/mkL0SoVfIb | ||||
+HttVfQ3Q63+sf1Qyk+gUtniSdN2AqtFQYKxtTcXim4McWk6IixkYFP8kkt | ||||
02t9Hsl0eXvltmogrlRsiuJsTAbFS+QTeq4OGTODCT5jjVdQAAAIA2llpZg | ||||
y5v46lGt4dQhkH8ytyMGyjBRPF6rm51msinX3lMR9xfwTaS7ZYP0b6HJt5M | ||||
sQI+m7iIYaVFB1oC8niXbkkavLcxhGpNVkwE2INWS4TIBbTQhivuoE+dMYY | ||||
KauLQxqSUjixJk3LjhCQb | ||||
</data> | ||||
<fingerprint> | ||||
c1:b1:30:29:d7:b8:de:6c:97:77:10:d7:46:41:63:87 | ||||
</fingerprint> | ||||
</host-key> | ||||
<host-key> | ||||
<name>my-call-home-x509-key</name> | ||||
<format-identifier>x509v3-rsa2048-sha256</format-identifier> | ||||
<data> <!-- base64 reformated for draft --> | ||||
AAAAB3NzaC1yc2EAAAABIwAAAQEAyBLl90dPUGX7Es12q7YKkw6v8WgWop+ | ||||
B62zhT39C+yvslMIwIqgHYii0h/TGktahKpBwssawfhvAZoMF/nOyO3yDPD | ||||
pQxNrA76H7owNOjG5206QHDYfVALKPvxgrDy/6BjsR9MayOGkZTSL6GRFSl | ||||
g7ivT9AIR9E5qXmP+1z+IDufRlpwfaGfpZAxjJLEwzAjFAIwXsXKJ5FH/QP | ||||
mfC6gxfhqpt9rJCDlgqmzrXi8dXKsFUC3/o1lzezqTXTV1iMETTuCHgWegF | ||||
5QcX2baBdFgCnkd1SnftVoBHVnvXA1euRqgiG3fMNK4rct0D99D+GI+kZc+ | ||||
vQyUdCw3dPlhXPZw== | ||||
</data> | ||||
<fingerprint> | ||||
97:77:10:29:d7:b8:de:6c:97:77:30:29:d7:41:63:87 | ||||
</fingerprint> | ||||
</host-key> | ||||
</host-keys> | ||||
</ssh> | ||||
</netconf-server> | </netconf-server> | |||
A.2. TLS Transport Configuration | A.2. TLS Transport Configuration + State | |||
The following example illustrastes the <get> response from a NETCONF | ||||
server that only supports TLS, both listening for incoming | ||||
connections as well as calling home to a single application 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"> | <netconf-server xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-server"> | |||
<listen> | <listen> | |||
<name>foo bar</name> | <endpoint> | |||
<ssh> | <name>primary-netconf-endpoint</name> | |||
<port>831</port> | <tls> | |||
</ssh> | <address>11.22.33.44</address> | |||
<certificates> | ||||
<certificate>fw1.east.example.com</certificate> | ||||
</certificates> | ||||
</tls> | ||||
</endpoint> | ||||
</listen> | </listen> | |||
<call-home> | <call-home> | |||
<name>config-mgr</name> | <application> | |||
<tls> | <name>config-mgr</name> | |||
<endpoints> | <tls> | |||
<endpoint> | <endpoints> | |||
<name>east-data-center</name> | <endpoint> | |||
<address>11.22.33.44</address> | <name>east-data-center</name> | |||
</endpoint> | <address>11.22.33.44</address> | |||
<endpoint> | </endpoint> | |||
<name>west-data-center</name> | <endpoint> | |||
<address>55.66.77.88</address> | <name>west-data-center</name> | |||
<address>55.66.77.88</address> | ||||
</endpoint> | </endpoint> | |||
</endpoints> | </endpoints> | |||
</tls> | <certificates> | |||
<certificate>fw1.east.example.com</certificate> | ||||
</certificates> | ||||
</tls> | ||||
</application> | ||||
</call-home> | </call-home> | |||
<tls-client-auth> | <tls> | |||
<trusted-ca-certs> | <certificates> | |||
<trusted-ca-cert> | <certificate> | |||
QW4gRWFzdGVyIGVnZywgZm9yIHRob3NlIHdobyBtaWdodCBsb29rICA6KQo= | <name>fw1.east.example.com</name> | |||
</trusted-ca-cert> | <data> <!-- base64 reformated for draft --> | |||
</trusted-ca-certs> | AAAAB3NzaC1yc2EAAAABIwAAAQEA7D2lxYg3+WD97RZqZtO8bUU8QpIl6g9 | |||
<trusted-client-certs> | X11kZHZ8NgSIR+x2H1MHCD5sEjmx/B6JIouK5eBvbJE9FFV3phsl62fupN6 | |||
<trusted-client-cert> | Y4EmXosC6iqpuI41dcGA63XCQ1OenWG4ppdq1f8tlecSrmEcLw7MKPzBHK6 | |||
SSBhbSB0aGUgZWdnIG1hbiwgdGhleSBhcmUgdGhlIGVnZyBtZW4uCg== | rNQTciqMuVuLPOKwBu/54QAiUwvvHKAsk8bkN9YxEJ1NTV1FFQmvMOADVcD | |||
</trusted-client-cert> | 2qqPangETwV5zInW8AEkBbLccM/mmHucGNS81axXR3V9R5KgXF2DyGB47d2 | |||
<trusted-client-cert> | k6iOnGa3LBIOYi/5Q+O8IFUlO+kytfqwuFgUc+Mx7aKReSIAPov3owVjeBL | |||
SSBhbSB0aGUgd2FscnVzLCBnb28gZ29vIGcnam9vYi4K | KWsvjD24UO68qtwQ== | |||
</trusted-client-cert> | </data> | |||
</trusted-client-certs> | </certificate> | |||
<cert-maps> | </certificates> | |||
<cert-to-name> | <client-auth> | |||
<id>1</id> | <trusted-ca-certs> | |||
<fingerprint>11:0A:05:11:00</fingerprint> | <trusted-ca-cert> | |||
<map-type>x509c2n:san-any</map-type> | QW4gRWFzdGVyIGVnZywgZm9yIHRob3NlIHdobyBtaWdodCBsb29rICA6KQo= | |||
</cert-to-name> | </trusted-ca-cert> | |||
<cert-to-name> | </trusted-ca-certs> | |||
<id>2</id> | <trusted-client-certs> | |||
<fingerprint>11:0A:05:11:00</fingerprint> | <trusted-client-cert> | |||
<map-type>x509c2n:specified</map-type> | SSBhbSB0aGUgZWdnIG1hbiwgdGhleSBhcmUgdGhlIGVnZyBtZW4uCg== | |||
<name>Joe Cool</name> | </trusted-client-cert> | |||
</cert-to-name> | <trusted-client-cert> | |||
</cert-maps> | SSBhbSB0aGUgd2FscnVzLCBnb28gZ29vIGcnam9vYi4K | |||
<psk-maps> | </trusted-client-cert> | |||
<psk-map> | </trusted-client-certs> | |||
<psk-identity>a8gc8]klh59</psk-identity> | <cert-maps> | |||
<user-name>admin</user-name> | <cert-to-name> | |||
<not-valid-before>2013-01-01T00:00:00Z</not-valid-before> | <id>1</id> | |||
<not-valid-after>2014-01-01T00:00:00Z</not-valid-after> | <fingerprint>11:0A:05:11:00</fingerprint> | |||
</psk-map> | <map-type>x509c2n:san-any</map-type> | |||
</psk-maps> | </cert-to-name> | |||
</tls-client-auth> | <cert-to-name> | |||
<id>2</id> | ||||
<fingerprint>11:0A:05:11:00</fingerprint> | ||||
<map-type>x509c2n:specified</map-type> | ||||
<name>Joe Cool</name> | ||||
</cert-to-name> | ||||
</cert-maps> | ||||
</client-auth> | ||||
</tls> | ||||
</netconf-server> | </netconf-server> | |||
Appendix B. Change Log | Appendix B. Change Log | |||
B.1. 00 to 01 | B.1. 00 to 01 | |||
o Restructured document so it flows better | o Restructured document so it flows better | |||
o Added trusted-ca-certs and trusted-client-certs objects into the | o Added trusted-ca-certs and trusted-client-certs objects into the | |||
ietf-system-tls-auth module | ietf-system-tls-auth module | |||
skipping to change at page 28, line 27 | skipping to change at page 33, line 27 | |||
o removed "network-manager" terminology | o removed "network-manager" terminology | |||
o moved open issues to github issues | o moved open issues to github issues | |||
o brought TLS client auth back into model | o brought TLS client auth back into model | |||
B.3. 02 to 03 | B.3. 02 to 03 | |||
o fixed tree diagrams and surrounding text | o fixed tree diagrams and surrounding text | |||
B.4. 03 to 04 | ||||
o reduced the number of grouping statements | ||||
o removed psk-maps and associated feature statements | ||||
o added ability for listen/call-home instances to specify which | ||||
host-keys/certificates (of all listed) to use | ||||
o clarified that last-connected should span reboots | ||||
o added missing "objectives" for selecting which keys to use, | ||||
authenticating client-certificates, and mapping authenticated | ||||
client-certificates to usernames | ||||
o clarified indirect client certificate authentication | ||||
o added keep-alive configuration for listen connections | ||||
o added global-level NETCONF session parameters | ||||
Appendix C. Open Issues | Appendix C. Open Issues | |||
Please see: https://github.com/netconf-wg/server-model/issues. | Please see: https://github.com/netconf-wg/server-model/issues. | |||
Authors' Addresses | Authors' Addresses | |||
Kent Watsen | Kent Watsen | |||
Juniper Networks | Juniper Networks | |||
EMail: kwatsen@juniper.net | EMail: kwatsen@juniper.net | |||
End of changes. 140 change blocks. | ||||
664 lines changed or deleted | 932 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |