| rfc8886xml2.original.xml | rfc8886.xml | |||
|---|---|---|---|---|
| <?xml version="1.0" encoding="US-ASCII"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
| <!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
| <!ENTITY rfc2119 PUBLIC "" ".//reference.RFC.2119.xml"> | ||||
| ]> | ||||
| <!-- WK: Set category, IPR, docName --> | ||||
| <rfc category="info" docName="draft-ietf-opsawg-sdi-13" ipr="trust200902"> | ||||
| <?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?> | ||||
| <?rfc toc="yes" ?> | ||||
| <?rfc symrefs="yes" ?> | ||||
| <?rfc sortrefs="yes"?> | ||||
| <?rfc iprnotified="no" ?> | ||||
| <?rfc strict="yes"?> | ||||
| <?rfc compact="yes" ?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" | |||
| docName="draft-ietf-opsawg-sdi-13" number="8886" ipr="trust200902" | ||||
| obsoletes="" updates="" submissionType="IETF" category="info" | ||||
| consensus="true" xml:lang="en" tocInclude="true" symRefs="true" | ||||
| sortRefs="true" version="3"> | ||||
| <front> | <front> | |||
| <!-- WK: Set long title. --> | ||||
| <title abbrev="Secure Device Install">Secure Device Install</title> | <title abbrev="Secure Device Install">Secure Device Install</title> | |||
| <seriesInfo name="RFC" value="8886"/> | ||||
| <author fullname="Warren Kumari" initials="W." surname="Kumari"> | <author fullname="Warren Kumari" initials="W." surname="Kumari"> | |||
| <organization>Google</organization> | <organization>Google</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street>1600 Amphitheatre Parkway</street> | <street>1600 Amphitheatre Parkway</street> | |||
| <city>Mountain View</city> | ||||
| <city>Mountain View, CA</city> | <region>CA</region> | |||
| <code>94043</code> | <code>94043</code> | |||
| <country>United States of America</country> | ||||
| <country>US</country> | ||||
| </postal> | </postal> | |||
| <email>warren@kumari.net</email> | <email>warren@kumari.net</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author fullname="Colin Doyle" initials="C." surname="Doyle"> | <author fullname="Colin Doyle" initials="C." surname="Doyle"> | |||
| <organization>Juniper Networks</organization> | <organization>Juniper Networks</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street>1133 Innovation Way</street> | <street>1133 Innovation Way</street> | |||
| <city>Sunnyvale</city> | ||||
| <city>Sunnyvale, CA</city> | <region>CA</region> | |||
| <code>94089</code> | <code>94089</code> | |||
| <country>United States of America</country> | ||||
| <country>US</country> | ||||
| </postal> | </postal> | |||
| <email>cdoyle@juniper.net</email> | <email>cdoyle@juniper.net</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date month="September" year="2020"/> | ||||
| <date day="24" month="June" year="2020"/> | <keyword>autoboot</keyword> | |||
| <keyword>auto-boot</keyword> | ||||
| <keyword>autoinstall</keyword> | ||||
| <keyword>tftp</keyword> | ||||
| <keyword>install</keyword> | ||||
| <keyword>bunny</keyword> | ||||
| <abstract> | <abstract> | |||
| <t>Deploying a new network device in a location | ||||
| where the operator has no staff of its own often requires that an employee | ||||
| physically travel to the location to perform the initial install and | ||||
| configuration, even in shared facilities with "remote-hands" type | ||||
| support. In many cases, this could be avoided if there were an | ||||
| easy way to transfer the initial configuration to a new device, | ||||
| while still maintaining confidentiality of the configuration.</t> | ||||
| <t>This document extends existing vendor proprietary auto-install | <t>Deploying a new network device in a location where the operator has | |||
| no staff of its own often requires that an employee physically travel to | ||||
| the location to perform the initial install and configuration, even in | ||||
| shared facilities with "remote-hands" (or similar) support. In many | ||||
| cases, this could be avoided if there were an easy way to transfer the | ||||
| initial configuration to a new device while still maintaining | ||||
| confidentiality of the configuration.</t> | ||||
| <t>This document extends existing vendor proprietary auto-install | ||||
| to provide limited confidentiality to initial configuration during | to provide limited confidentiality to initial configuration during | |||
| bootstrapping of the device.</t> | bootstrapping of the device.</t> | |||
| <t>[ Ed note: Text inside square brackets ([]) is additional background | ||||
| information, answers to frequently asked questions, general musings, | ||||
| etc. They will be removed before publication. This document is being | ||||
| collaborated on in Github at: | ||||
| https://github.com/wkumari/draft-wkumari-opsawg-sdi. The most recent | ||||
| version of the document, open issues, etc should all be available here. | ||||
| The authors (gratefully) accept pull requests. ]</t> | ||||
| <t>[ Ed note: This document introduces concepts and serves as the basic | ||||
| for discussion. Because of this, it is conversational, and would need | ||||
| to be firmed up before being published ]</t> | ||||
| </abstract> | </abstract> | |||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section title="Introduction"> | <section numbered="true" toc="default"> | |||
| <name>Introduction</name> | ||||
| <t>In a growing, global network, significant amounts of time and money | <t>In a growing, global network, significant amounts of time and money | |||
| are spent deploying new devices and "forklift" upgrading | are spent deploying new devices and "forklift" upgrading | |||
| existing devices. In many cases, these devices are in shared | existing devices. In many cases, these devices are in shared | |||
| facilities (for example, Internet Exchange Points (IXP) or | facilities (for example, Internet Exchange Points (IXP) or | |||
| "carrier-neutral datacenters"), which have staff on hand that can be | "carrier-neutral data centers"), which have staff on hand that can be | |||
| contracted to perform tasks including physical installs, device | contracted to perform tasks including physical installs, device | |||
| reboots, loading initial configurations, etc. There are also a | reboots, loading initial configurations, etc. There are also a | |||
| number of (often proprietary) protocols to perform initial | number of (often proprietary) protocols to perform initial | |||
| device installs and configurations. For example, many network | device installs and configurations. For example, many network | |||
| devices will attempt to use DHCP <xref target="RFC2131"></xref> or | devices will attempt to use DHCP <xref target="RFC2131" format="default"/> | |||
| DHCPv6 <xref target="RFC8415"></xref> to get | or | |||
| an IP address and configuration server, and then fetch and install | DHCPv6 <xref target="RFC8415" format="default"/> to get | |||
| an IP address and configuration server and then fetch and install | ||||
| a configuration when they are first powered on.</t> | a configuration when they are first powered on.</t> | |||
| <t>The configurations of network devices contain a significant amount of | <t>The configurations of network devices contain a significant amount of | |||
| security-related and proprietary information (for example, RADIUS | security-related and proprietary information (for example, RADIUS | |||
| <xref target="RFC2865"></xref> or TACACS+ <xref target="I-D.ietf-opsawg-ta cacs"/> | <xref target="RFC2865" format="default"/> or TACACS+ <xref target="I-D.iet f-opsawg-tacacs" format="default"/> | |||
| secrets). Exposing these to a third party to load onto a new device (or us ing | secrets). Exposing these to a third party to load onto a new device (or us ing | |||
| an auto-install technique which fetches an unencrypted configuration file | an auto-install technique that fetches an unencrypted configuration file v | |||
| via | ia | |||
| TFTP <xref target="RFC1350"/>) or something similar is an unacceptable | TFTP <xref target="RFC1350" format="default"/>) or something similar is an | |||
| unacceptable | ||||
| security risk for many operators, and so they send employees to remote loc ations to | security risk for many operators, and so they send employees to remote loc ations to | |||
| perform the initial configuration work; this costs time and money.</t> | perform the initial configuration work; this costs time and money.</t> | |||
| <t>There are some workarounds to this, such as asking the vendor to | ||||
| <t>There are some workarounds to this, such as asking the vendor to pre- | preconfigure the device before shipping it; asking the remote support to | |||
| configure the device before shipping it; asking the remote support to | ||||
| install a terminal server; providing a minimal, unsecured | install a terminal server; providing a minimal, unsecured | |||
| configuration and using that to bootstrap to a complete | configuration and using that to bootstrap to a complete | |||
| configuration, etc. However, these are often clumsy and have security | configuration; etc. However, these are often clumsy and have security | |||
| issues. As an example, in the terminal server case, the console port | issues. As an example, in the terminal server case, the console port | |||
| connection could be easily snooped.</t> | connection could be easily snooped.</t> | |||
| <t>An ideal solution in this space would protect both the | ||||
| confidentiality of device configuration in transit and the authenticity | ||||
| (and authorization status) of configuration to be used by the | ||||
| device. The mechanism described in this document only addresses the | ||||
| former and makes no effort to do the latter, with the device accepting | ||||
| any configuration file that comes its way and is encrypted to the | ||||
| device's key (or not encrypted, as the case may be). Other solutions | ||||
| (such as <xref target="RFC8572" format="default">Secure Zero Touch | ||||
| Provisioning (SZTP)</xref>, <xref | ||||
| target="I-D.ietf-anima-bootstrapping-keyinfra" | ||||
| format="default">Bootstrapping Remote Secure Key Infrastructures (BRSKI)</ | ||||
| xref>, and | ||||
| other voucher-based methods) are more fully featured but also require | ||||
| more complicated machinery. | ||||
| <t>An ideal solution in this space would protect both the confidentiality | This document describes something much | |||
| of device configuration in transit and the authenticity (and authorizatio | ||||
| n | ||||
| status) of configuration to be used by the device. The mechanism describe | ||||
| d | ||||
| in this document only addresses the former, and makes no effort to do | ||||
| the latter, with the device accepting any configuration file that comes i | ||||
| ts | ||||
| way and is encrypted to the device's key (or not encrypted, as the case m | ||||
| ay be). | ||||
| Other solutions (such as <xref | ||||
| target="RFC8572">"Secure Zero Touch Provisioning (SZTP)"</xref>, | ||||
| <xref target="I-D.ietf-anima-bootstrapping-keyinfra"/> and other | ||||
| voucher-based methods) are more fully featured, but also require | ||||
| more complicated machinery. This document describes something much | ||||
| simpler, at the cost of only providing limited protection.</t> | simpler, at the cost of only providing limited protection.</t> | |||
| <t>This document layers security onto existing auto-install solutions | <t>This document layers security onto existing auto-install solutions | |||
| (one example of which is <xref target="Cisco_AutoInstall"/>) | (one example of which is <xref target="Cisco_AutoInstall" | |||
| to provide a method to initially configure new devices while maintaining | format="default"/>) to provide a method to initially configure new | |||
| (limited) confidentiality of the initial configuration. It is | devices while maintaining (limited) confidentiality of the initial | |||
| optimized for simplicity, for both the implementor and the operator; | configuration. It is optimized for simplicity, for both the implementor | |||
| it is explicitly not intended to be a | and the operator. It is explicitly not intended to be a fully featured | |||
| fully featured system for managing installed devices, nor | system for managing installed devices nor is it intended to solve all | |||
| is it intended to solve all use cases: rather it is a simple | use cases; rather, it is a simple targeted solution to solve a common | |||
| targeted solution to solve a common operational issue where the | operational issue where the network device has been delivered, fiber has | |||
| network device has been delivered, fibre laid (as appropriate) | been laid (as appropriate), and there is no trusted member of the | |||
| and there is no trusted member of the operator's staff to perform | operator's staff to perform the initial configuration. This solution is | |||
| the initial configuration. This solution is only intended to increase | only intended to increase confidentiality of the information in the | |||
| confidentiality of the information in the configuration file, and | configuration file and does not protect the device itself from loading a | |||
| does not protect the device itself from loading a malicious | malicious configuration.</t> | |||
| configuration.</t> | <t>This document describes a concept and some example ways of implementing | |||
| this concept. As devices have different capabilities and use different | ||||
| <t>This document describes a concept, and some example ways of implementin | ||||
| g | ||||
| this concept. As devices have different capabilities, and use different | ||||
| configuration paradigms, one method will not suit all, and so it is | configuration paradigms, one method will not suit all, and so it is | |||
| expected that vendors will differ in exactly how they implement this.</t> | expected that vendors will differ in exactly how they implement this.</t> | |||
| <t>This solution is specifically designed to be a simple method on top | <t>This solution is specifically designed to be a simple method on top | |||
| of exiting device functionality. If devices do not support this new | of exiting device functionality. If devices do not support this new | |||
| method, they can continue to use the existing functionality. In | method, they can continue to use the existing functionality. In | |||
| addition, operators can choose to use this to protect their | addition, operators can choose to use this to protect their | |||
| configuration information, or can continue to use the existing | configuration information or can continue to use the existing | |||
| functionality.</t> | functionality.</t> | |||
| <t>The issue of securely installing devices is in no way a new issue | ||||
| <t>The issue of securely installing devices is in no way a new issue, | ||||
| nor is it limited to network devices; it occurs when deploying | nor is it limited to network devices; it occurs when deploying | |||
| servers, PCs, IoT devices, and in many other situations. While the | servers, PCs, Internet of Things (IoT) devices, and in many other situatio ns. While the | |||
| solution described in this document is obvious (encrypt the config, | solution described in this document is obvious (encrypt the config, | |||
| then decrypt it with a device key), this document only discusses the | then decrypt it with a device key), this document only discusses the | |||
| use for network devices, such as routers and switches.</t> | use for network devices, such as routers and switches.</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Overview"> | <name>Overview</name> | |||
| <t>Most network devices already include some sort of initial bootstrapping | <t>Most network devices already include some sort of initial | |||
| logic (sometimes called 'autoboot', or 'autoinstall'). This generally work | bootstrapping logic (sometimes called 'autoboot' or 'autoinstall'). This | |||
| s | generally works by having a newly installed, unconfigured device obtain | |||
| by having a newly installed, unconfigured device obtain an IP address for | an IP address for itself and discover the address of a configuration | |||
| itself | server (often called 'next-server', 'siaddr', or 'tftp-server-name') | |||
| and discover the address of a configuration server | using DHCP or DHCPv6 (see <xref target="RFC2131" format="default"/> and | |||
| (often called 'next-server', 'siaddr' or | <xref target="RFC8415" format="default"/>). The device then contacts | |||
| 'tftp-server-name') using DHCP or DHCPv6 (see <xref target="RFC2131"></xre | this configuration server to download its initial configuration, which | |||
| f>, | is often identified using the device's serial number, Media Access | |||
| <xref target="RFC8415"></xref>). The device | Control (MAC) address, or similar. This document extends this | |||
| then contacts this configuration server to download its initial configurat | (vendor-specific) paradigm by allowing the configuration file to be | |||
| ion, | encrypted.</t> | |||
| which is often identified using the device's serial number, MAC address or | ||||
| similar. This document extends this (vendor-specific) paradigm by allowing | ||||
| the configuration file to be encrypted.</t> | ||||
| <t>This document uses the serial number of the device as a unique device | <t>This document uses the serial number of the device as a unique device | |||
| identifier for simplicity; some vendors may not want to implement the | identifier for simplicity; some vendors may not want to implement the | |||
| system using the serial number as the identifier for business reasons (a | system using the serial number as the identifier for business reasons (a | |||
| competitor or similar could enumerate the serial numbers and determine | competitor or similar could enumerate the serial numbers and determine | |||
| how many devices have been manufactured). Implementors are free to | how many devices have been manufactured). Implementors are free to | |||
| choose some other way of generating identifiers (e.g., UUID <xref | choose some other way of generating identifiers (e.g., a Universally | |||
| target="RFC4122"/>), but this will likely make it somewhat harder for | Unique Identifier (UUID) <xref target="RFC4122" format="default"/>), but | |||
| this will likely make it somewhat harder for | ||||
| operators to use (the serial number is usually easy to find on a device).< /t> | operators to use (the serial number is usually easy to find on a device).< /t> | |||
| <section numbered="true" toc="default"> | ||||
| <t>[ Ed note: This example also uses TFTP because that is what many vendor | <name>Example Scenario</name> | |||
| s | <t>Operator_A needs another peering router, and so they | |||
| use in their auto-install feature. It could easily instead be | order another router from Vendor_B to be drop-shipped to | |||
| HTTP, FTP, etc. ]</t> | ||||
| <section title="Example Scenario"> | ||||
| <t>Operator_A needs another peering router, and so they | ||||
| order another router from Vendor_B, to be drop-shipped to | ||||
| the facility. Vendor_B begins assembling the new | the facility. Vendor_B begins assembling the new | |||
| device, and tells Operator_A what the new device's serial number will be | device and tells Operator_A what the new device's serial number will be | |||
| (SN:17894321). When Vendor_B first installs the firmware on the device and | (SN:17894321). When Vendor_B first installs the firmware on the device and | |||
| boots it, the device generates a public-private key pair, and Vendor_B | boots it, the device generates a public-private key pair, and Vendor_B | |||
| publishes the public key on their keyserver (in a public key certificate, for | publishes the public key on its key server (in a public key certificate, f or | |||
| ease of use).</t> | ease of use).</t> | |||
| <t>While the device is being shipped, Operator_A generates the initial | ||||
| <t>While the device is being shipped, Operator_A generates the initial | device configuration and fetches the certificate from Vendor_B key servers | |||
| device configuration and fetches the certificate from Vendor_B keyservers | by | |||
| by | ||||
| providing the serial number of the new device. Operator_A then encrypts th e | providing the serial number of the new device. Operator_A then encrypts th e | |||
| device configuration and puts this encrypted configuration on a (local) TF TP | device configuration and puts this encrypted configuration on a (local) TF TP | |||
| server.</t> | server.</t> | |||
| <t>When the device arrives at the Point of Presence (POP), it gets | ||||
| <t>When the device arrives at the POP, it gets installed in Operator_A's | installed in Operator_A's rack and cabled as instructed. The new | |||
| rack, and cabled as instructed. The new device powers up and discovers | device powers up and discovers that it has not yet been configured. It | |||
| that it has not yet been configured. It enters its autoboot state, and | enters its autoboot state and begins the DHCP process. Operator_A's | |||
| begins the DHCP process. Operator_A's DHCP server provides it with an IP | DHCP server provides it with an IP address and the address of the | |||
| address and the address of the configuration server. The router uses | configuration server. The router uses TFTP to fetch its configuration | |||
| TFTP to fetch its configuration file. Note that all of this is existing | file. Note that all of this is existing functionality. The device | |||
| functionality. The device attempts to load the configuration file. As an | attempts to load the configuration file. As an added step, if the | |||
| added step, if the configuration file cannot be parsed, the device tries | configuration file cannot be parsed, the device tries to use its | |||
| to use its private key to decrypt the file and, assuming it validates, | private key to decrypt the file and, assuming it validates, proceeds | |||
| proceeds to install the new, decrypted, configuration.</t> | to install the new, decrypted configuration.</t> | |||
| <t>Only the "correct" device will have the required private key and be | ||||
| <t>Only the "correct" device will have the required private key and be | able to decrypt and use the configuration file (see | |||
| able to decrypt and use the configuration file (See | ||||
| <xref target="security">Security Considerations</xref>). | <xref target="security">Security Considerations</xref>). | |||
| An attacker would be able to connect to the network and get an IP | An attacker would be able to connect to the network and get an IP | |||
| address. They would also be able to retrieve (encrypted) configuration fil es by | address. They would also be able to retrieve (encrypted) configuration fil es by | |||
| guessing serial numbers (or perhaps the server would allow directory | guessing serial numbers (or perhaps the server would allow directory | |||
| listing), but without the private keys an attacker will not be able to | listing), but without the private keys, an attacker will not be able to | |||
| decrypt the files.</t> | decrypt the files.</t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Vendor Role"> | <name>Vendor Role</name> | |||
| <t>This section describes the vendor's roles and | <t>This section describes the vendor's roles and | |||
| provides an overview of what the device needs to do.</t> | provides an overview of what the device needs to do.</t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Device key generation"> | <name>Device Key Generation</name> | |||
| <t>Each device requires a public-private key pair, and for the | <t>Each device requires a public-private key pair and for the | |||
| public part to be published and retrievable by the operator. The | public part to be published and retrievable by the operator. The | |||
| cryptographic algorithm and key lengths to be used are out of the scope | cryptographic algorithm and key lengths to be used are out of the scope | |||
| of this document. This section illustrates one method, but, as with | of this document. This section illustrates one method, but, as with | |||
| much of this document the exact mechanism may vary by vendor. | much of this document, the exact mechanism may vary by vendor. | |||
| Enrollment over Secure Transport (<xref target="RFC7030"/>) | ||||
| or possibly <xref target="I-D.gutmann-scep"/> are | ||||
| methods which vendors may want to consider.</t> | ||||
| Enrollment over Secure Transport <xref target="RFC7030" | ||||
| format="default"/> and possibly the Simple Certificate Enrollment | ||||
| Protocol <xref target="RFC8894" format="default"/> are | ||||
| methods that vendors may want to consider.</t> | ||||
| <t>During the manufacturing stage, when the device is initially powered | <t>During the manufacturing stage, when the device is initially powered | |||
| on, it will generate a public-private key pair. It will send its unique device | on, it will generate a public-private key pair. It will send its unique device | |||
| identifier and the public key to the vendor's directory server | identifier and the public key to the vendor's directory server | |||
| (<xref target="RFC5280"/>) to be published. The vendor's directory serve | <xref target="RFC5280" format="default"/> to be published. The vendor's | |||
| r | directory server | |||
| should only accept certificates from the manufacturing facility, | should only accept certificates that are from the manufacturing | |||
| and which match vendor defined policies (for example, extended key usage | facility and that match vendor-defined policies (for example, extended | |||
| , | key usage and extensions). | |||
| and extensions) Note that some devices may be constrained, and so may se | ||||
| nd | Note that some devices may be constrained and so may send | |||
| the raw public key and unique device identifier to the certificate | the raw public key and unique device identifier to the certificate | |||
| publication server, while more capable devices may generate and send | publication server, while more capable devices may generate and send | |||
| self-signed certificates. This communication with the directory server | self-signed certificates. | |||
| should be integrity protected, and in a controlled environment.</t> | ||||
| This communication with the directory server should be integrity protected and | ||||
| should occur in a controlled environment.</t> | ||||
| <t>This reference architecture needs a serialization format for the | <t>This reference architecture needs a serialization format for the | |||
| key material. Due to the prevalence of tooling support for it on | key material. Due to the prevalence of tooling support for it on | |||
| network devices, X.509 certificates are a convenient format to | network devices, X.509 certificates are a convenient format to | |||
| exchange public keys. However, most of the meta-data that would | exchange public keys. | |||
| use for revocation and aging will not be used and should be | ||||
| ignored by both the client and server. In such cases the | ||||
| signature on the certificate conveys no value and the consumer | ||||
| of the certificate is expected to pin the end-entity key | ||||
| fingerprint (versus using a PKI and signature chain).</t> | ||||
| </section> | ||||
| <section title="Directory Server"> | However, most of the metadata that would be used for revocation and aging will | |||
| not be used and should be ignored by both the client and server. In such | ||||
| cases, the signature on the certificate conveys no value, and the consumer of | ||||
| the certificate is expected to pin the end-entity key fingerprint (versus | ||||
| using a PKI and signature chain).</t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Directory Server</name> | ||||
| <t>The directory server contains a database of | <t>The directory server contains a database of | |||
| certificates. If newly manufactured devices upload certificates the | certificates. If newly manufactured devices upload certificates, the | |||
| directory server can simply publish these; if the | directory server can simply publish these; if the | |||
| devices provide the raw public keys and unique device identifier, | devices provide the raw public keys and unique device identifier, | |||
| the directory server will need to wrap these in a | the directory server will need to wrap these in a | |||
| certificate.</t> | certificate.</t> | |||
| <t>The customers (e.g., Operator_A) query this server with | <t>The customers (e.g., Operator_A) query this server with | |||
| the serial number (or other provided unique identifier) of a device, | the serial number (or other provided unique identifier) of a device | |||
| and retrieve the associated certificate. It is expected that operators | and retrieve the associated certificate. It is expected that operators | |||
| will receive the unique device identifier (serial number) of devices whe n | will receive the unique device identifier (serial number) of devices whe n | |||
| they purchase them, and will download and store the | they purchase them and will download and store the | |||
| certificate. This means that there is not a hard requirement on the | certificate. This means that there is not a hard requirement on the | |||
| reachability of the directory server.</t> | reachability of the directory server.</t> | |||
| <figure> | ||||
| <figure> | <name>Initial Certificate Generation and Publication</name> | |||
| <artwork><![CDATA[ +------------+ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| +------------+ | ||||
| +------+ | | | +------+ | | | |||
| |Device| | Directory | | |Device| | Directory | | |||
| +------+ | Server | | +------+ | Server | | |||
| +------------+ | +------------+ | |||
| +----------------+ +--------------+ | +----------------+ +--------------+ | |||
| | +---------+ | | | | | +---------+ | | | | |||
| | | Initial | | | | | | | Initial | | | | | |||
| | | boot? | | | | | | | boot? | | | | | |||
| | +----+----+ | | | | | +----+----+ | | | | |||
| | | | | | | | | | | | | |||
| skipping to change at line 316 ¶ | skipping to change at line 284 ¶ | |||
| | |Certificate | | | | | | |Certificate | | | | | |||
| | +------------+ | | | | | +------------+ | | | | |||
| | | | | +-------+ | | | | | | +-------+ | | |||
| | +-------|---|-->|Receive| | | | +-------|---|-->|Receive| | | |||
| | | | +---+---+ | | | | | +---+---+ | | |||
| | | | | | | | | | | | | |||
| | | | +---v---+ | | | | | +---v---+ | | |||
| | | | |Publish| | | | | | |Publish| | | |||
| | | | +-------+ | | | | | +-------+ | | |||
| | | | | | | | | | | |||
| +----------------+ +--------------+]]></artwork> | +----------------+ +--------------+ | |||
| ]]></artwork> | ||||
| <postamble>Initial certificate generation and | </figure> | |||
| publication.</postamble> | ||||
| </figure> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Operator Role"> | <name>Operator Role</name> | |||
| <section title="Administrative "> | <section numbered="true" toc="default"> | |||
| <name>Administrative</name> | ||||
| <t>When purchasing a new device, the accounting department will need | <t>When purchasing a new device, the accounting department will need | |||
| to get the unique device identifier (e.g., serial number) of the new | to get the unique device identifier (e.g., serial number) of the new | |||
| device and communicate it to the operations group.</t> | device and communicate it to the operations group.</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Technical"> | <name>Technical</name> | |||
| <t>The operator will contact the vendor's publication server, and | <t>The operator will contact the vendor's publication server and | |||
| download the certificate (by providing the unique device identifier of | download the certificate (by providing the unique device identifier of | |||
| the device). The operator fetches the certificate using a secure | the device). The operator fetches the certificate using a secure | |||
| transport that authenticates the source of the certificate, | transport that authenticates the source of the certificate, | |||
| such as HTTPS (confidentiality protection can provide some privacy | such as HTTPS (confidentiality protection can provide some privacy | |||
| and metadata-leakage benefit, but is not key to the primary | and metadata-leakage benefit but is not key to the primary | |||
| mechanism of this document). The operator will then encrypt the initial | mechanism of this document). The operator will then encrypt the initial | |||
| configuration (for example, using SMIME <xref target="RFC5751"/>) | configuration (for example, using S/MIME <xref target="RFC8551" format=" | |||
| using the key in the certificate, and place it on their | default"/>) | |||
| using the key in the certificate and place it on their | ||||
| configuration server.</t> | configuration server.</t> | |||
| <t>See Appendix B for examples.</t> | ||||
| <figure> | <t>See <xref target="proof"/> for examples.</t> | |||
| <artwork><![CDATA[ +------------+ | <figure> | |||
| +--------+ | | | <name>Fetching the Certificate, Encrypting the Configuration, and Publishing | |||
| |Operator| | Directory | | the Encrypted Configuration</name> | |||
| +--------+ | Server | | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| +------------+ | ||||
| +--------+ | | | ||||
| |Operator| | Directory | | ||||
| +--------+ | Server | | ||||
| +------------+ | +------------+ | |||
| +----------------+ +----------------+ | +----------------+ +----------------+ | |||
| | +-----------+ | | +-----------+ | | | +-----------+ | | +-----------+ | | |||
| | | Fetch | | | | | | | | | Fetch | | | | | | | |||
| | | Device |<------>|Certificate| | | | | Device |<------>|Certificate| | | |||
| | |Certificate| | | | | | | | |Certificate| | | | | | | |||
| | +-----+-----+ | | +-----------+ | | | +-----+-----+ | | +-----------+ | | |||
| | | | | | | | | | | | | |||
| | +-----v------+ | | | | | +-----v------+ | | | | |||
| | | Encrypt | | | | | | | Encrypt | | | | | |||
| | | Device | | | | | | | Device | | | | | |||
| | | Config | | | | | | | Config | | | | | |||
| | +-----+------+ | | | | | +-----+------+ | | | | |||
| | | | | | | | | | | | | |||
| | +-----v------+ | | | | | +-----v------+ | | | | |||
| | | Publish | | | | | | | Publish | | | | | |||
| | | TFTP | | | | | | | TFTP | | | | | |||
| | | Server | | | | | | | Server | | | | | |||
| | +------------+ | | | | | +------------+ | | | | |||
| | | | | | | | | | | |||
| +----------------+ +----------------+]]></artwork> | +----------------+ +----------------+ | |||
| ]]></artwork> | ||||
| <postamble>Fetching the certificate, encrypting the configuration, | </figure> | |||
| publishing the encrypted configuration.</postamble> | ||||
| </figure> | ||||
| </section> | </section> | |||
| <section anchor="initial_cust_boot" numbered="true" toc="default"> | ||||
| <section anchor="initial_cust_boot" title="Example Initial Customer Boot"> | <name>Example Initial Customer Boot</name> | |||
| <t>When the device is first booted by the customer (and on subsequent | <t>When the device is first booted by the customer (and on subsequent | |||
| boots), if the device does not have a valid configuration, it will use | boots), if the device does not have a valid configuration, it will use | |||
| existing auto-install functionality. As an example, it performs DHCP | existing auto-install functionality. As an example, it performs DHCP | |||
| Discovery until it gets a DHCP offer including DHCP option 66 | Discovery until it gets a DHCP offer including DHCP option 66 | |||
| (Server-Name) or 150 (TFTP server address), contacts the server | (Server-Name) or 150 (TFTP server address), contacts the server | |||
| listed in these DHCP options and downloads its configuration file. Note that this | listed in these DHCP options, and downloads its configuration file. Note that this | |||
| is existing functionality (for example, Cisco devices fetch the config | is existing functionality (for example, Cisco devices fetch the config | |||
| file named by the Bootfile-Name DHCP option (67)).</t> | file named by the Bootfile-Name DHCP option (67)).</t> | |||
| <t>After retrieving the configuration file, the device needs to determin e if it is | <t>After retrieving the configuration file, the device needs to determin e if it is | |||
| encrypted or not. If it is not encrypted, the existing behavior is used. | encrypted or not. If it is not encrypted, the existing behavior is used. | |||
| If the configuration is encrypted, the process continues as described in this | If the configuration is encrypted, the process continues as described in this | |||
| document. If the device has been configured to only support encrypted co nfiguration | document. If the device has been configured to only support encrypted co nfiguration | |||
| and determines that the configuration file is not encrypted, it should a bort. | and determines that the configuration file is not encrypted, it should a bort. | |||
| The method used to determine if the configuration is encrypted or not is | The method used to determine if the configuration is encrypted or not is | |||
| implementation dependent; there are a number of (obvious) options, inclu ding | implementation dependent; there are a number of (obvious) options, inclu ding | |||
| having a magic string in the file header, using a file name extension | having a magic string in the file header, using a file name extension | |||
| (e.g., config.enc), or using specific DHCP options.</t> | (e.g., config.enc), or using specific DHCP options.</t> | |||
| <t>If the file is encrypted, the device will attempt to | <t>If the file is encrypted, the device will attempt to | |||
| decrypt and parse the file. If able, it will install the configuration, | decrypt and parse the file. If able, it will install the configuration a | |||
| and | nd | |||
| start using it. If it cannot decrypt the file, or if parsing the configu | start using it. If it cannot decrypt the file or if parsing the configur | |||
| ration fails, | ation fails, | |||
| the device will either abort the auto-install process, or repeat this | the device will either abort the auto-install process or repeat this | |||
| process until it succeeds. When retrying, care should be taken to not | process until it succeeds. When retrying, care should be taken to not | |||
| overwhelm the server hosting the encrypted configuration files. It is su ggested | overwhelm the server hosting the encrypted configuration files. It is su ggested | |||
| that the device retry every 5 minutes for the first hour, and then every hour after | that the device retry every 5 minutes for the first hour and then every hour after | |||
| that. As it is expected that devices may be installed well before the | that. As it is expected that devices may be installed well before the | |||
| configuration file is ready, a maximum number of retries is not specifie d.</t> | configuration file is ready, a maximum number of retries is not specifie d.</t> | |||
| <t>Note that the device only needs to be able to download the | <t>Note that the device only needs to be able to download the | |||
| configuration file; after the initial power-on in the factory it never n | configuration file; after the initial power on in the factory, it never | |||
| eeds | needs | |||
| to access the Internet or vendor or directory server. The device | to access the Internet, vendor, or directory server. The device | |||
| (and only the device) has the private key and so has the ability to decr ypt | (and only the device) has the private key and so has the ability to decr ypt | |||
| the configuration file.</t> | the configuration file.</t> | |||
| <figure> | ||||
| <figure> | <name>Device Boot, Fetch, and Install Configuration File</name> | |||
| <artwork><![CDATA[ +--------+ +--------------+ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
| +--------+ +--------------+ | ||||
| | Device | |Config server | | | Device | |Config server | | |||
| +--------+ | (e.g. TFTP) | | +--------+ |(e.g., TFTP) | | |||
| +--------------+ | +--------------+ | |||
| +---------------------------+ +------------------+ | +---------------------------+ +------------------+ | |||
| | +-----------+ | | | | | +-----------+ | | | | |||
| | | | | | | | | | | | | | | |||
| | | DHCP | | | | | | | DHCP | | | | | |||
| | | | | | | | | | | | | | | |||
| | +-----+-----+ | | | | | +-----+-----+ | | | | |||
| | | | | | | | | | | | | |||
| | +-----v------+ | | +-----------+ | | | +-----v------+ | | +-----------+ | | |||
| | | | | | | Encrypted | | | | | | | | | Encrypted | | | |||
| skipping to change at line 458 ¶ | skipping to change at line 424 ¶ | |||
| | \ / | Boot | | | | | | \ / | Boot | | | | | |||
| | \ / +--------+ | | | | | \ / +--------+ | | | | |||
| | V | | | | | V | | | | |||
| | |N | | | | | |N | | | | |||
| | | | | | | | | | | | | |||
| | +----v---+ | | | | | +----v---+ | | | | |||
| | |Retry or| | | | | | |Retry or| | | | | |||
| | | abort | | | | | | | abort | | | | | |||
| | +--------+ | | | | | +--------+ | | | | |||
| | | | | | | | | | | |||
| +---------------------------+ +------------------+]]></artwork> | +---------------------------+ +------------------+ | |||
| ]]></artwork> | ||||
| <postamble>Device boot, fetch and install configuration file</postambl | </figure> | |||
| e> | ||||
| </figure> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Additional Considerations"> | <name>Additional Considerations</name> | |||
| <section title="Key storage"> | <section numbered="true" toc="default"> | |||
| <name>Key Storage</name> | ||||
| <t>Ideally, the key pair would be stored in a Trusted Platform Module | <t>Ideally, the key pair would be stored in a Trusted Platform Module | |||
| (TPM) on something which is identified as the “router” | (TPM) on something that is identified as the "router" | |||
| - for example, the chassis / backplane. This is so that a key pair | -- for example, the chassis/backplane. This is so that a key pair | |||
| is bound to what humans think of as the “device”, and | is bound to what humans think of as the "device" and | |||
| not, for example (redundant) routing engines. Devices which | not, for example, (redundant) routing engines. Devices that | |||
| implement IEEE 802.1AR <xref target="IEEE802-1AR"/> | implement IEEE 802.1AR <xref target="IEEE802-1AR" format="default"/> | |||
| could choose to use the IDevID for this | could choose to use the Initial Device Identifier (IDevID) for this | |||
| purpose.</t> | purpose.</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Key replacement "> | <name>Key Replacement</name> | |||
| <t>It is anticipated that some operator may want to replace the | <t>It is anticipated that some operator may want to replace the | |||
| (vendor provided) keys after installing the device. There are two | (vendor-provided) keys after installing the device. There are two | |||
| options when implementing this: a vendor could allow the operator's | options when implementing this: a vendor could allow the operator's | |||
| key to completely replace the initial device-generated key (which | key to completely replace the initial device-generated key (which | |||
| means that, if the device is ever sold, the new owner couldn't use | means that, if the device is ever sold, the new owner couldn't use | |||
| this technique to install the device), or the device could prefer the | this technique to install the device), or the device could prefer the | |||
| operator's installed key. This is an implementation decision left to | operator's installed key. This is an implementation decision left to | |||
| the vendor.</t> | the vendor.</t> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Device reinstall"> | <name>Device Reinstall</name> | |||
| <t>Increasingly, operations is moving towards an automated model of | <t>Increasingly, operations are moving towards an automated model of | |||
| device management, whereby portions of (or the entire) configuration is | device management, whereby portions of the configuration (or the entire | |||
| configuration) are | ||||
| programmatically generated. This means that operators may want to | programmatically generated. This means that operators may want to | |||
| generate an entire configuration after the device has been initially | generate an entire configuration after the device has been initially | |||
| installed and ask the device to load and use this new configuration. | installed and ask the device to load and use this new configuration. | |||
| It is expected (but not defined in this document, as it is vendor | It is expected (but not defined in this document, as it is vendor | |||
| specific) that vendors will allow the operator to copy a new, | specific) that vendors will allow the operator to copy a new, | |||
| encrypted configuration (or part of a configuration) onto a device and t | encrypted configuration (or part of a configuration) onto a device and | |||
| hen request | then request that the device decrypt and install it (e.g., 'load | |||
| that the device decrypt and install it (e.g.: ‘load replace | replace <filename> encrypted'). The operator could also choose to | |||
| <filename> encrypted). The operator could also choose to reset | reset the device to factory defaults and allow the device to act as | |||
| the device to factory defaults, and allow the device to act as though | though it were the initial boot (see <xref target="initial_cust_boot" | |||
| it were the initial boot (see <xref target="initial_cust_boot"/>).</t> | format="default"/>).</t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="IANA Considerations"> | <name>IANA Considerations</name> | |||
| <t>This document makes no requests of the IANA.</t> | <t>This document has no IANA actions.</t> | |||
| </section> | </section> | |||
| <section anchor="security" numbered="true" toc="default"> | ||||
| <section anchor="security" title="Security Considerations"> | <name>Security Considerations</name> | |||
| <t>This reference architecture is intended to incrementally improve | <t>This reference architecture is intended to incrementally improve | |||
| upon commonly accepted "auto-install" practices used today that may | upon commonly accepted "auto-install" practices used today that may | |||
| transmit configurations unencrypted (e.g., unencrypted configuration files | transmit configurations unencrypted (e.g., unencrypted configuration files | |||
| which can be downloaded connecting to unprotected ports in datacenters, | that can be downloaded connecting to unprotected ports in data centers, | |||
| mailing initial configuration files on flash drives, or emailing configura tion files | mailing initial configuration files on flash drives, or emailing configura tion files | |||
| and asking a third-party to copy and paste them over a serial terminal) | and asking a third party to copy and paste them over a serial terminal) | |||
| or allow unrestricted access to these configurations.</t> | or allow unrestricted access to these configurations.</t> | |||
| <t>> This document describes an object level security design to provide | <t>This document describes an object-level security design to provide | |||
| confidentiality assurances for the configuration stored at rest on the | confidentiality assurances for the configuration stored at rest on the | |||
| configuration server; and for configuration while it is in transit between | configuration server and for configuration while it is in transit | |||
| the configuration server and the unprovisioned device even if the underly | between the configuration server and the unprovisioned device, even if | |||
| transport does not provide this security service.</t> | the underlying transport does not provide this security service.</t> | |||
| <t>The architecture provides no assurances about the source of | <t>The architecture provides no assurances about the source of | |||
| the encrypted configuration or protect against theft and | the encrypted configuration or protect against theft and | |||
| reuse of devices.</t> | reuse of devices.</t> | |||
| <t>An attacker (e.g., a malicious data center employee, person in the | ||||
| <t>An attacker (e.g., a malicious datacenter employee, person in the | ||||
| supply chain, etc.) who has physical | supply chain, etc.) who has physical | |||
| access to the device before it is connected to the network, or who | access to the device before it is connected to the network or who | |||
| manages to exploit it once installed, | manages to exploit it once installed | |||
| may be able to extract the device private key (especially if it is not | may be able to extract the device private key (especially if it is not | |||
| stored in a TPM), pretend to be the device when connecting to the | stored in a TPM), pretend to be the device when connecting to the | |||
| network, and download and extract the (encrypted) configuration file.</t> | network, and download and extract the (encrypted) configuration file.</t> | |||
| <t>An attacker with access to the configuration server (or the | <t>An attacker with access to the configuration server (or the | |||
| ability to route traffic to configuration server under their control) | ability to route traffic to configuration server under their control) | |||
| and the device's public key could return a configuration of the | and the device's public key could return a configuration of the | |||
| attacker's choosing to the unprovisioned device.</t> | attacker's choosing to the unprovisioned device.</t> | |||
| <t>This mechanism does not protect against a malicious vendor. While | <t>This mechanism does not protect against a malicious vendor. While | |||
| the key pair should be generated on the device, and the private key | the key pair should be generated on the device and the private key | |||
| should be securely stored, the mechanism cannot detect or protect | should be securely stored, the mechanism cannot detect or protect | |||
| against a vendor who claims to do this, but instead generates the | against a vendor who claims to do this but instead generates the | |||
| key pair off device and keeps a copy of the private key. It is largely | key pair off device and keeps a copy of the private key. It is largely | |||
| understood in the operator community that a malicious vendor or attacker | understood in the operator community that a malicious vendor or attacker | |||
| with physical access to the device is largely a "Game Over" | with physical access to the device is largely a "Game Over" | |||
| situation.</t> | situation.</t> | |||
| <t>Even when using a secure bootstrap mechanism, security-conscious | <t>Even when using a secure bootstrap mechanism, security-conscious | |||
| operators may wish to bootstrap devices with a minimal or less-sensitive | operators may wish to bootstrap devices with a minimal or less-sensitive | |||
| configuration, and then replace this with a more complete one after | configuration and then replace this with a more complete one after | |||
| install.</t> | install.</t> | |||
| </section> | </section> | |||
| <section title="Acknowledgments"> | ||||
| <t>The authors wish to thank everyone who contributed, including Benoit | ||||
| Claise, Francis Dupont, Mirja Kuehlewind, Sam Ribeiro, Michael Richardson, | ||||
| Sean Turner and Kent Watsen. Joe Clarke also provided significant | ||||
| comments and review, and Tom Petch provided significant editorial | ||||
| contributions to better describe the use cases, and clarify the scope.</t> | ||||
| <t>Roman Danyliw and Benjamin Kaduk also provided helpful text, | ||||
| especially around the certificate usage and security considerations.</t> | ||||
| </section> | ||||
| </middle> | </middle> | |||
| <back> | <back> | |||
| <references title="Informative References"> | ||||
| <?rfc include='reference.RFC.8572'?> | ||||
| <?rfc include='reference.RFC.4122'?> | <displayreference target="I-D.ietf-anima-bootstrapping-keyinfra" to="BRSKI"/> | |||
| <?rfc include='reference.RFC.2131'?> | ||||
| <?rfc include='reference.RFC.8415'?> | ||||
| <?rfc include='reference.RFC.2865'?> | ||||
| <?rfc include='reference.RFC.1350'?> | ||||
| <?rfc include='reference.RFC.5751'?> | ||||
| <?rfc include='reference.RFC.7030'?> | ||||
| <?rfc include='reference.RFC.5280'?> | ||||
| <?rfc include="reference.I-D.ietf-opsawg-tacacs.xml"?> | ||||
| <?rfc include="reference.I-D.ietf-anima-bootstrapping-keyinfra.xml"?> | ||||
| <?rfc include="reference.I-D.gutmann-scep.xml"?> | ||||
| <reference anchor="IEEE802-1AR" | ||||
| target="https://standards.ieee.org/standard/802_1AR-2018.html"> | ||||
| <front> | ||||
| <title>IEEE Standard for Local and Metropolitan Area Net | ||||
| works - Secure Device Identity</title> | ||||
| <author> | ||||
| <organization>IEEE</organization> | ||||
| </author> | ||||
| <date month="June" year="2018"/> | ||||
| </front> | ||||
| <format type="TXT" target="https://standards.ieee.org/standard/8 | ||||
| 02_1AR-2018.html"/> | ||||
| </reference> | ||||
| <reference anchor="Cisco_AutoInstall" | ||||
| target="https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/fundam | ||||
| entals/configuration/15mt/fundamentals-15-mt-book/cf-autoinstall.html"> | ||||
| <front> | ||||
| <title>Using AutoInstall to Remotely Configure Cisco Net | ||||
| working Devices</title> | ||||
| <author> | ||||
| <organization>Cisco Systems, Inc.</organization> | ||||
| </author> | ||||
| <date month="Jan" year="2018"/> | ||||
| </front> | ||||
| <format type="TXT" target="https://standards.ieee.org/standard/8 | ||||
| 02_1AR-2018.html"/> | ||||
| </reference> | ||||
| </references> | ||||
| <section title="Changes / Author Notes."> | ||||
| <t>[RFC Editor: Please remove this section before publication ]</t> | ||||
| <t>From -09 to -10</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Typos - "lenghts" => "lengths", missed a reference to Acme.</t> | ||||
| </list></t> | ||||
| <t>From -08 to -09</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Addressed Mirja's IETF LC comments.</t> | ||||
| </list></t> | ||||
| <t>From -04 to -08</t> | ||||
| <t><list style="symbols"> | ||||
| <t>Please see GitHub commit log (I forgot to put them in here :-P )</t | ||||
| > | ||||
| </list></t> | ||||
| <t>From -03 to -04</t> | <displayreference target="I-D.ietf-opsawg-tacacs" to="TACACS"/> | |||
| <t><list style="symbols"> | ||||
| <t>Addressed Joe's WGLC comments. This involved changing the "just try | ||||
| decrypt and pray" to vendor specific, like a file extension, magic header sting | ||||
| , etc.</t> | ||||
| <t>Addressed tom's comments.</t> | ||||
| </list></t> | ||||
| <t>From individual WG-01 to -03:</t> | <references> | |||
| <t><list style="symbols"> | <name>Informative References</name> | |||
| <t>Addressed Joe Clarke's comments - https://mailarchive.ietf.org/arch | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | |||
| /msg/opsawg/JTzsdVXw-XtWXZIIFhH7aW_-0YY</t> | ce.RFC.8572.xml"/> | |||
| <t>Many typos / nits</t> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | |||
| <t>Broke Overview and Example Scenario into 2 sections.</t> | ce.RFC.4122.xml"/> | |||
| <t>Reordered text for above.</t> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | |||
| </list></t> | ce.RFC.2131.xml"/> | |||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | ||||
| ce.RFC.8415.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | ||||
| ce.RFC.2865.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | ||||
| ce.RFC.1350.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | ||||
| ce.RFC.8551.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | ||||
| ce.RFC.7030.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | ||||
| ce.RFC.5280.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | ||||
| ce.RFC.8894.xml"/> | ||||
| <t>From individual -04 to WG-01:</t> | <reference anchor='I-D.ietf-opsawg-tacacs'> | |||
| <front> | ||||
| <title>The TACACS+ Protocol</title> | ||||
| <t><list style="symbols"> | <author initials='T' surname='Dahm' fullname='Thorsten Dahm'> | |||
| <t>Renamed from draft-wkumari-opsawg-sdi-04 -> | <organization /> | |||
| draft-ietf-opsawg-sdi-00</t> | </author> | |||
| </list></t> | ||||
| <t>From -00 to -01</t> | <author initials='A' surname='Ota' fullname='Andrej Ota'> | |||
| <organization /> | ||||
| </author> | ||||
| <t><list style="symbols"> | <author initials='D.' surname='Medway Gash' fullname='Douglas C. Medway Gash'> | |||
| <t>Nothing changed in the template!</t> | <organization /> | |||
| </list>From -01 to -03:<list style="symbols"> | </author> | |||
| <t>See github commit log (AKA, we forgot to update this!)</t> | ||||
| <t>Added Colin Doyle.</t> | <author initials='D' surname='Carrel' fullname='David Carrel'> | |||
| </list></t> | <organization /> | |||
| </author> | ||||
| <t>From -03 to -04:</t> | <author initials='L' surname='Grant' fullname='Lol Grant'> | |||
| <organization /> | ||||
| </author> | ||||
| <t>Addressed a number of comments received before / at IETF104 (Prague). | <date month='March' day='20' year='2020' /> | |||
| These include:<list style="symbols"> | ||||
| <t>Pointer to | ||||
| https://datatracker.ietf.org/doc/draft-ietf-netconf-zerotouch -- | ||||
| included reference to (now) RFC8572 (KW)</t> | ||||
| <t>Suggested that 802.1AR IDevID (or similar) could be used. Stress | </front> | |||
| that this is designed for simplicity (MR)</t> | <seriesInfo name='Internet-Draft' value='draft-ietf-opsawg-tacacs-18' /> | |||
| <t>Added text to explain that any unique device identifier can be | </reference> | |||
| used, not just serial number - serial number is simple and easy, but | ||||
| anything which is unique (and can be communicated to the customer) | ||||
| will work (BF).</t> | ||||
| <t>Lots of clarifications from Joe Clarke.</t> | <xi:include | |||
| href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-a | ||||
| nima-bootstrapping-keyinfra.xml"/> | ||||
| <t>Make it clear it should first try use the config, and if it | <reference anchor="IEEE802-1AR" target="https://standards.ieee.org/standar | |||
| doesn't work, then try decrypt and use it.</t> | d/802_1AR-2018.html"> | |||
| <front> | ||||
| <title>IEEE Standard for Local and Metropolitan Area Networks - Secure | ||||
| Device Identity</title> | ||||
| <author> | ||||
| <organization>IEEE</organization> | ||||
| </author> | ||||
| <date month="June" year="2018"/> | ||||
| </front> | ||||
| <seriesInfo name="IEEE Std" value="802-1AR"/> | ||||
| </reference> | ||||
| <t>The CA part was confusing people - the certificate is simply a | <reference anchor="Cisco_AutoInstall" target="https://www.cisco.com/c/en/u | |||
| wrapper for the key, and the Subject just an index, and so removed | s/td/docs/ios-xml/ios/fundamentals/configuration/15mt/fundamentals-15-mt-book/cf | |||
| that.</t> | -autoinstall.html"> | |||
| <front> | ||||
| <title>Using AutoInstall to Remotely Configure Cisco Networking Device | ||||
| s</title> | ||||
| <author> | ||||
| <organization>Cisco Systems, Inc.</organization> | ||||
| </author> | ||||
| <date month="January" year="2018"/> | ||||
| </front> | ||||
| <refcontent>Configuration Fundamentals Configuration Guide, Cisco IOS | ||||
| Release 15M&T</refcontent> | ||||
| </reference> | ||||
| </references> | ||||
| <t>Added a bunch of ASCII diagrams</t> | <section anchor="proof" numbered="true" toc="default"> | |||
| </list></t> | <name>Proof of Concept</name> | |||
| </section> | ||||
| <section title="Proof of Concept"> | ||||
| <t>This section contains a proof of concept of the system. | <t>This section contains a proof of concept of the system. | |||
| It is only intended for illustration, and is not intended to be used | It is only intended for illustration and is not intended to be used | |||
| in production.</t> | in production.</t> | |||
| <t>It uses OpenSSL from the command line. In production, something more | ||||
| <t>It uses OpenSSL from the command line. In production something more | ||||
| automated would be used. In this example, the unique device identifier is the | automated would be used. In this example, the unique device identifier is the | |||
| serial number of the router, SN19842256.</t> | serial number of the router, SN19842256.</t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Step 1: Generating the certificate. "> | <name>Step 1: Generating the Certificate</name> | |||
| <t>This step is performed by the router. It generates a key, then a | <t>This step is performed by the router. It generates a key, then a | |||
| Certificate Signing Request (CSR), and then a self signed certificate.</ | Certificate Signing Request (CSR), and then a self-signed certificate.</ | |||
| t> | t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Step 1.1: Generate the private key. "> | <name>Step 1.1: Generate the Private Key</name> | |||
| <figure> | <sourcecode name="" type=""><![CDATA[ | |||
| <artwork><![CDATA[ | $ openssl ecparam -out privatekey.key -name prime256v1 -genkey | |||
| $ openssl ecparam -out privatekey.key -name prime256v1 -genkey | $ | |||
| $ | ]]></sourcecode> | |||
| ]]></artwork> | ||||
| </figure> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Step 1.2: Generate the certificate signing request."> | <name>Step 1.2: Generate the Certificate Signing Request</name> | |||
| <figure> | <sourcecode name="" type=""><![CDATA[ | |||
| <artwork><![CDATA[$ openssl req -new -key key.pem -out SN19842256.cs | $ openssl req -new -key key.pem -out SN19842256.csr | |||
| r | Common Name (e.g., server FQDN or YOUR name) []:SN19842256 | |||
| Common Name (e.g. server FQDN or YOUR name) []:SN19842256 | ]]></sourcecode> | |||
| ]]></artwork> | ||||
| </figure> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Step 1.3: Generate the (self signed) certificate itself. | <name>Step 1.3: Generate the (Self-Signed) Certificate Itself</name> | |||
| "> | <sourcecode name="" type=""><![CDATA[ | |||
| <t>$ openssl req -x509 -days 36500 -key key.pem -in SN19842256.csr | $ openssl req -x509 -days 36500 -key key.pem -in SN19842256.csr | |||
| -out SN19842256.crt</t> | -out SN19842256.crt | |||
| ]]></sourcecode> | ||||
| <t>The router then sends the key to the vendor’s keyserver for | <t>The router then sends the key to the vendor's key server for | |||
| publication (not shown).</t> | publication (not shown).</t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Step 2: Generating the encrypted configuration. "> | <name>Step 2: Generating the Encrypted Configuration</name> | |||
| <t>The operator now wants to deploy the new router.</t> | <t>The operator now wants to deploy the new router.</t> | |||
| <t>They generate the initial configuration (using whatever magic tool | <t>They generate the initial configuration (using whatever magic tool | |||
| generates router configs!), fetch the router’s certificate and | generates router configs!), fetch the router's certificate, and | |||
| encrypt the configuration file to that key. This is done by the operator .</t> | encrypt the configuration file to that key. This is done by the operator .</t> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Step 2.1: Fetch the certificate."> | <name>Step 2.1: Fetch the Certificate</name> | |||
| <t>$ wget http://keyserv.example.net/certificates/SN19842256.crt</t> | <sourcecode name="" type=""><![CDATA[ | |||
| $ wget http://keyserv.example.net/certificates/SN19842256.crt | ||||
| ]]></sourcecode> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Step 2.2: Encrypt the configuration file. "> | <name>Step 2.2: Encrypt the Configuration File</name> | |||
| <t>S/MIME is used here because it is simple to demonstrate. This is | <t>S/MIME is used here because it is simple to demonstrate. This is | |||
| almost definitely not the best way to do this.</t> | almost definitely not the best way to do this.</t> | |||
| <sourcecode name="" type=""><![CDATA[ | ||||
| <figure> | $ openssl smime -encrypt -aes-256-cbc -in SN19842256.cfg\ | |||
| <artwork><![CDATA[$ openssl smime -encrypt -aes-256-cbc -in SN198422 | ||||
| 56.cfg\ | ||||
| -out SN19842256.enc -outform PEM SN19842256.crt | -out SN19842256.enc -outform PEM SN19842256.crt | |||
| $ more SN19842256.enc | $ more SN19842256.enc | |||
| -----BEGIN PKCS7----- | -----BEGIN PKCS7----- | |||
| MIICigYJKoZIhvcNAQcDoIICezCCAncCAQAxggE+MIIBOgIBADAiMBUxEzARBgNV | MIICigYJKoZIhvcNAQcDoIICezCCAncCAQAxggE+MIIBOgIBADAiMBUxEzARBgNV | |||
| BAMMClNOMTk4NDIyNTYCCQDJVuBlaTOb1DANBgkqhkiG9w0BAQEFAASCAQBABvM3 | BAMMClNOMTk4NDIyNTYCCQDJVuBlaTOb1DANBgkqhkiG9w0BAQEFAASCAQBABvM3 | |||
| ... | ... | |||
| LZoq08jqlWhZZWhTKs4XPGHUdmnZRYIP8KXyEtHt | LZoq08jqlWhZZWhTKs4XPGHUdmnZRYIP8KXyEtHt | |||
| -----END PKCS7----- | -----END PKCS7----- | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Step 2.3: Copy configuration to the configuration server | <name>Step 2.3: Copy Configuration to the Configuration Server</name> | |||
| ."> | <sourcecode name="" type=""><![CDATA[ | |||
| <figure> | $ scp SN19842256.enc config.example.com:/tftpboot | |||
| <artwork><![CDATA[$ scp SN19842256.enc config.example.com:/tftpboot | ]]></sourcecode> | |||
| ]]></artwork> | ||||
| </figure> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Step 3: Decrypting and using the configuration. "> | <name>Step 3: Decrypting and Using the Configuration</name> | |||
| <t>When the router connects to the operator's network it will detect | <t>When the router connects to the operator's network, it will detect | |||
| that does not have a valid configuration file, and will start the | that it does not have a valid configuration file and will start the | |||
| “autoboot” process. This is a well documented process, but | "autoboot" process. This is a well-documented process, but | |||
| the high level overview is that it will use DHCP to obtain an IP | the high-level overview is that it will use DHCP to obtain an IP | |||
| address and configuration server. It will then use TFTP to download a | address and configuration server. It will then use TFTP to download a | |||
| configuration file, based upon its serial number (this document | configuration file, based upon its serial number (this document | |||
| modifies the solution to fetch an encrypted configuration file (ending i n | modifies the solution to fetch an encrypted configuration file (ending i n | |||
| .enc)). It will then decrypt the configuration file, and install it.</t> | .enc)). It will then decrypt the configuration file and install it.</t> | |||
| <section numbered="true" toc="default"> | ||||
| <t/> | <name>Step 3.1: Fetch Encrypted Configuration File from Configuration | |||
| Server</name> | ||||
| <section title="Step 3.1: Fetch encrypted configuration file from config | <sourcecode name="" type=""><![CDATA[ | |||
| uration server."> | $ tftp 2001:0db8::23 -c get SN19842256.enc | |||
| <figure> | ]]></sourcecode> | |||
| <artwork><![CDATA[$ tftp 2001:0db8::23 -c get SN19842256.enc | ||||
| ]]></artwork> | ||||
| </figure> | ||||
| </section> | </section> | |||
| <section numbered="true" toc="default"> | ||||
| <section title="Step 3.2: Decrypt and use the configuration. "> | <name>Step 3.2: Decrypt and Use the Configuration</name> | |||
| <figure> | <sourcecode name="" type=""><![CDATA[ | |||
| <artwork><![CDATA[$ openssl smime -decrypt -in SN19842256.enc -infor | $ openssl smime -decrypt -in SN19842256.enc -inform pkcs7\ | |||
| m pkcs7\ | ||||
| -out config.cfg -inkey key.pem | -out config.cfg -inkey key.pem | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| <t>If an attacker does not have the correct key, they will not be | <t>If an attacker does not have the correct key, they will not be | |||
| able to decrypt the configuration file:</t> | able to decrypt the configuration file:</t> | |||
| <sourcecode name="" type=""><![CDATA[ | ||||
| <figure> | $ openssl smime -decrypt -in SN19842256.enc -inform pkcs7\ | |||
| <artwork><![CDATA[$ openssl smime -decrypt -in SN19842256.enc -infor | ||||
| m pkcs7\ | ||||
| -out config.cfg -inkey wrongkey.pem | -out config.cfg -inkey wrongkey.pem | |||
| Error decrypting PKCS#7 structure | Error decrypting PKCS#7 structure | |||
| 140352450692760:error:06065064:digital envelope | 140352450692760:error:06065064:digital envelope | |||
| routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:592: | routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:592: | |||
| $ echo $? | $ echo $? | |||
| 4]]></artwork> | 4]]></sourcecode> | |||
| </figure> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section numbered="false" toc="default"> | ||||
| <name>Acknowledgments</name> | ||||
| <t>The authors wish to thank everyone who contributed, including | ||||
| <contact fullname="Benoit Claise"/>, <contact fullname="Francis | ||||
| Dupont"/>, <contact fullname="Mirja Kuehlewind"/>, <contact | ||||
| fullname="Sam Ribeiro"/>, <contact fullname="Michael Richardson"/>, | ||||
| <contact fullname="Sean Turner"/>, and <contact fullname="Kent | ||||
| Watsen"/>. <contact fullname="Joe Clarke"/> also provided significant | ||||
| comments and review, and <contact fullname="Tom Petch"/> provided | ||||
| significant editorial contributions to better describe the use cases | ||||
| and clarify the scope.</t> | ||||
| <t><contact fullname="Roman Danyliw"/> and <contact fullname="Benjamin | ||||
| Kaduk"/> also provided helpful text, especially around the certificate | ||||
| usage and security considerations.</t> | ||||
| </section> | ||||
| </back> | </back> | |||
| </rfc> | </rfc> | |||
| End of changes. 140 change blocks. | ||||
| 502 lines changed or deleted | 399 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/ | ||||