draft-ietf-netconf-access-control-04.txt | draft-ietf-netconf-access-control-05.txt | |||
---|---|---|---|---|
Internet Engineering Task Force A. Bierman | Internet Engineering Task Force A. Bierman | |||
Internet-Draft Brocade | Internet-Draft Brocade | |||
Intended status: Standards Track M. Bjorklund | Intended status: Standards Track M. Bjorklund | |||
Expires: December 16, 2011 Tail-f Systems | Expires: April 6, 2012 Tail-f Systems | |||
June 14, 2011 | October 4, 2011 | |||
Network Configuration Protocol Access Control Model | Network Configuration Protocol (NETCONF) Access Control Model | |||
draft-ietf-netconf-access-control-04 | draft-ietf-netconf-access-control-05 | |||
Abstract | Abstract | |||
The standardization of network configuration interfaces for use with | The standardization of network configuration interfaces for use with | |||
the NETCONF protocol requires a structured and secure operating | the NETCONF protocol requires a structured and secure operating | |||
environment that promotes human usability and multi-vendor | environment that promotes human usability and multi-vendor | |||
interoperability. There is a need for standard mechanisms to | interoperability. There is a need for standard mechanisms to | |||
restrict NETCONF protocol access for particular users to a pre- | restrict NETCONF protocol access for particular users to a pre- | |||
configured subset of all available NETCONF operations and content. | configured subset of all available NETCONF protocol operations and | |||
This document discusses requirements for a suitable access control | content. This document defines such an access control model. | |||
model, and provides one solution that meets these requirements. | ||||
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 December 16, 2011. | This Internet-Draft will expire on April 6, 2012. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2011 IETF Trust and the persons identified as the | Copyright (c) 2011 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.1.1. Requirements Notation . . . . . . . . . . . . . . . . 4 | ||||
1.1.2. NETCONF Terms . . . . . . . . . . . . . . . . . . . . 4 | ||||
1.1.3. YANG Terms . . . . . . . . . . . . . . . . . . . . . . 5 | ||||
1.1.4. NACM Terms . . . . . . . . . . . . . . . . . . . . . . 5 | ||||
2. Access Control Design Objectives . . . . . . . . . . . . . . . 6 | 2. Access Control Design Objectives . . . . . . . . . . . . . . . 6 | |||
2.1. Protocol Control Points . . . . . . . . . . . . . . . . . 6 | 2.1. Access Control Points . . . . . . . . . . . . . . . . . . 6 | |||
2.2. Simplicity . . . . . . . . . . . . . . . . . . . . . . . . 7 | 2.2. Simplicity . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
2.3. Procedural Interface . . . . . . . . . . . . . . . . . . . 7 | 2.3. Procedural Interface . . . . . . . . . . . . . . . . . . . 7 | |||
2.4. Datastore Access . . . . . . . . . . . . . . . . . . . . . 8 | 2.4. Datastore Access . . . . . . . . . . . . . . . . . . . . . 7 | |||
2.4.1. Access Rights . . . . . . . . . . . . . . . . . . . . 8 | 2.5. Users and Groups . . . . . . . . . . . . . . . . . . . . . 7 | |||
2.4.2. <get> and <get-config> Operations . . . . . . . . . . 8 | 2.6. Maintenance . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
2.4.3. <edit-config> Operation . . . . . . . . . . . . . . . 9 | 2.7. Configuration Capabilities . . . . . . . . . . . . . . . . 8 | |||
2.4.4. <copy-config> Operation . . . . . . . . . . . . . . . 10 | 2.8. Identifying Security-Sensitive Content . . . . . . . . . . 8 | |||
2.5. Users and Groups . . . . . . . . . . . . . . . . . . . . . 10 | 3. NETCONF Access Control Model (NACM) . . . . . . . . . . . . . 10 | |||
2.6. Maintenance . . . . . . . . . . . . . . . . . . . . . . . 11 | 3.1. Introduction . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
2.7. Configuration Capabilities . . . . . . . . . . . . . . . . 11 | 3.1.1. Features . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
2.8. Identifying Security Holes . . . . . . . . . . . . . . . . 11 | 3.1.2. External Dependencies . . . . . . . . . . . . . . . . 11 | |||
2.9. Data Shadowing . . . . . . . . . . . . . . . . . . . . . . 12 | 3.1.3. Message Processing Model . . . . . . . . . . . . . . . 11 | |||
2.10. NETCONF Specific Requirements . . . . . . . . . . . . . . 12 | 3.2. Datastore Access . . . . . . . . . . . . . . . . . . . . . 13 | |||
3. NETCONF Access Control Model (NACM) . . . . . . . . . . . . . 14 | 3.2.1. Access Rights . . . . . . . . . . . . . . . . . . . . 13 | |||
3.1. Introduction . . . . . . . . . . . . . . . . . . . . . . . 14 | 3.2.2. <get> and <get-config> Operations . . . . . . . . . . 14 | |||
3.1.1. Features . . . . . . . . . . . . . . . . . . . . . . . 14 | 3.2.3. <edit-config> Operation . . . . . . . . . . . . . . . 14 | |||
3.1.2. External Dependencies . . . . . . . . . . . . . . . . 15 | 3.2.4. <copy-config> Operation . . . . . . . . . . . . . . . 15 | |||
3.1.3. Message Processing Model . . . . . . . . . . . . . . . 15 | 3.2.5. <delete-config> Operation . . . . . . . . . . . . . . 16 | |||
3.2. Model Components . . . . . . . . . . . . . . . . . . . . . 17 | 3.2.6. <commit> Operation . . . . . . . . . . . . . . . . . . 16 | |||
3.2.1. Users . . . . . . . . . . . . . . . . . . . . . . . . 17 | 3.2.7. <discard-changes> Operation . . . . . . . . . . . . . 16 | |||
3.2.2. Groups . . . . . . . . . . . . . . . . . . . . . . . . 17 | 3.2.8. <kill-session> Operation . . . . . . . . . . . . . . . 16 | |||
3.2.3. Sessions . . . . . . . . . . . . . . . . . . . . . . . 18 | 3.3. Model Components . . . . . . . . . . . . . . . . . . . . . 16 | |||
3.2.4. Access Permissions . . . . . . . . . . . . . . . . . . 18 | 3.3.1. Users . . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
3.2.5. Global Enforcement Controls . . . . . . . . . . . . . 18 | 3.3.2. Groups . . . . . . . . . . . . . . . . . . . . . . . . 17 | |||
3.2.5.1. enable-nacm Switch . . . . . . . . . . . . . . . . 18 | 3.3.3. Global Enforcement Controls . . . . . . . . . . . . . 17 | |||
3.2.5.2. read-default Switch . . . . . . . . . . . . . . . 19 | 3.3.3.1. enable-nacm Switch . . . . . . . . . . . . . . . . 17 | |||
3.2.5.3. write-default Switch . . . . . . . . . . . . . . . 19 | 3.3.3.2. read-default Switch . . . . . . . . . . . . . . . 17 | |||
3.2.5.4. exec-default Switch . . . . . . . . . . . . . . . 19 | 3.3.3.3. write-default Switch . . . . . . . . . . . . . . . 18 | |||
3.2.6. Access Control Rules . . . . . . . . . . . . . . . . . 20 | 3.3.3.4. exec-default Switch . . . . . . . . . . . . . . . 18 | |||
3.3. Access Control Enforcement Procedures . . . . . . . . . . 20 | 3.3.4. Access Control Rules . . . . . . . . . . . . . . . . . 18 | |||
3.3.1. Initial Operation . . . . . . . . . . . . . . . . . . 20 | 3.4. Access Control Enforcement Procedures . . . . . . . . . . 19 | |||
3.3.2. Session Establishment . . . . . . . . . . . . . . . . 21 | 3.4.1. Initial Operation . . . . . . . . . . . . . . . . . . 19 | |||
3.3.3. "access-denied" Error Handling . . . . . . . . . . . . 21 | 3.4.2. Session Establishment . . . . . . . . . . . . . . . . 19 | |||
3.3.4. Incoming RPC Message Validation . . . . . . . . . . . 21 | 3.4.3. "access-denied" Error Handling . . . . . . . . . . . . 19 | |||
3.3.5. Data Node Access Validation . . . . . . . . . . . . . 24 | 3.4.4. Incoming RPC Message Validation . . . . . . . . . . . 20 | |||
3.3.6. Outgoing <notification> Authorization . . . . . . . . 26 | 3.4.5. Data Node Access Validation . . . . . . . . . . . . . 22 | |||
3.4. Data Model Definitions . . . . . . . . . . . . . . . . . . 28 | 3.4.6. Outgoing <notification> Authorization . . . . . . . . 24 | |||
3.4.1. Data Organization . . . . . . . . . . . . . . . . . . 28 | ||||
3.4.2. YANG Module . . . . . . . . . . . . . . . . . . . . . 29 | 3.5. Data Model Definitions . . . . . . . . . . . . . . . . . . 26 | |||
3.5. IANA Considerations . . . . . . . . . . . . . . . . . . . 38 | 3.5.1. Data Organization . . . . . . . . . . . . . . . . . . 27 | |||
3.6. Security Considerations . . . . . . . . . . . . . . . . . 39 | 3.5.2. YANG Module . . . . . . . . . . . . . . . . . . . . . 27 | |||
3.6. IANA Considerations . . . . . . . . . . . . . . . . . . . 37 | ||||
3.7. Security Considerations . . . . . . . . . . . . . . . . . 37 | ||||
3.7.1. NACM Configuration and Monitoring Considerations . . . 37 | ||||
3.7.2. General Configuration Issues . . . . . . . . . . . . . 39 | ||||
3.7.3. Data Model Design Considerations . . . . . . . . . . . 40 | ||||
4. References . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 4. References . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | |||
4.1. Normative References . . . . . . . . . . . . . . . . . . . 41 | 4.1. Normative References . . . . . . . . . . . . . . . . . . . 41 | |||
4.2. Informative References . . . . . . . . . . . . . . . . . . 41 | 4.2. Informative References . . . . . . . . . . . . . . . . . . 41 | |||
Appendix A. Usage Examples . . . . . . . . . . . . . . . . . . . 42 | Appendix A. Usage Examples . . . . . . . . . . . . . . . . . . . 42 | |||
A.1. <groups> Example . . . . . . . . . . . . . . . . . . . . . 42 | A.1. <groups> Example . . . . . . . . . . . . . . . . . . . . . 42 | |||
A.2. Module Rule Example . . . . . . . . . . . . . . . . . . . 43 | A.2. Module Rule Example . . . . . . . . . . . . . . . . . . . 43 | |||
A.3. RPC Rule Example . . . . . . . . . . . . . . . . . . . . . 44 | A.3. RPC Rule Example . . . . . . . . . . . . . . . . . . . . . 44 | |||
A.4. Data Rule Example . . . . . . . . . . . . . . . . . . . . 46 | A.4. Data Rule Example . . . . . . . . . . . . . . . . . . . . 46 | |||
A.5. Notification Rule Example . . . . . . . . . . . . . . . . 48 | A.5. Notification Rule Example . . . . . . . . . . . . . . . . 48 | |||
Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 50 | Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 50 | |||
B.1. 03-04 . . . . . . . . . . . . . . . . . . . . . . . . . . 50 | B.1. 04-05 . . . . . . . . . . . . . . . . . . . . . . . . . . 50 | |||
B.2. 02-03 . . . . . . . . . . . . . . . . . . . . . . . . . . 50 | B.2. 03-04 . . . . . . . . . . . . . . . . . . . . . . . . . . 50 | |||
B.3. 01-02 . . . . . . . . . . . . . . . . . . . . . . . . . . 50 | B.3. 02-03 . . . . . . . . . . . . . . . . . . . . . . . . . . 50 | |||
B.4. 00-01 . . . . . . . . . . . . . . . . . . . . . . . . . . 50 | B.4. 01-02 . . . . . . . . . . . . . . . . . . . . . . . . . . 51 | |||
B.5. 00 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 | B.5. 00-01 . . . . . . . . . . . . . . . . . . . . . . . . . . 51 | |||
B.6. 00 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 52 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 52 | |||
1. Introduction | 1. Introduction | |||
The NETCONF protocol does not provide any standard mechanisms to | The NETCONF protocol does not provide any standard mechanisms to | |||
restrict the operations and content that each user is authorized to | restrict the protocol operations and content that each user is | |||
use. | authorized to access. | |||
There is a need for inter-operable management of the controlled | There is a need for inter-operable management of the controlled | |||
access to operator selected portions of the available NETCONF content | access to administrator selected portions of the available NETCONF | |||
within a particular server. | content within a particular server. | |||
This document addresses access control mechanisms for the Operation | This document addresses access control mechanisms for the Operation | |||
and Content layers of NETCONF, as defined in | and Content layers of NETCONF, as defined in [RFC6241]. It contains | |||
[I-D.ietf-netconf-4741bis], and [RFC5277]. It contains three main | three main sections: | |||
sections: | ||||
1. Access Control Design Objectives | 1. Access Control Design Objectives | |||
2. NETCONF Access Control Model (NACM) | 2. NETCONF Access Control Model (NACM) | |||
3. YANG Data Model (ietf-netconf-acm.yang) | 3. YANG Data Model (ietf-netconf-acm.yang) | |||
1.1. Terminology | 1.1. Terminology | |||
1.1.1. Requirements Notation | ||||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "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 [RFC2119]. | document are to be interpreted as described in [RFC2119]. | |||
1.1.2. NETCONF Terms | The following terms are defined in [RFC6241] and are not redefined | |||
here: | ||||
The following terms are defined in [I-D.ietf-netconf-4741bis] and are | ||||
not redefined here: | ||||
o client | o client | |||
o datastore | o datastore | |||
o operation | ||||
o protocol operation | o protocol operation | |||
o server | o server | |||
o session | o session | |||
o user | o user | |||
1.1.3. YANG Terms | ||||
The following terms are defined in [RFC6020] and are not redefined | The following terms are defined in [RFC6020] and are not redefined | |||
here: | here: | |||
o data node | o data node | |||
o data definition statement | o data definition statement | |||
1.1.4. NACM Terms | ||||
The following terms are used throughout this documentation: | The following terms are used throughout this documentation: | |||
access control: A security feature provided by the NETCONF server, | access control: A security feature provided by the NETCONF server, | |||
that allows an operator to restrict access to a subset of all | that allows an administrator to restrict access to a subset of all | |||
NETCONF protocol operations and data, based on various criteria. | NETCONF protocol operations and data, based on various criteria. | |||
access control model (ACM): A conceptual model used to configure and | access control model (ACM): A conceptual model used to configure and | |||
monitor the access control procedures desired by the operator to | monitor the access control procedures desired by the administrator | |||
enforce a particular access control policy. | to enforce a particular access control policy. | |||
access control rule: The conceptual criteria used to determine if a | access control rule: The criteria used to determine if a particular | |||
particular NETCONF protocol operation will be permitted or denied. | NETCONF protocol operation will be permitted or denied. | |||
access operation: How a request attempts to access a conceptual | access operation: How a request attempts to access a conceptual | |||
object. One of "read", "create", "delete", "update", and | object. One of "none", "read", "create", "delete", "update", and | |||
"execute". | "execute". | |||
recovery session: A special administrative session that is given | recovery session: A special administrative session that is given | |||
unlimited NETCONF access, and is exempt from all access control | unlimited NETCONF access, and is exempt from all access control | |||
enforcement. The specific mechanism(s) used by an implementation | enforcement. The mechanism(s) used by a server to control and | |||
to control and identify whether a session is a recovery session or | identify whether a session is a recovery session or not are | |||
not are outside the scope of this document. | implementation-specific and outside the scope of this document. | |||
write access: A shorthand for the "create", "delete", and "update" | ||||
access operations. | ||||
2. Access Control Design Objectives | 2. Access Control Design Objectives | |||
[Editor's note: some things described here are requirements (MUST, | This section documents the design objectives for the NETCONF Access | |||
SHOULD, etc), but some things are descriptions how NACM works, e.g. | Control Model presented in Section 3. | |||
2.4.1, 2.4.3...] | ||||
2.1. Protocol Control Points | 2.1. Access Control Points | |||
The NETCONF protocol allows new operations to be added at any time, | NETCONF allows new protocol operations to be added at any time, and | |||
and the YANG data modeling language supports this feature. It is not | the YANG data modeling language supports this feature. It is not | |||
possible to design an ACM for NETCONF which only focuses on a static | possible to design an ACM for NETCONF that only focuses on a static | |||
set of operations, like some other protocols. Since few assumptions | set of protocol operations, like some other protocols. Since few | |||
can be made about an arbitrary protocol operation, the NETCONF | assumptions can be made about an arbitrary protocol operation, the | |||
architectural server components need to be protected at several | NETCONF architectural server components need to be protected at three | |||
conceptual control points. | conceptual control points. | |||
+-------------+ +-------------+ | +-------------+ +-------------+ | |||
client | protocol | | prune | client | client | protocol | | data node | | |||
request --> | operation | | restricted | ---> reply | request --> | operation | -------------> | access | | |||
| allowed? | | <rpc-reply> | | | allowed? | datastore | allowed? | | |||
+-------------+ | nodes? | | +-------------+ or state +-------------+ | |||
| +-------------+ | data access | |||
| if any datastore or | ||||
| state data is accessed | ||||
| by the operation | ||||
V | ||||
+-------------+ +----------------+ | ||||
| data node | | prune | | ||||
| access | | restricted | | ||||
| allowed? | | <notification> | ---> client | ||||
+-------------+ | event or data? | session | ||||
+----------------+ | ||||
Figure 1 | +----------------+ | |||
| notification | | ||||
event --> | allowed? | | ||||
+----------------+ | ||||
The following access control points are defined: | Figure 1 | |||
protocol operation: Configurable permission to invoke specific | The following access control points, described in Figure 1, are | |||
protocol operations is required. Wildcard or multiple target | identified: | |||
mechanisms to reduce configuration and effort are also required. | ||||
NETCONF datastore: Configurable permission to read and/or alter | protocol operation: Permission to invoke specific protocol | |||
specific data nodes within any conceptual datastore is required. | operations. | |||
Wildcard or multiple target mechanisms to reduce configuration and | ||||
effort are also required. | ||||
RPC Reply Content: Configurable permission to read specific data | datastore: Permission to read and/or alter specific data nodes | |||
nodes within any conceptual RPC output section is required. | within any datastore. | |||
Unauthorized data is silently omitted from the reply, instead of | ||||
dropping the reply or sending an "access-denied" error. | ||||
Notification Content: Configurable permission to receive specific | notification: Permission to receive specific notification event | |||
notification event types is required. | types. | |||
2.2. Simplicity | 2.2. Simplicity | |||
Experience has shown that a complicated ACM will not be widely | Experience has shown that a complicated ACM will not be widely | |||
deployed, because it is too hard to use. The key factor that is | deployed, because it is too hard to use. The key factor that is | |||
ignored in such solutions is the concept of "localized cost". It | ignored in such solutions is the concept of "localized cost". It | |||
needs to be easy to do simple things, and possible to do complex | needs to be easy to do simple things, and possible to do complex | |||
things, instead of hard to do everything. | things, instead of hard to do everything. | |||
Configuration of the access control system needs to be as simple as | Configuration of the access control system needs to be as simple as | |||
possible. Simple and common tasks need to be easy to configure, and | possible. Simple and common tasks need to be easy to configure, and | |||
require little expertise or domain-specific knowledge. Complex tasks | require little expertise or domain-specific knowledge. Complex tasks | |||
are possible using additional mechanisms, which may require | are possible using additional mechanisms, which may require | |||
additional expertise. | additional expertise. | |||
A single set of access control rules SHOULD be able to control all | A single set of access control rules ought to be able to control all | |||
types of NETCONF protocol operation invocation, all conceptual | types of NETCONF protocol operation invocation, all datastore access, | |||
datastore access, and all NETCONF session output. | and all notification events. | |||
Access control SHOULD be defined with a small and familiar set of | Access control ought to be defined with a small and familiar set of | |||
permissions, while still allowing full control of NETCONF datastore | permissions, while still allowing full control of NETCONF datastore | |||
access. | access. | |||
Access control does not need to be applied to NETCONF <hello> | ||||
messages. | ||||
2.3. Procedural Interface | 2.3. Procedural Interface | |||
The NETCONF protocol uses a procedural interface model, and an | The NETCONF protocol uses a remote procedure call model, and an | |||
extensible set of protocol operations. Access control for any | extensible set of protocol operations. Access control for any | |||
possible protocol operation is required. | possible protocol operation is necessary. | |||
It MUST be possible to configure the ACM to permit or deny access to | ||||
specific NETCONF operations. | ||||
YANG modules SHOULD be designed so that different access levels for | ||||
input parameters to protocol operations is not required. Use of | ||||
generic operations should be avoided, and separate operations defined | ||||
instead, if different access levels are needed. | ||||
2.4. Datastore Access | 2.4. Datastore Access | |||
It MUST be possible to control access to specific nodes and subtrees | It is necessary to control access to specific nodes and subtrees | |||
within the conceptual NETCONF datastore. | within the NETCONF datastore, regardless of which protocol operation, | |||
standard or proprietary, was used to access the datastore. | ||||
The same access control rules apply to all conceptual datastores. | ||||
For example, the candidate configuration or the running | ||||
configuration. | ||||
Only the standard NETCONF datastores (candidate, running, and | ||||
startup) are controlled by the ACM. Local or remote files or | ||||
datastores accessed via the <url> parameter are optional to support. | ||||
The non-volatile startup configuration needs to be loaded at boot- | ||||
time into the running configuration without applying any access | ||||
control rules. Access control is applied after the server has | ||||
booted, and user sessions are active. | ||||
2.4.1. Access Rights | ||||
A small set of hard-wired datastore access rights is needed to | ||||
control access to all possible NETCONF datastore operations, | ||||
including vendor extensions to the standard operation set. | ||||
The familiar "CRUDX" model can support all NETCONF operations: | ||||
o Create: Allows the client to add a new data node instance to a | ||||
datastore. | ||||
o Read: Allows the client to read a data node instance from a | ||||
datastore, or receive the notification event type. | ||||
o Update: Allows the client to update an existing data node instance | ||||
in a datastore. | ||||
o Delete: Allows the client to delete a data node instance from a | ||||
datastore. | ||||
o eXec: Allows the client to execute the protocol operation. | ||||
2.4.2. <get> and <get-config> Operations | ||||
Data nodes to which the client does not have read access, either | ||||
directly or via wildcard access, are silently omitted from the <rpc- | ||||
reply> message. This is done to allow NETCONF filters for <get> and | ||||
<get-config> to function properly, instead of causing an "access- | ||||
denied" error because the filter criteria would otherwise include | ||||
unauthorized read access to some data nodes. For NETCONF filtering | ||||
purposes, the selection criteria is applied to the subset of nodes | ||||
that the client is authorized to read, not the entire datastore. | ||||
2.4.3. <edit-config> Operation | ||||
The NACM access rights are not directly coupled to the <edit-config> | ||||
"operation" attribute, although they are similar. Instead, a NACM | ||||
access right applies to all operations which would result in a | ||||
particular access operation to the target datastore. This section | ||||
describes how these access rights apply to the specific datastore | ||||
operations supported by the <edit-config> operation. | ||||
If the effective operation is "none" (i.e., default-operation="none") | ||||
for a particular data node, then no access control is applied to that | ||||
data node. | ||||
A "create", "merge", or "replace" operation on a datastore node which | ||||
would result in the creation of a new data node instance, for which | ||||
the user does not have "create" access permission, is rejected with | ||||
an "access-denied" error. | ||||
A "merge" or "replace" operation on a datastore node which would | ||||
result in the modification of an existing data node instance, for | ||||
which the user does not have "update" access permission, is rejected | ||||
with an "access-denied" error. | ||||
A "replace", "delete", or "remove" operation on a datastore node | ||||
which would result in the deletion of an existing data node instance, | ||||
for which the user does not have "delete" access permission, is | ||||
rejected with an "access-denied" error. | ||||
A "merge" operation may include data nodes which do not alter | ||||
portions of the existing datastore. For example, a container or list | ||||
node may be present for naming purposes, but does not actually alter | ||||
the corresponding datastore node. These unaltered data nodes within | ||||
the scope of a "merge" operation are ignored by the server, and do | ||||
not require any access rights by the client. | ||||
[Editor's note: ditto for "replace" (and copy-config...) Note that | ||||
with this rule, a client w/o read access can guess db content by | ||||
sending merge requests - if access-denied is not returned, it means | ||||
the db has that value.] | ||||
A "merge" operation may include data nodes, but not include | ||||
particular child data nodes that are present in the datastore. These | ||||
missing data nodes within the scope of a "merge" operation are | ||||
ignored by the server, and do not require any access rights by the | ||||
client. | ||||
The contents of specific restricted datastore nodes MUST NOT be | ||||
exposed in any <rpc-error> elements within the reply. | ||||
2.4.4. <copy-config> Operation | ||||
Access control for the <copy-config> operation requires special | ||||
consideration because the operator is replacing the entire target | ||||
datastore. Read access to the entire source datastore, and write | ||||
access to the entire target datastore is needed for this operation to | ||||
succeed. | ||||
The server SHOULD determine the exact nodes in the target datastore | ||||
which are actually different, and only check write access permissions | ||||
for this set of nodes, which could be empty. For example, if a | ||||
session can read the entire datastore, but only change one leaf, that | ||||
session SHOULD be able to edit and save that one leaf. E.g., the | ||||
<copy-config> operation from <running> to <startup> SHOULD succeed if | ||||
the only effective changes are for data nodes that session is | ||||
authorized to change. | ||||
A client MUST have access to every datastore node, even ones that are | ||||
not present in the source configuration data. | ||||
For example, consider a common use-case such as a simple backup and | ||||
restore procedure. The operator (client) MUST have full read access | ||||
to the datastore in order to receive a complete copy of its contents. | ||||
If the server simply omits these subtrees from the reply, and that | ||||
copy is later used to restore the server datastore, the server will | ||||
interpret the missing nodes as a request to delete those nodes, and | ||||
return an error. | ||||
2.5. Users and Groups | 2.5. Users and Groups | |||
The server MUST obtain a user name from the underlying NETCONF | It is necessary that access control rules for a single user or a | |||
transport, such as an SSH user name. | configurable group of users can be configured. | |||
It MUST be possible to specify access control rules for a single user | ||||
or a configurable group of users. | ||||
The ACM MUST support the concept of administrative groups, to support | The ACM needs to support the concept of administrative groups, to | |||
the well-established distinction between a root account and other | support the well-established distinction between a root account and | |||
types of less-privileged conceptual user accounts. These groups MUST | other types of less-privileged conceptual user accounts. These | |||
be configurable by the operator. | groups needs to be configurable by the administrator. | |||
It MUST be possible to delegate the user-to-group mapping to a | It is necessary that the user-to-group mapping can be delegated to a | |||
central server, such as a RADIUS server [RFC2865] [RFC5607]. Since | central server, such as a RADIUS server [RFC2865] [RFC5607]. Since | |||
authentication is performed by the NETCONF transport layer, and | authentication is performed by the NETCONF transport layer, and | |||
RADIUS performs authentication and service authorization at the same | RADIUS performs authentication and service authorization at the same | |||
time, it MUST be possible for the underlying NETCONF transport to | time, the underlying NETCONF transport needs to be able to report a | |||
report a set of group names associated with the user to the server. | set of group names associated with the user to the server. | |||
2.6. Maintenance | 2.6. Maintenance | |||
It SHOULD be possible to disable part or all of the access control | It ought to be possible to disable part or all of the access control | |||
model without deleting any configuration. | model without deleting any access control rules. | |||
2.7. Configuration Capabilities | 2.7. Configuration Capabilities | |||
Suitable control and monitoring mechanisms are needed to allow an | Suitable configuration and monitoring mechanisms are needed to allow | |||
operator to easily manage all aspects of the ACM behavior. A | an administrator to easily manage all aspects of the ACM behavior. A | |||
standard data model, suitable for use with the <edit-config> | standard data model, suitable for use with the <edit-config> protocol | |||
operation MUST be available for this purpose. | operation needs to be available for this purpose. | |||
Access control rules to restrict operations on specific subtrees | Access control rules to restrict access operations on specific | |||
within the configuration datastore MUST be supported. Existing | subtrees within the configuration datastore needs to be supported. | |||
mechanisms can be used to identify the subtree(s) for this purpose. | ||||
2.8. Identifying Security Holes | 2.8. Identifying Security-Sensitive Content | |||
One of the most important aspects of the data model documentation, | One of the most important aspects of the data model documentation, | |||
and biggest concerns during deployment, is the identification of | and biggest concerns during deployment, is the identification of | |||
security-sensitive content. This applies to operations in NETCONF, | security-sensitive content. This applies to protocol operations in | |||
not just data and notifications. | NETCONF, not just data and notifications. | |||
It is mandatory for security-sensitive objects to be documented in | It is mandatory for security-sensitive objects to be documented in | |||
the Security Considerations section of an RFC. This is nice, but it | the Security Considerations section of an RFC. This is nice, but it | |||
is not good enough, for the following reasons: | is not good enough, for the following reasons: | |||
o This documentation-only approach forces operators to study the RFC | o This documentation-only approach forces administrators to study | |||
and determine if there are any potential security holes introduced | the RFC and determine if there are any potential security risks | |||
by a new YANG module. | introduced by a new data model. | |||
o If any security holes are identified, then the operator can study | o If any security risks are identified, then the administrator can | |||
some more RFC text, and determine how to close the security | study some more RFC text, and determine how to mitigate the | |||
hole(s). | security risk(s). | |||
o The ACM on each server can be configured to close the security | o The ACM on each server can be configured to mitigate the security | |||
holes, e.g., require privileged access to read or write the | risks, e.g., require privileged access to read or write the | |||
specific data identified in the Security Considerations section. | specific data identified in the Security Considerations section. | |||
o If the ACM is not pre-configured, then there will be a time window | o If the ACM is not pre-configured, then there will be a time window | |||
of vulnerability, after the new module is loaded, and before the | of vulnerability, after the new data model is loaded, and before | |||
new access control rules for that module are configured, enabled, | the new access control rules for that data model are configured, | |||
and debugged. | enabled, and debugged. | |||
Often, the operator just wants to disable default access to the | Often, the administrator just wants to disable default access to the | |||
secure content, so no inadvertent or malicious changes can be made to | secure content, so no inadvertent or malicious changes can be made to | |||
the server. This allows the default rules to be more lenient, | the server. This allows the default rules to be more lenient, | |||
without significantly increasing the security risk. | without significantly increasing the security risk. | |||
A data model designer needs to be able to use machine-readable | A data model designer needs to be able to use machine-readable | |||
statements to identify NETCONF content which needs to be protected by | statements to identify NETCONF content which needs to be protected by | |||
default. This will allow client and server tools to automatically | default. This will allow client and server tools to automatically | |||
close data-model specific security holes, by denying access to | identify data-model specific security risks, by denying access to | |||
sensitive data unless the user is explicitly authorized to perform | sensitive data unless the user is explicitly authorized to perform | |||
the requested operation. | the requested access operation. | |||
2.9. Data Shadowing | ||||
One of the more complicated security administration problems is | ||||
identifying data nodes which shadow or mirror the content of another | ||||
data node. An access control rule to prevent read operations for a | ||||
particular node may be insufficient to prevent access to the data | ||||
node with the copied value. | ||||
If the description statement, other documentation, or no | ||||
documentation exists to identify a data shadow problem, then it may | ||||
not be detected. | ||||
Since NETCONF allows any vendor operation to be added to the | ||||
protocol, there is no way to reliably identify all of the operations | ||||
that may expose copies of sensitive data nodes in <rpc-reply> | ||||
messages. | ||||
A NETCONF server MUST ensure that unauthorized access to its | ||||
conceptual datastores and non-configuration data nodes is prevented. | ||||
It is beyond the scope of this document to define access control | ||||
enforcement procedures for underlying device instrumentation that may | ||||
exist to support the NETCONF server operation. An operator can | ||||
identify each operation that the server provides, and decide if it | ||||
needs any access control applied to it. | ||||
Proprietary protocol operations SHOULD be properly documented by the | ||||
vendor, so it is clear to operators what data nodes (if any) are | ||||
affected by the operation, and what information (if any) is returned | ||||
in the <rpc-reply> message. | ||||
2.10. NETCONF Specific Requirements | ||||
The server MUST be able to identify the specific protocol access | ||||
request at the 4 access control points defined above. | ||||
The server MUST be able to identify any datastore access request, | ||||
even for proprietary operations. | ||||
A client MUST always be authorized to invoke the <close-session> | ||||
operation, defined in [I-D.ietf-netconf-4741bis]. | ||||
A client MUST always be authorized to receive the <replayComplete> | ||||
and <notificationComplete> notification events, defined in [RFC5277] | ||||
The set of module name strings used within one particular server MUST | ||||
be unique. | ||||
3. NETCONF Access Control Model (NACM) | 3. NETCONF Access Control Model (NACM) | |||
3.1. Introduction | 3.1. Introduction | |||
This section provides a high-level overview of the access control | This section provides a high-level overview of the access control | |||
model structure. It describes the NETCONF protocol message | model structure. It describes the NETCONF protocol message | |||
processing model, and the conceptual access control requirements | processing model, and the conceptual access control requirements | |||
within that model. | within that model. | |||
skipping to change at page 14, line 31 | skipping to change at page 10, line 31 | |||
to use. | to use. | |||
o The concept of an emergency recovery session is supported, but | o The concept of an emergency recovery session is supported, but | |||
configuration of the server for this purpose is beyond the scope | configuration of the server for this purpose is beyond the scope | |||
of this document. An emergency recovery session will bypass all | of this document. An emergency recovery session will bypass all | |||
access control enforcement, in order to allow it to initialize or | access control enforcement, in order to allow it to initialize or | |||
repair the NACM configuration. | repair the NACM configuration. | |||
o A simple and familiar set of datastore permissions is used. | o A simple and familiar set of datastore permissions is used. | |||
o Support for YANG security tagging (e.g., nacm:secure extension) | o Support for YANG security tagging (e.g., "nacm:default-deny-write" | |||
allows default security modes to automatically exclude sensitive | statement) allows default security modes to automatically exclude | |||
data. | sensitive data. | |||
o Separate default access modes for read, write, and execute | o Separate default access modes for read, write, and execute | |||
permissions. | permissions. | |||
o Access control rules are applied to configurable groups of users. | o Access control rules are applied to configurable groups of users. | |||
o The entire ACM can be disabled during operation, in order to debug | o The entire ACM can be disabled during operation, in order to debug | |||
operational problems. | operational problems. | |||
o Access control rules are simple to configure. | o Access control rules are simple to configure. | |||
o The number of denied protocol operation requests and denied | o The number of denied protocol operation requests and denied | |||
datastore write requests can be monitored by the client. | datastore write requests can be monitored by the client. | |||
o Simple unconstrained YANG instance identifiers are used to | o Simple unconstrained YANG instance identifiers are used to | |||
configure access control rules for specific data nodes. | configure access control rules for specific data nodes. | |||
3.1.2. External Dependencies | 3.1.2. External Dependencies | |||
The NETCONF [I-D.ietf-netconf-4741bis] protocol is used for all | The NETCONF [RFC6241] protocol is used for all management purposes | |||
management purposes within this document. It is expected that the | within this document. It is expected that the mandatory transport | |||
mandatory transport mapping NETCONF Over SSH | mapping NETCONF Over SSH [RFC6242] is also supported by the server, | |||
[I-D.ietf-netconf-rfc4742bis] is also supported by the server, and | and that the server has access to the user name associated with each | |||
that the server has access to the user name associated with each | ||||
session. | session. | |||
The YANG Data Modeling Language [RFC6020] is used to define the | The YANG Data Modeling Language [RFC6020] is used to define the | |||
NETCONF data models specified in this document. | NETCONF data models specified in this document. | |||
3.1.3. Message Processing Model | 3.1.3. Message Processing Model | |||
The following diagram shows the NETCONF message flow model, including | The following diagram shows the conceptual message flow model, | |||
the points at which access control is applied, during NETCONF message | including the points at which access control is applied, during | |||
processing. | NETCONF message processing. | |||
+-------------------------+ | +-------------------------+ | |||
| session | | | session | | |||
| (username) | | | (username) | | |||
+-------------------------+ | +-------------------------+ | |||
| ^ | | ^ | |||
V | | V | | |||
+--------------+ +---------------+ | +--------------+ +---------------+ | |||
| message | | message | | | message | | message | | |||
| dispatcher | | generator | | | dispatcher | | generator | | |||
+--------------+ +---------------+ | +--------------+ +---------------+ | |||
| ^ ^ | | ^ ^ | |||
V | | | V | | | |||
+===========+ +-------------+ +----------------+ | +===========+ +-------------+ +----------------+ | |||
| <rpc> |---> | <rpc-reply> | | <notification> | | | <rpc> |---> | <rpc-reply> | | <notification> | | |||
| acc. ctl | | generator | | generator | | | acc. ctl | | generator | | generator | | |||
+===========+ +-------------+ +----------------+ | +===========+ +-------------+ +----------------+ | |||
| ^ ^ ^ | | ^ ^ ^ | |||
V +------+ | | | V +------+ | | | |||
+-----------+ | +=============+ +================+ | +-----------+ | +=============+ +================+ | |||
| <rpc> | | | <rpc-reply> | | <notification> | | | <rpc> | | | read | | <notification> | | |||
| processor |-+ | acc. ctl | | access ctl | | | processor |-+ | data node | | access ctl | | |||
| | | acc. ctl | | | | ||||
+-----------+ +=============+ +================+ | +-----------+ +=============+ +================+ | |||
| | ^ ^ | | | ^ ^ | |||
V +----------------+ | | | V +----------------+ | | | |||
+===========+ | | | | +===========+ | | | | |||
| write | | | | | ||||
| data node | | | | | | data node | | | | | |||
| acc. ctl | -----------+ | | | | | acc. ctl | -----------+ | | | | |||
+===========+ | | | | | +===========+ | | | | | |||
| | | | | | | | | | | | |||
V V V | | | V V V | | | |||
+---------------+ +-----------------+ | +---------------+ +-----------------+ | |||
| configuration | ---> | server | | | configuration | ---> | server | | |||
| datastore | | instrumentation | | | datastore | | instrumentation | | |||
| | <--- | | | | | <--- | | | |||
+---------------+ +-----------------+ | +---------------+ +-----------------+ | |||
skipping to change at page 17, line 5 | skipping to change at page 13, line 6 | |||
Figure 2 | Figure 2 | |||
The following high-level sequence of conceptual processing steps is | The following high-level sequence of conceptual processing steps is | |||
executed for each received <rpc> message, if access control | executed for each received <rpc> message, if access control | |||
enforcement is enabled: | enforcement is enabled: | |||
o Access control is applied to all <rpc> messages (except <close- | o Access control is applied to all <rpc> messages (except <close- | |||
session>) received by the server, individually, for each active | session>) received by the server, individually, for each active | |||
session, unless the session is identified as a "recovery session". | session, unless the session is identified as a "recovery session". | |||
o If the session is authorized to execute the specified RPC | o If the user is authorized to execute the specified protocol | |||
operation, then processing continues, otherwise the request is | operation, then processing continues, otherwise the request is | |||
rejected with an "access-denied" error. | rejected with an "access-denied" error. | |||
o If the configuration datastore or conceptual state data is | o If the configuration datastore or conceptual state data is | |||
accessed by the protocol operation, then the data node access MUST | accessed by the protocol operation, then the data node access MUST | |||
be authorized. If the session is authorized to perform the | be authorized. If the user is authorized to perform the requested | |||
requested operation on the requested data, then processing | access operation on the requested data, then processing continues. | |||
continues. | ||||
The following sequence of conceptual processing steps is executed for | The following sequence of conceptual processing steps is executed for | |||
each generated notification event, if access control enforcement is | each generated notification event, if access control enforcement is | |||
enabled: | enabled: | |||
o Server instrumentation generates a conceptual notification, for a | o Server instrumentation generates a notification, for a particular | |||
particular subscription. | subscription. | |||
o The notification access control enforcer checks the notification | o The notification access control enforcer checks the notification | |||
event type, and if it is one which the session is not authorized | event type, and if it is one which the user is not authorized to | |||
to read, then the notification is dropped for that subscription. | read, then the notification is dropped for that subscription. | |||
3.2. Model Components | 3.2. Datastore Access | |||
This section defines the conceptual components related to access | The same access control rules apply to all datastores. For example, | |||
control model. | the candidate configuration datastore or the running configuration | |||
datastore. | ||||
3.2.1. Users | Only the standard NETCONF datastores (candidate, running, and | |||
startup) are controlled by the ACM. Local or remote files or | ||||
datastores accessed via the <url> parameter are optional to support. | ||||
A "user" is the conceptual entity that is associated with the access | 3.2.1. Access Rights | |||
permissions granted to a particular session. A user is identified by | ||||
a string which MUST be unique within the server. | ||||
As described in [I-D.ietf-netconf-4741bis], the user name string is | A small set of hard-wired datastore access rights is needed to | |||
derived from the transport layer during session establishment. If | control access to all possible NETCONF protocol operations, including | |||
the transport layer cannot authenticate the user, the session is | vendor extensions to the standard protocol operation set. | |||
terminated. | ||||
The server MAY support a "recovery session" mechanism, which will | The "CRUDX" model can support all NETCONF protocol operations: | |||
bypass all access control enforcement. This is useful for | ||||
restricting initial access and repairing a broken access control | ||||
configuration. | ||||
3.2.2. Groups | o Create: Allows the client to add a new data node instance to a | |||
datastore. | ||||
Access to a specific NETCONF operation is granted to a session, | o Read: Allows the client to read a data node instance from a | |||
associated with a group, not a user. | datastore, or receive the notification event type. | |||
A group is identified by its name. All group names MUST be unique | o Update: Allows the client to update an existing data node instance | |||
within the server. | in a datastore. | |||
A group member is identified by a user name string. | o Delete: Allows the client to delete a data node instance from a | |||
datastore. | ||||
The same user may be configured in multiple groups. | o eXec: Allows the client to execute the protocol operation. | |||
3.2.3. Sessions | 3.2.2. <get> and <get-config> Operations | |||
A session is simply a NETCONF session, which is the entity that is | Data nodes to which the client does not have read access are silently | |||
granted access to specific NETCONF operations. | omitted from the <rpc-reply> message. This is done to allow NETCONF | |||
filters for <get> and <get-config> to function properly, instead of | ||||
causing an "access-denied" error because the filter criteria would | ||||
otherwise include unauthorized read access to some data nodes. For | ||||
NETCONF filtering purposes, the selection criteria is applied to the | ||||
subset of nodes that the user is authorized to read, not the entire | ||||
datastore. | ||||
A session is associated with a single user name for the lifetime of | 3.2.3. <edit-config> Operation | |||
the session. | ||||
3.2.4. Access Permissions | The NACM access rights are not directly coupled to the <edit-config> | |||
"operation" attribute, although they are similar. Instead, a NACM | ||||
access right applies to all protocol operations which would result in | ||||
a particular access operation to the target datastore. This section | ||||
describes how these access rights apply to the specific access | ||||
operations supported by the <edit-config> protocol operation. | ||||
The access permissions are the NETCONF protocol specific set of | If the effective access operation is "none" (i.e., default- | |||
permissions that have been assigned to a particular session. | operation="none") for a particular data node, then no access control | |||
is applied to that data node. | ||||
The same access permissions MUST stay in effect for the processing of | If the protocol operation would result in the creation of a data | |||
a particular message. | store node, and the user does not have "create" access permission for | |||
that node, the protocol operation is rejected with an "access-denied" | ||||
error. | ||||
The server MUST use the access control rules in effect at the time | If the protocol operation would result in the deletion of a data | |||
the message is processed. | store node, and the user does not have "delete" access permission for | |||
that node, the protocol operation is rejected with an "access-denied" | ||||
error. | ||||
The access control model treats protocol operation execution | If the protocol operation would result in the modification of a data | |||
separately from configuration datastore access and outgoing messages: | store node, and the user does not have "update" access permission for | |||
that node, the protocol operation is rejected with an "access-denied" | ||||
error. | ||||
create: Permission to create conceptual server data. | A "merge" or "replace" <edit-config> operation may include data nodes | |||
which do not alter portions of the existing datastore. For example, | ||||
a container or list node may be present for naming purposes, but does | ||||
not actually alter the corresponding datastore node. These unaltered | ||||
data nodes are ignored by the server, and do not require any access | ||||
rights by the client. | ||||
read: Read access to conceptual server data, <rpc-reply> and | A "merge" <edit-config> operation may include data nodes, but not | |||
<notification> content. | include particular child data nodes that are present in the | |||
datastore. These missing data nodes within the scope of a "merge" | ||||
<edit-config> operation are ignored by the server, and do not require | ||||
any access rights by the client. | ||||
update: Permission to modify existing conceptual server data. | The contents of specific restricted datastore nodes MUST NOT be | |||
exposed in any <rpc-error> elements within the reply. | ||||
delete: Permission to delete existing conceptual server data. | 3.2.4. <copy-config> Operation | |||
exec: Permission to invoke a protocol operation. | Access control for the <copy-config> protocol operation requires | |||
special consideration because the administrator may be replacing the | ||||
entire target datastore. | ||||
3.2.5. Global Enforcement Controls | If the source of the <copy-config> protocol operation is the running | |||
configuration datastore, and the target is the startup configuration | ||||
datastore, the client is only required to have permission to execute | ||||
the <copy-config> protocol operation. | ||||
Otherwise: | ||||
o If the source of the <copy-config> operation is a datastore, then | ||||
data nodes to which the client does not have read access are | ||||
silently omitted. | ||||
o If the target of the <copy-config> operation is a datastore, the | ||||
client needs access to the modified nodes. Specifically: | ||||
If the protocol operation would result in the creation of a | ||||
data store node, and the user does not have "create" access | ||||
permission for that node, the protocol operation is rejected | ||||
with an "access-denied" error. | ||||
If the protocol operation would result in the deletion of a | ||||
data store node, and the user does not have "delete" access | ||||
permission for that node, the protocol operation is rejected | ||||
with an "access-denied" error. | ||||
If the protocol operation would result in the modification of a | ||||
data store node, and the user does not have "update" access | ||||
permission for that node, the protocol operation is rejected | ||||
with an "access-denied" error. | ||||
3.2.5. <delete-config> Operation | ||||
Access to the <delete-config> protocol operation is denied by | ||||
default. The 'exec-default' parameter does not apply to this | ||||
protocol operation. Access control rules must be explicitly | ||||
configured to allow invocation by a non-recovery session. | ||||
3.2.6. <commit> Operation | ||||
The server MUST determine the exact nodes in the running | ||||
configuration datastore which are actually different, and only check | ||||
"create", "update", and "delete" access permissions for this set of | ||||
nodes, which could be empty. | ||||
For example, if a session can read the entire datastore, but only | ||||
change one leaf, that session needs to be able to edit and commit | ||||
that one leaf. | ||||
3.2.7. <discard-changes> Operation | ||||
The client is only required to have permission to execute the | ||||
<discard-changes> protocol operation. No datastore permissions are | ||||
needed. | ||||
3.2.8. <kill-session> Operation | ||||
The <kill-session> operation does not directly alter a datastore. | ||||
However, it allows one session to disrupt another session which is | ||||
editing a datastore. | ||||
Access to the <kill-session> protocol operation is denied by default. | ||||
The 'exec-default' parameter does not apply to this protocol | ||||
operation. Access control rules must be explicitly configured to | ||||
allow invocation by a non-recovery session. | ||||
3.3. Model Components | ||||
This section defines the conceptual components related to access | ||||
control model. | ||||
3.3.1. Users | ||||
A "user" is the conceptual entity that is associated with the access | ||||
permissions granted to a particular session. A user is identified by | ||||
a string which is unique within the server. | ||||
As described in [RFC6241], the user name string is derived from the | ||||
transport layer during session establishment. If the transport layer | ||||
cannot authenticate the user, the session is terminated. | ||||
The server MAY support a "recovery session" mechanism, which will | ||||
bypass all access control enforcement. This is useful for | ||||
restricting initial access and repairing a broken access control | ||||
configuration. | ||||
3.3.2. Groups | ||||
Access to a specific NETCONF protocol operation is granted to a | ||||
session, associated with a group, not a user. | ||||
A group is identified by its name. All group names are unique within | ||||
the server. | ||||
A group member is identified by a user name string. | ||||
The same user can be a member of multiple groups. | ||||
3.3.3. Global Enforcement Controls | ||||
There are four global controls that are used to help control how | There are four global controls that are used to help control how | |||
access control is enforced. | access control is enforced. | |||
3.2.5.1. enable-nacm Switch | 3.3.3.1. enable-nacm Switch | |||
A global "enable-nacm" on/off switch is provided to enable or disable | A global "enable-nacm" on/off switch is provided to enable or disable | |||
all access control enforcement. When this global switch is set to | all access control enforcement. When this global switch is set to | |||
"true", then all access requested are checked against the access | "true", then all requests are checked against the access control | |||
control rules, and only permitted if configured to allow the specific | rules, and only permitted if configured to allow the specific access | |||
access request. When this global switch is set to "false", then all | request. When this global switch is set to "false", then all access | |||
access requested are permitted. | requested are permitted. | |||
3.2.5.2. read-default Switch | 3.3.3.2. read-default Switch | |||
An on/off "read-default" switch is provided to enable or disable | An on/off "read-default" switch is provided to enable or disable | |||
default access to receive data in replies and notifications. When | default access to receive data in replies and notifications. When | |||
the "enable-nacm" global switch is set to "true", then this global | the "enable-nacm" global switch is set to "true", then this global | |||
switch is relevant, if no matching access control rule is found to | switch is relevant, if no matching access control rule is found to | |||
explicitly permit or deny read access to the requested NETCONF | explicitly permit or deny read access to the requested NETCONF | |||
datastore data or notification event type. | datastore data or notification event type. | |||
When this global switch is set to "permit", and no matching access | When this global switch is set to "permit", and no matching access | |||
control rule is found for the NETCONF datastore read or notification | control rule is found for the NETCONF datastore read or notification | |||
event requested, then access is permitted. | event requested, then access is permitted. | |||
When this global switch is set to "deny", and no matching access | When this global switch is set to "deny", and no matching access | |||
control rule is found for the NETCONF datastore read or notification | control rule is found for the NETCONF datastore read or notification | |||
event requested, then access is denied. | event requested, then access is denied. | |||
3.2.5.3. write-default Switch | 3.3.3.3. write-default Switch | |||
An on/off "write-default" switch is provided to enable or disable | An on/off "write-default" switch is provided to enable or disable | |||
default access to alter configuration data. When the "enable-nacm" | default access to alter configuration data. When the "enable-nacm" | |||
global switch is set to "true", then this global switch is relevant, | global switch is set to "true", then this global switch is relevant, | |||
if no matching access control rule is found to explicitly permit or | if no matching access control rule is found to explicitly permit or | |||
deny write access to the requested NETCONF datastore data. | deny write access to the requested NETCONF datastore data. | |||
When this global switch is set to "permit", and no matching access | When this global switch is set to "permit", and no matching access | |||
control rule is found for the NETCONF datastore write requested, then | control rule is found for the NETCONF datastore write requested, then | |||
access is permitted. | access is permitted. | |||
When this global switch is set to "deny", and no matching access | When this global switch is set to "deny", and no matching access | |||
control rule is found for the NETCONF datastore write requested, then | control rule is found for the NETCONF datastore write requested, then | |||
access is denied. | access is denied. | |||
3.2.5.4. exec-default Switch | 3.3.3.4. exec-default Switch | |||
An on/off "exec-default" switch is provided to enable or disable | An on/off "exec-default" switch is provided to enable or disable | |||
default access to execute protocol operations. When the "enable- | default access to execute protocol operations. When the "enable- | |||
nacm" global switch is set to "true", then this global switch is | nacm" global switch is set to "true", then this global switch is | |||
relevant, if no matching access control rule is found to explicitly | relevant, if no matching access control rule is found to explicitly | |||
permit or deny access to the requested NETCONF protocol operation. | permit or deny access to the requested NETCONF protocol operation. | |||
When this global switch is set to "permit", and no matching access | When this global switch is set to "permit", and no matching access | |||
control rule is found for the NETCONF protocol operation requested, | control rule is found for the NETCONF protocol operation requested, | |||
then access is permitted. | then access is permitted. | |||
When this global switch is set to "deny", and no matching access | When this global switch is set to "deny", and no matching access | |||
control rule is found for the NETCONF protocol operation requested, | control rule is found for the NETCONF protocol operation requested, | |||
then access is denied. | then access is denied. | |||
3.2.6. Access Control Rules | 3.3.4. Access Control Rules | |||
There are 4 types of rules available in NACM: | There are 4 types of rules available in NACM: | |||
module rule: Controls access for definitions in a specific module, | module rule: Controls access for definitions in a specific YANG | |||
identified by its name. | module, identified by its name. | |||
protocol operation rule: Controls access for a specific protocol | protocol operation rule: Controls access for a specific protocol | |||
operation, identified by its module and name. | operation, identified by its YANG module and name. | |||
data node rule: Controls access for a specific data node, identified | data node rule: Controls access for a specific data node, identified | |||
by its path location within the conceptual XML document for the | by its path location within the conceptual XML document for the | |||
data node. | data node. | |||
notification rule: Controls access for a specific notification event | notification rule: Controls access for a specific notification event | |||
type, identified by its module and name. | type, identified by its YANG module and name. | |||
3.3. Access Control Enforcement Procedures | 3.4. Access Control Enforcement Procedures | |||
There are seven separate phases that need to be addressed, four of | There are seven separate phases that need to be addressed, four of | |||
which are related to the NETCONF message processing model. In | which are related to the NETCONF message processing model. In | |||
addition, the initial start-up mode for a NETCONF server, session | addition, the initial start-up mode for a NETCONF server, session | |||
establishment, and "access-denied" error handling procedures also | establishment, and "access-denied" error handling procedures also | |||
need to be considered. | need to be considered. | |||
3.3.1. Initial Operation | The server MUST use the access control rules in effect at the time it | |||
starts processing the message. The same access control rules MUST | ||||
stay in effect for the processing of the entire message. | ||||
3.4.1. Initial Operation | ||||
Upon the very first start-up of the NETCONF server, the access | Upon the very first start-up of the NETCONF server, the access | |||
control configuration will probably not be present. If it isn't, a | control configuration will probably not be present. If it isn't, a | |||
server MUST NOT allow any write access to any session role except a | server MUST NOT allow any write access to any session role except a | |||
"recovery session", if supported. | "recovery session". | |||
Access control rules are not enforced before or while the non- | Access rules are enforced any time a request is initiated from a user | |||
volatile configuration data is processed and loaded into the running | session. Access control is not enforced for server-initiated access | |||
configuration, when the server is booting or rebooting. Access rules | requests, such as the initial load of the running datastore, during | |||
are enforced any time a request is initiated from a user session. | bootup. | |||
Access control is not enforced for server-initiated access requests, | ||||
such as the initial load of the running datastore, during bootup. | ||||
3.3.2. Session Establishment | 3.4.2. Session Establishment | |||
The access control model applies specifically to the well-formed XML | The access control model applies specifically to the well-formed XML | |||
content transferred between a client and a server, after session | content transferred between a client and a server, after session | |||
establishment has been completed, and after the <hello> exchange has | establishment has been completed, and after the <hello> exchange has | |||
been successfully completed. | been successfully completed. | |||
A server SHOULD NOT include any sensitive information in any | ||||
<capability> elements within the <hello> exchange. | ||||
Once session establishment is completed, and a user has been | Once session establishment is completed, and a user has been | |||
authenticated, the NETCONF transport layer reports the user name and | authenticated, the NETCONF transport layer reports the user name and | |||
a possibly empty set of group names associated with the user to the | a possibly empty set of group names associated with the user to the | |||
NETCONF server. The NETCONF server will enforce the access control | NETCONF server. The NETCONF server will enforce the access control | |||
rules, based on the supplied user name, group names, and the | rules, based on the supplied user name, group names, and the | |||
configuration data stored on the server. | configuration data stored on the server. | |||
3.3.3. "access-denied" Error Handling | 3.4.3. "access-denied" Error Handling | |||
The "access-denied" error-tag is generated when the access control | The "access-denied" error-tag is generated when the access control | |||
system denies access to either a request to invoke a protocol | system denies access to either a request to invoke a protocol | |||
operation or a request to perform a particular operation on the | operation or a request to perform a particular access operation on | |||
configuration datastore. | the configuration datastore. | |||
A server MUST NOT include any sensitive information in any <error- | A server MUST NOT include any sensitive information in any <error- | |||
info> elements within the <rpc-error> response. | info> elements within the <rpc-error> response. | |||
3.3.4. Incoming RPC Message Validation | 3.4.4. Incoming RPC Message Validation | |||
The diagram below shows the basic conceptual structure of the access | The diagram below shows the basic conceptual structure of the access | |||
control processing model for incoming NETCONF <rpc> messages, within | control processing model for incoming NETCONF <rpc> messages, within | |||
a server. | a server. | |||
NETCONF server | NETCONF server | |||
+------------+ | +------------+ | |||
| XML | | | XML | | |||
| message | | | message | | |||
| dispatcher | | | dispatcher | | |||
skipping to change at page 22, line 41 | skipping to change at page 21, line 7 | |||
| configuration | | | configuration | | |||
| datastore | | | datastore | | |||
+----------------------+ | +----------------------+ | |||
Figure 3 | Figure 3 | |||
Access control begins with the message dispatcher. | Access control begins with the message dispatcher. | |||
After the server validates the <rpc> element, and determines the | After the server validates the <rpc> element, and determines the | |||
namespace URI and the element name of the protocol operation being | namespace URI and the element name of the protocol operation being | |||
requested, the RPC access control enforcer verifies that the session | requested, the server verifies that the user is authorized to invoke | |||
is authorized to invoke the protocol operation. | the protocol operation. | |||
The protocol operation is authorized by following these steps: | The protocol operation is authorized by following these steps: | |||
1. If the "enable-nacm" leaf is set to "false", then the protocol | 1. If the "enable-nacm" leaf is set to "false", then the protocol | |||
operation is permitted. | operation is permitted. | |||
2. If the requesting session is identified as a "recovery session", | 2. If the requesting session is identified as a "recovery session", | |||
then the protocol operation is permitted. | then the protocol operation is permitted. | |||
3. If the requested operation is the NETCONF <close-session> | 3. If the requested operation is the NETCONF <close-session> | |||
operation, then the protocol operation is permitted. | protocol operation, then the protocol operation is permitted. | |||
4. Check all the "group" entries for ones that contain a "user- | 4. Check all the "group" entries for ones that contain a "user- | |||
name" entry that equals the user name for the session making the | name" entry that equals the user name for the session making the | |||
request. Add to these groups the set of groups provided by the | request. Add to these groups the set of groups provided by the | |||
transport layer. | transport layer. | |||
5. If no groups are found, continue with step 10. | 5. If no groups are found, continue with step 10. | |||
6. Process all rule-list entries, in order. If a rule-list's | 6. Process all rule-list entries, in the order they appear in the | |||
"group" leaf-list does not match any of the user's groups, | configuration. If a rule-list's "group" leaf-list does not | |||
proceed to the next rule-list entry. | match any of the user's groups, proceed to the next rule-list | |||
entry. | ||||
7. For each rule-list entry found, process all rules, in order, | 7. For each rule-list entry found, process all rules, in order, | |||
until a rule that matches the requested operation is found. A | until a rule that matches the requested access operation is | |||
rule matches if all of the following criteria are met: | found. A rule matches if all of the following criteria are met: | |||
* The rule's "module-name" leaf is "*", or equals the name of | * The rule's "module-name" leaf is "*", or equals the name of | |||
the YANG module where the protocol operation is defined. | the YANG module where the protocol operation is defined. | |||
* The rule does not have a "rule-type" defined, or the "rule- | * The rule does not have a "rule-type" defined, or the "rule- | |||
type" is "protocol-operation" and the "rpc-name" is "*" or | type" is "protocol-operation" and the "rpc-name" is "*" or | |||
equals the name of the requested protocol operation. | equals the name of the requested protocol operation. | |||
* The rule's "access-operations" leaf has the "exec" bit set, | * The rule's "access-operations" leaf has the "exec" bit set, | |||
or has the special value "*". | or has the special value "*". | |||
8. If a matching rule is found, then the "action" leaf is checked. | 8. If a matching rule is found, then the "action" leaf is checked. | |||
If it is equal to "permit", then the protocol operation is | If it is equal to "permit", then the protocol operation is | |||
permitted, otherwise it is denied. | permitted, otherwise it is denied. | |||
9. Otherwise, no matching rule was found in any rule-list entry. | 9. Otherwise, no matching rule was found in any rule-list entry. | |||
10. If the requested protocol operation is defined in a YANG module | 10. If the requested protocol operation is defined in a YANG module | |||
advertised in the server capabilities, and the "rpc" statement | advertised in the server capabilities, and the "rpc" statement | |||
contains a "nacm:secure" or a "nacm:very-secure" statement, then | contains a "nacm:default-deny-all" statement, then the protocol | |||
the protocol operation is denied. | operation is denied. | |||
11. If the "exec-default" leaf is set to "permit", then permit the | 11. If the requested protocol operation is the NETCONF <kill- | |||
session> or <delete-config>, then the protocol operation is | ||||
denied. | ||||
12. If the "exec-default" leaf is set to "permit", then permit the | ||||
protocol operation, otherwise deny the request. | protocol operation, otherwise deny the request. | |||
If the session is not authorized to invoke the protocol operation | If the user is not authorized to invoke the protocol operation then | |||
then an <rpc-error> is generated with the following information: | an <rpc-error> is generated with the following information: | |||
error-tag: access-denied | error-tag: access-denied | |||
error-path: Identifies the requested protocol operation. For | error-path: Identifies the requested protocol operation. For | |||
example: | example: | |||
<error-path | <error-path | |||
xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"> | xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"> | |||
/nc:rpc/nc:edit-config | /nc:rpc/nc:edit-config | |||
</error-path> | </error-path> | |||
represents the <edit-config> operation in the NETCONF base | represents the <edit-config> protocol operation in the NETCONF | |||
namespace. | base namespace. | |||
If a datastore is accessed, either directly or as a side effect of | If a datastore is accessed, either directly or as a side effect of | |||
the protocol operation, then the server MUST intercept the operation | the protocol operation, then the server MUST intercept the access | |||
and make sure the session is authorized to perform the requested | operation and make sure the user is authorized to perform the | |||
operation on the specified data, as defined in Section 3.3.5. | requested access operation on the specified data, as defined in | |||
Section 3.4.5. | ||||
3.3.5. Data Node Access Validation | 3.4.5. Data Node Access Validation | |||
If a data node within a datastore is accessed, then the server MUST | If a data node within a datastore is accessed, then the server MUST | |||
ensure that the client session is authorized to perform the requested | ensure that the user is authorized to perform the requested read, | |||
read, create, update, or delete operation on the specified data node. | create, update, or delete access operation on the specified data | |||
node. | ||||
The data node access request is authorized by following these steps: | The data node access request is authorized by following these steps: | |||
1. If the "enable-nacm" leaf is set to "false", then the protocol | 1. If the "enable-nacm" leaf is set to "false", then the access | |||
operation is permitted. | operation is permitted. | |||
2. If the requesting session is identified as a "recovery session", | 2. If the requesting session is identified as a "recovery session", | |||
then the protocol operation is permitted. | then the access operation is permitted. | |||
3. Check all the "group" entries for ones that contain a "user- | 3. Check all the "group" entries for ones that contain a "user- | |||
name" entry that equals the user name for the session making the | name" entry that equals the user name for the session making the | |||
request. Add to these groups the set of groups provided by the | request. Add to these groups the set of groups provided by the | |||
transport layer. | transport layer. | |||
4. If no groups are found, continue with step 9. | 4. If no groups are found, continue with step 9. | |||
5. Process all rule-list entries, in order. If a rule-list's | 5. Process all rule-list entries, in the order they appear in the | |||
"group" leaf-list does not match any of the user's groups, | configuration. If a rule-list's "group" leaf-list does not | |||
proceed to the next rule-list entry. | match any of the user's groups, proceed to the next rule-list | |||
entry. | ||||
6. For each rule-list entry found, process all rules, in order, | 6. For each rule-list entry found, process all rules, in order, | |||
until a rule that matches the requested operation is found. A | until a rule that matches the requested access operation is | |||
rule matches if all of the following criteria are met: | found. A rule matches if all of the following criteria are met: | |||
* The rule's "module-name" leaf is "*", or equals the name of | * The rule's "module-name" leaf is "*", or equals the name of | |||
the YANG module where the protocol operation is defined. | the YANG module where the requested data node is defined. | |||
* The rule does not have a "rule-type" defined, or the "rule- | * The rule does not have a "rule-type" defined, or the "rule- | |||
type" is "data-node" and the "path" matches the requested | type" is "data-node" and the "path" matches the requested | |||
data node. | data node. | |||
* For a read operation, the rule's "access-operations" leaf has | * For a read access operation, the rule's "access-operations" | |||
the "read" bit set, or has the special value "*". | leaf has the "read" bit set, or has the special value "*". | |||
* For a creation operation, the rule's "access-operations" leaf | * For a create access operation, the rule's "access-operations" | |||
has the "create" bit set, or has the special value "*". | leaf has the "create" bit set, or has the special value "*". | |||
* For a deletion operation, the rule's "access-operations" leaf | * For a delete access operation, the rule's "access-operations" | |||
has the "delete" bit set, or has the special value "*". | leaf has the "delete" bit set, or has the special value "*". | |||
* For an update operation, the rule's "access-operations" leaf | * For an update access operation, the rule's "access- | |||
has the "update" bit set, or has the special value "*". | operations" leaf has the "update" bit set, or has the special | |||
value "*". | ||||
7. If a matching rule is found, then the "action" leaf is checked. | 7. If a matching rule is found, then the "action" leaf is checked. | |||
If it is equal to "permit", then the data node access is | If it is equal to "permit", then the data node access is | |||
permitted, otherwise it is denied. For a read operation, | permitted, otherwise it is denied. For a read access operation, | |||
"denied" means that the requested data is not returned in the | "denied" means that the requested data is not returned in the | |||
reply. | reply. | |||
8. Otherwise, no matching rule was found in any rule-list entry. | 8. Otherwise, no matching rule was found in any rule-list entry. | |||
9. For a read operation, if the requested data node is defined in a | 9. For a read access operation, if the requested data node is | |||
YANG module advertised in the server capabilities, and the data | defined in a YANG module advertised in the server capabilities, | |||
definition statement contains a "nacm:very-secure" statement, | and the data definition statement contains a "nacm:default-deny- | |||
then the requested data node is not included in the reply. | all" statement, then the requested data node is not included in | |||
the reply. | ||||
10. For a write operation, if the requested data node is defined in | 10. For a write access operation, if the requested data node is | |||
a YANG module advertised in the server capabilities, and the | defined in a YANG module advertised in the server capabilities, | |||
data definition statement contains a "nacm:secure" or a "nacm: | and the data definition statement contains a "nacm:default-deny- | |||
very-secure" statement, then the data node access request is | write" or a "nacm:default-deny-all" statement, then the data | |||
denied. | node access request is denied. | |||
11. For a read operation, if the "read-default" leaf is set to | 11. For a read access operation, if the "read-default" leaf is set | |||
"permit", then include the requested data node in the reply, | to "permit", then include the requested data node in the reply, | |||
otherwise do not include the requested data node in the reply. | otherwise do not include the requested data node in the reply. | |||
12. For a write operation, if the "write-default" leaf is set to | 12. For a write access operation, if the "write-default" leaf is set | |||
"permit", then permit the data node access request, otherwise | to "permit", then permit the data node access request, otherwise | |||
deny the request. | deny the request. | |||
3.3.6. Outgoing <notification> Authorization | 3.4.6. Outgoing <notification> Authorization | |||
Configuration of access control rules specifically for descendant | Configuration of access control rules specifically for descendant | |||
nodes of the notification event type element are outside the scope of | nodes of the notification event type element are outside the scope of | |||
this document. If the session is authorized to receive the | this document. If the user is authorized to receive the notification | |||
notification event type, then it is also authorized to receive any | event type, then it is also authorized to receive any data it | |||
data it contains. | contains. | |||
The following figure shows the conceptual message processing model | The following figure shows the conceptual message processing model | |||
for outgoing <notification> messages. | for outgoing <notification> messages. | |||
NETCONF server | NETCONF server | |||
+------------+ | +------------+ | |||
| XML | | | XML | | |||
| message | | | message | | |||
| generator | | | generator | | |||
+------------+ | +------------+ | |||
skipping to change at page 27, line 15 | skipping to change at page 25, line 48 | |||
The generation of a notification for a specific subscription is | The generation of a notification for a specific subscription is | |||
authorized by following these steps: | authorized by following these steps: | |||
1. If the "enable-nacm" leaf is set to "false", then the | 1. If the "enable-nacm" leaf is set to "false", then the | |||
notification is permitted. | notification is permitted. | |||
2. If the session is identified as a "recovery session", then the | 2. If the session is identified as a "recovery session", then the | |||
notification is permitted. | notification is permitted. | |||
3. If the notification is the NETCONF <replayComplete> or | 3. If the notification is the NETCONF <replayComplete> or | |||
<notificationComplete> event type, then the notification is | <notificationComplete> event type [RFC5277], then the | |||
permitted. | notification is permitted. | |||
4. Check all the "group" entries for ones that contain a "user- | 4. Check all the "group" entries for ones that contain a "user- | |||
name" entry that equals the user name for the session making the | name" entry that equals the user name for the session making the | |||
request. Add to these groups the set of groups provided by the | request. Add to these groups the set of groups provided by the | |||
transport layer. | transport layer. | |||
5. If no groups are found, continue with step 10. | 5. If no groups are found, continue with step 10. | |||
6. Process all rule-list entries, in order. If a rule-list's | 6. Process all rule-list entries, in the order they appear in the | |||
"group" leaf-list does not match any of the user's groups, | configuration. If a rule-list's "group" leaf-list does not | |||
proceed to the next rule-list entry. | match any of the user's groups, proceed to the next rule-list | |||
entry. | ||||
7. For each rule-list entry found, process all rules, in order, | 7. For each rule-list entry found, process all rules, in order, | |||
until a rule that matches the requested operation is found. A | until a rule that matches the requested access operation is | |||
rule matches if all of the following criteria are met: | found. A rule matches if all of the following criteria are met: | |||
* The rule's "module-name" leaf is "*", or equals the name of | * The rule's "module-name" leaf is "*", or equals the name of | |||
the YANG module where the protocol operation is defined. | the YANG module where the notification is defined. | |||
* The rule does not have a "rule-type" defined, or the "rule- | * The rule does not have a "rule-type" defined, or the "rule- | |||
type" is "notification" and the "notification-name" is "*", | type" is "notification" and the "notification-name" is "*", | |||
equals the name of the notification. | equals the name of the notification. | |||
* The rule's "access-operations" leaf has the "read" bit set, | * The rule's "access-operations" leaf has the "read" bit set, | |||
or has the special value "*". | or has the special value "*". | |||
8. If a matching rule is found, then the "action" leaf is checked. | 8. If a matching rule is found, then the "action" leaf is checked. | |||
If it is equal to "permit", then permit the notification, | If it is equal to "permit", then permit the notification, | |||
otherwise drop the notification for the associated subscription. | otherwise drop the notification for the associated subscription. | |||
9. Otherwise, no matching rule was found in any rule-list entry. | 9. Otherwise, no matching rule was found in any rule-list entry. | |||
10. If the requested notification is defined in a YANG module | 10. If the requested notification is defined in a YANG module | |||
advertised in the server capabilities, and the "notification" | advertised in the server capabilities, and the "notification" | |||
statement contains a "nacm:very-secure" statement, then the | statement contains a "nacm:default-deny-all" statement, then the | |||
notification is dropped for the associated subscription. | notification is dropped for the associated subscription. | |||
11. If the "read-default" leaf is set to "permit", then permit the | 11. If the "read-default" leaf is set to "permit", then permit the | |||
notification, otherwise drop the notification for the associated | notification, otherwise drop the notification for the associated | |||
subscription. | subscription. | |||
3.4. Data Model Definitions | 3.5. Data Model Definitions | |||
This section defines the semantics of the conceptual data structures | This section defines the semantics of the conceptual data structures | |||
found in the data model in Section 3.4. | found in the data model in Section 3.5. | |||
3.4.1. Data Organization | ||||
The top-level element is called <nacm>, and it is defined in the | ||||
"ietf-netconf-acm" module's namespace. | ||||
There are several data structures defined as child nodes of the | ||||
<nacm> element: | ||||
leaf <enable-nacm>: On/off boolean switch to enable or disable | ||||
access control enforcement. | ||||
leaf <read-default>: Enumeration to permit or deny default read | ||||
access requests. | ||||
leaf <write-default>: Enumeration to permit or deny default write | ||||
access requests. | ||||
leaf <exec-default>: Enumeration to permit or deny default protocol | ||||
operation execution requests. | ||||
leaf <denied-rpcs>: Read-only counter of the number of times the | ||||
server has denied an RPC operation request, since the last reboot | ||||
of the server. | ||||
leaf <denied-data-writes>: Read-only counter of the number of times | ||||
the server has denied a data node write request, since the last | ||||
reboot of the server. | ||||
leaf <denied-notifications>: Read-only counter of the number of | ||||
times the server has denied a notification, since the last reboot | ||||
of the server. | ||||
container <groups>: Configures the groups used within the access | ||||
control system. | ||||
list <group>: A list of user names belonging to the same | ||||
administrative group. | ||||
container <rules>: Configures the access control rules used within | 3.5.1. Data Organization | |||
the server. | ||||
list <rule-list>: An ordered collection of related access control | The following diagram highlights the contents and structure of the | |||
rules. | NACM YANG module. | |||
list <rule>: Configures the access control rules for protocol | +--rw nacm | |||
operation invocation, configuration datastore access, and | +--rw enable-nacm? boolean | |||
for controlling delivery of <notification> events. | +--rw read-default? action-type | |||
+--rw write-default? action-type | ||||
+--rw exec-default? action-type | ||||
+--ro denied-operations yang:zero-based-counter32 | ||||
+--ro denied-data-writes yang:zero-based-counter32 | ||||
+--ro denied-notifications yang:zero-based-counter32 | ||||
+--rw groups | ||||
| +--rw group [name] | ||||
| +--rw name group-name-type | ||||
| +--rw user-name* user-name-type | ||||
+--rw rule-list [name] | ||||
+--rw name string | ||||
+--rw group* union | ||||
+--rw rule [name] | ||||
+--rw name string | ||||
+--rw module-name? union | ||||
+--rw (rule-type)? | ||||
| +--:(protocol-operation) | ||||
| | +--rw rpc-name? union | ||||
| +--:(notification) | ||||
| | +--rw notification-name? union | ||||
| +--:(data-node) | ||||
| +--rw path node-instance-identifier | ||||
+--rw access-operations? union | ||||
+--rw action action-type | ||||
+--rw comment? string | ||||
3.4.2. YANG Module | 3.5.2. YANG Module | |||
The following YANG module specifies the normative NETCONF content | The following YANG module specifies the normative NETCONF content | |||
that MUST by supported by the server. | that MUST by supported by the server. | |||
The ietf-netconf-acm YANG module imports typedefs from [RFC6021]. | The "ietf-netconf-acm" YANG module imports typedefs from [RFC6021]. | |||
// RFC Ed.: please update the date to the date of publication | ||||
<CODE BEGINS> file="ietf-netconf-acm@2011-06-14.yang" | ||||
module ietf-netconf-acm { | ||||
namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-acm"; | ||||
prefix "nacm"; | ||||
import ietf-yang-types { | ||||
prefix yang; | ||||
} | ||||
organization | ||||
"IETF NETCONF (Network Configuration) Working Group"; | ||||
contact | // RFC Ed.: please update the date to the date of publication | |||
"WG Web: <http://tools.ietf.org/wg/netconf/> | <CODE BEGINS> file="ietf-netconf-acm@2011-10-04.yang" | |||
WG List: <mailto:netconf@ietf.org> | ||||
WG Chair: Mehmet Ersue | module ietf-netconf-acm { | |||
<mailto:mehmet.ersue@nsn.com> | ||||
WG Chair: Bert Wijnen | namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-acm"; | |||
<mailto:bertietf@bwijnen.net> | prefix "nacm"; | |||
Editor: Andy Bierman | import ietf-yang-types { | |||
<mailto:andy.bierman@brocade.com> | prefix yang; | |||
} | ||||
Editor: Martin Bjorklund | organization | |||
<mailto:mbj@tail-f.com>"; | "IETF NETCONF (Network Configuration) Working Group"; | |||
description | contact | |||
"NETCONF Server Access Control Model. | "WG Web: <http://tools.ietf.org/wg/netconf/> | |||
WG List: <mailto:netconf@ietf.org> | ||||
Copyright (c) 2011 IETF Trust and the persons identified as | WG Chair: Mehmet Ersue | |||
authors of the code. All rights reserved. | <mailto:mehmet.ersue@nsn.com> | |||
Redistribution and use in source and binary forms, with or | WG Chair: Bert Wijnen | |||
without modification, is permitted pursuant to, and subject | <mailto:bertietf@bwijnen.net> | |||
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 XXXX; see | Editor: Andy Bierman | |||
the RFC itself for full legal notices."; | <mailto:andy.bierman@brocade.com> | |||
// RFC Ed.: replace XXXX with actual RFC number and | ||||
// remove this note | ||||
// RFC Ed.: remove this note | Editor: Martin Bjorklund | |||
// Note: extracted from draft-ietf-netconf-access-control-04.txt | <mailto:mbj@tail-f.com>"; | |||
// RFC Ed.: please update the date to the date of publication | ||||
revision "2011-06-14" { | ||||
description | description | |||
"Initial version"; | "NETCONF Access Control Model. | |||
reference | ||||
"RFC XXXX: Network Configuration Protocol | ||||
Access Control Model"; | ||||
} | ||||
/* | Copyright (c) 2011 IETF Trust and the persons identified as | |||
* Extension statements | authors of the code. All rights reserved. | |||
*/ | ||||
extension secure { | Redistribution and use in source and binary forms, with or | |||
description | without modification, is permitted pursuant to, and subject | |||
"Used to indicate that the data model node | to the license terms contained in, the Simplified BSD | |||
represents a sensitive security system parameter. | License set forth in Section 4.c of the IETF Trust's | |||
Legal Provisions Relating to IETF Documents | ||||
(http://trustee.ietf.org/license-info). | ||||
If present, and the NACM module is enabled (i.e., | This version of this YANG module is part of RFC XXXX; see | |||
/nacm/enable-nacm object equals 'true'), the NETCONF server | the RFC itself for full legal notices."; | |||
will only allow the designated 'recovery session' to have | // RFC Ed.: replace XXXX with actual RFC number and | |||
write or execute access to the node. An explicit access | // remove this note | |||
control rule is required for all other users. | ||||
The 'secure' extension MAY appear within a data definition | // RFC Ed.: remove this note | |||
statement or rpc statement. It is ignored otherwise."; | // Note: extracted from draft-ietf-netconf-access-control-05.txt | |||
} | ||||
extension very-secure { | // RFC Ed.: please update the date to the date of publication | |||
description | revision "2011-10-04" { | |||
"Used to indicate that the data model node | description | |||
controls a very sensitive security system parameter. | "Initial version"; | |||
reference | ||||
"RFC XXXX: Network Configuration Protocol | ||||
Access Control Model"; | ||||
} | ||||
If present, and the NACM module is enabled (i.e., | /* | |||
/nacm/enable-nacm object equals 'true'), the NETCONF server | * Extension statements | |||
will only allow the designated 'recovery session' to have | */ | |||
read, write, or execute access to the node. An explicit | ||||
access control rule is required for all other users. | ||||
The 'very-secure' extension MAY appear within a data | extension default-deny-write { | |||
definition statement, rpc statement, or notification | description | |||
statement. It is ignored otherwise."; | "Used to indicate that the data model node | |||
} | represents a sensitive security system parameter. | |||
/* | If present, and the NACM module is enabled (i.e., | |||
* Derived types | /nacm/enable-nacm object equals 'true'), the NETCONF server | |||
*/ | will only allow the designated 'recovery session' to have | |||
write access to the node. An explicit access control rule is | ||||
required for all other users. | ||||
typedef user-name-type { | The 'default-deny-write' extension MAY appear within a data | |||
type string { | definition statement. It is ignored otherwise."; | |||
length "1..max"; | ||||
} | } | |||
description | ||||
"General Purpose User Name string."; | ||||
} | ||||
typedef matchall-string-type { | extension default-deny-all { | |||
type string { | description | |||
pattern "\*"; | "Used to indicate that the data model node | |||
} | controls a very sensitive security system parameter. | |||
description | ||||
"The string containing a single asterisk '*' is used | ||||
to conceptually represent all possible values | ||||
for the particular leaf using this data type."; | ||||
} | ||||
typedef access-operations-type { | If present, and the NACM module is enabled (i.e., | |||
type bits { | /nacm/enable-nacm object equals 'true'), the NETCONF server | |||
bit create { | will only allow the designated 'recovery session' to have | |||
description | read, write, or execute access to the node. An explicit | |||
"Any operation that creates a | access control rule is required for all other users. | |||
new instance of the specified data is a create | ||||
operation."; | ||||
} | ||||
bit read { | ||||
description | ||||
"Any operation or notification that | ||||
returns data to an application is a read | ||||
operation."; | ||||
} | ||||
bit update { | ||||
description | ||||
"Any operation that alters an existing | ||||
data node is an update operation."; | ||||
} | ||||
bit delete { | ||||
description | ||||
"Any operation that removes a datastore | ||||
node instance is a delete operation."; | ||||
} | ||||
bit exec { | ||||
description | ||||
"Execution access to the specified RPC operation. | ||||
Any RPC operation invocation is an exec operation."; | ||||
} | ||||
} | ||||
description | ||||
"NETCONF Access Operation."; | ||||
} | ||||
typedef group-name-type { | The 'default-deny-all' extension MAY appear within a data | |||
type string { | definition statement, 'rpc' statement, or 'notification' | |||
length "1..max"; | statement. It is ignored otherwise."; | |||
pattern "[^\*].*"; | ||||
} | } | |||
description | ||||
"Name of administrative group that can be | ||||
assigned to the user, and specified in | ||||
an access control rule-list."; | ||||
} | ||||
typedef action-type { | /* | |||
type enumeration { | * Derived types | |||
enum permit { | */ | |||
description | ||||
"Requested action is permitted."; | ||||
} | ||||
enum deny { | ||||
description | ||||
"Requested action is denied."; | ||||
typedef user-name-type { | ||||
type string { | ||||
length "1..max"; | ||||
} | } | |||
} | ||||
description | ||||
"Action taken by the server when a particular | ||||
rule matches."; | ||||
} | ||||
typedef node-instance-identifier { | ||||
type yang:xpath1.0; | ||||
description | ||||
"Path expression used to represent a special | ||||
data node instance identifier string. | ||||
A node-instance-identifier value is an | ||||
unrestricted YANG instance-identifier expression. | ||||
All the same rules as an instance-identifier apply | ||||
except predicates for keys are optional. If a key | ||||
predicate is missing, then the node-instance-identifier | ||||
represents all possible server instances for that key. | ||||
This XPath expression is evaluated in the following context: | ||||
o The set of namespace declarations are those in scope on | ||||
the leaf element where this type is used. | ||||
o The set of variable bindings contains one variable, | ||||
'USER', which contains the name of user of the current | ||||
session. | ||||
o The function library is the core function library, but | ||||
note that due to the syntax restrictions of an | ||||
instance-identifier, no functions are allowed. | ||||
o The context node is the root node in the data tree."; | ||||
} | ||||
container nacm { | ||||
nacm:very-secure; | ||||
description | ||||
"Parameters for NETCONF Access Control Model."; | ||||
leaf enable-nacm { | ||||
type boolean; | ||||
default true; | ||||
description | description | |||
"Enable or disable all NETCONF access control | "General Purpose User Name string."; | |||
enforcement. If 'true', then enforcement | ||||
is enabled. If 'false', then enforcement | ||||
is disabled."; | ||||
} | } | |||
leaf read-default { | typedef matchall-string-type { | |||
type action-type; | type string { | |||
default "permit"; | pattern "\*"; | |||
} | ||||
description | description | |||
"Controls whether read access is granted if | "The string containing a single asterisk '*' is used | |||
no appropriate rule is found for a | to conceptually represent all possible values | |||
particular read request."; | for the particular leaf using this data type."; | |||
} | } | |||
leaf write-default { | typedef access-operations-type { | |||
type action-type; | type bits { | |||
default "deny"; | bit create { | |||
description | ||||
"Any protocol operation that creates a | ||||
new data node."; | ||||
} | ||||
bit read { | ||||
description | ||||
"Any protocol operation or notification that | ||||
returns the value of a data node."; | ||||
} | ||||
bit update { | ||||
description | ||||
"Any protocol operation that alters an existing | ||||
data node."; | ||||
} | ||||
bit delete { | ||||
description | ||||
"Any protocol operation that removes a data node."; | ||||
} | ||||
bit exec { | ||||
description | ||||
"Execution access to the specified protocol operation."; | ||||
} | ||||
} | ||||
description | description | |||
"Controls whether create, update, or delete access | "NETCONF Access Operation."; | |||
is granted if no appropriate rule is found for a | ||||
particular write request."; | ||||
} | } | |||
leaf exec-default { | typedef group-name-type { | |||
type action-type; | type string { | |||
default "permit"; | length "1..max"; | |||
pattern "[^\*].*"; | ||||
} | ||||
description | description | |||
"Controls whether exec access is granted if no appropriate | "Name of administrative group to which | |||
rule is found for a particular RPC operation request."; | users can be assigned."; | |||
} | } | |||
leaf denied-rpcs { | typedef action-type { | |||
type yang:zero-based-counter32; | type enumeration { | |||
config false; | enum permit { | |||
mandatory true; | description | |||
"Requested action is permitted."; | ||||
} | ||||
enum deny { | ||||
description | ||||
"Requested action is denied."; | ||||
} | ||||
} | ||||
description | description | |||
"Number of times an RPC operation request was denied | "Action taken by the server when a particular | |||
since the server last restarted."; | rule matches."; | |||
} | } | |||
leaf denied-data-writes { | typedef node-instance-identifier { | |||
type yang:zero-based-counter32; | type yang:xpath1.0; | |||
config false; | ||||
mandatory true; | ||||
description | ||||
"Number of times a request to alter a data node | ||||
was denied, since the server last restarted."; | ||||
} | ||||
leaf denied-notifications { | ||||
type yang:zero-based-counter32; | ||||
config false; | ||||
mandatory true; | ||||
description | description | |||
"Number of times a notification was denied | "Path expression used to represent a special | |||
since the server last restarted."; | data node instance identifier string. | |||
A node-instance-identifier value is an | ||||
unrestricted YANG instance-identifier expression. | ||||
All the same rules as an instance-identifier apply | ||||
except predicates for keys are optional. If a key | ||||
predicate is missing, then the node-instance-identifier | ||||
represents all possible server instances for that key. | ||||
This XPath expression is evaluated in the following context: | ||||
o The set of namespace declarations are those in scope on | ||||
the leaf element where this type is used. | ||||
o The set of variable bindings contains one variable, | ||||
'USER', which contains the name of user of the current | ||||
session. | ||||
o The function library is the core function library, but | ||||
note that due to the syntax restrictions of an | ||||
instance-identifier, no functions are allowed. | ||||
o The context node is the root node in the data tree."; | ||||
} | } | |||
container groups { | container nacm { | |||
nacm:default-deny-all; | ||||
description | description | |||
"NETCONF Access Control Groups."; | "Parameters for NETCONF Access Control Model."; | |||
list group { | leaf enable-nacm { | |||
key name; | type boolean; | |||
default true; | ||||
description | ||||
"Enable or disable all NETCONF access control | ||||
enforcement. If 'true', then enforcement | ||||
is enabled. If 'false', then enforcement | ||||
is disabled."; | ||||
} | ||||
leaf read-default { | ||||
type action-type; | ||||
default "permit"; | ||||
description | description | |||
"One NACM Group Entry."; | "Controls whether read access is granted if | |||
no appropriate rule is found for a | ||||
particular read request."; | ||||
} | ||||
leaf name { | leaf write-default { | |||
type group-name-type; | type action-type; | |||
description | default "deny"; | |||
"Group name associated with this entry."; | description | |||
} | "Controls whether create, update, or delete access | |||
is granted if no appropriate rule is found for a | ||||
particular write request."; | ||||
} | ||||
leaf-list user-name { | leaf exec-default { | |||
type user-name-type; | type action-type; | |||
description | default "permit"; | |||
"Each entry identifies the user name of | description | |||
a member of the group associated with | "Controls whether exec access is granted if no appropriate | |||
this entry."; | rule is found for a particular protocol operation request."; | |||
} | } | |||
leaf denied-operations { | ||||
type yang:zero-based-counter32; | ||||
config false; | ||||
mandatory true; | ||||
description | ||||
"Number of times a protocol operation request was denied | ||||
since the server last restarted."; | ||||
} | } | |||
} | ||||
list rule-list { | leaf denied-data-writes { | |||
key "name"; | type yang:zero-based-counter32; | |||
ordered-by user; | config false; | |||
description | mandatory true; | |||
"An ordered collection of access control rules."; | description | |||
"Number of times a protocol operation request to alter | ||||
a configuration datastore was denied, since the | ||||
server last restarted."; | ||||
} | ||||
leaf name { | leaf denied-notifications { | |||
type string { | type yang:zero-based-counter32; | |||
length "1..256"; | config false; | |||
} | mandatory true; | |||
description | description | |||
"Arbitrary name assigned to the rule-list."; | "Number of times a notification was dropped | |||
for a subscription because access to | ||||
the event type was denied, since the server | ||||
last restarted."; | ||||
} | } | |||
leaf-list group { | ||||
type union { | container groups { | |||
type matchall-string-type; | ||||
type group-name-type; | ||||
} | ||||
description | description | |||
"List of administrative groups that will be | "NETCONF Access Control Groups."; | |||
assigned the associated access rights | ||||
defined by the 'rule' list. | ||||
The string '*' indicates that all groups apply to the | list group { | |||
entry."; | key name; | |||
description | ||||
"One NACM Group Entry."; | ||||
leaf name { | ||||
type group-name-type; | ||||
description | ||||
"Group name associated with this entry."; | ||||
} | ||||
leaf-list user-name { | ||||
type user-name-type; | ||||
description | ||||
"Each entry identifies the user name of | ||||
a member of the group associated with | ||||
this entry."; | ||||
} | ||||
} | ||||
} | } | |||
list rule { | list rule-list { | |||
key "name"; | key "name"; | |||
ordered-by user; | ordered-by user; | |||
description | description | |||
"One access control rule. | "An ordered collection of access control rules."; | |||
Rules are processed in user-defined order until a match is | ||||
found. A rule matches if 'module-name', 'rule-type', and | ||||
'access-operations' matches the request. If a rule | ||||
matches, the 'action' leaf determines if access is granted | ||||
or not."; | ||||
leaf name { | leaf name { | |||
type string { | type string { | |||
length "1..256"; | length "1..max"; | |||
} | } | |||
description | description | |||
"Arbitrary name assigned to the rule."; | "Arbitrary name assigned to the rule-list."; | |||
} | } | |||
leaf-list group { | ||||
leaf module-name { | ||||
type union { | type union { | |||
type matchall-string-type; | type matchall-string-type; | |||
type string; | type group-name-type; | |||
} | } | |||
default "*"; | ||||
description | description | |||
"Name of the module associated with this rule. | "List of administrative groups that will be | |||
assigned the associated access rights | ||||
defined by the 'rule' list. | ||||
This leaf matches if it has the value '*', or if the | The string '*' indicates that all groups apply to the | |||
object being accessed is defined in the module with the | entry."; | |||
specified module name."; | ||||
} | } | |||
choice rule-type { | ||||
list rule { | ||||
key "name"; | ||||
ordered-by user; | ||||
description | description | |||
"This choice matches if all leafs present in the rule | "One access control rule. | |||
matches the request. If no leafs are present, the | ||||
choice matches all requests."; | Rules are processed in user-defined order until a match is | |||
case protocol-operation { | found. A rule matches if 'module-name', 'rule-type', and | |||
leaf rpc-name { | 'access-operations' matches the request. If a rule | |||
type union { | matches, the 'action' leaf determines if access is granted | |||
type matchall-string-type; | or not."; | |||
type string; | ||||
} | leaf name { | |||
description | type string { | |||
"This leaf matches if it has the value '*', or if its | length "1..max"; | |||
value equals the requested RPC operation name."; | ||||
} | } | |||
description | ||||
"Arbitrary name assigned to the rule."; | ||||
} | } | |||
case notification { | ||||
leaf notification-name { | leaf module-name { | |||
type union { | type union { | |||
type matchall-string-type; | type matchall-string-type; | |||
type string; | type string; | |||
} | ||||
description | ||||
"This leaf matches if it has the value '*', or if its | ||||
value equals the requested notification name."; | ||||
} | } | |||
default "*"; | ||||
description | ||||
"Name of the module associated with this rule. | ||||
This leaf matches if it has the value '*', or if the | ||||
object being accessed is defined in the module with the | ||||
specified module name."; | ||||
} | } | |||
case data-node { | choice rule-type { | |||
leaf path { | description | |||
type node-instance-identifier; | "This choice matches if all leafs present in the rule | |||
mandatory true; | matches the request. If no leafs are present, the | |||
description | choice matches all requests."; | |||
"Data Node Instance Identifier associated with the data | case protocol-operation { | |||
node controlled by this rule. | leaf rpc-name { | |||
type union { | ||||
type matchall-string-type; | ||||
type string; | ||||
} | ||||
description | ||||
"This leaf matches if it has the value '*', or if | ||||
its value equals the requested protocol operation | ||||
name."; | ||||
} | ||||
} | ||||
case notification { | ||||
leaf notification-name { | ||||
type union { | ||||
type matchall-string-type; | ||||
type string; | ||||
} | ||||
description | ||||
"This leaf matches if it has the value '*', or if its | ||||
value equals the requested notification name."; | ||||
} | ||||
} | ||||
case data-node { | ||||
leaf path { | ||||
type node-instance-identifier; | ||||
mandatory true; | ||||
description | ||||
"Data Node Instance Identifier associated with the | ||||
data node controlled by this rule. | ||||
Configuration data or state data instance | Configuration data or state data instance | |||
identifiers start with a top-level data node. A | identifiers start with a top-level data node. A | |||
complete instance identifier is required for this | complete instance identifier is required for this | |||
type of path value. | type of path value. | |||
The special value '/' refers to all possible data | The special value '/' refers to all possible data | |||
store contents."; | store contents."; | |||
} | ||||
} | } | |||
} | } | |||
} | ||||
leaf access-operations { | leaf access-operations { | |||
type union { | type union { | |||
type matchall-string-type; | type matchall-string-type; | |||
type access-operations-type; | type access-operations-type; | |||
} | ||||
default "*"; | ||||
description | ||||
"Access operations associated with this rule. | ||||
This leaf matches if it has the value '*', or if the | ||||
bit corresponding to the requested operation is set."; | ||||
} | } | |||
default "*"; | ||||
description | ||||
"Access operations associated with this rule. | ||||
This leaf matches if it has the value '*', or if the | leaf action { | |||
bit corresponding to the requested operation is set."; | type action-type; | |||
} | mandatory true; | |||
description | ||||
"The access control action associated with the | ||||
rule. If a rule is determined to match a | ||||
particular request, then this object is used | ||||
to determine whether to permit or deny the | ||||
request."; | ||||
} | ||||
leaf action { | leaf comment { | |||
type action-type; | type string; | |||
mandatory true; | description | |||
description | "A textual description of the access rule."; | |||
"The access control action associated with the | } | |||
rule. If a rule is determined to match a | ||||
particular request, then this object is used | ||||
to determine whether to permit or deny the | ||||
request."; | ||||
} | ||||
leaf comment { | ||||
type string; | ||||
description | ||||
"A textual description of the access rule."; | ||||
} | } | |||
} | } | |||
} | } | |||
} | } | |||
} | ||||
<CODE ENDS> | <CODE ENDS> | |||
Figure 5 | Figure 5 | |||
3.5. IANA Considerations | 3.6. IANA Considerations | |||
There are two actions that are requested of IANA: This document | There are two actions that are requested of IANA: This document | |||
registers one URI in "The IETF XML Registry". Following the format | registers one URI in "The IETF XML Registry". Following the format | |||
in [RFC3688], the following has been registered. | in [RFC3688], the following has been registered. | |||
URI: urn:ietf:params:xml:ns:yang:ietf-netconf-acm | URI: urn:ietf:params:xml:ns:yang:ietf-netconf-acm | |||
Registrant Contact: The IESG. | Registrant Contact: The IESG. | |||
XML: N/A, the requested URI is an XML namespace. | XML: N/A, the requested URI is an XML namespace. | |||
This document registers one module in the "YANG Module Names" | This document registers one module in the "YANG Module Names" | |||
registry. Following the format in [RFC6020], the following has been | registry. Following the format in [RFC6020], the following has been | |||
registered. | registered. | |||
name: ietf-netconf-acm | name: ietf-netconf-acm | |||
namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-acm | namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-acm | |||
prefix: nacm | prefix: nacm | |||
reference: RFC XXXX | reference: RFC XXXX | |||
// RFC Ed.: Replace XXX with actual RFC number | // RFC Ed.: Replace XXX with actual RFC number | |||
// and remove this note | // and remove this note | |||
3.6. Security Considerations | 3.7. Security Considerations | |||
This entire document discusses access control requirements and | This entire document discusses access control requirements and | |||
mechanisms for restricting NETCONF protocol behavior within a given | mechanisms for restricting NETCONF protocol behavior within a given | |||
session. | session. | |||
This section highlights the issues for an administrator to consider | ||||
when configuring a NETCONF server with NACM. | ||||
3.7.1. NACM Configuration and Monitoring Considerations | ||||
Configuration of the access control system is highly sensitive to | Configuration of the access control system is highly sensitive to | |||
system security. A server may choose not to allow any user | system security. A server may choose not to allow any user | |||
configuration to some portions of it, such as the global security | configuration to some portions of it, such as the global security | |||
level, or the groups which allowed access to system resources. | level, or the groups which allowed access to system resources. | |||
This document incorporates the optional use of a "recovery session" | By default, NACM enforcement is enabled. By default, "read" access | |||
mechanism, which can be used to bypass access control enforcement in | to all datastore contents enabled, (unless "nacm:default-deny-all" is | |||
emergencies, such as NACM configuration errors which disable all | specified for the data definition) and "exec" access is enabled for | |||
access to the server. The configuration and identification of such a | safe protocol operations. An administrator needs to ensure that NACM | |||
recovery session mechanism are outside the scope of this document. | is enabled, and also decide if the default access parameters are set | |||
appropriately. Make sure the following data nodes are properly | ||||
configured: | ||||
There is a risk that invocation of non-standard protocol operations | o /nacm/enable-nacm (default "true") | |||
will have undocumented side effects. An administrator needs to | ||||
construct access control rules such that the configuration datastore | ||||
is protected from such side effects. Also, such protocol operations | ||||
SHOULD never be invoked by a session during a "recovery session". | ||||
There is a risk that non-standard protocol operations, or even the | o /nacm/read-default (default "permit") | |||
standard <get> operation, may return data which "aliases" or "copies" | ||||
sensitive data from a different data object. In this case, the | o /nacm/write-default (default "deny") | |||
namespace and/or the element name will not match the values for the | ||||
sensitive data, which is then fully or partially copied into a | o /nacm/exec-default (default "permit") | |||
different namespace and/or element. An administrator needs to avoid | ||||
using data models which use this practice. | ||||
An administrator needs to restrict write access to all configurable | An administrator needs to restrict write access to all configurable | |||
objects within this data model. | objects within this data model. | |||
If write access is allowed for configuration of access control rules, | If write access is allowed for configuration of access control rules, | |||
then care needs to be taken not to disrupt the access control | then care needs to be taken not to disrupt the access control | |||
enforcement. | enforcement. For example, if the NACM access control rules are | |||
editing directly within the running configuration datastore (i.e., | ||||
:writable-running capability is supported and used), then care needs | ||||
to be taken not to allow unintended access while the edits are being | ||||
done. | ||||
NACM requires some a user name in each NACM group mapping. An | ||||
administrator needs to make sure that the translation from a | ||||
transport or implementation dependant user identity to a NACM user | ||||
name is unique. | ||||
An administrator needs to restrict read access to the following | An administrator needs to restrict read access to the following | |||
objects within this data model, which reveal access control | objects within this data model, which reveal access control | |||
configuration which could be considered sensitive. | configuration which could be considered sensitive. | |||
o enable-nacm | o /nacm/enable-nacm | |||
o read-default | o /nacm/read-default | |||
o write-default | o /nacm/write-default | |||
o exec-default | o /nacm/exec-default | |||
o groups | o /nacm/groups | |||
o rules | o /nacm/rule-list | |||
3.7.2. General Configuration Issues | ||||
There is a risk that invocation of non-standard protocol operations | ||||
will have undocumented side effects. An administrator needs to | ||||
construct access control rules such that the configuration datastore | ||||
is protected from such side effects. | ||||
It is possible for a session with some write access (e.g., allowed to | ||||
invoke <edit-config>), but without any access to a particular | ||||
datastore subtree containing sensitive data, to determine the | ||||
presence or non-presence of that data. This can be done by | ||||
repeatedly issuing some sort of edit request (create, update, or | ||||
delete) and possibly receiving "access-denied" errors in response. | ||||
These "fishing" attacks can identify the presence or non-presence of | ||||
specific sensitive data even without the "error-path" field being | ||||
present within the "rpc-error" response. | ||||
It is possible that the data model definition itself (e.g., YANG | ||||
when-stmt) will help an unauthorized session determine the presence | ||||
or even value of sensitive data nodes by examining the presence and | ||||
values of different data nodes. | ||||
There is a risk that non-standard protocol operations, or even the | ||||
standard <get> protocol operation, may return data which "aliases" or | ||||
"copies" sensitive data from a different data object. There may | ||||
simply be multiple data model definitions which expose or even | ||||
configure the same underlying system instrumentation. | ||||
A data model may contain external keys (e.g., YANG leafref), which | ||||
expose values from a different data structure. An administrator | ||||
needs to be aware of sensitive data models which contain leafref | ||||
nodes. This entails finding all the leafref objects that "point" at | ||||
the sensitive data (i.e., "path-stmt" values that implicitly or | ||||
explicitly include the sensitive data node. | ||||
It is beyond the scope of this document to define access control | ||||
enforcement procedures for underlying device instrumentation that may | ||||
exist to support the NETCONF server operation. An administrator can | ||||
identify each protocol operation that the server provides, and decide | ||||
if it needs any access control applied to it. | ||||
This document incorporates the optional use of a "recovery session" | ||||
mechanism, which can be used to bypass access control enforcement in | ||||
emergencies, such as NACM configuration errors which disable all | ||||
access to the server. The configuration and identification of such a | ||||
recovery session mechanism are implementation-specific and outside | ||||
the scope of this document. An administrator needs to be aware of | ||||
any "recovery session" mechanisms available on the device, and make | ||||
sure they are used appropriately. | ||||
It is possible for a session to disrupt configuration management, | ||||
even without any write access to the configuration, by locking the | ||||
datastore. This may be done to insure all or part of the | ||||
configuration remains stable while it is being retrieved, ot it may | ||||
be done as a "denial-of-service" attack. There is no way for the | ||||
server to know the difference. An administrator may wish to restrict | ||||
"exec" access to the following protocol operations: | ||||
o <lock> | ||||
o <unlock> | ||||
o <partial-lock> | ||||
o <partial-unlock> | ||||
3.7.3. Data Model Design Considerations | ||||
Designers need to clearly identify any sensitive data, notifications, | ||||
or protocol operations defined within a YANG module. For such | ||||
definitions, a "nacm:default-deny-write" or "nacm:default-deny-all" | ||||
statement SHOULD be present, in addition to a clear description of | ||||
the security risks. | ||||
Protocol operations need to be properly documented by the data model | ||||
designer, so it is clear to administrators what data nodes (if any) | ||||
are affected by the protocol operation, and what information (if any) | ||||
is returned in the <rpc-reply> message. | ||||
Data models ought to be designed so that different access levels for | ||||
input parameters to protocol operations is not required. Use of | ||||
generic protocol operations should be avoided, and separate protocol | ||||
operations defined instead, if different access levels are needed. | ||||
4. References | 4. References | |||
4.1. Normative References | 4.1. Normative References | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, March 1997. | Requirement Levels", BCP 14, RFC 2119, March 1997. | |||
[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. | |||
skipping to change at page 41, line 25 | skipping to change at page 41, line 25 | |||
[RFC5277] Chisholm, S. and H. Trevino, "NETCONF Event | [RFC5277] Chisholm, S. and H. Trevino, "NETCONF Event | |||
Notifications", RFC 5277, July 2008. | Notifications", RFC 5277, July 2008. | |||
[RFC6020] Bjorklund, M., "YANG - A Data Modeling Language for the | [RFC6020] Bjorklund, M., "YANG - A Data Modeling Language for the | |||
Network Configuration Protocol (NETCONF)", RFC 6020, | Network Configuration Protocol (NETCONF)", RFC 6020, | |||
October 2010. | October 2010. | |||
[RFC6021] Schoenwaelder, J., "Common YANG Data Types", RFC 6021, | [RFC6021] Schoenwaelder, J., "Common YANG Data Types", RFC 6021, | |||
October 2010. | October 2010. | |||
[I-D.ietf-netconf-4741bis] | [RFC6241] Enns, R., Bjorklund, M., Schoenwaelder, J., and A. | |||
Enns, R., Bjorklund, M., Schoenwaelder, J., and A. | ||||
Bierman, "Network Configuration Protocol (NETCONF)", | Bierman, "Network Configuration Protocol (NETCONF)", | |||
draft-ietf-netconf-4741bis-10 (work in progress), | RFC 6241, June 2011. | |||
March 2011. | ||||
[I-D.ietf-netconf-rfc4742bis] | [RFC6242] Wasserman, M., "Using the NETCONF Protocol over Secure | |||
Wasserman, M. and T. Goddard, "Using the NETCONF | Shell (SSH)", RFC 6242, June 2011. | |||
Configuration Protocol over Secure Shell (SSH)", | ||||
draft-ietf-netconf-rfc4742bis-08 (work in progress), | ||||
March 2011. | ||||
4.2. Informative References | 4.2. Informative References | |||
[RFC2865] Rigney, C., Willens, S., Rubens, A., and W. Simpson, | [RFC2865] Rigney, C., Willens, S., Rubens, A., and W. Simpson, | |||
"Remote Authentication Dial In User Service (RADIUS)", | "Remote Authentication Dial In User Service (RADIUS)", | |||
RFC 2865, June 2000. | RFC 2865, June 2000. | |||
[RFC5607] Nelson, D. and G. Weber, "Remote Authentication Dial-In | [RFC5607] Nelson, D. and G. Weber, "Remote Authentication Dial-In | |||
User Service (RADIUS) Authorization for Network Access | User Service (RADIUS) Authorization for Network Access | |||
Server (NAS) Management", RFC 5607, July 2009. | Server (NAS) Management", RFC 5607, July 2009. | |||
skipping to change at page 42, line 28 | skipping to change at page 42, line 28 | |||
<nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"> | <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"> | |||
<groups> | <groups> | |||
<group> | <group> | |||
<name>admin</name> | <name>admin</name> | |||
<user-name>admin</user-name> | <user-name>admin</user-name> | |||
<user-name>andy</user-name> | <user-name>andy</user-name> | |||
</group> | </group> | |||
<group> | <group> | |||
<name>monitor</name> | <name>limited</name> | |||
<user-name>wilma</user-name> | <user-name>wilma</user-name> | |||
<user-name>bam-bam</user-name> | <user-name>bam-bam</user-name> | |||
</group> | </group> | |||
<group> | <group> | |||
<name>guest</name> | <name>guest</name> | |||
<user-name>guest</user-name> | <user-name>guest</user-name> | |||
<user-name>guest@example.com</user-name> | <user-name>guest@example.com</user-name> | |||
</group> | </group> | |||
</groups> | </groups> | |||
</nacm> | </nacm> | |||
This example shows 3 groups: | This example shows 3 groups: | |||
1. The "admin" group contains 2 users named "admin" and "andy". | 1. The "admin" group contains 2 users named "admin" and "andy". | |||
2. The "monitor" group contains 2 users named "wilma" and "bam-bam". | 2. The "limited" group contains 2 users named "wilma" and "bam-bam". | |||
3. The "guest" group contains 2 users named "guest" and | 3. The "guest" group contains 2 users named "guest" and | |||
"guest@example.com". | "guest@example.com". | |||
A.2. Module Rule Example | A.2. Module Rule Example | |||
Module rules are used to control access to all the content defined in | Module rules are used to control access to all the content defined in | |||
a specific module. A module rule has the <module-name> leaf set, but | a specific module. A module rule has the <module-name> leaf set, but | |||
no case in the "rule-type" choice. | no case in the "rule-type" choice. | |||
<nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"> | <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"> | |||
<rule-list> | <rule-list> | |||
<name>guest</name> | <name>guest-acl</name> | |||
<group>guest</group> | <group>guest</group> | |||
<rule> | <rule> | |||
<name>mod-1</name> | <name>deny-ncm</name> | |||
<module-name>ietf-netconf-monitoring</module-name> | <module-name>ietf-netconf-monitoring</module-name> | |||
<access-operations>*</access-operations> | <access-operations>*</access-operations> | |||
<action>deny</action> | <action>deny</action> | |||
<comment> | <comment> | |||
Do not allow guests any access to the netconf | Do not allow guests any access to the netconf | |||
monitoring information. | monitoring information. | |||
</comment> | </comment> | |||
</rule> | </rule> | |||
</rule-list> | </rule-list> | |||
<rule-list> | <rule-list> | |||
<name>monitor example</name> | <name>limited-acl</name> | |||
<group>monitor</group> | <group>limited</group> | |||
<rule> | <rule> | |||
<name>mod-2</name> | <name>permit-ncm</name> | |||
<module-name>ietf-netconf-monitoring</module-name> | <module-name>ietf-netconf-monitoring</module-name> | |||
<access-operations>read</access-operations> | <access-operations>read</access-operations> | |||
<action>permit</action> | <action>permit</action> | |||
<comment> | <comment> | |||
Allow read access to the netconf | Allow read access to the netconf | |||
monitoring information. | monitoring information. | |||
</comment> | </comment> | |||
</rule> | </rule> | |||
<rule> | <rule> | |||
<name>mod-3</name> | <name>permit-exec</name> | |||
<module-name>*</module-name> | <module-name>*</module-name> | |||
<access-operations>exec</access-operations> | <access-operations>exec</access-operations> | |||
<action>permit</action> | <action>permit</action> | |||
<comment> | <comment> | |||
Allow invocation of the | Allow invocation of the | |||
supported server operations. | supported server operations. | |||
</comment> | </comment> | |||
</rule> | </rule> | |||
</rule-list> | </rule-list> | |||
<rule-list> | <rule-list> | |||
<name>admin example</name> | <name>admin-acl</name> | |||
<group>admin</group> | <group>admin</group> | |||
<rule> | <rule> | |||
<name>mod-4</name> | <name>permit-all</name> | |||
<module-name>*</module-name> | <module-name>*</module-name> | |||
<access-operations>*</access-operations> | <access-operations>*</access-operations> | |||
<action>permit</action> | <action>permit</action> | |||
<comment> | <comment> | |||
Allow the admin group complete access to all | Allow the admin group complete access to all | |||
operations and data. | operations and data. | |||
</comment> | </comment> | |||
</rule> | </rule> | |||
</rule-list> | </rule-list> | |||
</nacm> | </nacm> | |||
This example shows 4 module rules: | This example shows 4 module rules: | |||
mod-1: This rule prevents the guest group from reading any | deny-ncm: This rule prevents the "guest" group from reading any | |||
monitoring information in the ietf-netconf-monitoring YANG module. | monitoring information in the "ietf-netconf-monitoring" YANG | |||
module. | ||||
mod-2: This rule allows the monitor group to read the ietf-netconf- | permit-ncm: This rule allows the "limited" group to read the "ietf- | |||
monitoring YANG module. | netconf-monitoring" YANG module. | |||
mod-3: This rule allows the monitor group to invoke any protocol | permit-exec: This rule allows the "limited" group to invoke any | |||
operation supported by the server. | protocol operation supported by the server. | |||
mod-4: This rule allows the admin group complete access to all | permit-all: This rule allows the "admin" group complete access to | |||
content in the server. No subsequent rule will match for the | all content in the server. No subsequent rule will match for the | |||
admin group, because of this module rule. | "admin" group, because of this module rule. | |||
A.3. RPC Rule Example | A.3. RPC Rule Example | |||
RPC rules are used to control access to a specific protocol | RPC rules are used to control access to a specific protocol | |||
operation. | operation. | |||
<nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"> | <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"> | |||
<rule-list> | <rule-list> | |||
<name>guest</name> | <name>guest-limited-acl</name> | |||
<group>monitor</group> | <group>limited</group> | |||
<group>guest</group> | <group>guest</group> | |||
<rule> | <rule> | |||
<name>rpc-1</name> | <name>deny-kill-session</name> | |||
<module-name>ietf-netconf</module-name> | <module-name>ietf-netconf</module-name> | |||
<rpc-name>kill-session</rpc-name> | <rpc-name>kill-session</rpc-name> | |||
<access-operations>exec</access-operations> | <access-operations>exec</access-operations> | |||
<action>deny</action> | <action>deny</action> | |||
<comment> | <comment> | |||
Do not allow the monitor or guest group | Do not allow the limited or guest group | |||
to kill another session. | to kill another session. | |||
</comment> | </comment> | |||
</rule> | </rule> | |||
<rule> | <rule> | |||
<name>rpc-2</name> | <name>deny-delete-config</name> | |||
<module-name>ietf-netconf</module-name> | <module-name>ietf-netconf</module-name> | |||
<rpc-name>delete-config</rpc-name> | <rpc-name>delete-config</rpc-name> | |||
<access-operations>exec</access-operations> | <access-operations>exec</access-operations> | |||
<action>deny</action> | <action>deny</action> | |||
<comment> | <comment> | |||
Do not allow monitor or guest group | Do not allow limited or guest group | |||
to delete any configurations. | to delete any configurations. | |||
</comment> | </comment> | |||
</rule> | </rule> | |||
</rule-list> | </rule-list> | |||
<rule-list> | <rule-list> | |||
<name>monitor</name> | <name>limited-acl</name> | |||
<group>monitor</group> | <group>limited</group> | |||
<rule> | <rule> | |||
<name>rpc-3</name> | <name>permit-edit-config</name> | |||
<module-name>ietf-netconf</module-name> | <module-name>ietf-netconf</module-name> | |||
<rpc-name>edit-config</rpc-name> | <rpc-name>edit-config</rpc-name> | |||
<access-operations>exec</access-operations> | <access-operations>exec</access-operations> | |||
<action>permit</action> | <action>permit</action> | |||
<comment> | <comment> | |||
Allow the monitor group to edit the configuration. | Allow the limited group to edit the configuration. | |||
</comment> | </comment> | |||
</rule> | </rule> | |||
</rule-list> | </rule-list> | |||
</nacm> | </nacm> | |||
This example shows 3 protocol operation rules: | This example shows 3 protocol operation rules: | |||
rpc-1: This rule prevents the monitor or guest groups from invoking | deny-kill-session: This rule prevents the "limited" or "guest" | |||
the NETCONF <kill-session> protocol operation. | groups from invoking the NETCONF <kill-session> protocol | |||
operation. | ||||
rpc-2: This rule prevents the monitor or guest groups from invoking | deny-delete-config: This rule prevents the "limited" or "guest" | |||
the NETCONF <delete-config> protocol operation. | groups from invoking the NETCONF <delete-config> protocol | |||
operation. | ||||
rpc-3: This rule allows the monitor group to invoke the NETCONF | permit-edit-config: This rule allows the "limited" group to invoke | |||
<edit-config> protocol operation. This rule will have no real | the NETCONF <edit-config> protocol operation. This rule will have | |||
effect unless the "exec-default" leaf is set to "deny". | no real effect unless the "exec-default" leaf is set to "deny". | |||
A.4. Data Rule Example | A.4. Data Rule Example | |||
Data rules are used to control access to specific (config and non- | Data rules are used to control access to specific (config and non- | |||
config) data nodes within the NETCONF content provided by the server. | config) data nodes within the NETCONF content provided by the server. | |||
<nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"> | <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"> | |||
<rule-list> | <rule-list> | |||
<name>guest rules</name> | <name>guest-acl</name> | |||
<group>guest</group> | <group>guest</group> | |||
<rule> | <rule> | |||
<name>data-1</name> | <name>deny-nacm</name> | |||
<path xmlns:n="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"> | <path xmlns:n="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"> | |||
/n:nacm | /n:nacm | |||
</path> | </path> | |||
<access-operations>*</access-operations> | <access-operations>*</access-operations> | |||
<action>deny</action> | <action>deny</action> | |||
<comment> | <comment> | |||
Deny the guest group any access to the /nacm data. | Deny the guest group any access to the /nacm data. | |||
</comment> | </comment> | |||
</rule> | </rule> | |||
</rule-list> | </rule-list> | |||
<rule-list> | <rule-list> | |||
<name>monitor rules</name> | <name>limited-acl</name> | |||
<group>monitor</group> | <group>limited</group> | |||
<rule> | <rule> | |||
<name>data-acme-config</name> | <name>permit-acme-config</name> | |||
<path xmlns:acme="http://example.com/ns/netconf"> | <path xmlns:acme="http://example.com/ns/netconf"> | |||
/acme:acme-netconf/acme:config-parameters | /acme:acme-netconf/acme:config-parameters | |||
</path> | </path> | |||
<access-operations> | <access-operations> | |||
read create update delete | read create update delete | |||
</access-operations> | </access-operations> | |||
<action>permit</action> | <action>permit</action> | |||
<comment> | <comment> | |||
Allow the monitor group complete access to the acme | Allow the limited group complete access to the acme | |||
netconf configuration parameters. Showing long form | netconf configuration parameters. Showing long form | |||
of 'access-operations' instead of shorthand. | of 'access-operations' instead of shorthand. | |||
</comment> | </comment> | |||
</rule> | </rule> | |||
</rule-list> | </rule-list> | |||
<rule-list> | <rule-list> | |||
<name>dummy-itf</name> | <name>guest-limited-acl</name> | |||
<group>guest monitor</group> | <group>guest</group> | |||
<group>limited</group> | ||||
<rule> | <rule> | |||
<name>dummy-itf</name> | <name>permit-dummy-interface</name> | |||
<path xmlns:acme="http://example.com/ns/itf"> | <path xmlns:acme="http://example.com/ns/itf"> | |||
/acme:interfaces/acme:interface[acme:name='dummy'] | /acme:interfaces/acme:interface[acme:name='dummy'] | |||
</path> | </path> | |||
<access-operations>read update</access-operations> | <access-operations>read update</access-operations> | |||
<action>permit</action> | <action>permit</action> | |||
<comment> | <comment> | |||
Allow the monitor and guest groups read | Allow the limited and guest groups read | |||
and update access to the dummy interface. | and update access to the dummy interface. | |||
</comment> | </comment> | |||
</rule> | </rule> | |||
</rule-list> | </rule-list> | |||
<rule-list> | <rule-list> | |||
<name>admin rules</name> | <name>admin-acl</name> | |||
<rule> | <rule> | |||
<name>admin-itf</name> | <name>permit-interface</name> | |||
<path xmlns:acme="http://example.com/ns/itf"> | <path xmlns:acme="http://example.com/ns/itf"> | |||
/acme:interfaces/acme:interface | /acme:interfaces/acme:interface | |||
</path> | </path> | |||
<access-operations>*</access-operations> | <access-operations>*</access-operations> | |||
<action>permit</action> | <action>permit</action> | |||
<comment> | <comment> | |||
Allow admin full access to all acme interfaces. | Allow admin full access to all acme interfaces. | |||
</comment> | </comment> | |||
</rule> | </rule> | |||
</rule-list> | </rule-list> | |||
skipping to change at page 47, line 46 | skipping to change at page 48, line 4 | |||
/acme:interfaces/acme:interface | /acme:interfaces/acme:interface | |||
</path> | </path> | |||
<access-operations>*</access-operations> | <access-operations>*</access-operations> | |||
<action>permit</action> | <action>permit</action> | |||
<comment> | <comment> | |||
Allow admin full access to all acme interfaces. | Allow admin full access to all acme interfaces. | |||
</comment> | </comment> | |||
</rule> | </rule> | |||
</rule-list> | </rule-list> | |||
</nacm> | </nacm> | |||
This example shows 4 data rules: | This example shows 4 data rules: | |||
data-1: This rule denies the guest group any access to the <nacm> | deny-nacm: This rule denies the "guest" group any access to the | |||
subtree. Note that the default namespace is only applicable | <nacm> subtree. Note that the default namespace is only | |||
because this subtree is defined in the same namespace as the | applicable because this subtree is defined in the same namespace | |||
<data-rule> element. | as the <data-rule> element. | |||
data-acme-config: This rule gives the monitor group read-write | permit-acme-config: This rule gives the "limited" group read-write | |||
access to the acme <config-parameters>. | access to the acme <config-parameters>. | |||
dummy-itf: This rule gives the monitor and guest groups read-update | permit-dummy-interface: This rule gives the "limited" and "guest" | |||
access to the acme <interface>. entry named "dummy". This entry | groups read-update access to the acme <interface>. entry named | |||
cannot be created or deleted by these groups, just altered. | "dummy". This entry cannot be created or deleted by these groups, | |||
just altered. | ||||
admin-itf: This rule gives the admin group read-write access to all | permit-interface: This rule gives the "admin" group read-write | |||
acme <interface>. entries. This is an example of an unreachable | access to all acme <interface>. entries. This is an example of an | |||
rule because the "mod-3" rule already gives the admin group full | unreachable rule because the "mod-3" rule already gives the | |||
access to this data. | "admin" group full access to this data. | |||
A.5. Notification Rule Example | A.5. Notification Rule Example | |||
Notification rules are used to control access to a specific | Notification rules are used to control access to a specific | |||
notification event type. | notification event type. | |||
<nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"> | <nacm xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-acm"> | |||
<rule-list> | <rule-list> | |||
<name>sys</name> | <name>sys-acl</name> | |||
<group>monitor</group> | <group>limited</group> | |||
<group>guest</group> | <group>guest</group> | |||
<rule> | <rule> | |||
<name>notif-1</name> | <name>deny-config-change</name> | |||
<module-name>acme-system</module-name> | <module-name>acme-system</module-name> | |||
<notification-name>sys-config-change</notification-name> | <notification-name>sys-config-change</notification-name> | |||
<access-operations>read</access-operations> | <access-operations>read</access-operations> | |||
<action>deny</action> | <action>deny</action> | |||
<comment> | <comment> | |||
Do not allow the guest or monitor groups | Do not allow the guest or limited groups | |||
to receive config change events. | to receive config change events. | |||
</comment> | </comment> | |||
</rule> | </rule> | |||
</rule-list> | </rule-list> | |||
</nacm> | </nacm> | |||
This example shows 1 notification rule: | This example shows 1 notification rule: | |||
notif-1: This rule prevents the monitor or guest groups from | deny-config-change: This rule prevents the "limited" or "guest" | |||
receiving the acme <sys-config-change> event type. | groups from receiving the acme <sys-config-change> event type. | |||
Appendix B. Change Log | Appendix B. Change Log | |||
-- RFC Ed.: remove this section before publication. | -- RFC Ed.: remove this section before publication. | |||
B.1. 03-04 | B.1. 04-05 | |||
Updated Security Considerations section. | ||||
Changed term 'operator' to 'administrator'. | ||||
Used the terms "access operation" and "protocol operation" | ||||
consistently. | ||||
Moved some normative text from section 2 to section 3. Also made it | ||||
more clear that section 2 is not a requirements section, but | ||||
documentation of the objectives for NACM. | ||||
Renamed "nacm:secure" to "nacm:default-deny-write", and "nacm:very- | ||||
secure" to "nacm:default-deny-all". Explained that "nacm:default- | ||||
deny-write" is ignored on rpc statements. | ||||
Described that <kill-session> and <delete-config> behave as if | ||||
specified with "nacm:default-deny-all". | ||||
B.2. 03-04 | ||||
Introduced rule-lists to group related rules together. | Introduced rule-lists to group related rules together. | |||
Moved "module-rule", "rpc-rule", "notification-rule", and "data-rule" | Moved "module-rule", "rpc-rule", "notification-rule", and "data-rule" | |||
into one common "rule", with a choice to select between the four | into one common "rule", with a choice to select between the four | |||
variants. | variants. | |||
Changed "superuser" to "recovery session", and adjusted text | Changed "superuser" to "recovery session", and adjusted text | |||
throughout document for this change. | throughout document for this change. | |||
Clarified behavior of global default NACM parameters, enable-nacm, | Clarified behavior of global default NACM parameters, enable-nacm, | |||
read-default, write-default, exec-default. | read-default, write-default, exec-default. | |||
Clarified when access control is applied during system | Clarified when access control is applied during system | |||
initialization. | initialization. | |||
B.2. 02-03 | B.3. 02-03 | |||
Fixed improper usage of RFC 2119 keywords. | Fixed improper usage of RFC 2119 keywords. | |||
Changed term usage of "database" to "datastore". | Changed term usage of "database" to "datastore". | |||
Clarified that "secure" and "very-secure" extensions only apply if | Clarified that "secure" and "very-secure" extensions only apply if | |||
the /nacm/enable-nacm object is "true". | the /nacm/enable-nacm object is "true". | |||
B.3. 01-02 | B.4. 01-02 | |||
Removed authentication text and objects. | Removed authentication text and objects. | |||
Changed module name from ietf-nacm to ietf-netconf-acm. | Changed module name from ietf-nacm to ietf-netconf-acm. | |||
Updated NETCONF and YANG terminology. | Updated NETCONF and YANG terminology. | |||
Removed open issues section. | Removed open issues section. | |||
Changed some must to MUST in requirements section. | Changed some must to MUST in requirements section. | |||
B.4. 00-01 | B.5. 00-01 | |||
Updated YANG anf YANG Types references. | Updated YANG anf YANG Types references. | |||
Updated module namespace URI to standard format. | Updated module namespace URI to standard format. | |||
Updated module header meta-data to standard format. | Updated module header meta-data to standard format. | |||
Filled in IANA section. | Filled in IANA section. | |||
B.5. 00 | B.6. 00 | |||
Initial version cloned from | Initial version cloned from | |||
draft-bierman-netconf-access-control-02.txt. | draft-bierman-netconf-access-control-02.txt. | |||
Authors' Addresses | Authors' Addresses | |||
Andy Bierman | Andy Bierman | |||
Brocade | Brocade | |||
Email: andy.bierman@brocade.com | Email: andy.bierman@brocade.com | |||
End of changes. 288 change blocks. | ||||
1020 lines changed or deleted | 1043 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/ |