<?xml version='1.0'?>
<!DOCTYPE rfc SYSTEM 'rfc2629.dtd'>
<?rfc toc="yes"?>
<?rfc symrefs="yes"?>
<?rfc compact="no"?>
<?rfc subcompact="no"?>
<?rfc strict="no"?>
<?rfc rfcedstyle="yes"?>
<rfc category="std"
     ipr="trust200902"
     docName="draft-ietf-netconf-reverse-ssh-03"
     updates="4253">
    <front>
        <title>Reverse Secure Shell (Reverse SSH)</title>
        <author initials="K.W." surname="Watsen" fullname="Kent Watsen">
            <organization>Juniper Networks</organization>
            <address>
                <email>kwatsen@juniper.net</email>
            </address>
        </author>
        <date month="February" year="2014"/>
        <area>Operations</area>
        <workgroup>NETCONF Working Group</workgroup>
        <keyword>reverse-ssh</keyword>
        <abstract>
            <t>This memo presents a technique for a NETCONF server to 
            initiate a  SSH connection to a NETCONF client.  This is 
            accomplished by the NETCONF client listening on IANA-assigned
            TCP port YYYY and starting the SSH client protocol immediately
            after accepting a TCP connection on it.  This role-reversal
            is necessary as the NETCONF server must also be the SSH Server,
            in order for the NETCONF client to open the IANA-assigned
            SSH subsystem "netconf".</t>
        </abstract>
    </front>
    <middle>

        <section title="Requirements Terminology">

            <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 RFC 2119 <xref target="RFC2119"/>.</t>

        </section>
        <section title="Introduction">

            <t>This memo presents a technique for a NETCONF 
            <xref target="RFC6241"/> server to initiate a  
            Secure Shell (SSH) <xref target="RFC4251"/> connection to
            a NETCONF client.  This is accomplished by the NETCONF
            client listening on IANA-assigned TCP port YYYY and starting
            the SSH client protocol immediately after accepting a TCP
            connection on it.  This role-reversal is necessary as the
            NETCONF server must also be the SSH Server, in order for
            the NETCONF client to open the IANA-assigned SSH subsystem
            "netconf" <xref target="RFC6242"/>.</t>

            <section title="Applicability Statement">
              <t>The techniques described in this document are
              suitable for network management scenarios such
              as the ones described in section 3. However,
              these techniques MUST only be used for a NETCONF
              server to initiate a connection to a NETCONF
              client, as described in this document.</t>

              <t>The reason for this restriction is that different
              protocols have different security assumptions.
              The NETCONF over SSH specification requires
              NETCONF clients and servers to verify the
              identity of the other party before starting the
              NETCONF protocol. This contrasts with the base
              SSH protocol, which does not require programmatic
              verification of the other party. In such circumstances,
              allowing the SSH server to contact the SSH client
              would open new vulnerabilities. Therefore, any
              use of Reverse SSH for purposes other than NETCONF
              will need a thorough, contextual security analysis.</t>
            </section>

            <section title="Update to RFC 4253">
            <t>This document updates the SSH Transport Layer Protocol
            <xref target="RFC4253"/> only by removing the restriction
            in Section 4 (Connection Setup) of <xref target="RFC4252"/>
            that the SSH Client must initiate the transport connection.
            Security implications related to this change are discussed
            in Security Considerations (<xref target="sec-con"/>).</t>
            </section>

        </section>
        <section title="Benefits to Device Management">

            <t>The SSH protocol is nearly ubiquitous for device management,
            as it is the transport for the command-line applications `ssh`,
            `scp`, and `sftp` and is the required transport for the NETCONF
            protocol <xref target="RFC6241"/>.  However, all these SSH-based
            protocols expect the network element to be the SSH server.</t>
            
            <t>Reverse SSH enables the network element to consistently be 
            the SSH server regardless of which peer initiates the underlying
            TCP connection.  Maintaining the role of SSH Server is both 
            necessary and desirable.  It is necessary because SSH
            channels and subsystems can only be opened on the SSH Server.
            It is desirable because it conveniently leverages infrastructure
            that may be deployed for host-key verification and user
            authentication.</t>

            <t>Reverse SSH is useful for both initial deployment and
            on-going device management and may be used to enable any
            of the following scenarios:
                <list style="symbols">
                  <t>The network element may proactively "call home" after
                  being powered on for the first time to register
                  itself with its management system.</t>
                  <t>The network element may access the network in a way that
                  dynamically assigns it an IP address and it doesn't
                  register its assigned IP addressed to a mapping service.</t>
                  <t>The network element may be configured in "stealth mode"
                  and thus doesn't have any open ports for the management
                  system to connect to.</t>
                  <t>The network element may be deployed behind a firewall
                  that doesn't allow SSH access to the internal network.</t>
                  <t>The network element may be deployed behind a firewall
                  that implements network address translation (NAT)
                  for all internal network IP addresses, thus complicating
                  the ability for a management system to connect to it.</t>
                  <t>The operator may prefer to have network elements initiate
                  management connections believing it is easier to
                  secure one open-port in the data center than to
                  have an open port on each network element in the network.</t>
                </list>
            </t>

            <t>One key benefit of using SSH as the transport protocol is 
            its ability to multiplex an unspecified number of independently
            flow-controlled TCP sessions <xref target="RFC4254"/>.  This
            is valuable as the network element only needs to be configured 
            to initiate a single Reverse SSH connection to the management
            system, regardless the number of TCP-based protocols the 
            management system wishes to support.  For instance, in addition
            to having a SSH channel for NETCONF, the management system may 
            "pin up" channels for Syslog, SNMP, or file-transfers.</t>
        </section>

        <section title="The Reverse SSH Protocol">

            <t>The NETCONF server's perspective (e.g., the network element)
              <list style="symbols">
                <t>The NETCONF server initiates a TCP connection to
                the NETCONF client on the IANA-assigned Reverse SSH
                port YYYY.</t>
                <t>The TCP connection is accepted and a TCP session is
                established.</t>
                <t>Using this TCP connection, the NETCONF server
                immediately starts the SSH Server protocol.  That is,
                the next message sent on the TCP stream is SSH's
                Protocol Version Exchange message (section 4.2, <xref
                target="RFC4253"/>).</t>
                <t>The SSH connection is established.</t>
              </list>
            </t>

            <t>The NETCONF client's perspective (e.g., the management system)
              <list style="symbols">
                <t>The NETCONF client listens for TCP connections
                on the IANA-assigned SSH port YYYY.</t>
                <t>The NETCONF client accepts an incoming TCP
                connection and a TCP session is established.</t>
                <t>Using this TCP connection, the NETCONF client immediately
                starts the SSH Client protocol, starting with sending
                the SSH's Protocol Version Exchange message (section 4.2,
                <xref target="RFC4253"/>).</t>
                <t>The SSH connection is established.</t>
              </list>
            </t>

        </section>
        <section title="SSH Server Identification and Verification">

            <t>When the management system accepts a new incoming
            connection, it needs to authenticate the remote peer.
            Ultimately, this entails identifying the peer
            and verifying its SSH host key.</t>

            <t>Due to Reverse SSH having the network element
            initiate the TCP connection, the first data the management
            system has to identify it with is the source IP address of
            the TCP connection.  But this approach is limited as it
            only works in networks that use known static addresses.</t>

            <t>To support network-elements having dynamically-assigned
            IP addresses or deployed behind gateways that translate
            their IP address (e.g., NAT), the management system MAY
            identify the device using its SSH host key.  For instance,
            a fingerprint of the network element's host key could be
            used as an identifier since the probability of collision
            is acceptably low.  But this solution requires the
            management system to be configured with each device's
            host key each time it changes.</t>

            <t>Yet another option for identifying the network element
            is for its host key to encode its identity, such as
            if it were a certificate.  This option enables the host 
            key to change over time, but brings the next issue of 
            how the mangement element can verify the network element's
            host key is authentic.</t>

            <t>The security of SSH is anchored in the ability for the
            SSH client to verify the SSH server's hostkey.  Typically
            this is done by comparing the host key presented by the
            SSH server with one that was previously configured on the 
            SSH client, looking it up in a local database using the
            identity of the SSH client as the lookup key.  Nothing 
            changes regarding this requirement due to the direction
            reversal of the underlying TCP connection.  To ensure
            security, the management system MUST verify the network
            element's SSH host key each time a SSH session is
            established.</t>

            <t>However, configuring distinct host keys on the 
            management system doesn't scale well, which is an important
            consideration to a network management system.  A more
            scalable strategy is to have the network element's host
            key signed by a common trusted key, such as a certificate
            authority.  Thus, the mangement system only needs to trust
            a single public key, which vouches for the authenticity
            of the various network element public keys.</t>

            <t>Since both the identification and verification issues
            are addressed using certificates, this draft RECOMMENDS
            network elements use a host key that can encode a unique
            (e.g., its serial number) and be signed by a common trust 
            anchor (e.g., a certificate authority).  Examples of 
            suitable public host keys are the X.509v3 keys defined 
            in defined in <xref target="RFC6187"/>.</t>
        </section>


        <section title="Device Configuration">
            <t>Configuring a device to initiate a Reverse SSH connection
            entails it knowing what IP address it should connect to and
            what SSH host-key it should present.  A complete YANG module
            <xref target="RFC6020"/> to configure Reverse SSH is defined
            in <xref target="I.D.kwatsen-netconf-server"/> .  This YANG
            module enables a NETCONF client to generically manage a 
            NETCONF server's Reverse SSH configuration.  Key aspects of
            this YANG module include support for more than one application,
            more than one server per application, and a reconnection
            strategy.</t>
        </section>

        <section anchor="sec-con" title="Security Considerations">

            <t>This RFC deviates from standard SSH protocol usage by
            allowing the SSH server to initiate the TCP connection.
            This conflicts with section 4 of the SSH Transport Layer
            Protocol RFC <xref target="RFC4253"/>, which states
            "The client initiates the connection".  However this
            statement is made without rationalization and it's not
            clear how it impacts the security of the protocol, so
            this section analyzes the security offered by 
            having the client initiate the connection.</t>
           
            <t>First, assuming the SSH server is not using a public
            host key algorithm that certifies its identity, the
            security of the protocol doesn't seem to be sensitive
            to which peer initiates the connection.  That is, it is
            still the case that reliable distribution of host keys
            (or their fingerprints) should occur prior to first connection
            and that verification for subsequent connections happens
            by comparing the host keys in locally cached database.
            It does not seem to matter if the SSH Server's host 
            name is derived from user-input or extracted from the
            TCP layer, potentially via a reverse-DNS lookup.  Once
            the host name-to-key association is stored in a local
            database, no man-in-the-middle attack is possible due
            to the attacker being unable to guess the real SSH
            server's private key (Section 9.3.4 (Man-in-th-middle) of 
            <xref target="RFC4251"/>).</t>
            
            <t>That said, this RFC recommends implementations use
            a public host key algorithm that certifies the SSH
            server's identity.  The identity can be any unique 
            identifier, such as a device's serial number or a
            deployment-specific value.  If this recommendation is
            followed, then no information from the TCP layer would
            be needed to lookup the device in a local database and
            therefore the directionality of the TCP layer is 
            clearly inconsequential.</t>
           
            <t>The SSH protocol negotiates which algorithms it will
            use during key exchange (Section 7.1 (Algorithm Negotiation)
            in <xref target="RFC4253"/>).  The algorithm
            selected is essentially the first compatible algorithm 
            listed by the SSH client that is also listed by the SSH
            server.  For a network management application, there 
            may be a need to advertise a large number of algorithms
            to be compatible with the various devices it manages.
            The SSH client SHOULD order its list of public host key
            algorithms such that all the certifiable public host key
            algorithms are listed first.  Additionally,
            when possible, SSH servers SHOULD only list certifiable
            public host key algorithms.  Note that since the SSH server
            would have to be configured to know which IP address it
            needs to connect to, it is expected that it will also be
            configured to know which host key algorithm to use
            for the particular application, and hence only needs
            to list just that one public host key algorithm.</t>

            <t>This RFC suggests implementations can use a device's
            serial number as a form of identity.  A potential concern
            with using a serial number is that the SSH protocol passes
            the SSH server's host-key in the clear and many times
            serial numbers encode revealing information about the
            device, such as what kind of device it is and when it
            was manufactured.  While there is little security in
            trying to hide this information from an attacker, it
            is understood that some deployments may want to keep 
            this information private.  If this is a concern, 
            deployments MAY consider using instead a hash of the 
            device's serial number or an application-specified 
            unique identifier.</t> 

            <t>An attacker could DoS the application by having it
            perform computationally expensive operations, before
            deducing that the attacker doesn't posses a valid key.
            This is no different than any secured service and all common 
            precautions apply (e.g., blacklisting the source address
            after a set number of unsuccessful login attempts).</t>
        </section>

        <section title="IANA Considerations">

          <t>This document requests that IANA assigns a TCP port number
          in the "Registered Port Numbers" range with the service name
          "reverse-ssh".  This port will be the default port for the 
          Reverse SSH protocol and will be used when the NETCONF server
          needs to initiate a connection to a NETCONF client using SSH.
          Below is the registration template following the rules in 
          <xref target="RFC6335"/>.</t>

          <t>
            <figure align="center">
                <artwork><![CDATA[
Service Name:           reverse-ssh
Transport Protocol(s):  TCP
Assignee:               IESG <iesg@ietf.org>
Contact:                IETF Chair <chair@ietf.org>
Description:            Reverse SSH (call home)
Reference:              RFC XXXX
Port Number:            YYYY
]]></artwork>
            </figure>
          </t>
        </section>

        <section title="Acknowledgements">
            <t>The author would like to thank for following for
            lively discussions on list and in the halls (ordered
            by last name): Andy Bierman, Martin Bjorklund, Mehmet Ersue,
            Wes Hardaker, Stephen Hanna, David Harrington, Jeffrey Hutzelman,
            Mouse, Russ Mundy, Tom Petch, Peter Saint-Andre, Joe Touch,
            Sean Turner, Bert Wijnen.</t>
        </section>

    </middle>
    <back>

        <references title="Normative References">
            <reference anchor="RFC2119">
                <front>
                    <title>
                       Key words for use in RFCs to Indicate Requirement Levels
                    </title>
                    <author initials="S.B." surname="Bradner"
                                            fullname="Scott Bradner">
                        <organization>Harvard University</organization>
                    </author>
                    <date month="March" year="1997" />
                </front>
                <seriesInfo name="BCP" value="14" />
                <seriesInfo name="RFC" value="2119" />
            </reference>
            <reference anchor="RFC4250">
                <front>
                    <title>
                        The Secure Shell (SSH) Protocol Assigned Numbers
                    </title>
                    <author initials="S.L." surname="Lehtinen"
                                            fullname="Sami Lehtinen">
                        <organization>
                          SSH Communications Security Corp
                        </organization>
                    </author>
                    <author initials="C.L." surname="Lonvick"
                            fullname="Chris Lonvick">
                        <organization>
                          Cisco Systems, Inc.
                        </organization>
                    </author>
                    <date month="December" year="2005" />
                </front>
                <seriesInfo name="RFC" value="4250" />
            </reference>
            <reference anchor="RFC4251">
                <front>
                    <title>
                        The Secure Shell (SSH) Protocol Architecture
                    </title>
                    <author initials="T.Y." surname="Ylonen"
                                            fullname="Tatu Ylonen">
                        <organization>
                          SSH Communications Security Corp
                        </organization>
                    </author>
                    <author initials="C.L." surname="Lonvick"
                            fullname="Chris Lonvick">
                        <organization>
                          Cisco Systems, Inc.
                        </organization>
                    </author>
                    <date month="January" year="2006" />
                </front>
                <seriesInfo name="RFC" value="4251" />
            </reference>
            <reference anchor="RFC4252">
                <front>
                    <title>
                        The Secure Shell (SSH) Authentication Protocol
                    </title>
                    <author initials="T.Y." surname="Ylonen"
                                            fullname="Tatu Ylonen">
                        <organization>
                          SSH Communications Security Corp
                        </organization>
                    </author>
                    <author initials="C.L." surname="Lonvick"
                            fullname="Chris Lonvick">
                        <organization>
                          Cisco Systems, Inc.
                        </organization>
                    </author>
                    <date month="January" year="2006" />
                </front>
                <seriesInfo name="RFC" value="4252" />
            </reference>
            <reference anchor="RFC4253">
                <front>
                    <title>
                        The Secure Shell (SSH) Transport Layer Protocol
                    </title>
                    <author initials="T.Y." surname="Ylonen"
                                            fullname="Tatu Ylonen">
                        <organization>
                          SSH Communications Security Corp
                        </organization>
                    </author>
                    <author initials="C.L." surname="Lonvick"
                            fullname="Chris Lonvick">
                        <organization>
                          Cisco Systems, Inc.
                        </organization>
                    </author>
                    <date month="January" year="2006" />
                </front>
                <seriesInfo name="RFC" value="4253" />
            </reference>
            <reference anchor="RFC4254">
                <front>
                    <title>
                        The Secure Shell (SSH) Connection Protocol
                    </title>
                    <author initials="T.Y." surname="Ylonen"
                                            fullname="Tatu Ylonen">
                        <organization>
                          SSH Communications Security Corp
                        </organization>
                    </author>
                    <author initials="C.L." surname="Lonvick"
                            fullname="Chris Lonvick">
                        <organization>
                          Cisco Systems, Inc.
                        </organization>
                    </author>
                    <date month="January" year="2006" />
                </front>
                <seriesInfo name="RFC" value="4254" />
            </reference>
            <reference anchor="RFC6020">
                <front>
                    <title>
                        YANG - A Data Modeling Language for the 
                        Network Configuration Protocol (NETCONF)
                    </title>
                    <author initials="M.B." surname="Bjorklund"
                            fullname="Martin Bjorklund">
                        <organization>Tail-f Systems</organization>
                    </author>
                    <date month="October" year="2010" />
                </front>
                <seriesInfo name="RFC" value="6020" />
            </reference>
