<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc category="std" docName="draft-mahesh-netconf-accounting-00"
     ipr="trust200902">
  <front>
    <title abbrev="NETCONF and RESTCONF Accounting">Accounting in NETCONF and
    RESTCONF</title>

    <author fullname="Mahesh Jethanandani" initials="M" surname="Jethanandani">
      <organization>Cisco Systems, Inc</organization>

      <address>
        <postal>
          <street>170 West Tasman Drive</street>

          <city>San Jose</city>

          <region>CA</region>

          <code>95070</code>

          <country>USA</country>
        </postal>

        <phone/>

        <facsimile/>

        <email>mjethanandani@gmail.com</email>

        <uri/>
      </address>
    </author>

    <date day="10" month="March" year="2017"/>

    <abstract>
      <t>This document defines an accounting record for NETCONF and
      RESTCONF.</t>
    </abstract>

    <note title="Requirements Language">
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
      document are to be interpreted as described in <xref
      target="RFC2119">RFC 2119</xref>.</t>
    </note>
  </front>

  <middle>
    <section title="Introduction">
      <t><xref target="RFC6241">NETCONF</xref> and <xref
      target="RFC8040">RESTCONF</xref> protocol operations are authenticated
      and authorized as part of the Authentication, Authorization and
      Accounting (AAA) framework. An accounting record needs to be created as
      part of the same framework for each of these operations to satisfy the
      accounting part of AAA. Having an accounting record that is consistent
      across vendors allows for the operator to compare operations across
      devices from different vendors. This document defines such a record and
      a corresponding YANG data model (ietf-netconf-am.yang).</t>

      <t>The rest of this document will use NETCONF to imply both NETCONF and
      RESTCONF, but where applicable will call out each protocol
      specifically.</t>

      <section title="Terminology">
        <t>The following terms are defined in <xref
        target="RFC6241">NETCONF</xref> and are not redefined here:</t>

        <t><list style="symbols">
            <t>client</t>

            <t>server</t>

            <t>session</t>

            <t>user</t>
          </list></t>
      </section>
    </section>

    <section title="Accounting Record">
      <t>An accounting record for NETCONF consists of the following
      fields.</t>

      <texttable title="">
        <ttcol>acct-code</ttcol>

        <ttcol>date-time</ttcol>

        <ttcol>src-ip</ttcol>

        <ttcol>session-id</ttcol>

        <ttcol>task-id</ttcol>

        <ttcol>user</ttcol>

        <ttcol>groups</ttcol>

        <ttcol>path</ttcol>

        <ttcol>action</ttcol>

        <ttcol>rule</ttcol>

        <ttcol>status</ttcol>
      </texttable>

      <t>where:</t>

      <t>acct-code: START indicates a start of a new record, NONE a
      continuation, and STOP the end of the record.</t>

      <t>date-time: The date and time when the operation was performed (UTC
      Timezone)</t>

      <t>src-ip: The source IP address that was used to request the
      operation</t>

      <t>session-id: The session-id in case of NETCONF and would be blank in
      case of RESTCONF</t>

      <t>task-id: Used to track a accounting record in case it needs to split
      for uploading or storing. The id is a monotonically increasing number
      assigned by the server.</t>

      <t>user: The NETCONF user that requesed this operation.</t>

      <t>groups: The group the user belongs to.</t>

      <t>path: The path in the NACM rule on which the operations is being
      performed</t>

      <t>action: The action in the NACM rule</t>

      <t>rule: The rule in the NACM that was used to authorize the action.</t>

      <t>status: Whether the operations was permitted or denied.</t>
    </section>

    <section title="Data Model Definitions">
      <t/>

      <section title="Data Organization">
        <t>The following diagram highlights the contents and structure of the
        Accounting YANG module.<figure>
            <artwork><![CDATA[
module: ietf-netconf-am
   +--ro nam
      +--ro accounting-record* [task-id]
         +--ro task-id       uint32
         +--ro session-id?   nc:session-id-type
         +--ro acct-code     enumeration
         +--ro date-time     yang:date-and-time
         +--ro src-ip        inet:ip-address
         +--ro group         nacm:group-name-type
         +--ro user?         nacm:user-name-type
         +--ro path          nacm:node-instance-identifier
         +--ro action        nacm:access-operations-type
         +--ro rule?         string
         +--ro status?       nacm:action-type
   ]]></artwork>
          </figure></t>
      </section>

      <section title="YANG Module">
        <t>The following YANG module specifies the normative NETCONF content
        that MUST be supported by the server.</t>

        <t>The "ietf-netconf-am" YANG module imports typedefs from <xref
        target="RFC6991">YANG-TYPES</xref>, from <xref
        target="RFC6241">NETCONF</xref> and from <xref
        target="RFC6536">NACM</xref>.</t>

        <figure>
          <artwork><![CDATA[<CODE BEGINS> file ietf-netconf-am@2017-03-13.yang

module ietf-netconf-am {
    yang-version 1.1;
    namespace "urn:ietf:params:xml:ns:yang:ietf-netconf-am";
    prefix "nam";

    import ietf-inet-types {
        prefix inet;
        //reference 
        //    "RFC 6991: Common YANG Data Types";
    }
    
    import ietf-yang-types {
        prefix yang;
        //reference
        //    "RFC 6991: Common YANG Data Types";
    }
  
    import ietf-netconf {
        prefix nc;
        //reference
        //    "RFC 6241: NETCONF Protocol";
    }

    import ietf-netconf-acm {
        prefix nacm;
        //reference
        //    "RFC 6536: NACM";
    }

    organization
        "IETF NETCONF (Network Configuration) Working Group";

    contact
        "WG Web:   <http://tools.ietf.org/wg/netconf/>
         WG List:  <mailto:netconf@ietf.org>

         WG Chair: Mehmet Ersue
               	   <mailto:mehmet.ersue@nsn.com>

         WG Chair: Mahesh Jethanandani
                   <mailto:mjethanandani@gmail.com>

         Editor:   Mahesh Jethanandani
                   <mailto:mjethanandani@gmail.com>";


    description
        "This module defines an accounting record for NETCONF operations
         performed on the server. If these operations are authorized 
         using rules defined by NACM [RFC6536], then that information is 
         also captured by this module.

         Copyright (c) 2014 IETF Trust and the persons identified as
         authors of the code. All rights reserved.

         Redistribution and use in source and binary forms, with or
         without modification, is permitted pursuant to, and subject
         to the license terms contained in, the Simplified BSD
         License set forth in Section 4.c of the IETF Trust's
         Legal Provisions Relating to IETF Documents
         (http://trustee.ietf.org/license-info).

         This version of this YANG module is part of RFC XXXX; see
         the RFC itself for full legal notices.";

     revision "2017-03-13" {
         description
             "Initial version";
         reference
             "RFC XXXX: NETCONF and RESTCONF Accounting";
     }

     /*
      * Data definition statements.
      */

     container nam {
         config false;
         description
             "Parameters for NETCONF Accounting Model.";

         list accounting-record {
             key "task-id";
             description
                 "A list of accounting records generated by the server";

             leaf task-id {
                 type uint32;
                 description
                     "The task-id is a monotonically increasing number 
                      assigned by the server to capture a single 
                      transaction.";
             }

             leaf session-id {
                 type nc:session-id-type;
                 description
                     "If this operation happened over NETCONF, this 
                      field captures the NETCONF session-id. In case 
                      of RESTCONF this field can be left blank.";
             }

             leaf acct-code {
                 type enumeration {
                     enum start {
                         description
                             "Start of an accounting record";
                     }
                     enum stop {
                         description
                             "Indicates the end of an accounting 
                              record";
                     }
                     enum none {
                         description
                             "Indicates a single payload or a 
                              continuation of an accounting record.";
                     }
                 }
                 mandatory true;
                 description
                     "Some of the AAA server place a limit on the size 
                      of the payload that can be transmitted at any 
                      particular time. 
                   
                      This field indicates what constitues a complete 
                      accounting record by setting up the boundaries. If 
                      the accounting record fits within the payload 
                      boundary the field should be set to none.";
              }

              leaf date-time {
                  type yang:date-and-time;
                  mandatory true;
                  description
                      "The date and time when the operation was 
                       requested.";
              }

              leaf src-ip {
                  type inet:ip-address;
                  mandatory true;
                  description
                      "The source IP address where the request was made 
                       from.";
              }

              leaf group {
                  type nacm:group-name-type;
                  mandatory true;
                  description
                      "The name of the group that the user who requested 
                       the operation belongs to.";
              }
      
              leaf user {
                  type nacm:user-name-type;
                  description
                      "The user within the group that is requesting this 
                       operation.";
              }
            
              leaf path {
                  type nacm:node-instance-identifier;
                  mandatory true;
                  description
                      "Data Node Instance Identifier associated with the
                       data node that the request is being made on.
 
                       Instance identifiers start with the top-level 
                       data node, and a complete identifier is required 
                       for this value.";
              }
            
              leaf action {
                  type nacm:access-operations-type;
                  mandatory true;
                  description
                      "The type of NETCONF operation being requested.";
              }
            
              leaf rule {
                  type string {
                      length "1..max";
                  }
                  description
                      "The name assigned to the rule that was used to
                       authorize the action, if authorization was 
                       enabled.";
              }
            
              leaf status {
                  type nacm:action-type;
                  description
                      "Action taken by the server when the above 
                       mentioned rule matched, if authorization was 
                       enable.";
              }
         }
     }
}


<CODE ENDS>
          ]]></artwork>
        </figure>

        <t/>
      </section>
    </section>

    <section anchor="IANA" title="IANA Considerations">
      <t>This document makes two requests of IANA.</t>

      <t>The first request is to register one URI in "The IETF XML Registry".
      Following the format in <xref target="RFC3688">The IETF XML
      Registry</xref>, the following needs to be registered.</t>

      <t>URI: urn:ietf:params:xml:ns:yang:ietf-netconf-am</t>

      <t>Registrant Contact: The IESG</t>

      <t>XML: N/A, the requested URI is an XML namespace</t>

      <t>The second request is to register one module in the "YANG Module
      Names" registry. Following the format in <xref
      target="RFC7950">YANG</xref>, the following needs to be registered.</t>

      <t>Name: ietf-netconf-am</t>

      <t>Namespace: urn:ietf:params:xml:ns:yang:ietf-netconf-am</t>

      <t>Prefix: nam</t>

      <t>Reference: RFC XXXX</t>

      <t>Note to RFC Editor - Please replace XXXX with the RFC id assigned to
      this draft.</t>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t>The YANG module defined in this memo is designed to be accessed using
      the NETCONF protocol. The lowest NETCONF layer is the secure transport
      layer and the mandatory-to-implement secure transport is SSH.</t>

      <t>Most of the data nodes defined in this YANG module are readonly, i.e.
      config false, and are therefore not vulnerable in network environments.
      However, they might contain data that might be sensitive and should be
      protected with the right <xref target="RFC6536">NACM</xref> rules.</t>
    </section>

    <section anchor="Acknowledgements" title="Acknowledgements">
      <t/>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <?rfc include="reference.RFC.2119"?>

      <?rfc include='reference.RFC.3688'?>

      <?rfc include='reference.RFC.6241'?>

      <?rfc include='reference.RFC.6536'?>

      <?rfc include='reference.RFC.6991'?>

      <?rfc include='reference.RFC.7950'?>

      <?rfc include='reference.RFC.8040'?>
    </references>
  </back>
</rfc>
