| < 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.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||