<!--
            <reference anchor="RFC6125">
                <front>
                    <title>
                        Representation and Verification of Domain-Based
                        Application Service Identity within Internet 
                        Public Key Infrastructure Using X.509 (PKIX)
                        Certificates in the Context of Transport Layer
                        Security (TLS)
                    </title>
                    <author initials="PSA" surname="Saint-Andre"
                            fullname="Peter Saint-Andre">
                        <organization>Cisco</organization>
                    </author>
                    <author initials="J.H." surname="Hodges"
                            fullname="Jeff Hodges">
                        <organization>PayPal</organization>
                    </author>
                    <date month="March" year="2011" />
                </front>
                <seriesInfo name="RFC" value="6125" />
            </reference>
-->
            <reference anchor="RFC6187">
                <front>
                    <title>
                        X.509v3 Certificates for Secure Shell Authentication
                    </title>
                    <author initials="K.I." surname="Igoe"
                            fullname="Kevin Igoe">
                        <organization>National Security Agency</organization>
                    </author>
                    <author initials="D.S." surname="Stebila"
                            fullname="Douglas Stebila">
                        <organization>
                            Queensland University of Technology
                        </organization>
                    </author>
                    <date month="March" year="2011" />
                </front>
                <seriesInfo name="RFC" value="6187" />
            </reference>
            <reference anchor="RFC6241">
                <front>
                    <title>NETCONF Configuration Protocol</title>
                    <author initials="R.E." surname="Enns"
                            fullname="Rob Enns">
                        <organization>Juniper Networks</organization>
                    </author>
                    <author initials="M.B." surname="Bjorklund"
                            fullname="Martin Bjorklund">
                        <organization>Tail-f Systems</organization>
                    </author>
                    <author initials="J.S." surname="Schoenwaelder"
                            fullname="Juergen Schoenwaelder">
                        <organization>Jacobs University</organization>
                    </author>
                    <author initials="A.B." surname="Bierman"
                            fullname="Andy Bierman">
                        <organization>Brocade</organization>
                    </author>
                    <date month="June" year="2011" />
                </front>
                <seriesInfo name="RFC" value="6241" />
            </reference>
            <reference anchor="RFC6242">
                <front>
                    <title>Using the NETCONF Protocol over Secure Shell (SSH)</title>
                    <author initials="M.W." surname="Wasserman"
                            fullname="Margaret Wasserman">
                        <organization>Painless Security, LLC</organization>
                    </author>
                    <date month="June" year="2011" />
                </front>
                <seriesInfo name="RFC" value="6242"/>
            </reference>
            <reference anchor="RFC6335">
                <front>
                    <title>Internet Assigned Numbers Authority (IANA)
                    Procedures for the Management of the Service Name
                    and Transport Protocol Port Number Registry</title>
                    <author initials="M.C." surname="Cotton"
                            fullname="Michelle Cotton">
                        <organization>Internet Corporation for Assigned Names and Numbers</organization>
                    </author>
                    <author initials="L.E." surname="Eggert"
                            fullname="Lars Eggert">
                        <organization>Nokia Research Center</organization>
                    </author>
                    <author initials="J.T." surname="Touch"
                            fullname="Joe Touch">
                        <organization>USC/ISI</organization>
                    </author>
                    <author initials="M.W." surname="Westerlund"
                            fullname="Magnus Westerlund">
                        <organization>Ericsson</organization>
                    </author>
                    <author initials="S.C." surname="Cheshire"
                            fullname="Stuart Cheshire">
                        <organization>Apple Inc.</organization>
                    </author>
                    <date month="August" year="2011" />
                </front>
                <seriesInfo name="RFC" value="6335" />
            </reference>
        </references>
        <references title="Informative References">
            <reference anchor="I.D.kwatsen-netconf-server">
                <front>
                    <title>A YANG Data Model for NETCONF Server Configuration</title>
                    <author initials="K.W." surname="Watsen"
                            fullname="Kent Watsen">
                        <organization>Juniper Networks</organization>
                    </author>
                    <author initials="J.S." surname="Schoenwaelder"
                            fullname="Juergen Schoenwaelder">
                        <organization>Jacobs University</organization>
                    </author>
                    <date month="June" year="2011" />
                </front>
                <seriesInfo name="RFC" value="6242"/>
            </reference>
        </references>

        <section title="Change Log">
          <section title="02 to 03">
            <t>
            <list>
              <t>Updated Device Configuration section to reference
              <xref target="I.D.kwatsen-netconf-server"/></t>
            </list>
            </t>
          </section>
          <section title="01 to 02">
            <t>
            <list>
              <t>Added Applicability Statement</t>
              <t>Removed references to ZeroConf / ZeroTouch</t>
              <t>Clarified the protocol section</t>
              <t>Added a section for identification and verification</t>
            </list>
            </t>
          </section>
          <section title="00 to 01">
            <t>
            <list>
              <t>Removed the hmac-* family of algorithms</t>
            </list>
            </t>
          </section>
        </section>
    </back>
</rfc>

