RFC 8572 Secure Zero Touch Provisioning (SZTP)

Internet Engineering Task Force (IETF)                         K. Watsen
Request for Comments: 8572                               Watsen Networks
Category: Standards Track                                      I. Farrer
ISSN: 2070-1721                                      Deutsche Telekom AG
                                                          M. Abrahamsson
                                                               T-Systems
                                                              April 2019

Secure Zero Touch Provisioning (SZTP)

Защищённая автоматическая инициализация

PDF

Аннотация

В этом документе представлен метод защищённой подготовки устройства, загружаемого с заданными производителем настройками. Варианты решения позволяют применять его как в общественных, так и в частных сетях. На этапах подготовки можно обновить загрузочный образ, установить начальную конфигурацию и выполнить произвольные сценарии для решения дополнительных задач. После этого обновлённое устройство сможет устанавливать защищённые соединения с другими развёрнутыми системами управления сетью, например, NETCONF (RFC 6241) или RESTCONF (RFC 8040).

Статус документа

Документ содержит проект стандарта Internet (Standards Track).

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc8572.

Авторские права

Copyright (c) 2019. Авторские права принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К этому документу применимы права и ограничения, перечисленные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно, поскольку в них описаны права и ограничения, относящиеся к данному документу. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

1. Введение

Фундаментальным требованием бизнеса для операторов сетей является снижение расходов, когда это возможно. Для операторов развёртывание устройств в разных местах может вести к значительным расходам, поскольку отправка квалифицированных специалистов на каждую площадку для установки непомерно дорога и требует много персонала.

Этот документ определяет защищённую автоматическую инициализацию (Secure Zero Touch Provisioning или SZTP) — стратегию начальной загрузки для безопасного получения данных начальной загрузки без каких-либо действий персонала сверх монтажа и подключения сетевых и питающих кабелей. За счёт этого SZTP позволяет запускать устройства на удалённых площадках персоналу без технических навыков, не требуя вмешательства оператора.

Решение SZTP включает обновление загрузочного образа, установку начальных параметров и выполнение произвольных сценариев для решения дополнительных задач. Обновлённое устройство способно организовать защищённые соединения с другими системами. Например, оно может создать соединения NETCONF [RFC6241] и/или RESTCONF [RFC8040] с развёрнутыми системами управления сетью.

Документ в первую очередь относится к физическим устройствам, где исходное состояние (5. Детали устройства) задаётся при производстве. Решение SZTP можно расширить для поддержки виртуальных машин и похожих логических конструкций, но детали этого оставлены для будущих работ.

1.1. Варианты применения

  • Устройство подключено к удалённо управляемой сети. Этот вариант включает такие сценарии, как филиал или круглосуточный магазин, где устройство подключается к шлюзу доступа в сеть ISP. В предположении невозможности настроить сеть ISP для обеспечения начальной загрузки и отсутствия вблизи другого устройства, которое могло бы обеспечить загрузку, у устройства остаётся лишь один способ — обратиться к серверу начальной загрузки через Internet.

  • Устройство подключено к локально управляемой сети. Этот вариант отличается возможностью использовать близлежащие устройства, которые могут обеспечить начальную загрузку. Если таких устройств нет или они недоступны, можно воспользоваться предыдущим вариантом (сеть с удалённым управлением).

Концептуальные рабочие процессы развёртывания SZTP представлены а Приложении C.

1.2. Терминология

Artifact — артефакт

Этот термин служит в документе для представления трёх артефактов (объектов данных), определённых в разделе 3 (conveyed information, ownership voucher, owner certificate). Эти артефакты совместно обеспечивают все данные начальной загрузки, которые устройство может использовать.

Bootstrapping Data — данные начальной загрузки

Набор данных, которые устройство может получить в процессе начальной загрузки. В частности, к ним относятся три артефакта, описанные в разделе 3 (conveyed information, owner certificate, ownership voucher).

Bootstrap Server — сервер начальной загрузки

Любой сервер RESTCONF с реализацией модуля YANG, заданного в параграфе 7.3.

Conveyed Information — доставляемая (передаваемая) информация

Сведения о перенаправлении или вводные данные. Это один из трёх артефактов, описанных в разделе 3.

Device — устройство

Элемент сети, которому требуется начальная загрузка (5. Детали устройства).

Manufacturer — изготовитель

Изготовитель устройства или его полномочный представитель.

Network Management System (NMS) — система управления сетью

Система управления в конкретном развёртывании, за введение устройства в которую отвечает процесс начальной загрузки. С точки зрения устройства по завершении начальной загрузки в роли NMS выступает клиент NETCONF или RESTCONF.

Onboarding Information — вводные сведения

Это один из двух типов передаваемой информации, определённых в этом документе, а другим являются сведения о перенаправлении. Вводные сведения формально определены в контейнере onboarding-information структуры yang-data в параграфе 6.3.

Onboarding Server — сервер вводных сведений

Сервер начальной загрузки, лишь возвращающий вводные сведения.

Owner — владелец

Человек или организация, купившие или иным способом получившие устройство во владение.

Owner Certificate — сертификат владельца

Сертификат X.509, связывающий отождествление владельца с открытым ключом, который устройство применяет для проверки подписи через передаваемые сведения. Сертификат владельца может передаваться вместе с цепочкой промежуточных сертификатов, ведущей к известной точке доверия. Сертификат владельца является одним из трёх артефактов начальной загрузки, описанных в разделе 3.

Ownership Voucher — ваучер владения

Артефакт ваучера, определённый в [RFC8366] и являющийся одним из трёх артефактов начальной загрузки, описанных в разделе 3.

Redirect Information — сведения о перенаправлении

Это один из двух типов передаваемой информации, определённых в этом документе, а другим являются вводные сведения. Сведения о перенаправлении формально определены в контейнере conveyed-information структуры yang-data в параграфе 6.3.

Redirect Server — сервер перенаправления

Сервер начальной загрузки, возвращающий лишь сведения о перенаправлении. Такой сервер особенно полезен при размещении у изготовителя, как общеизвестный ресурс (например, в Internet) для перенаправления устройств на серверы начальной загрузки конкретного развёртывания.

Signed Data — подписанные данные

Передаваемые сведения, которые были подписаны, в частности, с применением секретного ключа владельца устройства.

Unsigned Data

Передаваемые сведения, которые не подписаны.

1.3. Уровни требований

Ключевые слова должно (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

1.4. Диаграммы деревьев

В диаграммах деревьев применяется нотация, заданная в [RFC8340].

2. Типы передаваемых сведений

В этом документе определяется два типа передаваемой информации, к которой устройства могут иметь доступ в процессе начальной загрузки. Эти сведения описаны в данном разделе, а примеры даны в параграфе 6.2.

2.1. Сведения о перенаправлении

Сведения о перенаправлении отправляют устройство на другой сервер начальной загрузки. Эти сведения представляются списком серверов начальной загрузки, с указанием имён (адресов IP), а также могут указывать порт и включать сертификат точки доверия, который устройство может использовать для проверки подлинности сервера.

Сведения о перенаправлении в модели данных YANG формально определены в контейнере redirect-information модуля YANG, представленного в параграфе 6.3. Дерево этого контейнера представлено ниже.

               +--:(redirect-information)
                  +-- redirect-information
                     +-- bootstrap-server* [address]
                        +-- address         inet:host
                        +-- port?           inet:port-number
                        +-- trust-anchor?   cms

Сведения о перенаправлении могут быть доверенными или недоверенными. Доверенными они считаются при получении через защищённое соединение с доверенным сервером начальной загрузки или при наличии подписи владельца устройства. В иных случаях сведения о перенаправлении считаются недоваренными.

Доверенные данные о перенаправлении полезны для обеспечения устройству возможности создания защищённого канала к указанному серверу начальной загрузки, что возможно при наличии в этих данных сертификата точки доверия для сервера начальной загрузки.

Недоверенные сведения о перенаправлении полезны для отправки устройства к серверу загрузки с подписанными данными для него. Если данные о перенаправлении не являются доверенными, устройство отбрасывает любые сертификаты точек доверия, которые могут быть включены.

Обработка сведений о перенаправлении описана в параграфе 5.5.

2.2. Вводные сведения

Вводные сведения обеспечивают данные, требуемые устройству для начальной загрузки и организации защищённых соединений с другими системами. В соответствии с определением в этом документе вводные сведения могут подробно указывать загрузочный образ для устройства, начальную конфигурацию и сценарии, которые устройство должно выполнить.

Вводные сведения в модели данных YANG формально заданы в контейнере onboarding-information модуля YANG, приведённого в параграфе 6.3. Дерево контейнера представлено ниже.

            +--:(onboarding-information)
               +-- onboarding-information
                  +-- boot-image
                  |  +-- os-name?              string
                  |  +-- os-version?           string
                  |  +-- download-uri*         inet:uri
                  |  +-- image-verification* [hash-algorithm]
                  |     +-- hash-algorithm    identityref
                  |     +-- hash-value        yang:hex-string
                  +-- configuration-handling?      enumeration
                  +-- pre-configuration-script?    script
                  +-- configuration?               binary
                  +-- post-configuration-script?   script

Вводные сведения должны быть доверенными, чтобы они были пригодны для устройства. Обработка устройством недоверенных вводных сведений не предусмотрена. Сведения считаются доверенными при получении через защищённое соединение с доверенным сервером начальной загрузки или при наличии подписи владельца устройства. В иных случаях вводные сведения считаются недоваренными.

Обработка вводных сведений описана в параграфе 5.6.

3. Артефакты

В этом документе определяются три артефакта, которые могут быть доступны устройствам при начальной загрузке. Каждый источник данных начальной загрузки указывает, как он представляет описанные в этом разделе артефакты (4. Источники данных для начальной загрузки).

3.1. Передаваемые сведения

Артефакт передаваемых сведений (conveyed information) содержит важные данные для начальной загрузки устройства. Этот артефакт служит для кодирования типов данных о перенаправлении и вводных сведений, описанных в разделе 2.

Артефакт имеет структуру криптографического сообщения (Cryptographic Message Syntax или CMS), как описано в [RFC5652], представленную с использованием правил ASN.1 DER3, заданных в ITU-T X.690 [ITU.X690.2015]. Содержимое структуры CMS должно соответствовать модулю YANG, заданному в параграфе 6.3.

Структура CMS с передаваемой информацией может содержать подписанные или неподписанные данные начальной загрузки. Подписанные данные могут также шифроваться, но здесь они по-прежнему называются подписанными данными (см. параграф 1.2. Терминология).

Когда артефакт передаваемых сведений не подписан и не зашифрован, как это может быть при передаче по защищённым каналам, верхним типом содержимого структуры CMS должен быть один из идентификаторов OID, описанных в параграфе 10.3 (id-ct-sztpConveyedInfoXML или id-ct-sztpConveyedInfoJSON), или OID id-data (1.2.840.113549.1.7.1). При использовании OID id-data кодирование (JSON, XML и т. п.) следует передавать внешними средствами. В любом случае связанное содержимое является строкой октетов данных conveyed-information с ожидаемым кодированием.

Когда артефакт передаваемой информации не подписан и не зашифрован, как это может быть при передаче по защищённому каналу, но оператор хочет убедиться, что содержимое может видеть лишь устройство, верхним типом содержимого структуры CMS должен быть OID id-envelopedData (1.2.840.113549.1.7.3). Кроме того, типом содержимого encryptedContentInfo должен быть один из OID, описанных в параграфе 10.3 (id-ct-sztpConveyedInfoXML или id-ct-sztpConveyedInfoJSON), или OID id-data (1.2.840.113549.1.7.1). При использовании OID id-data кодирование (JSON, XML и т. п.) следует передавать внешними средствами. В любом случае связанное содержимое является строкой октетов данных conveyed-information с ожидаемым кодированием.

Когда артефакт передаваемой информации подписан и не зашифрован, как это может быть при передаче по недоверенному каналу, верхним типом содержимого структуры CMS должен быть OID id-signedData (1.2.840.113549.1.7.2). Кроме того, внутренним eContentType должен быть один из OID, описанных в параграфе 10.3 (id-ct-sztpConveyedInfoXML или id-ct-sztpConveyedInfoJSON), или OID id-data (1.2.840.113549.1.7.1). При использовании OID id-data кодирование (JSON, XML и т. п.) следует передавать внешними средствами. В любом случае связанное содержимое является строкой октетов данных conveyed-information с ожидаемым кодированием.

Когда артефакт передаваемой информации подписан и зашифрован, как это может быть при передаче по недоверенному каналу с обеспечением конфиденциальности, верхним типом содержимого структуры CMS должен быть OID id-envelopedData (1.2.840.113549.1.7.3). Кроме того, типом encryptedContentInfo должен быть OID id-signedData (1.2.840.113549.1.7.2), для которого eContentType должен быть одним из OID, описанных в параграфе 10.3 (id-ct-sztpConveyedInfoXML или id-ct-sztpConveyedInfoJSON), или OID id-data (1.2.840.113549.1.7.1). При использовании OID id-data кодирование (JSON, XML и т. п.) следует передавать внешними средствами. В любом случае связанное содержимое является строкой октетов данных conveyed-information с ожидаемым кодированием.

3.2. Сертификат владельца

Артефакт сертификата владельца является сертификатом X.509 [RFC5280], применяемым для идентификации «владельца» (например, организации). Сертификат владельца может быть подписан удостоверяющим центром (certificate authority или CA). Сертификат владельца должен не задавать Key Usage или для Key Usage, как минимум, должен быть установлен бит digitalSignature. Этот документ не ограничивает значения subject и subjectAltName в сертификате владельца.

Сертификат владельца устройство использует для проверки подписи артефакта передаваемых сведений (3.1. Передаваемые сведения), который устройство должно получить, как указано в параграфе 3.5. В частности, устройство проверяет подпись с использованием открытого ключа в сертификате владельца для содержимого артефакта передаваемых сведений.

Артефакт сертификата владельца формально является структурой CMS, как задано в [RFC5652], представленной ASN.1 DER в соответствии с ITU-T X.690 [ITU.X690.2015].

Структура CMS сертификата владельца должна содержать сам сертификат, а также все промежуточные сертификаты, ведущие к закреплённому сертификату домена (pinned-domain-cert), указанному в ваучере владения. Артефакт сертификата владельца может включать и pinned-domain-cert.

Для поддержки устройств, развёрнутых в частных сетях, структура CMS сертификата владельца может включать достаточно свежие в соответствии с локальной политикой объекты отзыва (например, списки отзыва — Certificate Revocation List или CRL [RFC5280] и отклики OCSP [RFC6960]). Наличие объектов отзыва, прикреплённых к сертификату владельца, может избавить устройство от необходимости получать их динамически с использованием точки распространения CRL или ответчика протокола состояния сертификатов (Online Certificate Status Protocol или OCSP), указанного в связанных сертификатах.

В незашифрованном артефакте верхним типом содержимого структуры CMS сертификата владельца должен быть OID id-signedData (1.2.840.113549.1.7.2). Внутренняя структура SignedData является вырожденной и не подписывается, как при распространении сертификатов и объектов отзыва.

В зашифрованном артефакте верхним типом содержимого структуры CMS сертификата владельца должен быть OID id-envelopedData (1.2.840.113549.1.7.3), а типом содержимого encryptedContentInfo должен быть OID id-signedData (1.2.840.113549.1.7.2), в результате чего внутренняя SignedData является вырожденной и не подписывается, как при распространении сертификатов и объектов отзыва.

3.3. Ваучер владения

Артефакт ваучера владения служит для защищённой идентификации владельца устройства, известного изготовителю. Ваучер владения подписывает изготовитель устройства. Ваучер владения служит для проверки сертификата владельца (3.2. Сертификат владельца), который устройству также следует получить, как указано в параграфе 3.5. В частности, устройство проверяет наличие в сертификате владельца цепочки доверия, ведущей к доверенному сертификату, включённому в ваучер владения (pinned-domain-cert). Отметим, что эта связь сохраняется даже для самоподписанного сертификата владельца, являющегося также pinned-domain-cert.

Незашифрованный артефакт ваучера владения определён в [RFC8366]. Как указано, он является структурой CMS, в которой верхним типом содержимого должен быть OID id-signedData (1.2.840.113549.1.7.2), где eContentType должен быть OID id-ct-animaJSONVoucher (1.2.840.113549.1.9.16.1.404) или OID id-data (1.2.840.113549.1.7.1). При использовании OID id-data кодирование (JSON, XML и т. п.) следует передавать внешними средствами. В любом случае связанное содержимое является строкой октетов данных conveyed-information с ожидаемым кодированием.

В зашифрованном артефакте ваучера владения верхним типом содержимого должен быть OID id-envelopedData (1.2.840.113549.1.7.3), а типом содержимого encryptedContentInfo’s должен быть OID id-signedData (1.2.840.113549.1.7.2), где eContentType должен быть OID id-ct-animaJSONVoucher (1.2.840.113549.1.9.16.1.40) или OID id-data (1.2.840.113549.1.7.1). При использовании OID id-data кодирование (JSON, XML и т. п.) следует передавать внешними средствами. В любом случае связанное содержимое является строкой октетов данных conveyed-information с ожидаемым кодированием.

3.4. Шифрование артефактов

Каждый из трёх артефактов можно шифровать индивидуально. Шифрование может быть важным для сред, где содержимое считается конфиденциальным. Каждый из трёх артефактов шифруется одинаково — незашифрованная форма помещается внутрь типа CMS EnvelopedData.

В результате артефакты передаваемых сведений и ваучеров владения подписываются, затем шифруются, но не наоборот. Такая последовательность имеет несколько преимуществ — скрывается сертификат подписавшего и обеспечивается гарантия того, что владелец знает подписываемое содержимое. Эта последовательность также позволяет владельцу проверить незашифрованный ваучер, полученный от изготовителя, затем самостоятельно зашифровать его, возможно, вместе с текущими объектами отзыва, когда владелец готов поместить сертификат в незащищённое место.

При шифровании CMS должен применяться защищённый сертификат отождествления для устройства. Это может быть тот же сертификат, который применяется клиентом уровня TLS, используемым устройством при соединении с серверами начальной загрузки. Способ получения владельцем сертификата отождествления устройства для этой цели выходит за рамки этого документа.

3.5. Группировки артефактов

В предыдущих параграфах рассмотрены артефакты начальной загрузки, но лишь некоторые группировки этих артефактов имеет смысл возвращать в различных ситуациях начальной загрузки, описанных в этом документе.

Неподписанные данные

Эта группа артефактов полезна, когда можно применить защиту транспортного уровня для доставки доверия (например, HTTPS) или передаваемая информация может быть обработана заранее (например, неподписанные сведения о перенаправлении).

Подписанные данные без отзывов

Эта группа артефактов полезна, когда нужны подписанные данные (данные получены из недоверенного источника и не могут быть заранее обработаны), а отзывы не нужны или могут быть получены динамически.

Подписанные данные с отзывами

Эта группа артефактов полезна, когда нужны подписанные данные (данные получены из недоверенного источника и не могут быть заранее обработаны), а отзывы нужны, но не могут быть получены динамически.

Наличие каждого артефакта и отличительные характеристики указаны для каждой группы в таблице (да и нет указывает наличие артефакта в группе).

Группировка

Передаваемые сведения

Ваучер владения

Сертификат владельца

Неподписанные данные

Да, без подписи

Нет

Нет

Подписанные данные без отзывов

Да, с подписью

Да, без отзывов

Да, без отзывов

Подписанные данные с отзывами

Да, с подписью

Да, с отзывами

Да, с отзывами

4. Источники данных для начальной загрузки

В этом разделе описаны несколько источников данных для начальной загрузки. Список не является исчерпывающим и может быть дополнен будущими документами. Для каждого источника указаны детали представления трёх артефактов, указанных в разделе 3.

4.1. Сменный носитель

Подключаемое напрямую съёмное устройство хранения (например, USB-носитель) может служить источником данных для начальной загрузки SZTP.

Отказаться от съёмных носителей сложно, поскольку они не требуют для работы внешней инфраструктуры. Необработанные (raw) загрузочные образы тоже можно размещать на съёмных носителях, позволяя им обеспечивать полное решение для автономной начальной загрузки.

Для использования съёмного носителя в качестве источника данных начальной загрузки устройству нужно лишь определить, что носитель подключён к устройству и примонтировать его файловую систему.

Съёмные устройства являются недоверенными источниками данных начальной загрузки. Это значит, что хранящиеся на них данные должны быть подписаны или должны содержать сведения, предназначенные для предварительной обработки (например, неподписанные сведения о перенаправлении).

С точки зрения артефактов съёмный носитель представляет себя как файловую систему и артефакты начальной загрузки должны быть представлены в виде файлов. Описанные в разделе 3 артефакты отображаются в файловую систему, как показано ниже.

Передаваемые сведения

Отображаются в файл с двоичным артефактом, описанным в параграфе 3.1 (например, conveyed-information.cms).

Сертификат владельца

Отображаются в файл с двоичным артефактом, описанным в параграфе 3.2 (например, owner-certificate.cms).

Ваучер владения

Отображается в файл с двоичным артефактом, описанным в параграфе 3.3 (например, ownership-voucher.cms или ownership-voucher.vcj).

Формат файловой системы съёмного носителя и именование файлов выходят за рамки этого документа. Однако для улучшения совместимости устройствам рекомендуется поддерживать открытые и/или стандартизованные файловые системы. Устройствам также рекомендуется предполагать именование файлов, позволяющее создать не один экземпляр данных начальной загрузки (например, для разных устройств) на одном съёмном носителе. Именовать файлы следует уникально для изготовителя, чтобы на одном носителе можно было разместить данные начальной загрузки для устройств разных производителей.

4.2. Сервер DNS

Источником данных для начальной загрузки SZTP может служить сервер DNS. Это может быть привлекательным решением для развёртываний с имеющейся инфраструктурой DNS, поскольку может обеспечивать автоматическую (touchless) начальную загрузку, не требуя использовать сторонние ресурсы Internet.

DNS является недоверенным источником данных начальной загрузки. Даже при использовании DNSSEC [RFC6698] для аутентификации записей о ресурсах DNS (например, A, AAAA, CERT, TXT, TLSA) устройство не может быть уверенным, что возвращённый (например, сервером DHCP) домен, принадлежит законному владельцу. Это значит, что сведения из записей DNS должны быть подписаны (в соответствии с этим документом, а не DNSSEC) или должны быть данными для предварительной обработки (например, неподписанные сведения о перенаправлении).

4.2.1. Запросы DNS

Устройства, заявляющие поддержку DNS как источника данных начальной загрузки, должны сначала запрашивать записи DNS для устройства и лишь после неудачной загрузки должны запрашивать независимые от устройства записи DNS. Для каждого зависимого или независимого от устройства запроса устройство должно сначала передать multicast-запрос DNS [RFC6762], а затем, если не произошло успешной загрузки, должен передаваться unicast-запрос DNS [RFC1035] [RFC7766]. Это предполагает известность адреса сервера DNS, поэтому можно применять методы, подобные описанным в разделе 11 [RFC6763].

Для извлечения зависимых от устройства записей DNS устройство должно запрашивать записи TXT [RFC1035] из раздела <serial-number>._sztp, где <serial-number> — серийный номер устройства (то же значение, которое указано в сертификате отождествления защищённого устройства), _sztp — глобальный атрибут DNS, зарегистрированный этим документом (10.7. Реестр Underscored and Globally Scoped DNS Node Names). Примеры записей DNS для устройства приведены ниже.

      TXT in <serial-number>._sztp.local.  (multicast)
      TXT in <serial-number>._sztp.<domain>.  (unicast)

Для извлечения независимых от устройства записей DNS устройство должно запрашивать записи SRV [RFC2782] из раздела _sztp._tcp, где _sztp — имя службы, зарегистрированное этим документом (10.6. Реестр Service Name and Transport Protocol Port Number), а _tcp — глобальный атрибут DNS, зарегистрированный [RFC8552].

Отметим, что независимый от устройства отклик может содержать лишь неподписанные данные, поскольку для подписанных требуется использование ваучера владения для устройства. Применение записей SRV максимально привязано к имеющимся стандартам DNS. Отклик с несколькими записями SRV сравним с неподписанным списком сведений о перенаправлении на серверы начальной загрузки. Примеры зависимых от устройства записей DNS приведены ниже.

      SRV in _sztp._tcp.local.  (multicast)
      SRV in _sztp._tcp.<domain>.  (unicast)

4.2.2. Отклик DNS на зависимый от устройства запрос

Для зависимых от устройства запросов три артефакта начальной загрузки, определённых в разделе 3, кодируются в записи TXT, использующие пары ключ-значение, подобно методу, описанному в параграфе 6.3 [RFC6763].

Передаваемые сведения

Отображаются в запись TXT с ключом ci и значением в виде двоичного артефакта, описанного в параграфе 3.1.

Сертификат владельца

Отображаются в запись TXT с ключом oc и значением в виде двоичного артефакта, описанного в параграфе 3.2.

Ваучер владения

Отображаются в запись TXT с ключом ov и значением в виде двоичного артефакта, описанного в параграфе 3.3.

Устройство должно игнорировать все прочие ключи, которые могут быть возвращены.

Отметим, что, несмотря на тип TXT, в записях следует (параграф 6.5 в [RFC6763]) кодировать двоичные данные.

Ниже приведён пример отклика для конкретного устройства с подписанными данными, как он может быть представлен пользовательским агентом. В примере предполагается, что серийный номер устройства — это <serial-number>, домен -example.com, а <binary data> — двоичное представление артефакта.

     <serial-number>._sztp.example.com. 3600 IN TXT "ci=<binary data>"
     <serial-number>._sztp.example.com. 3600 IN TXT "oc=<binary data>"
     <serial-number>._sztp.example.com. 3600 IN TXT "ov=<binary data>"

Отметим, что в случае, когда ci представляет неподписанные данные, ключей oc и ov не будет в отклике.

4.2.3. Отклик DNS на независимый от устройства запрос

Для независимых от устройства запросов три артефакта начальной загрузки, определённых в разделе 3, кодируются в записи SRV.

Передаваемые сведения

Этот артефакт не поддерживается напрямую и вместо этого суть сведений о перенаправлении отображается в записи SRV в соответствии с [RFC2782].

Сертификат владельца

Не поддерживается. Независимые от устройства отклики не включают подписанных данных, поэтому не нужен артефакт сертификата владельца.

Ваучер владения

Не поддерживается. Независимые от устройства отклики не включают подписанных данных, поэтому не нужен артефакт ваучера владения.

Ниже представлен пример независимого от устройства отклика, содержащего (фактически) неподписанные сведения о перенаправлении на 4 сервера начальной загрузки, как он может быть представлен пользовательским агентом. В примере предполагается домен example.com и наличие четырёх серверов начальной загрузки sztp[1-4].

      _sztp._tcp.example.com. 1800 IN SRV 0 0 443 sztp1.example.com.
      _sztp._tcp.example.com. 1800 IN SRV 1 0 443 sztp2.example.com.
      _sztp._tcp.example.com. 1800 IN SRV 2 0 443 sztp3.example.com.
      _sztp._tcp.example.com. 1800 IN SRV 2 0 443 sztp4.example.com.

Отметим, что в этом примере sztp3 и sztp4 имеют одинаковый приоритет, следовательно, эффективно представляют кластеризованную пару серверов начальной загрузки. Хотя у sztp1 и sztp2 лишь по одной записи SRV, может случиться так, что записи указывают на балансировщик, размещенный перед кластером серверов начальной загрузки.

Хотя в этом документе не применяется DNS-SD [RFC6763], в соответствии с параграфом 12.2 этого RFC, откликам Multicast DNS (mDNS) следует включать также все адресные записи (A и AAAA), указанные в SRV rdata.

4.2.4. Размер подписанных данных

Подписанные артефакты данных имеют большой размер в DNS. В варианте с наименьшим объёмом памяти каждый из них занимает несколько килобайт. Однако вводные сведения могут иметь больший размер. Все записи о ресурсах, включая TXT, ограничены размером 65535 байт, поскольку поле RDLENGTH имеет размер 16 битов (параграф 3.2.1 в [RFC1035]). Если желательно закодировать вводные сведения, превышающие это ограничение, в возвращаемых записях DNS следует вместо этого кодировать сведения о перенаправлении, указывающие устройству сервер начальной загрузки, с которого можно получить вводные сведения.

С учётом ожидаемого размера записей TXT неочевидно, что подписанные данные поместятся в пакет DNS протокола UDP даже при включённых механизмах расширения (Extension Mechanisms for DNS или EDNS(0)) [RFC6891]. В зависимости от содержимого подписанные данные могут не поместиться и в групповой (multicast) пакет DNS, который в соответствии с разделом 17 в [RFC6762] может достигать 9000 байтов. Поэтому для возврата подписанных данных предполагается потребность в доставке пакетов DNS по протоколу TCP [RFC7766].

4.3. Сервер DHCP

Сервер DHCP может служить источником данных начальной загрузки SZTP. Это может быть привлекательно для развёртываний с инфраструктурой DHCP, поскольку обеспечивает возможность автоматической (touchless) начальной загрузки без применения ресурсов Internet, поддерживаемых сторонними организациями.

Сервер DHCP является недоверенным источником данных начальной загрузки, поэтому хранящиеся там данные должны быть подписаны или это должна быть информация, которая может быть обработана предварительно (например, неподписанные сведения о перенаправлении).

Однако, в отличие от других источников данных начальной загрузки, описанных в этом документе, протокол DHCP (особенно DHCP для IPv4) сильно ограничен по размеру передаваемой информации и подписанные данные передать не удастся. Это означает, что через DHCP можно получить лишь неподписанные сведения о перенаправлении. Поскольку эти данные не подписаны, в них не следует включать необязательный сертификат привязки доверия, так как он занимает место в сообщении DHCP, а устройству все равно придётся его отбросить. По этой причине определённые в разделе 8 опции DHCP не позволяют кодировать сертификат привязки доверия.

Ниже приведено отображение артефактов, заданных в разделе 3, на поля DHCP, указанные в разделе 8.

Передаваемые сведения

Этот артефакт не поддерживается напрямую и взамен суть сведений о перенаправлении отображается в опции DHCP, описанные в разделе 8.

Сертификат владельца

Не поддерживается, поскольку в пакете DHCP недостаточно места для артефакта сертификата владельца.

Ваучер владения

Не поддерживается, поскольку в пакете DHCP недостаточно места для артефакта ваучера владения.

4.4. Сервер начальной загрузки

Сервер начальной загрузки может служить источником данных для начальной загрузки SZTP. Сервер начальной загрузки определён как сервер RESTCONF [RFC8040], реализующий модуль YANG из раздела 7.

Применение сервера начальной загрузки в качестве источника данных для начальной загрузки привлекательно, поскольку он может использовать защиту транспортного уровня, исключая необходимость подписывать данные, что в некоторых случаях может быть проще в развёртывании.

В отличие от других источников данных начальной загрузки, описанных в этом документе, сервер начальной загрузки является не только источником данных, но и может получать данные от устройств, используя вызов YANG RPC report-progress из модуля YANG, определённого в параграфе 7.3. RPC report-progress обеспечивает видимость процесса загрузки (например, предупреждения и ошибки) и предоставляет потенциально полезные сведения по завершении (например ключи SSH для хоста и/или сертификаты привязок доверия TLS).

Сервер начальной загрузки может быть доверенным или недоверенным источником данных в зависимости от получения устройством привязки доверия для сервера из доверенного источника. Если сервер начальной загрузки является доверенным, передаваемые им сведения могут быть подписаны. При недоверенном сервере начальной загрузки передаваемые сведения должны быть подписаны или должны быть информацией, которая может предварительно обрабатываться (например, неподписанные сведения о перенаправлении).

Поскольку сервер начальной загрузки предоставляет данные, соответствующие модели YANG, артефакты должны сопоставляться с узлами YANG. Три артефакта, заданные в разделе 3, отображаются на узлы output в RPC get-bootstrapping-data из модуля, определённого в параграфе 7.3.

Передаваемые сведения

Сопоставляется с листом conveyed-information в выводе RPC get-bootstrapping-data.

Сертификат владельца

Сопоставляется с листом owner-certificate в выводе RPC get-bootstrapping-data.

Ваучер владения

Сопоставляется с листом ownership-voucher в выводе RPC get-bootstrapping-data.

Серверы SZTP имеют лишь две конечных точки — RPC get-bootstrapping-data и один из вызовов RPC report-progress. Эти RPC используют аутентифицированное имя пользователя RESTCONF для изоляции выполнения RPC от других устройств.

5. Детали устройства

Поддерживающие описанную в этом документе начальную загрузку устройства должны иметь настроенное заранее состояние и логику загрузки, описанные в последующих параграфах.

5.1. Исходное состояние

      +-------------------------------------------------------------+
      |                          <Устройство>                       |
      |                                                             |
      | +---------------------------------------------------------+ |
      | |              <Хранилище с чтением и записью>            | |
      | |                                                         | |
      | | 1. Включение начальной загрузки SZTP (true)             | |
      | +---------------------------------------------------------+ |
      |                                                             |
      | +---------------------------------------------------------+ |
      | |              <хранилище лишь для чтения>                | |
      | |                                                         | |
      | | 2. Клиентский сертификат TLS и промежуточные сертификаты| |
      | | 3. Список доверенных общеизвестных серверов загрузки    | |
      | | 4. Список сертификатов привязок доверия для серверов    | |
      | | 5. Список сертификатов привязок доверия для ваучеров    | |
      | +---------------------------------------------------------+ |
      |                                                             |
      |   +-----------------------------------------------------+   |
      |   |            <защищённое хранилище>                   |   |
      |   |                                                     |   |
      |   |  6. Секретный ключ для клиентского сертификата TLS  |   |
      |   |  7. Секретный ключ для расшифровки артефактов SZTP  |   |
      |   +-----------------------------------------------------+   |
      |                                                             |
      +-------------------------------------------------------------+

Нумерация в приведенном ниже списке соответствует нумерации на рисунке.

  1. Устройства должны иметь настраиваемую переменную для включения и отключения начальной загрузки SZTP. Эта переменная по умолчанию должна разрешать начальную загрузку SZTP при первом включении питания устройства. Поскольку конфигурация, задаваемая процессом начальной загрузки, отключает начальную загрузку SZTP и эта конфигурация может быть объединена с имеющейся, не рекомендуется использовать узел конфигурации, зависящий от присутствия, поскольку его нельзя удалить при слиянии.

  2. Устройствам, поддерживающим загрузку данных начальной загрузки с bootstrap-серверов (4.4. Сервер начальной загрузки), следует иметь клиентский сертификат TLS и все промежуточные сертификаты, ведущие к общеизвестной привязке доверия для сертификатов. Сертификатом общеизвестной привязки доверия может быть промежуточный сертификат или самоподписанный корневой сертификат. Для поддержки устройств без клиентского сертификата устройства могут идентифицировать и аутентифицировать себя серверу начальной загрузки с помощью схемы аутентификации HTTP в соответствии с параграфом 2.5 в [RFC8040], однако этот документ не задаёт механизма ввода данных оператором (например, пароля).

  3. Устройства, поддерживающие загрузку начальных данных с общеизвестных bootstrap-серверов, должны иметь список таких серверов. В соответствии со сведениями о перенаправлении (параграф 2.1) каждый сервер начальной загрузки может быть указан именем или IP-адресом хоста, а также необязательным номером порта.

  4. Устройства, поддерживающие загрузку начальных данных с общеизвестных bootstrap-серверов, должны иметь список сертификатов привязок доверия, которые могут служить для проверки подлинности общеизвестных серверов начальной загрузки. Для каждого сертификата привязки доверия, не являющегося самоподписанным корневым сертификатом, устройству следует иметь также цепочку промежуточных сертификатов, ведущих к самоподписанному корневому сертификату, включая его.

  5. Устройства, поддерживающие загрузку подписанных данных (1.2. Терминология), должны иметь сертификаты привязок доверия для проверки ваучеров владения. Для каждого сертификата привязки доверия, не являющегося самоподписанным корневым сертификатом, устройству следует иметь также цепочку промежуточных сертификатов, ведущих к самоподписанному корневому сертификату, включая его.

  6. Устройства, поддерживающие клиентский сертификат уровня TLS для идентификации и аутентификации себя на сервере начальной загрузки, должны иметь секретный ключ, соответствующий открытому ключу в сертификате TLS. Этот ключ следует держать в защищённом хранилище, в идеале на криптографическом устройстве, таком как микросхема модуля доверенной платформы (trusted platform module или TPM).

  7. Устройства, поддерживающие расшифровку артефактов SZTP, должны иметь секретный ключ, соответствующий открытому ключу для шифрования артефактов. Этот ключ следует держать в защищённом хранилище, в идеале на криптографическом устройстве, таком как микросхема модуля доверенной платформы (TPM). Это может быть секретный ключ, связанный с клиентским сертификатом TLS, используемым для соединения с серверами начальной загрузки.

Модуль YANG, представляющий эти данные, приведён в Приложении A.

5.2. Последовательность загрузки

Устройство, заявляющее поддержку описанной в документе стратегии, должно обеспечивать указанную ниже последовательность загрузки.

Включение питания
        |
        v                              Нет
1. Начальная загрузка SZTP включена ------> Обычная загрузка
        |
        | Да
        v
2. Для каждого поддерживаемого источника данных начальной загрузки
   предпринимается попытка загрузить из него данные
        |
        |
        v                Да
3. Удалось загрузиться -----> Работа с новой конфигурацией
        |
        | Нет
        v
4. Возврат к п. 1

Примечание. В любой момент устройство можно настроить с помощью иного механизма, например через командный интерфейс (command-line interface или CLI).

Нумерация в приведенном ниже списке соответствует нумерации на диаграмме процесса.

  1. При включении устройства оно сначала проверяет, включена ли начальная загрузка SZTP, как ожидается для заданного исходного состояния. При отключённой начальной загрузке SZTP устройство запускается как обычно.

  2. Устройство выполняет итерацию по списку источников данных для начальной загрузки (раздел 4), как описано в параграфе 5.3.

  3. Если устройство смогло загрузиться из источника данных начальной загрузки, оно работает с новой загруженной конфигурацией.

  4. В противном случае устройство должно вернуться к следующему элементу списка источников загрузки.

Этот документ не запрещает одновременное использование альтернативных механизмов обеспечения, которые могут включать, например, CLI или web-интерфейс для пользователя и даже другой протокол начальной загрузки. Независимо от способа настройки в конфигурации следует сбросить флаг начальной загрузки SZTP, как указано в параграфе 5.1.

5.3. Работа с источниками данных для начальной загрузки

В этом параграфе рассматривается рекурсивный алгоритм, который устройства могут использовать для получения вводных сведений. Алгоритм является рекурсивным, поскольку источники могут возвращать сведения о перенаправлении, которые ведут к запуску алгоритма для другого источника данных начальной загрузки. Выбор источника считается успешным, когда получены вводные сведения, которым может предшествовать одно или несколько перенаправлений.

Важным аспектом алгоритма является понимание, когда данные должны быть подписаны.

Тип данных начальной загрузки

От недоверенного источника

От доверенного источника

Неподписанные сведения о перенаправлении

Да5

Да

Подписанные сведения о перенаправлении

Да

Да6

Неподписанные вводные сведения

Нет

Да

Подписанные вводные сведения

Да

Да6

В рекурсивном алгоритме применяется глобальная переменная trust-state с исходным значением FALSE. Конечной целью алгоритма является обработка вводных сведений (параграф 2.2) пока не будет достигнуто trust-state = TRUE.

Если источником данных для начальной загрузки (раздел 4) является bootstrap-сервер (параграф 4.4) и устройство способно аутентифицировать себя на сервере с использованием проверки пути сертификации X.509 (раздел 6 в [RFC6125]) к одной из заданных на устройстве или узнанных на предыдущем этапе привязок доверия, устройство должно установить trust-state = TRUE.

При организации соединения с доверенным или недоверенным сервером начальной загрузки устройство должно идентифицировать и аутентифицировать себя на сервере с использованием сертификата клиента уровня TLS и/или схемы аутентификации HTTP (параграф 2.5 в [RFC8040]). При использовании обоих механизмов они должны указывать один серийный номер. При отправке сертификата клиента устройство должно также передать все промежуточные сертификаты, ведущие к сертификату общеизвестной привязки доверия для сертификата клиента, возможно включая и её.

Для любого источника данных начальной загрузки (4. Источники данных для начальной загрузки) при получении зашифрованного артефакта устройство должно сначала расшифровать его, используя секретный ключ, связанный с сертификатом устройства, применяемым для шифрования артефакта.

Если артефакт передаваемых сведений подписан и устройство способно проверить подписанные данные по алгоритму параграфа из 5.4, оно должно установить trust-state = TRUE, при неспособности проверить подписанные данные устройство должно установить trust-state = FALSE. Отметим, что это относится к особому случаю, когда подписанные данные возвращаются даже из доверенного источника данных начальной загрузки.

Если артефакт передаваемых сведений содержит данные о перенаправлении, устройство должно обработать сведения о перенаправлении в соответствии с параграфом 5.5, учитывая разрешённую глубину рекурсии. Реализации должны ограничивать глубину рекурсии и следует разрешать не более 10 рекурсивных перенаправлений. Рекурсия ведёт к повторению алгоритма, но на этот раз источником данных определённо будет сервер начальной загрузки, поскольку сведения о перенаправлении могут отправлять устройство лишь на bootstrap-серверы.

Если артефакт передаваемых сведений содержит вводные данные и trust-state = FALSE, устройство должно выйти из рекурсии (см. диаграмму процесса выше), вернувшись к последовательности, как описано в параграфе 5.2. В иных случаях устройство должно попытаться обработать вводные сведения, как описано в параграфе 5.6. Независимо от результата обработки вводных сведений, устройство должно выйти из рекурсии, возвращаясь к последовательности начальной загрузки, как описано в параграфе 5.2. Единственным отличием является ответ на вопрос о возможности начальной загрузки из какого-либо источника, показанный на диаграмме выше.

5.4. Проверка подписанных данных

При получении устройством подписанных данных оно должно проверить их, как описано здесь, включая случаи предоставления подписанных данных доверенным источником. Устройству вместе с подписанными данными должен предоставляться ваучер владения и сертификат владельца, как описано для разных источников данных начальной загрузки в разделе 4. Источники данных для начальной загрузки.

Для проверки подписанных данных устройство сначала должно убедиться в подлинности ваучера владения путём проверки его подписи через одну из настроенных заранее привязок доверия (5.1. Исходное состояние), что может повлечь использование промежуточных сертификатов, присоединенных к ваучеру владения. Если устройство имеет точные часы, оно должно убедиться, что ваучер владения создан в прошлом (created-on раньше текущего времени), а при наличии листа expires-on устройство должно проверить, что срок действия ваучера не истёк (expires-on после текущего времени). Устройство должно убедиться в приемлемости значения assertion (некоторые устройства воспринимают лишь значение verified). Устройство должно проверить свой серийный номер в листе serial-number. При наличии листа idevid-issuer устройство должно проверить корректность его значения. При успешной аутентификации ваучера владения устройство извлекает узел pinned-domain-cert — сертификат X.509, требуемый для проверки сертификата владельца на следующем этапе.

Затем устройство должно проверить подлинность сертификата владельца путём проверки пути сертификации X.509 к доверенному сертификату, извлечённому из узла pinned-domain-cert в ваучере владения. Эта проверка может повлечь использование дополнительных промежуточных сертификатов, присоединенных к артефакту сертификата владельца. Если узел domain-cert-revocation-checks в ваучере владения имеет значение true, устройство должно проверить статус отзыва цепочки сертификатов, использованной для подписи сертификата владельца, — при недоступности свежего статуса отзыва или обнаружении отзыва устройству недопустимо считать сертификат владельца действительным.

В заключение устройство должно убедиться, что артефакт передаваемых сведений подписан с проверенным сертификатом владельца.

При отказе на любом из указанных выше шагов устройство должно счесть подписанные данные недействительными и отказаться от последующих шагов.

5.5. Обработка сведений о перенаправлении

Для обработки сведений о перенаправлении (параграф 2.1) устройство должно выполнять представленные в этом параграфе действия. Обработка проста — устройство последовательно выполняет действия по списку предложенных bootstrap-серверов, пока не найдёт тот, с которого сможет загрузиться.

Если сервер представлен именем хоста и распознавание DNS даёт не один адрес IP, устройство должно предпринять хотя бы одну попытку соединения с каждым адресом, прежде чем перейти к следующему. Если устройство способно получить данные начальной загрузки с любого из полученных от DNS адресов, оно должно сразу же обработать эти данные без попытки соединения с другими адресами, полученными от DNS.

Если сведения о перенаправлении являются доверенными (например, trust-state = TRUE) и запись для bootstrap-сервера содержит сертификат привязки доверия, устройство должно аутентифицировать сертификат TLS у сервера, используя проверку пути сертификации X.509 (раздел 6 в [RFC6125]) к заданной привязке доверия. Если запись для bootstrap-сервера не включает сертификат привязки доверия, устройство должно организовать условное (provisional) соединение с сервером начальной загрузки (вслепую принять сертификат сервера) и установить trust-state = FALSE.

Если сведения о перенаправлении являются недоверенными (например, trust-state = FALSE), устройство должно отбросить все привязки доверия, представленные в сведениях о перенаправлении, и организовать условное (provisional) соединение с сервером начальной загрузки (вслепую принять серверный сертификат TLS).

5.6. Обработка вводных сведений

Для обработки вводных сведений (параграф 2.2) устройство должно выполнить представленные в этом параграфе действия. Сначала устройство должно обработать загрузочный образ (при наличии), затем сценарий предварительной настройки (при наличии). После этого задаётся исходная конфигурация (при наличии) и выполняются сценарии после установки конфигурации (при наличии).

При получении вводных данных от доверенного сервера начальной загрузки устройство должно передать отчёт об исполнении bootstrap-initiated и завершающий отчёт boot-image-installed-rebooting, bootstrap-complete или отчёт об ошибке. Если узел reporting-level в RPC-отклике get-bootstrapping-data от сервера начальной загрузки имеет значение verbose, устройство дополнительно должно передать все промежуточные (non-terminating) отчеты (например, инициирование, предупреждения, завершение и пр.). Независимо от уровня отчётности, запрошенного сервером начальной загрузки, устройство может передавать дополнительные отчёты о ходе выполнения.

При получении вводных данных от недоверенного сервера начальной загрузки устройству недопустимо передавать серверу какие-либо отчёты о ходе работ, даже когда вводные сведения подписаны и аутентифицированы. Следует помнить, что серверам начальной загрузки рекомендуется переводить недоверенные соединения в доверенные (последний абзац параграфа 9.6), чтобы иметь возможность собирать отчёты от устройств.

При возникновении ошибки на любом этапе устройство должно остановить последовательность начальной загрузки, описанную в параграфе 5.2. В контексте рекурсивного алгоритма устройство должно вернуться на предыдущий уровень, а не в самое начало. В процесс начальной загрузки может сохраниться то или иное состояние (например, обновленный загрузочный образ, log-файлы, остатки сценариев и т. п.). Однако сохранённое состояние недопустимо активировать каким-либо способом (например, новая конфигурация или запуск программы) и недопустимо препятствовать продолжению устройством последовательности начальной загрузки (т. е. обработки вводных сведений от другого bootstrap-сервера).

Далее описывается упорядоченная последовательность действий, которые устройство должно выполнить.

Если вводные сведения получены от доверенного сервера начальной загрузки, устройство должно передать отчет bootstrap-initiated. Отсутствие возврата строки состояния HTTP «204 No Content» является ошибкой и при её возникновении устройство должно попытаться отправить отчёт bootstrap-error перед выходом. Устройство должно проанализировать предоставленный документ с вводными сведениями для извлечения значений, применяемых на следующих этапах. Независимо от использования потокового синтаксического анализатора при возникновении ошибки в процессе анализа в случае подключения к доверенному серверу начальной загрузки устройство должно попытаться передать отчёт parsing-error перед выходом.

Если заданы критерии для загрузочного образа, устройство должно сначала проверить, соответствует ли им запущенный образ загрузки. Если на устройстве уже запущен указанный загрузочный образ, оставшаяся часть этого этапа пропускается. Если указанный образ ещё не запущен, устройство должно его загрузить, проверить и установить (в указанном порядке) и перезагрузиться. При подключении к доверенному серверу начальной загрузки устройство может попытаться отправить отчёт boot-image-mismatch. Для загрузки (download) образа устройство должно применять лишь URI, указанные вводными данными. Для проверки загрузочного образа устройство должно использовать проверочные отпечатки, представленные вводными данными, или криптографическую подпись, встроенную в сам образ загрузки, используя механизм, не задаваемый данным документом. До перезагрузки (при подключении к доверенному bootstrap-серверу) устройство должно попытаться передать отчёт boot-image-installed-rebooting. После перезапуска процесс начальной загрузки запускается снова, что в конечном итоге приведёт опять к этому шагу, но затем устройство запустит указанный образ загрузки и перейдёт к следующему шагу. Если при подключении к доверенному bootstrap-серверу происходит ошибка на любом этапе (до перезагрузки), устройство должно попытаться передать отчёт boot-image-error перед выходом.

Если задан сценарий предварительной настройки, устройство должно выполнить его, фиксируя весь вывод, а затем проверить наличие ошибок и предупреждений. Если возникает ошибка при соединении с доверенным сервером начальной загрузки, устройство должно попытаться передать отчёт pre-script-error перед выходом.

Если задана исходная конфигурация, устройство должно неделимо (atomically) представить её устройству, используя подход, заданный листом configuration-handling. Если возникает ошибка при соединении с доверенным сервером начальной загрузки, устройство должно попытаться передать отчёт config-error перед выходом.

Если задан сценарий для выполнения после настройки конфигурации, устройство должно выполнить его, фиксируя весь вывод, а затем проверить наличие ошибок и предупреждений. Если возникает ошибка при соединении с доверенным сервером начальной загрузки, устройство должно попытаться передать отчёт post-script-error перед выходом.

Если вводные данные были получены от доверенного bootstrap-сервера и в результате начальной загрузки не был сброшен флаг начальной загрузки SZTP, описанный в параграфе 5.1. Исходное состояние, устройству следует передать отчёт bootstrap-warning.

Если вводные данные были получены от доверенного bootstrap-сервера, устройство должно передать отчёт bootstrap-complete. Отсутствие возврата строки состояния HTTP «204 No Content» является ошибкой и при её возникновении устройство должно попытаться отправить отчёт bootstrap-error перед выходом.

На этом процесс обработки данных начальной загрузки завершается. Устройство работает с исходной конфигурацией. Если настроен звонок NETCONF Call Home или RESTCONF Call Home [RFC8071], устройство пытается связаться по телефону с указанным номером.

Примечание для разработчиков. Реализации могут отличаться способом предотвращения сохранения нежелательных состояний при ошибках в процесс загрузки. Если реализация возвращается (undo) к предыдущему шагу, применимы указанные ниже рекомендации.

  • При возникновении ошибки устройство может отказаться от текущего и любых предшествующих шагов.

  • Большинство шагов неделимы, например, обработка конфигурации (см. выше), обработка сценариев (как задано в модуле YANG ietf-sztp-conveyed-info).

  • В случае ошибки после установки начальной конфигурации устройство должно восстановить прежнюю конфигурацию.

  • В случае ошибки после успешного выполнения сценария для реализации может быть полезно иметь сценарий, способный принимать на входе параметр, указывающий необходимость удалить созданное предыдущим сценарием состояние.

6. Модель данных для передаваемых сведений

В этом разделе задан модуль YANG 1.1 [RFC7950], служащий для определения модели данных для артефакта передаваемых сведений, описанного в параграфе 3.1. Модель использует оператор расширения yang-data, заданный в [RFC8040]. Примеры, иллюстрирующие модель данных, представлены в параграфе 6.2.

6.1. Обзор модели данных

Ниже представлено дерево, иллюстрирующее модель данных для артефакта передаваемых сведений.

         module: ietf-sztp-conveyed-info

           yang-data conveyed-information:
             +-- (information-type)
                +--:(redirect-information)
                |  +-- redirect-information
                |     +-- bootstrap-server* [address]
                |        +-- address         inet:host
                |        +-- port?           inet:port-number
                |        +-- trust-anchor?   cms
                +--:(onboarding-information)
                   +-- onboarding-information
                      +-- boot-image
                      |  +-- os-name?              string
                      |  +-- os-version?           string
                      |  +-- download-uri*         inet:uri
                      |  +-- image-verification* [hash-algorithm]
                      |     +-- hash-algorithm    identityref
                      |     +-- hash-value        yang:hex-string
                      +-- configuration-handling?      enumeration
                      +-- pre-configuration-script?    script
                      +-- configuration?               binary
                      +-- post-configuration-script?   script

6.2. Пример использования

Приведённый ниже пример иллюстрирует кодирование сведений о перенаправлении (параграф 2.1) с использованием JSON [RFC8259].

   {
     "ietf-sztp-conveyed-info:redirect-information" : {
       "bootstrap-server" : [
         {
           "address" : "sztp1.example.com",
           "port" : 8443,
           "trust-anchor" : "base64encodedvalue=="
         },
         {
           "address" : "sztp2.example.com",
           "port" : 8443,
           "trust-anchor" : "base64encodedvalue=="
         },
         {
           "address" : "sztp3.example.com",
           "port" : 8443,
           "trust-anchor" : "base64encodedvalue=="
         }
       ]
     }
   }

Следующий пример показывает кодирование вводных данных (параграф 2.2) с использованием JSON [RFC8259]7.

   {
     "ietf-sztp-conveyed-info:onboarding-information" : {
       "boot-image" : {
         "os-name" : "VendorOS",
         "os-version" : "17.2R1.6",
         "download-uri" : [ "https://example.com/path/to/image/file" ],
         "image-verification" : [
           {
             "hash-algorithm" : "ietf-sztp-conveyed-info:sha-256",
             "hash-value" : "ba:ec:cf:a5:67:82:b4:10:77:c6:67:a6:22:ab:\
   7d:50:04:a7:8b:8f:0e:db:02:8b:f4:75:55:fb:c1:13:b2:33"
           }
         ]
       },
       "configuration-handling" : "merge",
       "pre-configuration-script" : "base64encodedvalue==",
       "configuration" : "base64encodedvalue==",
       "post-configuration-script" : "base64encodedvalue=="
     }
   }

6.3. Модуль YANG

В этом параграфе представлен модуль YANG для передаваемых сведений. В этом модуле применяются типы данных из [RFC5280], [RFC5652], [RFC6234] и [RFC6991], оператор расширения из [RFC8040] и кодирование, определённое в [ITU.X690.2015].

  <CODE BEGINS> file "ietf-sztp-conveyed-info@2019-04-30.yang"
  module ietf-sztp-conveyed-info {
    yang-version 1.1;
    namespace "urn:ietf:params:xml:ns:yang:ietf-sztp-conveyed-info";
    prefix sztp-info;

    import ietf-yang-types {
      prefix yang;
      reference
        "RFC 6991: Common YANG Data Types";
    }
    import ietf-inet-types {
      prefix inet;
      reference
        "RFC 6991: Common YANG Data Types";
    }
    import ietf-restconf {
      prefix rc;
      reference
        "RFC 8040: RESTCONF Protocol";
    }

    organization
      "IETF NETCONF (Network Configuration) Working Group";
    contact
      "WG Web:   <https://datatracker.ietf.org/wg/netconf/> 
       WG List:  <mailto:netconf@ietf.org> 
       Author:   Kent Watsen <mailto:kent+ietf@watsen.net>"; 
    description
      "Этот модуль задаёт модель данных для артефакта передаваемых
       сведений, определённого в RFC 8572 (Secure Zero Touch
       Provisioning (SZTP)).

       Ключевые слова ДОЛЖНО, НЕДОПУСТИМО, ТРЕБУЕТСЯ, НУЖНО, НЕ НУЖНО, 
       СЛЕДУЕТ, НЕ СЛЕДУЕТ, РЕКОМЕНДУЕТСЯ, НЕ РЕКОМЕНДУЕТСЯ, МОЖНО,
       НЕОБЯЗАТЕЛЬНО в этом документе трактуются в соответствии с 
       BCP 14 (RFC 2119) (RFC 8174) тогда и только тогда, когда они
       указаны заглавными буквами, как показано здесь.
       Авторские права (Copyright (c) 2019) принадлежат IETF Trust
       и лицам, указанным как авторы кода. Все права защищены.

       Распространение и использование модуля в исходном или двоичном
       формате, с изменениями или без таковых разрешено в соответствии 
       с условиями лицензии Simplified BSD License, изложенными в
       разделе 4.c документа IETF Trust's Legal Provisions применительно
       к документам IETF (http://trustee.ietf.org/license-info). 
 
       Эта версия модуля YANG является частью RFC 8572, где правовые
       аспекты изложены более полно.";

    revision 2019-04-30 {
      description
        "Исходная версия";
      reference
        "RFC 8572: Secure Zero Touch Provisioning (SZTP)";
    }

    // Отождествления
    identity hash-algorithm {
      description
        "Базовое отождествление для проверки алгоритма хэширования.";
    }

    identity sha-256 {
      base hash-algorithm;
      description
        "Алгоритм SHA-256.";
      reference
        "RFC 6234: US Secure Hash Algorithms";
    }

    // Определения типов
    typedef cms {
      type binary;
      description
        "Структура ContentInfo, заданная в RFC 5652, кодируется
         с применением правил ASN.1 (DER), заданных в ITU-T X.690.";
      reference
        "RFC 5652:
           Cryptographic Message Syntax (CMS)

         ITU-T X.690:
           Information technology - ASN.1 encoding rules:
           Specification of Basic Encoding Rules (BER),
           Canonical Encoding Rules (CER) and Distinguished
           Encoding Rules (DER)";
    }

    // yang-data
    rc:yang-data conveyed-information {
      choice information-type {
        mandatory true;
        description
          "Этот выбор обеспечивает наличие в отклике
           redirect-information или onboarding-information.";
        container redirect-information {
          description
            "Сведения о перенаправлении в соответствии с параграфом 2.1
             в RFC 8572. Предназначены для перенаправления устройства
             на другой сервер начальной загрузки.";
          reference
            "RFC 8572: Secure Zero Touch Provisioning (SZTP)";
          list bootstrap-server {
            key "address";
            min-elements 1;
            description
              "Сервер начальной загрузки (bootstrap).";
            leaf address {
              type inet:host;
              mandatory true;
              description
                "Адрес IP или имя хоста bootstrap-сервера, на который
                 следует перенаправить устройство.";
            }
            leaf port {
              type inet:port-number;
              default "443";
              description
                "Номер порта на bootstrap-сервере. По умолчанию 
                 применяется выделенный IANA порт https (443).";
            }
            leaf trust-anchor {
              type cms;
              description
                "Структура CMS, которая ДОЛЖНА содержать цепочку
                 сертификатов X.509, требуемых для аутентификации 
                 сертификата TLS, представленного bootstrap-сервером.

                 В CMS ДОЛЖНА содержаться лишь 1 цепочка сертификатов.
                 Bootstrap-сервер ДОЛЖЕН аутентифицировать лишь
                 последний промежуточный сертификат CA в цепочке.

                 Во всех случаях цепочка ДОЛЖНА включать самоподписанный
                 корневой сертификат. Если корневой сертификат связан с
                 эмитентом сертификата TLS bootstrap-сервера, в цепочке
                 будет присутствовать лишь этот сертификат.

                 Если устройству нужно, структура CMS МОЖЕТ также
                 включать подходящие свежие объекты отзыва, по которым
                 устройство может проверить статус отзыва сертификатов.

                 CMS кодируется вырожденной формой структуры SignedData,
                 обычно применяемой для распространения сертификатов 
                 X.509 и объектов отзыва (RFC 5280).";
              reference
                "RFC 5280:
                   Internet X.509 Public Key Infrastructure Certificate
                   and Certificate Revocation List (CRL) Profile";
            }
          }
        }
        container onboarding-information {
          description
            "Вводные сведения, описанные в параграфе 2.2 RFC 8572.
             Предоставляют устройству всё, что нужно для начальной
             загрузки.";
          reference
            "RFC 8572: Secure Zero Touch Provisioning (SZTP)";
          container boot-image {
            description
              "Критерии для загрузочного образа, который ДОЛЖЕН 
               запускаться на устройстве, а также сведения, 
               позволяющие устройству установить требуемый образ.";
            leaf os-name {
              type string;
              description
                "Название операционной системы, которая ДОЛЖНА быть
                 загружена на устройстве, чтобы не требовалось обновлять
                 программный образ (например, VendorOS).";
            }
            leaf os-version {
              type string;
              description
                "Версия операционной системы, которая ДОЛЖНА быть
                 загружена на устройстве, чтобы не требовалось обновлять
                 программный образ (например, 17.3R2.1).";
            }
            leaf-list download-uri {
              type inet:uri;
              ordered-by user;
              description
                "Упорядоченный список URI, откуда можно получить один и
                 тот же файл образа загрузки. Поддерживаемые устройством 
                 схемы URI (http, ftp, и пр.) зависят от производителя.
                 Если применяется защищённая схема (например, https),
                 устройство МОЖЕТ организовать недоверенное соединение с
                 удаленным сервером, вслепую принимая его сертификат для
                 получения загрузочного образа.";
            }
            list image-verification {
              must '../download-uri' {
                description
                  "URI для загрузки должны предоставляться, если
                   требуется проверка образа.";
              }
              key "hash-algorithm";
              description
                "Список хэш-значений, которые устройство может 
                 использовать для проверки файла образа загрузки.";
              leaf hash-algorithm {
                type identityref {
                  base hash-algorithm;
                }
                description
                  "Указывает используемый алгоритм хэширования.";
              }
              leaf hash-value {
                type yang:hex-string;
                mandatory true;
                description
                  "Шестнадцатеричное значение заданного алгоритма
                   хэширования, применённого к содержимому образа.";
              }
            }
          }
          leaf configuration-handling {
            type enumeration {
              enum merge {
                description
                  "Слияние конфигурации с рабочим хранилищем.";
              }
              enum replace {
                description
                  "Замена имеющегося содержимого рабочего хранилища 
                   переданной конфигурацией.";
              }
            }
            must '../configuration';
            description
              "Указывает, как серверу следует обрабатывать
               представленную конфигурацию.";
          }
          leaf pre-configuration-script {
            type script;
            description
              "Сценарий, который (при наличии) выполняется перед 
               обработкой конфигурации.";
          }
          leaf configuration {
            type binary;
            must '../configuration-handling';
            description
              "Любая конфигурация, известная устройству. Применение типа
               binary позволяет встраивать содержимое (например, XML) в
               документ JSON. Кодирование содержимого, как и для 
               сценария, зависит от производителя.";
          }
          leaf post-configuration-script {
            type script;
            description
              "Сценарий, который (при наличии) выполняется после 
               обработки конфигурации.";
          }
        }
      }
    }

    typedef script {
      type binary;
      description
        "Сценарий для конкретного устройства, позволяющий выполнять
         команды для действий, недоступных через настройку конфигурации.

         Не предпринимается попыток стандартизации содержимого,
         контекста работы, языка программирования сценариев, кроме
         возможности указания предупреждений и ошибок, а также выдачи
         вывода. Содержимое сценария считается зависящим от
         производителя, линейки продукции и/или модели устройства.

         Если при выполнении сценария выдавались предупреждения,
         устройство ДОЛЖНО считать, что в сценарии имеются «мягкие»
         ошибки, не влияющие на управляемость по мнению сценария.

         Если при выполнении сценария возникли ошибки, устройство
         ДОЛЖНО считать, что в сценарии имеются серьёзные ошибки,
         влияющие на управляемость. В этом случае сценарий должен
         аккуратно завершить работу, удалив все состояния, которые
         могут мешать устройству продолжить последовательность
         начальной загрузки (например, обработку вводных сведений
         от другого сервера начальной загрузки).";
    }
  }
  <CODE ENDS>

7. API сервера начальной загрузки SZTP

В этом разделе определяется интерфейс API для серверов начальной загрузки. API определяется как созданный сервером RESTCONF [RFC8040], который поддерживает определённый в этом разделе модуль YANG 1.1 [RFC7950].

7.1. Обзор API

Ниже представлено дерево для RESTCONF API сервера начальной загрузки.

   module: ietf-sztp-bootstrap-server

     rpcs:
       +---x get-bootstrapping-data
       |  +---w input
       |  |  +---w signed-data-preferred?   empty
       |  |  +---w hw-model?                string
       |  |  +---w os-name?                 string
       |  |  +---w os-version?              string
       |  |  +---w nonce?                   binary
       |  +--ro output
       |     +--ro reporting-level?    enumeration {onboarding-server}?
       |     +--ro conveyed-information    cms
       |     +--ro owner-certificate?      cms
       |     +--ro ownership-voucher?      cms
       +---x report-progress {onboarding-server}?
          +---w input
             +---w progress-type         enumeration
             +---w message?              string
             +---w ssh-host-keys
             |  +---w ssh-host-key* []
             |     +---w algorithm    string
             |     +---w key-data     binary
             +---w trust-anchor-certs
                +---w trust-anchor-cert*   cms

7.2. Пример использования

В этом параграфе приведены три примера, иллюстрирующие API сервера начальной загрузки. Два примера относятся к RPC get-bootstrapping-data (для недоверенного и доверенного bootstrap-сервера), один — к RPC report-progress.

В приведённом ниже примере показано устройство, применяющее API для получения данных начальной загрузки от недоверенного bootstrap-сервера. Устройство передаёт входной параметр signed-data-preferred и получает в ответ подписанные данные.

Запрос

   POST /restconf/operations/ietf-sztp-bootstrap-server:get-bootstrappi\
   ng-data HTTP/1.1
   HOST: example.com
   Content-Type: application/yang-data+xml8

   <input
     xmlns="urn:ietf:params:xml:ns:yang:ietf-sztp-bootstrap-server">
     <signed-data-preferred/>
   </input>

Отклик

   HTTP/1.1 200 OK
   Date: Sat, 31 Oct 2015 17:02:40 GMT
   Server: example-server
   Content-Type: application/yang-data+xml

   <output
     xmlns="urn:ietf:params:xml:ns:yang:ietf-sztp-bootstrap-server">
     <conveyed-information>base64encodedvalue==</conveyed-information>
     <owner-certificate>base64encodedvalue==</owner-certificate>
     <ownership-voucher>base64encodedvalue==</ownership-voucher>
   </output>

В приведённом ниже примере показано устройство, применяющее API для получения данных начальной загрузки от доверенного bootstrap-сервера. Устройство передаёт серверу начальной загрузки дополнительные входные параметры, которые тот может использовать для подготовки отклика устройству.

Запрос

   POST /restconf/operations/ietf-sztp-bootstrap-server:get-bootstrappi\
   ng-data HTTP/1.1
   HOST: example.com
   Content-Type: application/yang-data+xml

   <input
     xmlns="urn:ietf:params:xml:ns:yang:ietf-sztp-bootstrap-server">
     <hw-model>model-x</hw-model>
     <os-name>vendor-os</os-name>
     <os-version>17.3R2.1</os-version>
     <nonce>extralongbase64encodedvalue=</nonce>
   </input>

Отклик

   HTTP/1.1 200 OK
   Date: Sat, 31 Oct 2015 17:02:40 GMT
   Server: example-server
   Content-Type: application/yang-data+xml

   <output
     xmlns="urn:ietf:params:xml:ns:yang:ietf-sztp-bootstrap-server">
     <reporting-level>verbose</reporting-level>
     <conveyed-information>base64encodedvalue==</conveyed-information>
   </output>

Следующий пример показывает устройство, использующее API для отправки отчёта о выполнении серверу начальной загрузки. Приведено сообщение bootstrap-complete, но устройство может передавать серверу другие отчёты. В примере устройство отправляет SSH-ключи хоста и сертификат TLS, которые bootstrap-сервер может, например, передать в NMS, как описано в приложении C.3. Включение устройства.

Запрос

   POST /restconf/operations/ietf-sztp-bootstrap-server:report-progress\
    HTTP/1.1
   HOST: example.com
   Content-Type: application/yang-data+xml

   <input
     xmlns="urn:ietf:params:xml:ns:yang:ietf-sztp-bootstrap-server">
     <progress-type>bootstrap-complete</progress-type>
     <message>example message</message>
     <ssh-host-keys>
       <ssh-host-key>
         <algorithm>ssh-rsa</algorithm>
         <key-data>base64encodedvalue==</key-data>
       </ssh-host-key>
       <ssh-host-key>
         <algorithm>rsa-sha2-256</algorithm>
         <key-data>base64encodedvalue==</key-data>
       </ssh-host-key>
     </ssh-host-keys>
     <trust-anchor-certs>
       <trust-anchor-cert>base64encodedvalue==</trust-anchor-cert>
     </trust-anchor-certs>
   </input>

Отклик

   HTTP/1.1 204 No Content
   Date: Sat, 31 Oct 2015 17:02:40 GMT
   Server: example-server

7.3. Модуль YANG

Приведённый ниже модуль YANG формально определяет интерфейс API сервера начальной загрузки, обращённый в сторону устройства. В модуле используются типы данных, определённые в [RFC4253], [RFC5652], [RFC5280] и [RFC8366], кодирование, определённое в [ITU.X690.2015], и ссылки на [RFC4250], [RFC6187], [Std-802.1AR].

   <CODE BEGINS> file "ietf-sztp-bootstrap-server@2019-04-30.yang"
   module ietf-sztp-bootstrap-server {
     yang-version 1.1;
     namespace "urn:ietf:params:xml:ns:yang:ietf-sztp-bootstrap-server";
     prefix sztp-svr;

     organization
       "IETF NETCONF (Network Configuration) Working Group";
     contact
       "WG Web:   <https://datatracker.ietf.org/wg/netconf/> 
        WG List:  <mailto:netconf@ietf.org> 
        Author:   Kent Watsen <mailto:kent+ietf@watsen.net>"; 
     description
       "This module defines an interface for bootstrap servers, as
        defined by RFC 8572 ('Secure Zero Touch Provisioning (SZTP)').

        Ключевые слова ДОЛЖНО, НЕДОПУСТИМО, ТРЕБУЕТСЯ, НУЖНО, НЕ НУЖНО, 
        СЛЕДУЕТ, НЕ СЛЕДУЕТ, РЕКОМЕНДУЕТСЯ, НЕ РЕКОМЕНДУЕТСЯ, МОЖНО,
        НЕОБЯЗАТЕЛЬНО в этом документе трактуются в соответствии с 
        BCP 14 (RFC 2119) (RFC 8174) тогда и только тогда, когда они
        указаны заглавными буквами, как показано здесь.

        Авторские права (Copyright (c) 2019) принадлежат IETF Trust
        и лицам, указанным как авторы кода. Все права защищены.

        Распространение и использование модуля в исходном или двоичном
        формате, с изменениями или без таковых разрешено в соответствии 
        с условиями лицензии Simplified BSD License, изложенными в
        разделе 4.c документа IETF Trust's Legal Provisions применительно
        к документам IETF (http://trustee.ietf.org/license-info). 
 
        Эта версия модуля YANG является частью RFC 8572, где правовые
        аспекты изложены более полно.";

     revision 2019-04-30 {
       description
         "Initial version";
       reference
         "RFC 8572: Secure Zero Touch Provisioning (SZTP)";
     }

     // Свойства
     feature redirect-server {
       description
         "Поддерживается функция сервера перенаправления.";
     }

     feature onboarding-server {
       description
         "Поддерживается функция сервера вводных сведений.";
     }

     // Определения типов
     typedef cms {
       type binary;
       description
         "Структура CMS в соответствии с RFC 5652, закодированная по
          правилам ASN.1 DER, заданным в ITU-T X.690.";
       reference
         "RFC 5652: Cryptographic Message Syntax (CMS)
          ITU-T X.690:
            Information technology - ASN.1 encoding rules:
            Specification of Basic Encoding Rules (BER),
            Canonical Encoding Rules (CER) and Distinguished
            Encoding Rules (DER)";
     }

     // RPC
     rpc get-bootstrapping-data {
       description
         "Этот вызов RPC позволяет устройству, указанному именем 
          пользователя RESTCONF, получить данные начальной загрузки,
          доступные для него.";
       input {
         leaf signed-data-preferred {
           type empty;
           description
             "Этот необязательный входной параметр позволяет устройству
              взаимодействовать с bootstrap-сервером, который он
              предпочитает для получения подписанных данных. Устройствам
              СЛЕДУЕТ всегда передавать этот параметр недоверенному
              bootstrap-серверу, который при получении параметра ДОЛЖЕН
              возвратить подписанные данные или неподписанные сведения о
              перенаправлении. Серверу НЕДОПУСТИМО возвращать
              неподписанные вводные сведения.";
         }
         leaf hw-model {
           type string;
           description
             "Этот необязательный входной параметр позволяет устройству
              передать bootstrap-серверу свой аппаратный номер модели, 
              заданный производителем. Этот параметр может требоваться,
              например, при отсутствии значения hardwareModelName в поле
              subjectAltName его сертификата IDevID, что разрешено 
              802.1AR.";
           reference
             "IEEE 802.1AR: IEEE Standard for Local and
                metropolitan area networks - Secure
                Device Identity";
         }
         leaf os-name {
           type string;
           description
             "Этот необязательный входной параметр позволяет устройству
              передать bootstrap-серверу имя своей операционной системы.
              Этот параметр может быть полезен, если на устройстве, 
              указанном серийным номером, могут работать разные ОС.";
         }
         leaf os-version {
           type string;
           description
             "Этот необязательный входной параметр позволяет устройству
              передать bootstrap-серверу версию своей операционной 
              системы. Этот параметр может применяться bootstrap-
              сервером для возврата устройству зависящего от ОС отклика
              без необходимости потенциально «дорогого» обновления 
              загрузочного образа.";
         }
         leaf nonce {
           type binary {
             length "16..32";
           }
           description
             "Этот необязательный входной параметр позволяет устройству
              передать bootstrap-серверу значение nonce. Это может быть
              особенно полезно для устройств без точных часов, так как
              bootstrap-сервер может динамически получать от 
              изготовителя ваучер со значением nonce, как описано в 
              RFC 8366.";
           reference
             "RFC 8366:
                A Voucher Artifact for Bootstrapping Protocols";
         }
       }
       output {
         leaf reporting-level {
           if-feature "onboarding-server";
           type enumeration {
             enum minimal {
               description
                 "Передать отчёт о выполнении, требуемый RFC 8572.";
               reference
                 "RFC 8572: Secure Zero Touch Provisioning (SZTP)";
             }
             enum verbose {
               description
                 "Передача дополнительных отчётов о выполнении, 
                  которые могут помочь в диагностике проблем SZTP.";
             }
           }
           default "minimal";
           description
             "Задаёт уровень отчётов о выполнении, которые bootstrap-
              сервер хотел бы получать при обработке вводных данных.
              Отчёты не передаются при обработке сведений о 
              перенаправлении и недоверенным серверам начальной
              загрузки (например, устройство передало входной 
              параметр <signed-data-preferred>).";
         }
         leaf conveyed-information {
           type cms;
           mandatory true;
           description
             "Артефакт передаваемых сведений SZTP, как описано в 
              параграфе 3.1 RFC 8572.";
           reference
             "RFC 8572: Secure Zero Touch Provisioning (SZTP)";
         }
         leaf owner-certificate {
           type cms;
           must '../ownership-voucher' {
             description
               "Ваучер владения должен предоставляться при представлении
                сертификата владельца.";
           }
           description
             "Артефакт сертификата владельца, описанный в параграфе 3.2
              RFC 8572. Этот лист не обязателен, поскольку он нужен лишь
              в случае подписанного артефакта передаваемых сведений.";
           reference
             "RFC 8572: Secure Zero Touch Provisioning (SZTP)";
         }
         leaf ownership-voucher {
           type cms;
           must '../owner-certificate' {
             description
               "Сертификат владельца должен быть предоставлен при
                представлении ваучера владения.";
           }
           description
             "Артефакт ваучера владения, описанный в параграфе 3.3
              RFC 8572. Этот лист не обязателен, поскольку он нужен лишь
              в случае подписанного артефакта передаваемых сведений.";
           reference
             "RFC 8572: Secure Zero Touch Provisioning (SZTP)";
         }
       }
     }

     rpc report-progress {
       if-feature "onboarding-server";
       description
         "Этот вызов RPC позволяет устройству, указанному именем 
          пользователя RESTCONF, сообщить bootstrap-серверу о своём 
          процессе загрузки. Предполагается применение RPC при
          получении устройством вводных сведений от доверенного
          сервера начальной загрузки.";
       input {
         leaf progress-type {
           type enumeration {
             enum bootstrap-initiated {
               description
                 "Указывает, что устройство применяет RPC
                  get-bootstrapping-data. Узел message ниже МОЖЕТ
                  включать любые дополнительные сведения, которые
                  изготовитель может считать полезными.";
             }
             enum parsing-initiated {
               description
                 "Указывает, что устройство собирается начать анализ 
                  вводных сведений. Это предназначено лишь для случаев,
                  когда анализ реализован в виде отдельного этапа.";
             }
             enum parsing-warning {
               description
                 "Указывает, что устройство столкнулось с некритической
                  ошибкой при анализе отклика от сервера. В узле message
                  ниже СЛЕДУЕТ указать полученное предупреждение.";
             }
             enum parsing-error {
               description
                 "Указывает, что устройство столкнулось с критической
                  ошибкой при анализе отклика от сервера. Например, это
                  может быть результат ошибочного кодирования, получения
                  устройством неподписанных данных вместо подписанных,
                  отсутствия в ваучере владения серийного номера 
                  устройства, несоответствия подписи. В узле message 
                  ниже СЛЕДУЕТ указать конкретную ошибку. Этот тип также
                  указывает, что устройство отказалось от попытки 
                  начальной загрузки с этого bootstrap-сервера.";
             }
             enum parsing-complete {
               description
                 "Указывает, что устройство успешно завершило анализ 
                  вводных сведений. Этот тип применяется лишь при
                  реализации анализа на отдельном этапе.";
             }
             enum boot-image-initiated {
               description
                 "Указывает, что устройство начинает обработку данных
                  загрузочного образа.";
             }
             enum boot-image-warning {
               description
                 "Указывает, что устройство столкнулось с некритической
                  ошибкой при попытке установить загрузочный образ.
                  Возможные причины могут включать необходимость
                  форматирования раздела с потерей данных. В узле message
                  ниже СЛЕДУЕТ указать полученные предупреждения.";
             }
             enum boot-image-error {
               description
                 "Указывает, что устройство столкнулось с ошибкой
                  при попытке установить загрузочный образ. Это
                  может быть связано с недоступностью файлового сервера,
                  отсутствием файла, несоответствием подписи и пр. В 
                  узле message ниже СЛЕДУЕТ указать конкретную ошибку. 
                  Этот тип также  указывает, что устройство отказалось 
                  от попытки начальной загрузки с этого сервера.";
             }
             enum boot-image-mismatch {
               description
                 "Указывает, что устройство определило, что на нем
                  работает некорректный загрузочный образ. Этому 
                  сообщению СЛЕДУЕТ вызывать попытку загрузить
                  (download) образ.";
             }
             enum boot-image-installed-rebooting {
               description
                 "Указывает, что устройство установило новый загрузочный
                  образ и начинает перезапуск. После отправки этого
                  сообщения от устройства не ожидается нового обращения
                  к bootstrap-серверу для попытки начальной загрузки.";
             }
             enum boot-image-complete {
               description
                 "Указывает, что устройство считает, что на нем работает
                  корректный загрузочный образ.";
             }
             enum pre-script-initiated {
               description
                 "Указывает, что устройство начинает выполнение сценария
                  pre-configuration-script.";
             }
             enum pre-script-warning {
               description
                 "Указывает, что устройство получило предупреждение при
                  выполнении сценария pre-configuration-script. В узел
                  message ниже СЛЕДУЕТ включить весь вывод сценария.";
             }
             enum pre-script-error {
               description
                 "Указывает, что устройство столкнулось с ошибкой при
                  выполнении сценария pre-configuration-script. В узел
                  message ниже СЛЕДУЕТ включить весь вывод сценария.
                  Этот тип также  указывает, что устройство отказалось 
                  от попытки начальной загрузки с этого сервера.";
             }
             enum pre-script-complete {
               description
                 "Указывает, что устройство успешно выполнило сценарий
                  pre-configuration-script.";
             }
             enum config-initiated {
               description
                 "Указывает, что устройство начинает применять исходную
                  конфигурацию.";
             }
             enum config-warning {
               description
                 "Указывает, что устройство получило предупреждение при
                  представлении исходной конфигурации. В узел message
                  ниже СЛЕДУЕТ включить все выданные предупреждения.";
             }
             enum config-error {
               description
                 "Указывает, что устройство столкнулось с ошибкой при
                  представлении исходной конфигурации. В узел message
                  ниже СЛЕДУЕТ включить все сообщения об ошибках.
                  Этот тип также  указывает, что устройство отказалось 
                  от попытки начальной загрузки с этого сервера.";
             }
             enum config-complete {
               description
                 "Указывает, что устройство успешно установило исходную
                  конфигурацию.";
             }
             enum post-script-initiated {
               description
                 "Указывает, что устройство начинает выполнение сценария
                  post-configuration-script.";
             }
             enum post-script-warning {
               description
                  "Указывает, что устройство получило предупреждение при
                  выполнении сценария post-configuration-script. В узел
                  message ниже СЛЕДУЕТ включить весь вывод сценария.";
             }
             enum post-script-error {
               description
                 "Указывает, что устройство столкнулось с ошибкой при
                  выполнении сценария post-configuration-script. В узел
                  message ниже СЛЕДУЕТ включить весь вывод сценария.
                  Этот тип также  указывает, что устройство отказалось 
                  от попытки начальной загрузки с этого сервера.";
             }
             enum post-script-complete {
               description
                 "Указывает, что устройство успешно выполнило сценарий
                  post-configuration-script.";
             }
             enum bootstrap-warning {
               description
                 "Указывает предупреждение, для которого не подходит ни
                  одно из перечисляемых progress-type. В узле message
                  СЛЕДУЕТ описать предупреждение.";
             }
             enum bootstrap-error {
               description
                 "Указывает ошибку, для которой не подходит ни одно
                  из перечисляемых progress-type. В узле message СЛЕДУЕТ
                  описать ошибку. Этот тип также  указывает, что 
                  устройство отказалось от попытки начальной загрузки 
                  с этого сервера.";
             }
             enum bootstrap-complete {
               description
                 "Указывает, что устройство успешно обработало целиком
                  onboarding-information и готово к управлению. Узел 
                  message ниже МОЖЕТ включать любые дополнительные 
                  сведения, которые изготовитель может счесть полезными.
                  После отправки этого сообщения от устройства не 
                  ожидается нового обращения к bootstrap-серверу для 
                  попытки начальной загрузки.";
             }
             enum informational {
               description
                 "Указывает дополнительную информацию, не включённую в
                  другие типы, например, сообщение указывающее, что
                  устройство начинает перезапуск после установки
                  предоставленного образа загрузки. В узел message ниже
                  СЛЕДУЕТ включит сведения, которые изготовитель может 
                  счесть полезными.
             }
           }
           mandatory true;
           description
             "Тип предоставляемого отчёта о выполнении.";
         }
         leaf message {
           type string;
           description
             "Необязательное произвольное значение.";
         }
         container ssh-host-keys {
           when "../progress-type = 'bootstrap-complete'" {
             description
               "SSH-ключи хоста передаются лишь для типа 
                bootstrap-complete'.";
           }
           description
             "Список SSH-ключей хоста, которые NMS может использовать
              для аутентификации последующих соединений SSH с этим
              устройством (например, netconf-ssh, netconf-ch-ssh).";
           list ssh-host-key {
             description
               "SSH-ключ хоста, который NMS может использовать для
                аутентификации последующих соединений SSH с этим
                устройством (например, netconf-ssh, netconf-ch-ssh).";
             reference
               "RFC 4253: The Secure Shell (SSH) Transport Layer
                          Protocol";
             leaf algorithm {
               type string;
               mandatory true;
               description
                 "Имя алгоритма с открытым ключом для этого ключа SSH.

                  Пригодные значения указаны в субреесте Public Key 
                  Algorithm Names реестра Secure Shell (SSH) Protocol
                  Parameters, поддерживаемого IANA.";
               reference
                 "RFC 4250: The Secure Shell (SSH) Protocol Assigned
                            Numbers
                  IANA URL: <https://www.iana.org/assignments/ssh-parame\\
                             ters> 
                            (\\ добавлено для форматирования)";
             }
             leaf key-data {
               type binary;
               mandatory true;
               description
                 "Двоичные данные открытого ключа для этого ключа SSH, 
                  как указано в параграфе 6.6 RFC 4253, т. е.:
                    string    идентификатор формата сертификата или
                              открытого ключа
                    byte[n]   данные ключа/сертификата.";
               reference
                 "RFC 4253: The Secure Shell (SSH) Transport Layer
                            Protocol";
             }
           }
         }
         container trust-anchor-certs {
           when "../progress-type = 'bootstrap-complete'" {
             description
               "Привязки доверия передаются лишь для отчётов типа 
                bootstrap-complete.";
           }
           description
             "Список сертификатов привязок доверия, которые NMS может
              использовать для аутентификации последующих соединений с
              этим устройством по сертификату (например., restconf-tls, 
              netconf-tls и даже netconf-ssh с поддержкой X.509 из 
              RFC 6187). На практике привязки доверия для сертификатов
              IDevID не нужно передавать с помощью этого механизма.";
           reference
             "RFC 6187: X.509v3 Certificates for Secure Shell
                        Authentication";
           leaf-list trust-anchor-cert {
             type cms;
             description
               "Структура CMS, где типом содержимого верхнего уровня 
                ДОЛЖЕН быть signed-data, как указано в разделе 5 RFC 5652.

                В CMS ДОЛЖНА содержаться цепочка сертификатов X.509,
                требуемых для аутентификации представленного устройством
                сертификата.

                В CMS  ДОЛЖНА содержаться лишь 1 цепочка сертификатов.
                Последним в цепочке ДОЛЖЕН быть эмитент сертификата
                устройства.

                Во всех случаях цепочка ДОЛЖНА включать самоподписанный
                корневой сертификат. Если эмитентом сертификата 
                устройства является корневой CA, присутствует лишь его
                сертификат.

                CMS представляется вырожденной формой структуры 
                SignedData, которая обычно служит для распространения
                сертификатов X.509 и объектов отзыва (RFC 5280).";
             reference
               "RFC 5280: Internet X.509 Public Key Infrastructure
                          Certificate and Certificate Revocation List
                          (CRL) Profile
                RFC 5652: Cryptographic Message Syntax (CMS)";
           }
         }
       }
     }
   }
   <CODE ENDS>

8. Опции DHCP

В этом разделе определены две опции DHCP — по одной для DHCPv4 и DHCPv6. Опции имеют одинаковую семантику, но разный синтаксис.

8.1. Опция DHCPv4 SZTP Redirect

Опция DHCPv4 SZTP Redirect служит для предоставления клиенту одного или нескольких URI, указывающих серверы начальной загрузки, с которых можно пытаться получить дополнительную конфигурацию.

             0                             1
             0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
            +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
            |   option-code (143)   |     option-length     |
            +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
            .                                               .
            .    bootstrap-server-list (переменный размер)  .
            .                                               .
            +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

option-code

OPTION_V4_SZTP_REDIRECT (143).

option-length

Размер опции в октетах.

bootstrap-server-list

Список серверов, с которыми клиент может пытаться контактировать для получения дополнительных данных начальной загрузки в формате, показанном в параграфе 8.3. Базовое кодирование полей.

Поведение клиента DHCPv4

Клиент может запросить опцию OPTION_V4_SZTP_REDIRECT включением её кода в Parameter Request List (55) запроса DHCP.

При получении сообщения DHCPv4 Reply с опцией OPTION_V4_SZTP_REDIRECT клиент обрабатывает отклик в соответствии с параграфом 5.5, считая что значения address и port закодированы в URI.

Недействительные записи URI в поле uri-data клиент игнорирует. Если принятая опция OPTION_V4_SZTP_REDIRECT не включает хотя бы одной действительной записи URI в поле uri-data, клиент должен отбросить опцию.

Поскольку размер URI может превышать разрешённую длину опции DHCPv4 (255 октетов), клиент должен реализовать поведение агента декодирования, описанное в [RFC3396], для корректной обработки списка URI, разнесенного по нескольким принятым экземплярам опции OPTION_V4_SZTP_REDIRECT.

Поведение сервера DHCPv4

Сервер DHCPv4 может включать опцию OPTION_V4_SZTP_REDIRECT в передаваемые сообщения DHCP.9

Сообщение от сервера DHCP должно включать лишь одно поле bootstrap-server-list в опцию OPTION_V4_SZTP_REDIRECT. Однако список URI в этом поле может выходить за пределы разрешённого размера опций DHCPv4 (в соответствии с [RFC3396]). Если поле bootstrap-server-list помещается в один экземпляр OPTION_V4_SZTP_REDIRECT, серверу недопустимо передавать более 1 экземпляра опции. Если размер поля bootstrap-server-list слишком велик для одной опции, опция OPTION_V4_SZTP_REDIRECT должна расщепляться на несколько экземпляров в соответствии с процессом, описанным в [RFC3396].

8.2. Опция DHCPv6 SZTP Redirect

Опция DHCPv6 SZTP Redirect служит для предоставления клиенту одного или нескольких URI, указывающих серверы начальной загрузки, с которых можно пытаться получить дополнительную конфигурацию.

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |       option-code (136)       |          option-length        |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     .    bootstrap-server-list (переменный размер)                  .
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

option-code

OPTION_V6_SZTP_REDIRECT (136).

option-length

Размер опции в октетах.

bootstrap-server-list

Список серверов, с которыми клиент может пытаться контактировать для получения дополнительных данных начальной загрузки в формате, показанном в параграфе 8.3. Базовое кодирование полей.

Поведение клиента DHCPv6

Клиент может запросить опцию OPTION_V6_SZTP_REDIRECT с помощью процесса, заданного в параграфах 18.2.1, 18.2.2, 18.2.4, 18.2.5, 18.2.6 и 21.7 [RFC8415]. Клиент включает коды запрашиваемых опций в опцию Option Request.

При получении сообщения DHCPv6 Reply с опцией OPTION_V6_SZTP_REDIRECT клиент обрабатывает отклик в соответствии с параграфом 5.5, считая что значения address и port закодированы в URI.

Недействительные записи URI в поле uri-data клиент игнорирует. Если принятая опция OPTION_V6_SZTP_REDIRECT не включает хотя бы одной действительной записи URI в поле uri-data, клиент должен отбросить опцию.

Поведение сервера DHCPv6

В параграфе 18.3 [RFC8415] описана работа сервера в части назначения опций. Сервер будет передавать конкретный код опции лишь в том случае, когда для этой опции заданы значения кодов и клиент запросил опцию.

Опция OPTION_V6_SZTP_REDIRECT является одиночной (singleton) и серверу недопустимо передавать более одного экземпляра этой опции.

8.3. Базовое кодирование полей

Опции DHCPv4 и DHCPv6, заданные здесь, кодируют список URI серверов начальной загрузки. Структура URI является опцией DHCP, которая может содержать несколько URI (см. параграф 5.7 в [RFC7227]). Формат записи URI в поле bootstrap-server-list показан ниже.

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...-+-+-+-+-+-+-+
    |       uri-length              |          URI                  |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...-+-+-+-+-+-+-+

uri-length

2-октетное поле размера данных URI.

URI

URI для сервера начальной загрузки SZTP.

В URI сервера начальной загрузки SZTP должна использоваться схема URI https, определённая в параграфе 2.7.2 [RFC7230], и форма должна иметь вид https://<ip-address-or-hostname>[:<port>].

9. Вопросы безопасности

9.1. Точность часов

Описанное в документе решение полагается на сертификаты TLS и владельцев, а также ваучеры владения, для корректной работы (например, проверка срока действия или статуса отзыва) с которыми требуются точные часы. Реализациям следует обеспечивать на устройствах точность часов при отгрузке с производства и предпринимать шаги по предотвращению искажений работы часов.

При отсутствии возможности обеспечить точность часов реализации рекомендуется отключить все аспекты, связанные с проверкой времени. В частности, таким реализациям следует считать, что сертификаты TLS, ваучеры владения и другие сертификаты действительны всегда и не могут быть отозваны. Для ваучеров владения изготовителям следует задавать один ваучер на весь срок службы устройства.

Реализациям не следует полагаться на протокол NTP, поскольку в настоящее время он не обеспечивает защиты. Отметим документ IETF, посвящённый защите протокола NTP [NTS-NTP].

9.2. Использование сертификатов IDevID

Сертификаты IDevID, определённые в [Std-802.1AR], рекомендуются как для клиентов TLS при подключении к серверам начальной загрузки, так и для идентификации устройств при шифровании артефактов данных начальной загрузки SZTP.

9.3. Неизменяемое хранилище для привязок доверия

Устройства должны гарантировать, что все их сертификаты привязок доверия, включая используемые для соединений с серверами начальной загрузки и проверки ваучеров владения, защищены от постороннего вмешательства.

Со временем может потребоваться обновление этих сертификатов (например, изготовитель может добавить CA). Поэтому предполагается, что устройства могут обновить эти привязки доверия при возникновении необходимости с помощью проверяемого процесса, такого как обновление программ с использованием подписанных образов.

9.4. Защищённое хранилище для долгосрочных секретных ключей

Созданные изготовителем идентификаторы устройства могут иметь очень долгий срок действия. Например, в [Std-802.1AR] рекомендуется использовать notAfter = 99991231235959Z в сертификатах IDevID. С учётом длительного использования этих секретных ключей крайне важно хранить их так, что они были недоступны, например, в защищённом криптографическом процессоре (микросхема TPM).

9.5. Аутентификация сервера начальной загрузки вслепую

Этот документ разрешает устройству вслепую аутентифицировать сертификат TLS сервера начальной загрузки. Это делается для случаев, когда сведения о перенаправлении получены без защиты, что иногда следует разрешать.

Для компенсации этого документ требует, чтобы при соединении с недоверенным сервером начальной загрузки устройства проверяли подписи для загружаемых с сервера данных.

9.6. Раскрытие информации недоверенным серверам

Этот документ разрешает устройствам подключение к недоверенным серверам начальной загрузки. Однако такой сервер может контролироваться злоумышленниками, поэтому устройствам следует соблюдать осторожность при передаче данных на сервер начальной загрузки.

Устройства передают bootstrap-серверам разные данные на каждом уровне протоколов — TCP, TLS, HTTP, RESTCONF.

На уровне TCP устройства передают свой адрес IP, который может транслироваться в сети, и риска безопасности здесь не возникает.

На уровне TLS устройства могут использовать клиентские сертификаты для идентификации и аутентификации себя на недоверенном сервере начальной загрузки. Сертификат должен указывать по меньшей мере серийный номер устройства и может раскрывать дополнительные сведения, такие как изготовитель, аппаратная версия (модель), открытый ключ и т. п. Наличие таких сведений может позволить злоумышленнику организовать атаку. Рекомендуется не полагаться на защиту сети в таких случаях.

На уровне HTTP устройства могут применять схему аутентификации HTTP для идентификации и подтверждения своей подлинности недоверенным серверам начальной загрузки. Схема аутентификации раскрывает, по меньшей мере, серийный номер устройства, а в зависимости от применяемого механизма аутентификации, может раскрывать секрет, который предполагается известным лишь устройству (например, пароль). Устройствам не следует применять схемы аутентификации HTTP (например, HTTP Basic) с недоверенными bootstrap-серверами, раскрывающими секрет, который предполагается известным лишь устройству.

На уровне RESTCONF устройства применяют RPC get-bootstrapping-data (но не report-progress) при подключении к недоверенному серверу начальной загрузки. RPC get-bootstrapping-data позволяет передавать bootstrap-серверу дополнительные входные параметры (например, os-name, os-version, hw-model). Устройствам рекомендуется передавать недоверенным серверам лишь параметр signed-data-preferred. Хотя для bootstrap-сервера нормально сразу же возвращать подписанные вводные сведения, рекомендуется вместо этого переводить недоверенное соединение в доверенное, как описано в Приложении B, что позволяет устройству использовать RPC report-progress при обработке вводных сведений.

9.7. Упорядочение источников данных начальной загрузки

Для устройств, поддерживающих более одного источника данных для начальной загрузки, не требуется соблюдать какой-то конкретный порядок источников, поскольку все они считаются одинаково защищёнными. Однако с точки зрения приватности рекомендуется предпочитать источники с локальным доступом.

9.8. Безопасность секретных ключей, применяемых для доверия

Описанное в документе решение позволяет обеспечивать доверие к данным начальной загрузки двумя способами — защитой на транспортном уровне или подписыванием артефактов.

При использовании транспортной защиты (доверенный сервер начальной загрузки) секретный ключ для сертификата конечного объекта должен быть доступен для организации соединения TLS.

При подписывании артефактов ключ подписи должен быть доступен лишь при возврате bootstrap-сервером созданных динамически подписанных откликов с данными. Например, сервер начальной загрузки при получении входного параметра signed-data-preferred для RPC get-bootstrapping-data может динамически генерировать отклик с подписью.

Администраторам серверов начальной загрузки рекомендуется следовать проверенным (best practice) методам защиты секретных ключей, применяемых в online-операциях. Например, рекомендуется применять модули аппаратной защиты (hardware security module или HSM). Если HSM не используется, рекомендуется чаще обновлять секретный ключ при наличии на всех устройствах с удалённой начальной загрузкой точных часов (см. параграф 9.1).

Для лучшей защиты владельцам рекомендуется предоставлять лишь подписанные (с использованием защищённого секретного ключа) и зашифрованные (с использованием открытого ключа устройства из его сертификата отождествления защищённого устройства) данные начальной загрузки.

9.9. Уверенность в изготовителях

Представленный в этом документе протокол начальной загрузки SZTP передаёт некоторый контроль над начальной конфигурацией от владельца устройства изготовителю и его представителям. Изготовитель поддерживает список общеизвестных bootstrap-серверов, которым доверяют его устройства. По замыслу, если сначала не найдено данных начальной загрузки иными методами, устройство пытается связаться с общеизвестными серверами начальной загрузки. Нет никакого способа предотвратить это, кроме использования внешнего межсетевого экрана для блокировки таких соединений. Проблемы, связанные с доверенными bootstrap-серверами, рассмотрены в параграфе 9.10.

Изготовитель также ведёт список органов, подписывающих ваучеры, которым его устройства доверяют. Такие органы выпускают ваучеры, позволяющие владельцу доверять сертификату домена владельца. Крайне важно, чтобы изготовители обеспечивали целостность органов, подписывающих ваучеры, чтобы избежать некорректных назначений.

Операторам следует знать, что система предполагает их доверие всем заданным заранее серверам начальной загрузки, назначенным изготовителем. Хотя операторы могут использовать в сети средства блокировки доступа к общеизвестным bootstrap-серверам, они не могут запретить подписывающим ваучеры органам создавать ваучеры для их устройств.

9.10. Проблемы с доверенными серверами начальной загрузки

С общеизвестными и обнаруженными доверенными серверами могут быть связаны некоторые проблемы.

  • Скомпрометированный доверенный сервер можно изменить для возврата неподписанных данных любого типа. Например, bootstrap-сервер, от которого предполагается получение лишь сведений о перенаправлении, можно настроить на возврат вводных данных, а сервер, от которого ожидаются подписанные данные, — на возврат неподписанных. В обоих случаях устройство будет воспринимать отклик, не зная, что тот должен быть иным. Сопровождающим доверенные серверы начальной загрузки рекомендуется обеспечивать защиту серверов от компрометации, а при возникновении таковой иметь механизмы для быстрого обнаружения и устранения последствий.

  • Доверенный сервер начальной загрузки, на котором размещаются неподписанные или подписанные, но не зашифрованные данные, может раскрывать информацию нежелательным сторонам (например, своему администратору). Это проблема приватности, но она может раскрыть сведения, пригодные для организации атаки. Раскрытие сведений о перенаправлении имеет ограниченное влияние (это просто список bootstrap-серверов), тогда как раскрытие вводных данных может давать много информации (например, топологию сети, правила межсетевых экранов и т. п.). Операторам рекомендуется шифровать данные начальной загрузки, когда их содержимое считается важным, вплоть до сокрытия таких данных от администраторов bootstrap-сервера, который может поддерживаться сторонними лицами.

9.11. Срок действия переносимых сведений

Артефакт переносимых сведений не задаёт срок действия. Например, в сведениях о перенаправлении или вводных данных нет временных ограничений и ни один из этих артефактов нельзя отозвать.

Для неподписанных данных из недоверенного источника данных начальной загрузки нет смысла обсуждать срок действия сведений, коль скоро они не аутентифицируются и могут быть получены откуда угодно. Для неподписанных данных из доверенного источника (bootstrap-сервер) доступность данных является единственным мерилом их актуальности. Поскольку недоверенные данные приходят из доверенного источника, их текущая доступность имеет значение, а поскольку bootstrap-серверы используют TLS, содержимое обмена нельзя изменить или воспроизвести. Для подписанных данных из доверенного или недоверенного источника пригодность ограничена пригодностью ваучера владения и сертификата владельца, применяемых для аутентификации данных.

Пригодность ваучера владения в первую очередь ограничивается узлами created-on и expires-on. Хотя [RFC8366] рекомендует краткосрочные ваучеры (параграф 6.1), узел expires-on может указывать любое время в будущем и даже отсутствовать, указывая неограниченный срок действия. Пригодность ваучера ограничивается также PKI изготовителя, использованной для подписи ваучера. Хотя ваучер нельзя отозвать напрямую, для использованной при подписи PKI отзыв возможен.

Срок действия сертификата владельца в первую очередь ограничивается полем пригодности X.509 — значения notBefore и notAfter задаются удостоверяющим центром при подписании сертификата. Действие сертификата владельца ограничивается также пригодностью PKI, использованной при подписании ваучера. Сертификат владельца можно отозвать напрямую.

Владельцам, желающим иметь максимальную гибкость управления пригодностью подписанных данных, рекомендуется создавать уникальный сертификат владельца для каждого артефакта. Это не только позволяет указать срок действия артефакта, но и позволяет отозвать пригодность каждого артефакта.

9.12. Каскадирование доверия через перенаправление

Сведения о перенаправлении (параграф 2.1) предписывают загружающемуся устройству инициировать соединение HTTPS с указанными серверами начальной загрузки. Доверенные сведения о перенаправлении могут включать сертификат привязки доверия, применяемый устройством для аутентификации сертификата TLS конечного объекта, представленного bootstrap-сервером. В результате компрометация взаимодействия, обеспеченного сведениями о перенаправлении, ведёт к компрометации всех последующих взаимодействий.

9.13. Возможность повторного применения секретных ключей

В этом документе описано два применения сертификатов идентификации защищённых устройств. В основном это служит для аутентификации устройством себя на сервере начальной загрузки с использованием секретного ключа для проверки подлинности по клиентскому сертификату уровня TLS. Другим применением является расшифровка представленных артефактов начальной загрузки, точнее, в соответствии с разделом 6 в [RFC5652], расшифровка симметричного ключа, служащего для расшифровки данных.

Параграф 3.4. Шифрование артефактов допускает возможность применения одного сертификата идентификации защищённого устройства в обоих случаях, поскольку в [Std-802.1AR] указано, что сертификат DevID может иметь установленный бит KeyUsage keyEncipherment в дополнение к биту KeyUsage digitalSignature.

Хотя понятно, что повторное использование секретных ключей обычно не одобряется, этот документ считает такое использование приемлемым, поскольку нет каких-либо известных способов для подписи, созданной в одном контексте, вызвать (неверную) интерпретацию в другом.

9.14. Отсутствие проблем с шифрованием подписанных артефактов

Этот документ задаёт шифрование подписанных объектов, а не подписывание шифрованных, как можно было бы ожидать с учётом широко разрекламированных атак оракула (например, padding oracle attack). В документе такие атаки не считаются осуществимыми в контексте решения, поскольку расшифрованный текст никогда не покидает устройство.

9.15. Модуль YANG ietf-sztp-conveyed-info

Заданный в документе модуль ietf-sztp-conveyed-info определяет структуру данных, которая всегда оборачивается в структуру CMS. При доступе защищённого механизма (например, TLS) структура CMS может не подписываться. Однако при доступе незащищённых механизмов (например, съёмное хранилище) структура CMS должна быть подписана, чтобы устройство доверяло ей.

Реализациям следует учитывать, что подписанные данные начальной загрузки защищены лишь от изменения, содержимое остаётся видимым для других. Это не так влияет на безопасность, как на приватность. Содержимое могут читать посторонние при использовании незащищённых механизмов. В модуле ietf-sztp-conveyed-info задан оператор верхнего уровня choice, объявляющий, что содержимое имеет тип redirect-information или onboarding-information. Далее рассмотрены оба случая.

Когда структура CMS содержит redirect-information, наблюдатель может узнать bootstrap-серверы, куда направляется устройство, их адреса IP или имена, порты и сертификаты привязок доверия. Эти сведения могут дать некоторое представление о внутренней структуре сети.

Когда структура CMS содержит onboarding-information, наблюдатель может получить важные сведения о подготовке устройства. Эти сведения включают версию операционной системы, исходную конфигурацию и содержимое сценариев. Такая информация может быть конфиденциальной и следует принять меры для её защиты (например, шифровать артефакт с использованием открытого ключа устройства).

9.16. Модуль YANG ietf-sztp-bootstrap-server

Определённый в документе модуль ietf-sztp-bootstrap-server задаёт API для RESTCONF [RFC8040]. Нижним уровнем RESTCONF является HTTPS с обязательной реализацией защищённого транспорта TLS [RFC8446]. Модель доступа NACM (NETCONF Access Control Model) [RFC8341] обеспечивает предоставление доступа к предопределённому подмножеству протокольных операций и содержимого лишь указанным пользователям. Этот модуль не содержит узлов данных (только RPC), поэтому нет необходимости обсуждать конфиденциальность узлов данных.

Модуль определяет два операции RPC которые могут быть чувствительными в некоторых сетевых средах.

get-bootstrapping-data

Этот вызов RPC применяется устройствами для получения данных начальной загрузки. По замыслу каждое устройство, указанное свидетельствами аутентификации (например, сертификат клиента), может получить лишь свои данные. Для дополнительного ограничения доступа с этим вызовом RPC применение NACM не требуется.

report-progress

Этот вызов RPC применяется устройствами для отчётов о выполнении начальной загрузки. По замыслу каждое устройство, указанное свидетельствами аутентификации (например, сертификат клиента), может получить лишь свои данные. Для дополнительного ограничения доступа с этим вызовом RPC применение NACM не требуется.

10. Взаимодействие с IANA

10.1. Реестр IETF XML

Агентство IANA зарегистрировало два URI в субреестре ns реестра IETF XML Registry [RFC3688], доступного по ссылке <https://www.iana.org/assignments/xml-registry>. Ниже приведены регистрации в соответствии с форматом [RFC3688].

      URI: urn:ietf:params:xml:ns:yang:ietf-sztp-conveyed-info
      Registrant Contact: Рабочая группа NETCONF в IETF.
      XML: N/A, URI относится к пространству имён XML.

      URI: urn:ietf:params:xml:ns:yang:ietf-sztp-bootstrap-server
      Registrant Contact: Рабочая группа NETCONF в IETF.
      XML: N/A, URI относится к пространству имён XML.

10.2. Реестр YANG Module Names

Агентство IANA зарегистрировало два модуля YANG в реестре YANG Module Names [RFC6020], доступном по ссылке <https://www.iana.org/assignments/yang-parameters>. Ниже приведены регистрации в формате [RFC6020].

      name:      ietf-sztp-conveyed-info
      namespace: urn:ietf:params:xml:ns:yang:ietf-sztp-conveyed-info
      prefix:    sztp-info
      reference: RFC 8572

      name:      ietf-sztp-bootstrap-server
      namespace: urn:ietf:params:xml:ns:yang:ietf-sztp-bootstrap-server
      prefix:    sztp-svr
      reference: RFC 8572

10.3. Реестр SMI Security for S/MIME CMS Content

Агентство IANA зарегистрировало два идентификатора подчинённых объектов в реестре SMI Security for S/MIME CMS Content Type (1.2.840.113549.1.9.16.1), доступном по ссылке <https://www.iana.org/assignments/smi-numbers>. Ниже приведена регистрация в формате, заданном в параграфе 3.4 [RFC7107].

 

Десятичное значение

Описание

Документ

42

id-ct-sztpConveyedInfoXML

RFC 8572

43

id-ct-sztpConveyedInfoJSON

RFC 8572

 

id-ct-sztpConveyedInfoXML указывает, что conveyed-information кодируется с использованием XML, id-ct-sztpConveyedInfoJSON указывает кодирование conveyed-information с использованием JSON.

10.4. Реестр BOOTP Vendor Extensions and DHCP Options

Агентство IANA зарегистрировало код DHCP в реестре BOOTP Vendor Extensions and DHCP Options, доступном по ссылке <https://www.iana.org/assignments/bootp-dhcp-parameters>.

      Tag:         143
      Name:        OPTION_V4_SZTP_REDIRECT
      Data Length: N
      Meaning:     Список URI для bootstrap-серверов SZTP 
      Reference:   RFC 8572

10.5. Реестр Dynamic Host Configuration Protocol for IPv6 (DHCPv6)

Агентство IANA зарегистрировало код DHCP в субреестре Option Codes реестра Dynamic Host Configuration Protocol for IPv6 (DHCPv6), доступного по ссылке <https://www.iana.org/assignments/dhcpv6-parameters>.

      Value:            136
      Description:      OPTION_V6_SZTP_REDIRECT
      Client ORO:       Yes
      Singleton Option: Yes
      Reference:        RFC 8572

10.6. Реестр Service Name and Transport Protocol Port Number

Агентство IANA зарегистрировало имя службы в реестре Service Name and Transport Protocol Port Number Registry [RFC6335], доступном по ссылке <https://www.iana.org/assignments/service-names-port-numbers>. Ниже приведена регистрация в формате, заданном в параграфе 8.1.1 [RFC6335].

     Service Name:            sztp
     Transport Protocol(s):   TCP
     Assignee:                IESG <iesg@ietf.org>
     Contact:                 IETF Chair <chair@ietf.org>
     Description:             Это имя службы применяется при создании метки
                              сервиса SRV _sztp для обнаружения серверов
                              начальной загрузки SZTP.
     Reference:               RFC 8572
     Port Number:             N/A
     Service Code:            N/A
     Known Unauthorized Uses: N/A
     Assignment Notes:        Этот протокол применяет HTTPS как подложку.

10.7. Реестр Underscored and Globally Scoped DNS Node Names

Агентство IANA зарегистрировало имя службы в субреестре Underscored and Globally Scoped DNS Node Names [RFC8552] реестра Domain Name System (DNS) Parameters, доступного по ссылке <https://www.iana.org/assignments/dns-parameters>. Ниже приведена регистрация в формате раздела 3 [RFC8552].

      RR Type:            TXT
      _NODE NAME:         _sztp
      Reference:          RFC 8572

11. Литература

11.1. Нормативные документы

[ITU.X690.2015] International Telecommunication Union, «Information Technology — ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)», ITU-T Recommendation X.690, ISO/IEC 8825-1, August 2015, <https://www.itu.int/rec/T-REC-X.690/>.

[RFC1035] Mockapetris, P., «Domain names — implementation and specification», STD 13, RFC 1035, DOI 10.17487/RFC1035, November 1987, <https://www.rfc-editor.org/info/rfc1035>.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC2782] Gulbrandsen, A., Vixie, P., and L. Esibov, «A DNS RR for specifying the location of services (DNS SRV)», RFC 2782, DOI 10.17487/RFC2782, February 2000, <https://www.rfc-editor.org/info/rfc2782>.

[RFC3396] Lemon, T. and S. Cheshire, «Encoding Long Options in the Dynamic Host Configuration Protocol (DHCPv4)», RFC 3396, DOI 10.17487/RFC3396, November 2002, <https://www.rfc-editor.org/info/rfc3396>.

[RFC4253] Ylonen, T. and C. Lonvick, Ed., «The Secure Shell (SSH) Transport Layer Protocol», RFC 4253, DOI 10.17487/RFC4253, January 2006, <https://www.rfc-editor.org/info/rfc4253>.

[RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., Housley, R., and W. Polk, «Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile», RFC 5280, DOI 10.17487/RFC5280, May 2008, <https://www.rfc-editor.org/info/rfc5280>.

[RFC5652] Housley, R., «Cryptographic Message Syntax (CMS)», STD 70, RFC 5652, DOI 10.17487/RFC5652, September 2009, <https://www.rfc-editor.org/info/rfc5652>.

[RFC6020] Bjorklund, M., Ed., «YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)», RFC 6020, DOI 10.17487/RFC6020, October 2010, <https://www.rfc-editor.org/info/rfc6020>.

[RFC6125] Saint-Andre, P. and J. Hodges, «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)», RFC 6125, DOI 10.17487/RFC6125, March 2011, <https://www.rfc-editor.org/info/rfc6125>.

[RFC6762] Cheshire, S. and M. Krochmal, «Multicast DNS», RFC 6762, DOI 10.17487/RFC6762, February 2013, <https://www.rfc-editor.org/info/rfc6762>.

[RFC6991] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6991, DOI 10.17487/RFC6991, July 2013, <https://www.rfc-editor.org/info/rfc6991>.

[RFC7227] Hankins, D., Mrugalski, T., Siodelski, M., Jiang, S., and S. Krishnan, «Guidelines for Creating New DHCPv6 Options», BCP 187, RFC 7227, DOI 10.17487/RFC7227, May 2014, <https://www.rfc-editor.org/info/rfc7227>.

[RFC7230] Fielding, R., Ed. and J. Reschke, Ed., «Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing», RFC 7230, DOI 10.17487/RFC7230, June 2014, <https://www.rfc-editor.org/info/rfc7230>.

[RFC7950] Bjorklund, M., Ed., «The YANG 1.1 Data Modeling Language», RFC 7950, DOI 10.17487/RFC7950, August 2016, <https://www.rfc-editor.org/info/rfc7950>.

[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, «RESTCONF Protocol», RFC 8040, DOI 10.17487/RFC8040, January 2017, <https://www.rfc-editor.org/info/rfc8040>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8366] Watsen, K., Richardson, M., Pritikin, M., and T. Eckert, «A Voucher Artifact for Bootstrapping Protocols», RFC 8366, DOI 10.17487/RFC8366, May 2018, <https://www.rfc-editor.org/info/rfc8366>.

[RFC8415] Mrugalski, T., Siodelski, M., Volz, B., Yourtchenko, A., Richardson, M., Jiang, S., Lemon, T., and T. Winters, «Dynamic Host Configuration Protocol for IPv6 (DHCPv6)», RFC 8415, DOI 10.17487/RFC8415, November 2018, <https://www.rfc-editor.org/info/rfc8415>.

[RFC8552] Crocker, D., «Scoped Interpretation of DNS Resource Records through «Underscored» Naming of Attribute Leaves», BCP 222, RFC 8552, DOI 10.17487/RFC8552, March 2019, <https://www.rfc-editor.org/info/rfc8552>.

[Std-802.1AR] IEEE, «IEEE Standard for Local and metropolitan area networks — Secure Device Identity», IEEE 802.1AR.

11.2. Дополнительная литература

[NTS-NTP] Franke, D., Sibold, D., Teichel, K., Dansarie, M., and R. Sundblad, «Network Time Security for the Network Time Protocol», Work in Progress10, draft-ietf-ntp-using-nts-for-ntp-18, April 2019.

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004, <https://www.rfc-editor.org/info/rfc3688>.

[RFC4250] Lehtinen, S. and C. Lonvick, Ed., «The Secure Shell (SSH) Protocol Assigned Numbers», RFC 4250, DOI 10.17487/RFC4250, January 2006, <https://www.rfc-editor.org/info/rfc4250>.

[RFC6187] Igoe, K. and D. Stebila, «X.509v3 Certificates for Secure Shell Authentication», RFC 6187, DOI 10.17487/RFC6187, March 2011, <https://www.rfc-editor.org/info/rfc6187>.

[RFC6234] Eastlake 3rd, D. and T. Hansen, «US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)», RFC 6234, DOI 10.17487/RFC6234, May 2011, <https://www.rfc-editor.org/info/rfc6234>.

[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <https://www.rfc-editor.org/info/rfc6241>.

[RFC6335] Cotton, M., Eggert, L., Touch, J., Westerlund, M., and S. Cheshire, «Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Service Name and Transport Protocol Port Number Registry», BCP 165, RFC 6335, DOI 10.17487/RFC6335, August 2011, <https://www.rfc-editor.org/info/rfc6335>.

[RFC6698] Hoffman, P. and J. Schlyter, «The DNS-Based Authentication of Named Entities (DANE) Transport Layer Security (TLS) Protocol: TLSA», RFC 6698, DOI 10.17487/RFC6698, August 2012, <https://www.rfc-editor.org/info/rfc6698>.

[RFC6763] Cheshire, S. and M. Krochmal, «DNS-Based Service Discovery», RFC 6763, DOI 10.17487/RFC6763, February 2013, <https://www.rfc-editor.org/info/rfc6763>.

[RFC6891] Damas, J., Graff, M., and P. Vixie, «Extension Mechanisms for DNS (EDNS(0))», STD 75, RFC 6891, DOI 10.17487/RFC6891, April 2013, <https://www.rfc-editor.org/info/rfc6891>.

[RFC6960] Santesson, S., Myers, M., Ankney, R., Malpani, A., Galperin, S., and C. Adams, «X.509 Internet Public Key Infrastructure Online Certificate Status Protocol — OCSP», RFC 6960, DOI 10.17487/RFC6960, June 2013, <https://www.rfc-editor.org/info/rfc6960>.

[RFC7107] Housley, R., «Object Identifier Registry for the S/MIME Mail Security Working Group», RFC 7107, DOI 10.17487/RFC7107, January 2014, <https://www.rfc-editor.org/info/rfc7107>.

[RFC7766] Dickinson, J., Dickinson, S., Bellis, R., Mankin, A., and D. Wessels, «DNS Transport over TCP — Implementation Requirements», RFC 7766, DOI 10.17487/RFC7766, March 2016, <https://www.rfc-editor.org/info/rfc7766>.

[RFC8071] Watsen, K., «NETCONF Call Home and RESTCONF Call Home», RFC 8071, DOI 10.17487/RFC8071, February 2017, <https://www.rfc-editor.org/info/rfc8071>.

[RFC8259] Bray, T., Ed., «The JavaScript Object Notation (JSON) Data Interchange Format», STD 90, RFC 8259, DOI 10.17487/RFC8259, December 2017, <https://www.rfc-editor.org/info/rfc8259>.

[RFC8340] Bjorklund, M. and L. Berger, Ed., «YANG Tree Diagrams», BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, <https://www.rfc-editor.org/info/rfc8340>.

[RFC8341] Bierman, A. and M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.

[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.

[YANG-CRYPTO-TYPES] Watsen, K. and H. Wang, «Common YANG Data Types for Cryptography», Work in Progress, draft-ietf-netconf-crypto-types-05, March 2019.

[YANG-TRUST-ANCHORS] Watsen, K., «YANG Data Model for Global Trust Anchors», Work in Progress, draft-ietf-netconf-trust-anchors-03, March 2019.

Приложение A. Пример модели данных устройства

В этом приложении представлена ненормативная модель данных, позволяющая настроить начальную загрузку SZTP и определить, какие параметры применять в логике начальной загрузки устройства.

A.1. Обзор модели данных

Приведённое ниже дерево иллюстрирует модель данных устройства в SZTP.

    module: example-device-data-model
      +--rw sztp
         +--rw enabled?                          boolean
         +--ro idevid-certificate?               ct:end-entity-cert-cms
         |       {bootstrap-servers}?
         +--ro bootstrap-servers {bootstrap-servers}?
         |  +--ro bootstrap-server* [address]
         |     +--ro address    inet:host
         |     +--ro port?      inet:port-number
         +--ro bootstrap-server-trust-anchors {bootstrap-servers}?
         |  +--ro reference*   ta:pinned-certificates-ref
         +--ro voucher-trust-anchors {signed-data}?
            +--ro reference*   ta:pinned-certificates-ref

Отметим, что на диаграмме показан лишь один настраиваемый узел — enabled. Предполагается, что для этого узла будет установлено значение true в заданной на производстве конфигурации, принятой по умолчанию, а потом будет установлено значение false или узел будет удалён, когда начальная загрузка SZTP больше не требуется.

A.2. Пример использования

Ниже представлен пример экземпляра для этой модели данных.

   <sztp xmlns="https://example.com/sztp-device-data-model">
     <enabled>true</enabled>
     <idevid-certificate>base64encodedvalue==</idevid-certificate>
     <bootstrap-servers>
       <bootstrap-server>
         <address>sztp1.example.com</address>
         <port>8443</port>
       </bootstrap-server>
       <bootstrap-server>
         <address>sztp2.example.com</address>
         <port>8443</port>
       </bootstrap-server>
       <bootstrap-server>
         <address>sztp3.example.com</address>
         <port>8443</port>
       </bootstrap-server>
     </bootstrap-servers>
     <bootstrap-server-trust-anchors>
       <reference>manufacturers-root-ca-certs</reference>
     </bootstrap-server-trust-anchors>
     <voucher-trust-anchors>
       <reference>manufacturers-root-ca-certs</reference>
     </voucher-trust-anchors>
   </sztp>

A.3. Модуль YANG

Модель устройства определена модулем YANG, заданным ниже. Модуль ссылается на [Std-802.1AR] и использует типы данных, определённые в [RFC6991], [YANG-CRYPTO-TYPES] и [YANG-TRUST-ANCHORS].

   module example-device-data-model {
     yang-version 1.1;
     namespace "https://example.com/sztp-device-data-model";
     prefix sztp-ddm;

     import ietf-inet-types {
       prefix inet;
       reference "RFC 6991: Common YANG Data Types";
     }
     import ietf-crypto-types {
       prefix ct;
       revision-date 2019-03-09;
       description
        "ietf-crypto-types определёно в
         draft-ietf-netconf-crypto-types";
       reference
        "draft-ietf-netconf-crypto-types-05:
           Common YANG Data Types for Cryptography";
     }
     import ietf-trust-anchors {
       prefix ta;
       revision-date 2019-03-09;
       description
        "ietf-trust-anchors определено в
         draft-ietf-netconf-trust-anchors.";
       reference
        "draft-ietf-netconf-trust-anchors-03:
           YANG Data Model for Global Trust Anchors";
     }

     organization
       "Название компании";

     contact
       "Author: Bootstrap Admin <mailto:admin@example.com>";
     description
       "Этот модуль определяет модель данных для поддержки начальной
        загрузки SZTP и обнаружения применяемых параметров. Модуль
        предполагает применение сертификата IDevID, а не иных
        сертификатов клиента, или использование схемы аутентификации
        клиента на основе HTTP.";

     revision 2019-04-30 {
       description
         "Initial version";
       reference
         "RFC 8572: Secure Zero Touch Provisioning (SZTP)";
     }

     // Свойства
     feature bootstrap-servers {
       description
         "Устройство поддерживает начальную загрузку 
          с bootstrap-серверов.";
     }

     feature signed-data {
       description
         "Устройство поддерживает начальную загрузку 
          подписанных данных.";
     }

     // Доступные протоколу узлы
     container sztp {
       description
         "Контейнер верхнего уровня для модели данных SZTP.";
       leaf enabled {
         type boolean;
         default false;
         description
           "Лист enabled контролирует возможность начальной загрузки 
            SZTP. По умолчанию задано false, поэтому без включения
            (true) конфигурация не требуется.";
       }
       leaf idevid-certificate {
         if-feature bootstrap-servers;
         type ct:end-entity-cert-cms;
         config false;
         description
           "Эта структура CMS содержит сертификат IEEE 802.1AR IDevID
            и все промежуточные сертификаты, ведущие (с возможным
            включением) к сертификатам общеизвестных привязок доверия от
            изготовителя для сертификатов IDevID. Общеизвестная привязка
            довения не имеет самоподписанного сертификата.";
         reference
           "IEEE 802.1AR:
              IEEE Standard for Local and metropolitan area
              networks - Secure Device Identity";
       }
       container bootstrap-servers {
         if-feature bootstrap-servers;
         config false;
         description
           "Список bootstrap-серверов, которых устройство будет пытаться
            достичь для начальной загрузки.";
         list bootstrap-server {
           key "address";
           description
             "Запись для bootstrap-сервера.";
           leaf address {
             type inet:host;
             mandatory true;
             description
               "IP-адрес или имя хоста для сервера начальной загрузки,
                куда устройство следует перенаправить.";
           }
           leaf port {
             type inet:port-number;
             default "443";
             description
               "Номер порта на сервере начальной загрузки. По умолчанию
                принят выделенный IANA порт https (443).";
           }
         }
       }
       container bootstrap-server-trust-anchors {
         if-feature bootstrap-servers;
         config false;
         description "Контейнер для списка ссылок на привязки доверия.";
         leaf-list reference {
           type ta:pinned-certificates-ref;
           description
             "Ссылка на список сертификатов закреплённых (CA), которые 
              устройство применяет для проверки bootstrap-серверов.";
         }
       }
       container voucher-trust-anchors {
         if-feature signed-data;
         config false;
         description "Контейнер для списка ссылок на привязки доверия.";
         leaf-list reference {
           type ta:pinned-certificates-ref;
           description
             "Ссылка на список  сертификатов закреплённых (CA), которые 
              устройство применяет для проверки ваучеров владения.";
         }
       }
     }
   }

Приложение B. Перевод недоверенного соединения в доверенное

На приведённом ниже рисунке представлена последовательность действий при начальной загрузке, которые переводят недоверенное соединение с bootstrap-сервером в доверенное с тем же сервером. Это позволяет устройству ограничить объем информации, раскрываемой злоумыiленнику, у которого размещён недоверенный сервер начальной загрузки.

                                                          +-----------+
                                                          |Bootstrap- |
                                                          |  сервер   |
+----------+                                              |    для    |
|Устройство|                                              |разработки |
+----------+                                              +-----------+
     |                                                        |
     | 1. Запрос HTTPS ("signed-data-preferred", nonce)       |
     |------------------------------------------------------->|
     | 2. Отклик HTTPS (подписанные сведения о перенаправлен.)|
     |<-------------------------------------------------------|
     |                                                        |
     |                                                        |
     | 3. Запрос HTTPS (os-name=xyz, os-version=123, и т. д.) |
     |------------------------------------------------------->|
     | 4. Отклик HTTPS (неподписанные вводные сведения)       |
     |<-------------------------------------------------------|
     |                                                        |


Взаимодействия на рисунке описаны ниже.

  1. Устройство инициирует недоверенное соединение с сервером начальной загрузки, на что указывает «HTTPS» в двойных кавычках. Это по-прежнему соединение HTTPS, но устройство не может аутентифицировать сертификат TLS bootstrap-сервера. Поскольку устройство не может доверять серверу начальной загрузки, оно передаёт входной параметр signed-data-preferred и может добавить параметр nonce в RPC get-bootstrapping-data. Параметр signed-data-preferred информирует bootstrap-сервер о недоверии устройства, в результате чего устройство может скрывать от сервера некоторые дополнительные входные параметры (например, другие входные параметры, отчёты о выполнении и т. п.). Параметр nonce позволяет bootstrap-серверу динамически получить ваучер владения от MASA, что может быть важно для устройств без надёжных часов.

  2. Сервер начальной загрузки видит входной параметр signed-data-preferred и знает, что он может передать неподписанные сведения о перенаправлении или подписанные данные любого типа. В данном случае bootstrap-сервер имеет возможность подписывать данные и выбирает отклик с подписанными сведениями о перенаправлении для защищённого перенаправления устройства обратно к себе, а не подписанными вводными данными, как можно было ожидать. На рисунке это не показано, но если был передан входной параметр nonce, сервер начальной загрузки может динамически связаться с MASA и загрузить ваучер со значением nonce. Детали протокола, обеспечивающего такую интеграцию, выходят за рамки документа.

  3. После проверки подписанных сведений о перенаправлении устройство организует защищённое соединение с bootstrap-сервером. Устройство не знает, тот ли это bootstrap-сервер, с которым оно соединялось до этого, но поскольку оно может на этот раз аутентифицировать сервер, оно передаёт свой обычный запрос get-bootstrapping-data (с дополнительными входными параметрами), а также отчёт о выполнении (не показан).

  4. На этот раз, поскольку параметр signed-data-preferred не был передан, имея доступ ко всем входным параметрам, bootstrap-сервер возвращает в этом примере неподписанные вводные сведения для устройства. Отметим также, что сервер начальной загрузки стал доверенным и устройство может передавать ему отчёты о выполнении.

Приложение C. Обзор рабочего процесса

Представленное в документе решение концептуально состоит из ненормативных рабочих процессов, описанных ниже. Предполагается, что детали реализаций будут различаться. Каждый из рисунков споровождается подробным описанием представленных на рисунке действий с комментариями по части различий в реализациях.

C.1. Зачисление и упорядочение устройств

На рисунке представлены основные взаимодействия, которые могут происходить с момента, когда потенциальный владелец регистрируется в программе SZTP изготовителя, до момента, когда изготовитель поставляет устройства по заказу потенциального владельца.

  1.                               +--------------+
    +------------+                |Предполагаемый|                  +---+
    |Изготовитель|                |   владелец   |                  |NMS|
    +------------+                +--------------+                  +---+
          |                              |                            |
          |                              |                            |
          |  1. Исходное зачисление      |                            |
          #<-----------------------------|                            |
          #                              |                            |
          #                              |                            |
          #     Привязка доверия IDevID  |                            |
          #-----------------------------># Устан. привяз. довер.IDevID|
          #                              #--------------------------->|
          #                              |                            |
          #     Свидетельства для        |                            |
          #     bootstrap-сервера        |                            |
          #-----------------------------># Установка свидетельств     |
          |                              #--------------------------->|
          |                              |                            |
          |                              |                            |
          |  2. Установка привязки доверия для сертификата владельца  |
          |<----------------------------------------------------------|
          |                              |                            |
          |                              |                            |
          |  3. Заказ на устройство      |                            |
          |<-----------------------------#  Моделирование устройств   |
          |                              #--------------------------->|
          |                              |                            |
          |  4. Поставка устройств и     |                            |
          |     передача их идентификат. |                            |
          |     и ваучеров владения      |                            |
          |----------------------------->#Установка идентификаторов   |
          |                              #устройств и ваучеров владен.|
          |                              #--------------------------->|
          |                              |                            |


    1. Потенциальный владелец устройства инициирует процесс регистрации у изготовителя.

    • Независимо от намерений потенциального владельца в части начальной загрузки его устройств, он всегда будет получать от изготовителя сертификат привязки доверия для сертификатов IDevID. Этот сертификат устанавливается в NMS потенциального владельца, чтобы NMS могла проверить подлинность сертификатов IDevID на последующих этапах.

    • Если изготовитель поддерживает свой сервер начальной загрузки через Internet (например, сервер перенаправления) как описано в параграфе 4.4. Сервер начальной загрузки, свидетельства, требуемые для настройки bootstrap-сервера будут предоставлены потенциальному владельцу. Если bootstrap-сервер настраивается через API (не рассматривается в этом документе), свидетельства могут быть установлены в системе NMS потенциального владельца, чтобы NMS впоследствии могла настроить размещённый у производителя bootstrap-сервер.

  1. Если устройства изготовителя способны проверять подписанные данные (5.4. Проверка подписанных данных) и в предположении, что NMS потенциального владельца способна самостоятельно подготовить и подписать данные начальной загрузки, эта NMS может установить сертификат привязки доверия для bootstrap-сервера изготовителя, используя свидетельства, предоставленные на предыдущем этапе. Этот сертификат является сертификатом привязки доверия, которых потенциальный владелец хотел бы получить от производителя в ваучерах владения, которые тот создаст, чтобы устройства могли доверять сертификату владельца. Способ применения сертификата привязки доверия для того, чтобы разрешить устройствам проверять подписанные данные начальной загрузки, описан в параграфе 5.4. Проверка подписанных данных.

  2. Через некоторое время потенциальный владелец размещает заказ у изготовителя, возможно, со специальным флагом для обработки SZTP. В этот момент или перед размещением заказа владелец может смоделировать устройства в своей NMS, создавая виртуальные объекты для устройств без привязки к реальным устройствам. Например, модель можно использовать для имитации размещения устройств в сети и конфигурации, которую следует задать для полной работоспособности.

  3. Когда изготовитель выполнит заказ, поставив устройства в предусмотренные места, он может сообщить владельцу серийные номера и точки доставки, которые владелец может использовать для подготовки сети к включению устройств. В дополнение к этому изготовитель может передать один или несколько ваучеров владения, криптографически передав владельцу права собственности на устройства. Владелец может поместить эти сведения в свою NMS, возможно, связав смоделированные устройства с серийными номерами и ваучерами владения.

C.2. Этапы подготовки владельцем сети для начальной загрузки

На рисунке показано, как владелец может подготовить сеть для устройств с начальной загрузкой.

  1.               +-----------+ +-------------+
                  |Bootstrap- | | Bootstrap-  | +------+ +------+
                  |  сервер   | |   сервер    | |Локал.| |Локал.| +---------+
            +---+ |    для    | |      у      | |сервер| |сервер| | Съёмное |
            |NMS| |разработки | |изготовителя | | DNS  | | DHCP | |хранилище|
            +---+ +-----------+ +-------------+ +------+ +------+ +---------+
              |        |             |            |        |         |
     1.       |        |             |            |        |         |
     Активация|        |             |            |        |         |
     смоделир.|        |             |            |        |         |
     устройств|        |             |            |        |         |
     -------->|        |             |            |        |         |
              | 2. (необязательно)   |            |        |         |
              |    настройка         |            |        |         |
              |    bootstrap-сервера |            |        |         |
              |------->|             |            |        |         |
              |        |             |            |        |         |
              | 3. (необяз.) настр.  |            |        |         |
              |    bootstrap-сервера |            |        |         |
              |--------------------->|            |        |         |
              |        |             |            |        |         |
              |        |             |            |        |         |
              | 4. (необяз.) настройка сервера DNS|        |         |
              |---------------------------------->|        |         |
              |        |             |            |        |         |
              |        |             |            |        |         |
              | 5. (необяз.) настр. сервера DHCP  |        |         |
              |------------------------------------------->|         |
              |        |             |            |        |         |
              |        |             |            |        |         |
              | 6. (необяз.) запись артефактов нач. загр. на носитель|
              |----------------------------------------------------->|
              |        |             |            |        |         |
              |        |             |            |        |         |


    Имея ранее смоделированные устройства, включая установку для них полностью работоспособных конфигураций и связанных с устройствами серийных номеров, а также (необязательно) ваучеров владения, владелец может «активировать» одно или несколько смоделированных устройств. Т. е. владелец предписывает NMS выполнить этапы, требуемые для подготовки реальных устройств к включению питания и запуску процесса начальной загрузки. Отметим, что в некоторых развёртываниях этот этап может объединяться с последним этапом предыдущего рабочего процесса. Здесь отмечено, что NMS выполняет эти этапы, но они могут быть выполнены вручную или с помощью иного механизма.

  2. Если желательно использовать bootstrap-сервер конкретного развёртывания, он должен быть настроен на предоставление начальной загрузки конкретным устройствам. Настройка bootstrap-сервера может выполняться через программный интерфейс API, не определённый в этом документе. Показанный на рисунке как внешний узел, сервер начальной загрузки может быть реализован как внутренний компонент NMS.

  3. Если желательно использовать bootstrap-сервер изготовителя, он должен быть настроен на предоставление начальной загрузки конкретным устройствам. Это должны быть данные перенаправления или вводные сведения, т. е. сервер начальной загрузки у производителя будет перенаправлять устройство на другой bootstrap-сервер или сам предоставлять вводные данные. Типы данных начальной загрузки, поддерживаемые bootstrap-сервером у производителя, могут зависеть от реализации и некоторые реализации могут поддерживать только сведения о перенаправлении или вводные данные. Настройка bootstrap-сервера может выполняться через программный интерфейс API, не определённый в этом документе.

  4. Если желательно использовать сервер DNS для предоставления данных начальной загрузки, этот сервер должен быть настроен. Если желательно использовать multicast DNS, сервер DNS должен размещаться в локальной сети, в иных случаях можно пользоваться внешним сервером DNS. Настройка серверов DNS рассмотрена в параграфе 4.2. Настройка сервера DNS может выполняться через программный интерфейс API, не определённый в этом документе.

  5. Если желательно использовать сервер DHCP для предоставления данных начальной загрузки, этот сервер должен быть настроен. Доступ к серверу DHCP возможен напрямую или через ретранслятор (DHCP relay). Настройка серверов DHCP рассмотрена в параграфе 4.3. Настройка сервера DHCP может выполняться через программный интерфейс API, не определённый в этом документе.

  6. Если желательно использовать съёмное устройство хранения (например, USB flash) для предоставления данных начальной загрузки, это устройство должно быть подключено. Настройка для съёмных устройств рассмотрена в параграфе 4.1.

C.3. Включение устройства

На рисунке показана последовательность действий при включении питания устройства.

                                                      +-----------+
                                       +-----------+  | Bootstrap-|
                                       | Источник  |  |   сервер  |
+----------+                           | Bootstrap-|  |    для    |  +---+
|Устройство|                           |  данных   |  |разработки |  |NMS|
+----------+                           +-----------+  +-----------+  +---+
     |                                     |              |          |
     |                                     |              |          |
     | 1. Если служба начальной загрузки   |              |          |
     |    SZTP не включена, выход.         |              |          |
     |                                     |              |          |
     | 2. Для каждого поддерживаемого      |              |          |
     |    источн. проверка данных загрузки |              |          |
     |------------------------------------>|              |          |
     |                                     |              |          |
     | 3. Если вводные данные найдены,     |              |          |
     |    инициализация себя и если источн.|              |          |
     |    является доверенным bootstrap-   |              |          |
     |    сервером, передача отчёта.       |              |          |
     |------------------------------------>#              |          |
     |                                     # web-ловушка  |          |
     |                                     #------------------------>|
     |                                                    |          |
     | 4. Иначе, если найдены сведения о перенаправлении  |          |
     |    для каждого bootstrap-сервера проверка данных.  |          |
     |-+------------------------------------------------->|          |
     | |                                                  |          |
     | | Если снова найдены сведения о перенаправлении,   |          |
     | | рекурсия (не показана), иначе, если найдены      |          |
     | | вводные данные, инициализация себя и передача    |          |
     | | отчёта.                                          |          |
     | +-------------------------------------------------># web-     |
     |                                                    # ловушка  |
     |                                                    #--------->|
     |
     | 5. Повтор источников и/или ожидание настройки вручную.
     |
  1. При включении питания устройство проверяет, настроена ли начальная загрузка SZTP, как это должно быть в принятой по умолчанию заводской конфигурации. Если начальная загрузка SZTP не настроена, bootstrap-логика завершается без выполнения следующих этапов.

  2. Для каждого источника данных начальной загрузки, поддерживаемых устройством в порядке предпочтений (например, сначала съёмный носитель, потом серверы Internet), устройство проверяет наличие данных начальной загрузки для него.

  3. Если найдены вводные данные, устройство должным образом инициализирует себя (например, устанавливает загрузочный образ или применяет исходную конфигурацию). Если источником является bootstrap-сервер и ему можно доверять (аутентификация TLS), устройство также передаёт отчёт о выполнении bootstrap-серверу.

    • В исходной конфигурации следует настроить учётную запись администратора на устройстве (например, имя пользователя, открытый ключ SSH и т. п.), задать прослушивание соединений NETCONF или RESTCONF или инициирование исходящих звонков [RFC8071], а также отключить службу начальной загрузки SZTP (например, лист enabled в модели данных из Приложения A).

    • Если сервер начальной загрузки поддерживает пересылку отчётов о выполнении от устройства (например, через web-ловушку), отчёт bootstrap-complete (7.3. Модуль YANG) информирует внешнюю систему о том, когда она сможет, например, инициировать соединение с устройством. Для дальнейшей поддержки такого сценария отчёт bootstrap-complete может также ретранслировать SSH-ключи хоста и/или сертификаты TLS, которые внешняя система может использовать для аутентификации последующих соединений с устройством.

    • Если устройство успешно завершает процесс начальной загрузки, оно выходит из bootstrap-логики без рассмотрения других источников данных начальной загрузки.

  1. В иных случаях, если найдены сведения о перенаправлении, устройство проходит по списку заданных bootstrap-серверов, проверяя у них наличие данных для начальной загрузки устройства. Если это снова данные перенаправления, рекурсия продолжается. В иных случаях, если bootstrap-сервер возвращает вводные данные, устройство выполняет действия, описанные в п. 3 выше.

  2. Проверив все поддерживаемые источники данных начальной загрузки, устройство может повторить попытку для всех источников и/или предоставить интерфейс управления для настройки вручную (например, CLI, HTTP, NETCONF и т. п.). Если разрешена ручная настройка и конфигурация представлена, эта конфигурация должна отключить службу начальной загрузки SZTP, поскольку та больше не требуется.

Благодарности

Авторы благодарны за оживлённые дискуссии по почте и на встречах (в алфавитном порядке) Michael Behringer, Martin Bjorklund, Dean Bogdanovic, Joe Clarke, Dave Crocker, Toerless Eckert, Stephen Farrell, Stephen Hanna, Wes Hardaker, David Harrington, Benjamin Kaduk, Radek Krejci, Suresh Krishnan, Mirja Kuehlewind, David Mandelberg, Alexey Melnikov, Russ Mundy, Reinaldo Penno, Randy Presuhn, Max Pritikin, Michael Richardson, Adam Roach, Juergen Schoenwaelder, Phil Shafer.

Особая благодарность Steve Hanna, Russ Mundy и Wes за мозговой штурм исходного решения во время IETF 87 в Берлине.

Адреса авторов

Kent Watsen
Watsen Networks
Email: kent+ietf@watsen.net
 
Ian Farrer
Deutsche Telekom AG
Email: ian.farrer@telekom.de
 
Mikael Abrahamsson
T-Systems
Email: mikael.abrahamsson@t-systems.se

Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

3Distinguished encoding rules.

4Этот идентификатор в этом и следующем абзаце был указан с ошибкой. См. https://www.rfc-editor.org/errata/eid6807. Прим. перев.

5Источник, на который указывает перенаправление, должен вернуть подписанные данные или другое перенаправление без подписи.

6При обработке обычно не требуется, чтобы доверенный источник возвращал подписанные данные.

7Здесь и далее символ \ в конце строки служит для переноса слишком длинных строк.

8Здесь и ниже в оригинале было ошибочно указано yang.data. См. https://www.rfc-editor.org/errata/eid6933. Прим. перев.

9В оригинале этот абзац содержал ошибку. См. https://www.rfc-editor.org/errata/eid6684. Прим. перев.

10Опубликовано в RFC 8915. Прим. перев.

Рубрика: RFC | Оставить комментарий

RFC 8527 RESTCONF Extensions to Support the Network Management Datastore Architecture

Internet Engineering Task Force (IETF)                      M. Bjorklund
Request for Comments: 8527                                Tail-f Systems
Updates: 8040                                           J. Schoenwaelder
Category: Standards Track                              Jacobs University
ISSN: 2070-1721                                                P. Shafer
                                                        Juniper Networks
                                                               K. Watsen
                                                         Watsen Networks
                                                               R. Wilton
                                                           Cisco Systems
                                                              March 2019

RESTCONF Extensions to Support the Network Management Datastore Architecture

Расширения RESTCONF для поддержки архитектуры NMDA

PDF

Аннотация

Этот документ расширяет протокол RESTCONF, определенный в RFC 8040, для поддержки архитектуры NMDA1, определенной в RFC 8342.

Документ обновляет RFC 8040 за счет добавления новых ресурсов и нового параметра запросов, а также требования использовать библиотеку YANG (описана RFC 8525) на серверах RESTCONF, реализующих NMDA.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF2 и представляет согласованный взгляд сообщества IETF. Документ прошел открытое обсуждение и был одобрен для публикации IESG3. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc8527.

Авторские права

Авторские права (Copyright (c) 2019) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

1. Введение

Этот документ расширяет протокол RESTCONF [RFC8040] для поддержки архитектуры NMDA, определенной в [RFC8342].

Документ обновляет [RFC8040], чтобы позволить клиентам RESTCONF определять обеспечиваемые сервером RESTCONF хранилища и поддерживаемые каждым хранилищем модули, а также взаимодействовать со всеми хранилищами с архитектурой NMDA. В частности, обновление добавляет новые ресурсы хранилищ и новый параметр запроса, а также требует применять библиотеку YANG [RFC8525] на серверах RESTCONF с поддержкой NMDA.

Представленное здесь решение совместимо с [RFC8040]. Это достигнуто за счет того, что новые ресурсы добавлены без изменения семантики имеющихся ресурсов.

1.1. Терминология

С документе применяется терминология, определенная NMDA [RFC8342].

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

2. Хранилище данных и требования YANG Library

Соответствующий NMDA сервер RESTCONF должен поддерживать хранилище рабочего состояния и должен реализовать как минимум выпуск 2019-01-04 модуля ietf-yang-library, определенного в [RFC8525].

Такой сервер указывает свою поддержку NMDA путем реализации ресурса {+restconf}/ds/ietf-datastores:operational и выпуска модуля ietf-yang-library не раньше 2019-01-04.

Клиент RESTCONF может проверить поддержку сервером архитектуры NMDA с помощью метода HEAD или GET для ресурса {+restconf}/ds/ietf-datastores:operational.

Клиент RESTCONF может определить поддерживаемые сервером хранилища и модули YANG, считывая информацию библиотеки YANG из хранилища рабочего состояния.

3. Расширения RESTCONF

В этом разделе описаны расширения RESTCONF, требуемые для поддержки архитектуры NMDA.

3.1. Новые ресурсы хранилища данных

Документ определяет набор новых ресурсов, представляющих хранилища данных [RFC8342]. Эти ресурсы доступны с использованием шаблона пути

     {+restconf}/ds/<datastore>

Компонента <datastore> кодируется как identityref в соответствии с правилами JSON, заданными в параграфе 6.8 [RFC7951]. Должны применяться идентификаторы с указанием пространства имен, которые должны выводиться из отождествления datastore, определенного в модуле YANG ietf-datastores [RFC8342].

В частности

  • ресурс {+restconf}/ds/ietf-datastores:operational указывает хранилище рабочего состояния;

  • ресурс {+restconf}/ds/ietf-datastores:running указывает хранилище рабочей конфигурации;

  • ресурс {+restconf}/ds/ietf-datastores:intended указывает хранилище предполагаемой конфигурации.

Сервер с поддержкой NMDA должен реализовать ресурс {+restconf}/ds/ietf-datastores:operational и может реализовать другие ресурсы.

Действия YANG могут вызываться лишь для ресурса {+restconf}/ds/ietf-datastores:operational.

Например, если сервер реализует хранилище с именем ds-ephemeral, определенное в модуле example-ds-ephemeral, он будет поддерживать ресурс {+restconf}/ds/example-ds-ephemeral:ds-ephemeral.

3.2. Протокольные операции

Для новых ресурсов хранилища данных (параграф 3.1) доступны те же протокольные операции, которые определены в [RFC8040] для ресурса {+restconf}/data с некоторыми исключениями, перечисленными ниже.

  • Хранилища динамической конфигурации исключены, поскольку для каждого такого хранилища нужен пересмотр определений поддерживаемых протокольных операций.

  • Некоторые хранилища по своей природе доступны лишь для чтения (например, <intended>), поэтому попытки изменить их будут приводить к отказам. Сервер должен возвращать в таких случаях отклик «405 Method Not Allowed» с кодом ошибки operation-not-supported.

  • Семантика параметра запроса with-defaults (параграф 4.8.9 в [RFC8040]) отличается при взаимодействии с хранилище рабочего состояния (см. параграф 3.2.1).

  • Абзац 3 в параграфе 3.5.4 [RFC8040] не применим при взаимодействии с ресурсами ветви {+restconf}/ds.

3.2.1. Параметр with-defaults для запроса к хранилищу рабочего состояния

Поддержка параметра запросов with-defaults (параграф 4.8.9 в [RFC8040]) необязательна при взаимодействии с ресурсом {+restconf}/ds/ietf-datastores:operational. Соответствующая возможность для индикации поддержки на сервере указывается URI

     urn:ietf:params:restconf:capability:with-operational-defaults:1.0

Для поддерживающих эту возможность серверов поведение для запросов к хранилищу рабочей конфигурации с параметром with-defaults определено ниже.

  • Если параметр запроса with-defaults не задан или имеет значение explicit, report-all или report-all-tagged, из хранилища рабочего состояния возвращаются значения in use, как определено в параграфе 5.3 [RFC8342] даже при наличии у принятого по умолчанию значения узла в модуле YANG и использовании сервером этого значения. Если with-defaults имеет значение report-all-tagged, все значения, соответствующие принятым по умолчанию в схеме, сопровождаются дополнительными метаданными, как описано в параграфе 4.8.9 [RFC8040].

  • Если параметр with-defaults имеет значение trim, возвращаются все значения in use, кроме тех, которые фильтруются на выходе для исключения принятых по умолчанию значений схемы YANG.

Серверы не обязаны поддерживать все значения для параметра with-defaults в запросах к хранилищу рабочего состояния. Если запрос содержит не поддерживаемое значение параметра, сервер возвращает ошибку в соответствии с параграфом 4.8.9 [RFC8040].

3.2.2. Новый параметр запроса with-origin

Добавлен новый параметр запроса with-origin для операции GET. При наличии этого параметра в запросе сервер будет включать в отклик аннотации метаданных origin, как определено в NMDA. Это параметр действует только для запросов к {+restconf}/ds/ietf-datastores:operational и другим хранилищам данных, производным от operational. При указании непригодного хранилища сервер должен возвращать отклик 400 Bad Request с кодом ошибки invalid-value. Аннотации метаданных origin не включаются в отклики без явного запроса клиента.

Данные в хранилище рабочего состояния могут приходить от разных источников. Серверу следует возвращать аннотацию метаданных origin, наиболее точно указывающую источник значения рабочего состояния, как указано в параграфе 5.3.4 [RFC8342].

При кодировании аннотации метаданных origin для иерархии возвращаемых узлов аннотации для дочерних узлов могут опускаться, если они совпадают с аннотациями родительских узлов, как описано в модуле YANG ietf-origin [RFC8342].

Поддержка параметра запроса with-origin является необязательной и указывается URI

     urn:ietf:params:restconf:capability:with-origin:1.0

4. Взаимодействие с IANA

Этот документ определяет два идентификатора URN в реестре RESTCONF Capability URNs, заданном в [RFC8040].

Индекс

Идентификатор возможности

:with-origin
urn:ietf:params:restconf:capability:with-origin:1.0
:with-operational-defaults
urn:ietf:params:restconf:capability:with-operational-defaults:1.0

5. Вопросы безопасности

Этот документ расширяет протокол RESTCONF путем добавления новых ресурсов хранилищ данных. Базовым уровнем для RESTCONF является HTTPS с обязательной реализацией защищенного транспорта TLS [RFC8446]. Протокол RESTCONF использует модель управления доступом к настройке сети [RFC8341], которая позволяет ограничивать доступ конкретных пользователей RESTCONF предопределенным набором протокольных операций и содержимого RESTCONF.

Связанные с безопасностью ограничения протокола RESTCONF (раздел 12 в [RFC8040]) применимы и к новым ресурсам хранилищ данных RESTCONF, определенным здесь.

6. Нормативные документы

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC7951] Lhotka, L., «JSON Encoding of Data Modeled with YANG», RFC 7951, DOI 10.17487/RFC7951, August 2016, <https://www.rfc-editor.org/info/rfc7951>.

[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, «RESTCONF Protocol», RFC 8040, DOI 10.17487/RFC8040, January 2017, <https://www.rfc-editor.org/info/rfc8040>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8341] Bierman, A. and M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.

[RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., and R. Wilton, «Network Management Datastore Architecture (NMDA)», RFC 8342, DOI 10.17487/RFC8342, March 2018, <https://www.rfc-editor.org/info/rfc8342>.

[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.

[RFC8525] Bierman, A., Bjorklund, M., Schoenwaelder, J., Watsen, K., and R. Wilton, «YANG Library», RFC 8525, DOI 10.17487/RFC8525, March 2019, <https://www.rfc-editor.org/info/rfc8525>.

Адреса авторов

Martin Bjorklund

Tail-f Systems

Email: mbj@tail-f.com

Juergen Schoenwaelder

Jacobs University

Email: j.schoenwaelder@jacobs-university.de

Phil Shafer

Juniper Networks

Email: phil@juniper.net

Kent Watsen

Watsen Networks

Email: kent+ietf@watsen.net

Robert Wilton

Cisco Systems

Email: rwilton@cisco.com


Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

1Network Management Datastore Architecture — архитектура хранилища данных сетевого управления.

2Internet Engineering Task Force.

3Internet Engineering Steering Group.

Рубрика: RFC | Комментарии к записи RFC 8527 RESTCONF Extensions to Support the Network Management Datastore Architecture отключены

Новый стандарт

Принят стандарт IEEE 802.3cd TM -2018, Standard for Ethernet — Amendment 3: Media Access Control Parameters for 50 Gb/s and Physical Layers and Management Parameters for 50 Gb/s, 100 Gb/s, and 200 Gb/s Operation.

Стандарт определяет параметры MAC, спецификации физического уровня и параметры управления для передачи кадров  Ethernet со скоростью 50 Гбит/с по оптическим или электрическим линиям. Определены дополнительные спецификации физического уровня и параметры управления для передачи по оптическим и электрическим линиям со скоростью 100 Гбит/с и 200 Гбит/с.

Как обычно, в свободном доступе появится через полгода, а сейчас можно купить.

Рубрика: Разное | Комментарии к записи Новый стандарт отключены

RFC 8552 Scoped Interpretation of DNS Resource Records through «Underscored» Naming of Attribute Leaves

Internet Engineering Task Force (IETF)                        D. Crocker
Request for Comments: 8552                   Brandenburg InternetWorking
BCP: 222                                                      March 2019
Category: Best Current Practice
ISSN: 2070-1721

Scoped Interpretation of DNS Resource Records through «Underscored» Naming of Attribute Leaves

Интерпретация записей DNS по именам ветвей с символом подчёркивания

PDF

Аннотация

Формально любая запись о ресурсах DNS (Resource Record или RR) может присутствовать в любом доменном имени. Однако некоторые службы применяют рабочие соглашения, задающие конкретную интерпретацию RRset путём размещения записей в ветви DNS конкретного родительского домена, к котором RRset относится фактически. Вершина такой подчинённой ветви определяется соглашением об именовании, использующим зарезервированное имя узла, начинающееся с символа подчёркивания (например, _name). Именование с подчёркиванием определяет семантическую область для типов записей DNS, которые связаны с родительским доменом ветви с символом подчёркивания. В этой спецификации исследуется природа такого использования DNS и задан реестр IANA Underscored and Globally Scoped DNS Node Names, предназначенный для предотвращения конфликтов совпадающих имён для разных служб.

Статус документа

Документ относится к категории Internet Best Current Practice.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о документах BCP можно найти в разделе 2 в RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc8552.

Авторские права

Авторские права (Copyright (c) 2019) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

1. Введение

Основные технические спецификации системы доменных имён (Domain Name System или DNS) [RFC1035] и [RFC2181] не задают семантику доменных имён и их частей, а также не устанавливают ограничений для типов записей о ресурсах (RR), которые разрешается хранит для конкретных имён [RFC1035] [RFC2181]. С течением времени некоторые имена узлов, такие как www и ftp, стали означать поддержку конкретных услуг, но это скорее вопрос рабочих соглашений, чем семантики протокола. Такая свобода базовой технологии позволила параллельно использовать широкий спектр административных и семантических правил. Семантика данных DNS была ограничена спецификациями отдельных типов записей о ресурсах в расчёте на добавление новых типов записей при необходимости. К сожалению, добавление новых типов записей оказалось чрезвычайно сложной задачей и за время использования DNS возникли существенные препятствия внедрению и использованию новых типов записей.

1.1. Область действия по символу подчёркивания

В качестве альтернативы определению нового типа RR в некоторых усовершенствованиях службы DNS предусмотрено использование имеющегося типа записей о ресурсах с заданием ограничений на область его действия. Область действия является статическим свойством, не зависящим от природы запроса. Это артефакт имени DNS. Такая область является листовым узлом, содержащим конкретные наборы записей о ресурсах, которые формально определены и ограничены.

Лист размещается в ветви, имеющие отличительное соглашение об именовании, имеется родительское доменное имя, к которому относятся данные. Ветвь размещается под этим именем. Субветвь указывается одним или несколькими зарезервированными именами узлов DNS и по меньшей мере первое (старшее) из этих имён начинается с символа подчёркивания (например, _name).

Поскольку правила DNS для имён хостов (host) не позволяют использовать символ подчёркивания, имя с таким символом будет отличаться от всех разрешённых имён хостов [RFC0952]. Фактически такое соглашение об именовании создаёт пространство для перечисления «атрибутов» (в форме типов записей о ресурсах), связанных с родительским доменом выше субветви с подчёркиванием.

Указание области действия особенно полезно при использовании обобщённых типов записей о ресурсах, в частности, TXT, SRV и URI [RFC1035] [RFC2782] [RFC6335] [RFC7553]. Это обеспечивает эффективное разделение вариантов применения. При отсутствии такого разделения клиенту DNS возвращается большое число недифференцированных Rrset, которые должны анализироваться в поиске имеющих отношение к делу. Результаты в некоторых случаях могут быть неоднозначными, поскольку тип записи может не указывать адекватно своё конкретное назначение. При ограничении по символам подчёркивания будут возвращаться только имеющие отношение к делу RRset.

Простым примером является почта, указываемая ключами домена (DomainKeys Identified Mail или DKIM) [RFC6376], где используется _domainkey для указания места хранения записи TXT с подписанной информацией для родительского домена.

Эта спецификация формально определяет использование имён с символом подчёркивания в качестве «атрибутивного» расширения для имён родительских доменов. Например, доменное имя _domainkey.example. выступает как атрибут родительского домена «example.». Для предотвращения конфликтов, возникающих из-за применения одинаковых имён с символом подчёркивания для разных приложений, использующих один тип записей о ресурсах, данный документ организует реестр Underscored and Globally Scoped DNS Node Names в IANA. Использование имён узлов, начинающихся с символа подчёркивания, зарезервировано, если они являются ближайшими к корню DNS (в этом случае они считаются «глобальными»). Имена с символом подчёркивания, расположенные в иерархии дальше, обрабатываются в рамках глобального имени узла с символом подчёркивания.

Ключевые слова должно (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

1.2. Улучшение расширяемости

Некоторые типы записей о ресурсах применяются так, что могут возникать проблемы расширяемости (масштабирования), если весь набор RRset, связанный с доменным именем, агрегируется в листовом узле для этого имени. Все более популярным подходом с отличной расширяемостью является размещение RRset в специально поименованной ветви, которая находится в иерархии под именем узла, где в ином случае содержался бы RRset. Правила именования таких ветвей определяют контекст для интерпретации RRset. Иными словами, вместо

                            domain-name.example
                              /
                             RRset

применяется

                        _branch.domain-name.example
                          /
                         RRset

Прямой поиск в подчинённом листовом узле даёт лишь нужные типы записей, причём не дороже, чем обычный поиск DNS.

1.3. Глобальные имена узлов с символом подчёркивания

Как определено в [RFC1034], DNS использует имена, организованные в иерархическое дерево. Доменное имя может включать несколько имён узлов, начинающихся с символа подчёркивания (например, _name). Глобальное имя узла с символом подчёркивания является ближайшим к корню иерархии DNS и называется также верхним (highest level или topmost). В представлении, описанном в параграфе 3.1 [RFC1034], это будет самое правое имя метки.

В иных представлениях имя может размещаться иначе, поэтому для однозначности понимания здесь применяется термин «глобальное имя».

1.4. Взаимодействие с шаблонами DNS

Шаблоны (wildcard) DNS плохо взаимодействую с именами с символом подчёркивания по двум причинам.

Поскольку шаблоны интерпретируются лишь как имена листьев, невозможно создать эквивалент шаблонного имени для имён с префиксом. Такие имена, как label.*.example.com не являются шаблонами.

И наоборот, такой шаблон как *.example.com может соответствовать любому имени, включая имена с символом подчёркивания. В результате по шаблону будут возвращаться записи с типом, контролируемым именем с символом подчёркивания, но не предназначенным для контекста с подчёркиванием и не соответствующим его правилам.

1.5. История

Исходно варианты применения имён с символом подчёркивания в основно разрабатывались несогласованно. Для записей TXT нет согласованного внутреннего синтаксиса, позволяющего различать варианты применения. В случае SRV RR и URI RR различение типов было частью решения (см. [RFC2782] и [RFC7553]). Спецификации SRV и URI служат шаблонами, задающими RR, которые можно применять лишь в конкретных приложениях, имеющих дополнительные спецификации. Определение шаблона включает ссылку на два уровня таблиц имён, из которых следует брать имена с подчёркиванием. Нижний уровень (локальное действие) набора имён _service определён через другие таблицы IANA, а именно, таблицы с символьными именами. Верхний уровень (глобальное действие) поля именования SRV — это _proto, хотя его набор имён явно не задан.

Совокупным результатом независимых усилий стал длинный список имён с символом подчёркивания, которые были зарезервированы без координации, что может приводить к конфликтам при назначении имён. Исправить ситуацию можно с помощью данного документа и [RFC8553], где определён реестр таких имён и предпринята попытка зарегистрировать все уже используемые имена, а также направить изменения в имеющиеся спецификации, использующие глобальные имена узлов с символом подчёркивания.

2. Реестр Underscored and Globally Scoped DNS Node Names

Здесь определён реестр глобальных имён узлов DNS, начинающихся с символа подчёркивания. Цель реестра Underscored and Globally Scoped DNS Node Names состоит в предотвращении конфликтов в результате использования одного имени с символом подчёркивания для разных приложений.

Если публично доступная спецификация требует использования имени узла с символом подчёркивания, глобальное (ближайшее к корню DNS) имя с подчёркиванием должно включаться в этот реестр.

Имя с символом подчёркивания задаёт область применения конкретных типов записей о ресурсах, связанных с доменным именем, которое является родителем для ветви, определяемой именем с символом подчёркивания. Данное имя определяет конкретный, ограниченный контекст для одного или нескольких RR TYPE, где применение таких типов записей соответствует заданным ограничениям.

  • Внутри листа с областью действия, заданной подчёркиванием, можно применять другие RRset, не указанные как часть области действия.

Структурно реестр определяется как одна плоская таблица RR TYPE под именами узлов, начинающимися с символа подчёркивания. В некоторых случаях, таких как использование записи SRV, полное имя области действия может состоять из нескольких частей (последовательность имён с подчёркиванием). Семантически такая последовательность представляет иерархическую модель и теоретически разумно разрешить повторное использование подчинённого имени с символом подчёркивания в другом глобальном контексте с подчёркиванием, т. е. подчинённое имя будет значимым только в области действия глобального имени узла с подчёркиванием. Поэтому такие имена не включаются в реестр Underscored and Globally Scoped DNS Node Names, который предназначен для регистрации лишь имён верхнего уровня с символом подчёркивания (глобальных).

Таблица . Примеры имён с символом подчёркивания.

 

Имя

_service1

_protoB._service2

_protoB._service3

_protoC._service3

_useX._protoD._service4

_protoE._region._authority

 

В реестре Underscored and Globally Scoped DNS Node Names регистрируются только глобальные имена с символом подчёркивания. В приведённом выше примере это будут имена _service1, _service2, _service3, _service 4, и _authority.

  • Применение имён узлов с подчёркиванием специфично для каждого RR TYPE, область действия которого ограничивается. Каждое имя определяет место, но не задаёт правил для того, что размещается ниже этого места в виде дополнительного именования с символом подчёркивания или или листа с записями о ресурсах. Детали таких правил определяются спецификациями конкретных RR TYPE. В приведённых ниже разделах описаны способы использования имеющихся имён с подчёркиванием с именуемыми ими RR TYPE.

  • За определение и регистрацию подчинённых имён с подчёркиванием отвечает спецификация, создавшая глобальный узел с символом подчёркивания в имени в записи реестра.

Если схема, использующая глобальный узел с подчёркиванием в имени, имеет 1 или несколько подчинённых уровней именования узлов с символом подчёркивания, пространства имён, из которых выбираются имена для нижележащих уровней, контролируются родительским именем с символом подчёркивания. Каждое зарегистрированное глобальное имя с подчёркиванием владеет своим подчиненным пространством имён.

3. Рекомендации по регистрации использования RRset

В этом разделе содержится руководство для разработчиков спецификаций и базовый шаблон, который они могут применять для регистрации новых записей в реестре Underscored and Globally Scoped DNS Node Names. Приведённый ниже текст может добавляться в спецификации, использующие уже зарегистрированные комбинации RR TYPE и _NODE NAME.

В соответствии с RFC 8552 добавьте показанную ниже запись в реестр Underscored and Globally Scoped DNS Node Names.

Таблица . Шаблон для записей реестра Underscored and Globally Scoped DNS Node Names.

 

Тип RR

Имя _узла

Документ

*

_example

параграф 4.1.4

 

4. Взаимодействие с IANA

Агентство IANA организовало реестр Underscored and Globally Scoped DNS Node Names. В этом разделе описан сам реестр, определения, исходные записи, использование of_ta и _example, а также применение [RFC8126] как руководства для рецензирования экспертами. Агентство IANA добавило в реестр Enumservices Registrations ссылку на этот документ.

4.1. Реестр Underscored and Globally Scoped DNS Node Names

Реестр Underscored and Globally Scoped DNS Node Names включает все имена узлов DNS, начинающиеся с символа подчёркивания (_, ASCII 0x5F) и являющиеся ближайшими к корню, т. е. определяющими верхний уровень ветви DNS ниже уровня «родительского» доменного имени.

  • Для этого реестра применяются правила IANA Expert Review, см. параграф 4.1.5.

  • Содержимое каждой записи реестра определено в параграфе 4.1.1.

  • Каждая запись реестра должна включать значения всех полей, указанных в параграфе 4.1.1.

  • Внутри реестра комбинация RR Type и _NODE NAME должна быть уникальной.

  • Поля таблицы сортируются первому столбцу (RR Type), а при совпадении значений в нем — по второму (_NODE NAME).

  • Ссылка (Reference) в каждой записи должна иметь стабильную привязку к организации, контролирующей запись реестра.

4.1.1. Содержимое записи Underscored and Globally Scoped DNS Node Names

Поля записи реестра указаны ниже.

RR Type — тип RR

Значение RR TYPE, определённое для использования в данной области действия.

_NODE NAME — имя _узла

Одно имя с символом подчёркивания, определяющее зарезервированное имя. Это имя является глобальным для области действия типа записи о ресурсах, связанных с этим именем. Символы имён должны указываться в нижнем регистре (строчные буквы) для упрощения процедуры сравнения.

Reference — документ

Указывает спецификацию, определяющую тип записи и её использовании с данным _Node Name. Организация, выпустившая спецификацию, сохраняет контроль над записью реестра для _Node Name.

Каждый тип RR, используемый с _Node Name, должен иметь отдельную запись в реестре.

4.1.2. Исходные имена узлов

Исходные записи реестра приведены в таблице .

Таблица . Исходное содержимое реестра Underscored and Globally Scoped DNS Node Names.

 

Тип RR

Имя _узла

Документ

*

_example

параграф 4.1.4

NULL

_ta-* {параграф 4.1.3}

[RFC8145]

OPENPGPKEY

_openpgpkey

[RFC7929]

SMIMEA

_smimecert

[RFC8162]

SRV

_dccp

[RFC2782]

SRV

_http

[RFC4386]

SRV

_ipv6

[RFC5026]

SRV

_ldap

[RFC4386]

SRV

_ocsp

[RFC4386]

SRV

_sctp

[RFC2782]

SRV

_sip

[RFC5509]

SRV

_tcp

[RFC2782]

SRV

_udp

[RFC2782]

SRV

_xmpp

[RFC3921]

TLSA

_dane

[RFC7671]

TLSA

_sctp

[RFC6698]

TLSA

_tcp

[RFC6698]

TLSA

_udp

[RFC6698]

TXT

_acme-challenge

[RFC8555]

TXT

_dmarc

[RFC7489]

TXT

_domainkey

[RFC6376]

TXT

_mta-sts

[RFC8461]

TXT

_spf

[RFC7208]

TXT

_sztp

[ZEROTOUCH]

TXT

_tcp

[RFC6763]

TXT

_udp

[RFC6763]

TXT

_vouch

[RFC5518]

URI

_acct

[RFC6118]

URI

_dccp

[RFC7566]

URI

_email

[RFC6118]

URI

_ems

[RFC6118]

URI

_fax

[RFC6118]

URI

_ft

[RFC6118]

URI

_h323

[RFC6118]

URI

_iax

[RFC6118]

URI

_ical-access

[RFC6118]

URI

_ical-sched

[RFC6118]

URI

_ifax

[RFC6118]

URI

_im

[RFC6118]

URI

_mms

[RFC6118]

URI

_pres

[RFC6118]

URI

_pstn

[RFC6118]

URI

_sctp

[RFC6118]

URI

_sip

[RFC6118]

URI

_sms

[RFC6118]

URI

_tcp

[RFC6118]

URI

_udp

[RFC6118]

URI

_unifmsg

[RFC6118]

URI

_vcard

[RFC6118]

URI

_videomsg

[RFC6118]

URI

_voice

[RFC6118]

URI

_voicemsg

[RFC6118]

URI

_vpim

[RFC6118]

URI

_web

[RFC6118]

URI

_xmpp

[RFC6118]

 

4.1.3. _ta

Для NULL RR Type запись _ta-* указывает все имена узлов, начинающиеся с _ta-*. Это не является спецификацией шаблона DNS.

4.1.4. _example

Имя узла _example зарезервировано для всех RRset.

4.1.5. Рекомендации для рецензентов (Expert Review)

В этом параграфе даны рекомендации для экспертов, рецензирующих запросы на регистрацию в реестре Underscored and Globally Scoped DNS Node Names.

Рецензирование выполняется исключительно для определения адекватности запрошенной записи реестра и не включает другие аспекты задающего запись документа. Например, такой документ может также включать определения типа записи о ресурсах, на который ссылается запрошенная запись. Рецензирование таких определений выполняется отдельно от рецензирования, требуемого здесь.

Рецензирование выполняется для того, чтобы убедиться в том, что запись реестра:

  • достаточно ясна, точна и полна;

  • комбинация имени с символом подчёркивания, под которым используется указанный тип записей о ресурсах, и самого типа записи является уникальной в реестре.

При рецензировании другие аспекты технического качества спецификации, её адекватности и т. п. не учитываются.

4.2. Реестр Enumservices Registrations

В реестр Enumservice Registrations добавлено приведённое ниже замечание.

При добавлении записи в этот реестр следует внимательно рассмотреть также вопрос добавления записи в реестр Underscored and Globally Scoped DNS Node Names.

5. Вопросы безопасности

Этот документ не создаёт проблем безопасности.

6. Литература

6.1. Нормативные документы

[RFC0952] Harrenstien, K., Stahl, M., and E. Feinler, «DoD Internet host table specification», RFC 952, DOI 10.17487/RFC0952, October 1985, <https://www.rfc-editor.org/info/rfc952>.

[RFC1034] Mockapetris, P., «Domain names — concepts and facilities», STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987, <https://www.rfc-editor.org/info/rfc1034>.

[RFC1035] Mockapetris, P., «Domain names — implementation and specification», STD 13, RFC 1035, DOI 10.17487/RFC1035, November 1987, <https://www.rfc-editor.org/info/rfc1035>.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC2181] Elz, R. and R. Bush, «Clarifications to the DNS Specification», RFC 2181, DOI 10.17487/RFC2181, July 1997, <https://www.rfc-editor.org/info/rfc2181>.

[RFC2782] Gulbrandsen, A., Vixie, P., and L. Esibov, «A DNS RR for specifying the location of services (DNS SRV)», RFC 2782, DOI 10.17487/RFC2782, February 2000, <https://www.rfc-editor.org/info/rfc2782>.

[RFC3921] Saint-Andre, P., Ed., «Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence», RFC 3921, DOI 10.17487/RFC3921, October 2004, <https://www.rfc-editor.org/info/rfc3921>.

[RFC4386] Boeyen, S. and P. Hallam-Baker, «Internet X.509 Public Key Infrastructure Repository Locator Service», RFC 4386, DOI 10.17487/RFC4386, February 2006, <https://www.rfc-editor.org/info/rfc4386>.

[RFC5026] Giaretta, G., Ed., Kempf, J., and V. Devarapalli, Ed., «Mobile IPv6 Bootstrapping in Split Scenario», RFC 5026, DOI 10.17487/RFC5026, October 2007, <https://www.rfc-editor.org/info/rfc5026>.

[RFC5509] Loreto, S., «Internet Assigned Numbers Authority (IANA) Registration of Instant Messaging and Presence DNS SRV Rrs for the Session Initiation Protocol (SIP)», RFC 5509, DOI 10.17487/RFC5509, April 2009, <https://www.rfc-editor.org/info/rfc5509>.

[RFC5518] Hoffman, P., Levine, J., and A. Hathcock, «Vouch By Reference», RFC 5518, DOI 10.17487/RFC5518, April 2009, <https://www.rfc-editor.org/info/rfc5518>.

[RFC6118] Hoeneisen, B. and A. Mayrhofer, «Update of Legacy IANA Registrations of Enumservices», RFC 6118, DOI 10.17487/RFC6118, March 2011, <https://www.rfc-editor.org/info/rfc6118>.

[RFC6335] Cotton, M., Eggert, L., Touch, J., Westerlund, M., and S. Cheshire, «Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Service Name and Transport Protocol Port Number Registry», BCP 165, RFC 6335, DOI 10.17487/RFC6335, August 2011, <https://www.rfc-editor.org/info/rfc6335>.

[RFC6376] Crocker, D., Ed., Hansen, T., Ed., and M. Kucherawy, Ed., «DomainKeys Identified Mail (DKIM) Signatures», STD 76, RFC 6376, DOI 10.17487/RFC6376, September 2011, <https://www.rfc-editor.org/info/rfc6376>.

[RFC6698] Hoffman, P. and J. Schlyter, «The DNS-Based Authentication of Named Entities (DANE) Transport Layer Security (TLS) Protocol: TLSA», RFC 6698, DOI 10.17487/RFC6698, August 2012, <https://www.rfc-editor.org/info/rfc6698>.

[RFC6763] Cheshire, S. and M. Krochmal, «DNS-Based Service Discovery», RFC 6763, DOI 10.17487/RFC6763, February 2013, <https://www.rfc-editor.org/info/rfc6763>.

[RFC7208] Kitterman, S., «Sender Policy Framework (SPF) for Authorizing Use of Domains in Email, Version 1», RFC 7208, DOI 10.17487/RFC7208, April 2014, <https://www.rfc-editor.org/info/rfc7208>.

[RFC7489] Kucherawy, M., Ed. and E. Zwicky, Ed., «Domain-based Message Authentication, Reporting, and Conformance (DMARC)», RFC 7489, DOI 10.17487/RFC7489, March 2015, <https://www.rfc-editor.org/info/rfc7489>.

[RFC7553] Faltstrom, P. and O. Kolkman, «The Uniform Resource Identifier (URI) DNS Resource Record», RFC 7553, DOI 10.17487/RFC7553, June 2015, <https://www.rfc-editor.org/info/rfc7553>.

[RFC7566] Goix, L. and K. Li, «Enumservice Registration for ‘acct’ URI», RFC 7566, DOI 10.17487/RFC7566, June 2015, <https://www.rfc-editor.org/info/rfc7566>.

[RFC7671] Dukhovni, V. and W. Hardaker, «The DNS-Based Authentication of Named Entities (DANE) Protocol: Updates and Operational Guidance», RFC 7671, DOI 10.17487/RFC7671, October 2015, <https://www.rfc-editor.org/info/rfc7671>.

[RFC7929] Wouters, P., «DNS-Based Authentication of Named Entities (DANE) Bindings for OpenPGP», RFC 7929, DOI 10.17487/RFC7929, August 2016, <https://www.rfc-editor.org/info/rfc7929>.

[RFC8126] Cotton, M., Leiba, B., and T. Narten, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 8126, DOI 10.17487/RFC8126, June 2017, <https://www.rfc-editor.org/info/rfc8126>.

[RFC8145] Wessels, D., Kumari, W., and P. Hoffman, «Signaling Trust Anchor Knowledge in DNS Security Extensions (DNSSEC)», RFC 8145, DOI 10.17487/RFC8145, April 2017, <https://www.rfc-editor.org/info/rfc8145>.

[RFC8162] Hoffman, P. and J. Schlyter, «Using Secure DNS to Associate Certificates with Domain Names for S/MIME», RFC 8162, DOI 10.17487/RFC8162, May 2017, <https://www.rfc-editor.org/info/rfc8162>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8461] Margolis, D., Risher, M., Ramakrishnan, B., Brotman, A., and J. Jones, «SMTP MTA Strict Transport Security (MTA-STS)», RFC 8461, DOI 10.17487/RFC8461, September 2018, <https://www.rfc-editor.org/info/rfc8461>.

[RFC8555] Barnes, R., Hoffman-Andrews, J., McCarney, D., and J. Kasten, «Automatic Certificate Management Environment (ACME)», RFC 8555, DOI 10.17487/RFC8555, March 2019, <https://www.rfc-editor.org/info/rfc8555>.

6.2. Дополнительная литература

[RFC8553] Crocker, D., «DNS Attrleaf Changes: Fixing Specifications That Use Underscored Node Names», RFC 8553, DOI 10.17487/RFC8553, March 2019, <https://www.rfc-editor.org/info/rfc8553>.

[ZEROTOUCH] Watsen, K., Abrahamsson, M., and I. Farrer, «Secure Zero Touch Provisioning (SZTP)», Work in Progress3, draft-ietf-netconf-zerotouch-29, January 2019.

Благодарности

Спасибо Bill Fenner, Dick Franks, Tony Hansen, Martin Hoffmann, Paul Hoffman, Peter Koch, Olaf Kolkman, Murray Kucherawy, John Levine, Benno Overeinder, Andrew Sullivan за добросовестный обзор ранних черновых версий. За последующие улучшения спасибо Stephane Bortzmeyer, Alissa Cooper, Bob Harold, Joel Jaeggli, Benjamin Kaduk, Mirja Kuehlewind, Warren Kumari, John Levine, Benno Overeinder, Eric Rescorla, Adam Roach, Petr Spacek, Ondrej Sury, Paul Vixie, Tim Wicinski, Paul Wouters.

Отдельная благодарность Ray Bellis за настойчивую поддержку продолжения работы, а также за предложение существенно упростить модель регистрации.

Адрес автора

Dave Crocker
Brandenburg InternetWorking
675 Spruce Dr.
Sunnyvale, CA 94086
United States of America
Phone: +1.408.246.8253
Email: dcrocker@bbiw.net
URI: http://bbiw.net/
 

Перевод на русский язык

nmalykh@protokols.ru

1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

3Опубликовано в RFC 8572. Прим. перев.

Рубрика: RFC | Оставить комментарий

RFC 8519 YANG Data Model for Network Access Control Lists (ACLs)

Internet Engineering Task Force (IETF)                   M. Jethanandani
Request for Comments: 8519                                        VMware
Category: Standards Track                                     S. Agarwal
ISSN: 2070-1721                                      Cisco Systems, Inc.
                                                                L. Huang
                                                                D. Blair
                                                              March 2019

YANG Data Model for Network Access Control Lists (ACLs)

Модель данных YANG для списков управления доступом (ACL)

PDF

Аннотация

Этот документ задаёт модель данных для списков управления доступом (Access Control List или ACL), представляющих собой упорядоченный пользователем набор правил, служащих для настройки поведения пересылки на устройстве. Каждое правило применяется для сопоставления с пакетами и задает выполняемые по отношению к пакетам действия.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.

Информация о текущем статусе документа, найденных ошибках и способах обратной связи доступна по ссылке https://www.rfc-editor.org/info/rfc8519.

Авторские права

Copyright (c) 2019. Авторские права принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

1. Введение

Списки управления доступом (ACL) являются одним из базовых элементов настройки поведения пересылающего устройства. Они применяются во многих сетевых технологиях, например, в маршрутизации на основе правил (Policy-Based Routing или PBR), межсетевых экранах и т. п. ACL — это упорядоченный пользователем список правил, служащих для фильтрации трафика на сетевом устройстве. Каждое правило представляет в списке запись управления доступом (Access Control Entry или ACE). Каждая запись ACE имеет набор критериев сопоставления и набор действий.

Критерии сопоставления позволяют задать заголовки и метаданные пакетов, соответствующих правилу.

  • Сопоставления заголовков применимы к видимым в пакете полям, таким как адрес, класс обслуживания (Class of Service или CoS), номер порта.

  • Если производитель поддерживает это, можно применять сопоставления с полями, связанными с пакетом, которые не входят в заголовки, такими как входной интерфейс или размер пакета, полученного из линии.

Действия указывают, что делать с пакетом, соответствующим критериям сопоставления. Это могут быть любые операции, применимые к пакетам, такие как учёт, применение правил, пересылка и т. п. Набор доступных действий зависит от возможностей сетевого устройства.

Списки управления доступом часто называют просто ACL (произностися ak-uh l) или списками доступа (Access List). В этом документе все три варианта равноценны.

Сопоставление фильтров и действий в ACE/ACL запускается только после применения (присоединения) ACL на интерфейсе, экземпляре виртуальной маршрутизации и пересылки (Virtual Routing and Forwarding или VRF), в сессии vty/tty, политике QoS или протоколах в разных конфигурациях точек присоединения. После подключения списка он служит для сопоставления с ACE и выполнения соответствующих действий, заданных для ACE. Чтобы применить ACL в любой точке присоединения, отличной от интерфейса, производитель должен дополнить модель YANG ACL.

1.1. Определения и сокращения

ACE

Access Control Entry — запись управления доступом.

ACL

Access Control List — список управления доступом.

CoS

Class of Service — класс обслуживания (сервиса)

DSCP

Differentiated Services Code Point — код дифференцированного обслуживания.

ICMP

Internet Control Message Protocol — сообщение протокола управления Internet.

IP

Internet Protocol — протокол Internet.

IPv4

Internet Protocol version 4 — протокол Internet версии 4.

IPv6

Internet Protocol version 6 — протокол Internet версии 6.

MAC

Media Access Control — управление доступом к среде.

PBR

Policy-Based Routing — маршрутизация на основе правил (политики).

TCP

Transmission Control Protocol — протокол управления передачей.

UDP

User Datagram Protocol — протокол пользовательских дейтаграмм.

1.2. Уровни требований

Ключевые слова должно (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

1.3. Диаграмма дерева

В этом документе применяется графическое представление данных, определённое в YANG Tree Diagrams [RFC8340].

2. Постановка задачи

Этот документ задаёт модель данных YANG 1.1 [RFC7950] для настройки ACL. Модель определяет правила сопоставления для наиболее распространённых протоколов, таких как Ethernet, IPv4, IPv6, TCP, UDP, ICMP. Для поддержки дополнительных протоколов модель может быть расширена. Пример расширения дан в Приложении A.

Реализации ACL в каждом устройстве моугт существенно различаться конструкицями фильтров и поддерживаемыми действиями, поэтому в документе предложена модель, которыю можно дополнить стандартными и фирменными моделями.

3. Понимание фильтров и действий ACL

Хотя у разных производителей есть свои модели данных ACL, имеется базовое понимание, что такое ACL. В сетевых системах обычно имеются наборы ACL, каждый из которых содержит упорядоченный список правил, называемых ACE. Каждая запись ACE имеет набор критериев сопоставления и набор действий. Критерии позволяют указать заголовки пакетов или метаданные, если производитель их поддерживает. Сопоставление по заголовкам пакетов применяется к видимым в пакетах полям, таким как адреса, CoS, номер порта. Сопоставление метаданных применяется к связанным с пакетом полям, которые не являются заголовками пакета, таким как входной интерфейс, размер пакета или размер префикса отправителя или получателя. Действиями могут быть любые операции от записи в системный журнал до ограничесния скорости, отбрасывания или обычной пересылки. Применяются действия первой соответствующей записи ACE без применения последующих ACE.

Модель включает конвейер для хранения общего рабочего состояния каждого списка ACL и каждой записи ACE. Один список ACL можно применять на устройстве к разным целям, таким как интерфейсы сетевого устройства, приложения и функции, работающие на устройстве и т. п. При использовании для интерфейсов сетевого устройства можно задать разные ACL на входе и выходе интерфейса.

Этот документ пытается использовать общие для всех производителей аспекты и создать базовую модель, которую можно дополнять фирменными моделями. Базовая модель проста в устройстве и это позволяет надеяться на достаточную гибкость, позволяющую каждому производителю расширять её.

Применение в модели операторов feature позволяет производителям анонсировать правила сопоставления, которые они хотят и могут поддерживать. Имеется два набора операторов feature, которые устройству нужно анонсировать. Первый набор указывает возможности устройства, такие как способность сопоставлять заголовки Ethernet или заголовки IPv4. Второй набор задаёт комбинации заголовков, которые устройство готово поддерживать, например только IPv6 ACL или комбинация Ethernet, IPv4 и IPv6 ACL.

3.1. Модули ACL

Модель включает два модуля YANG. Модуль ietf-access-control-list определяет базовые аспекты, которые относятся ко всем ACL, независимо от типа и производителя. Фактически модуль можно считать базовым «суперклассом» ACL. Этот модуль импортирует второй модуль ietf-packet-fields. Контейнер сопоставления в ietf-access-control-list применяет группировки из ietf-packet-fields для задания полей сопоставления, таких как номера портов и протоколы. Комбинация проверки if-feature и операторов must позволяет выбрать нужные поля сопоставления, которые пользователь может включить в правила.

Если нужно задать новый выбор (choice) matches, например, IP Flow Information Export (IPFIX) [RFC7011], контейнер matches можно дополнить (augment).

   module: ietf-access-control-list
     +--rw acls
        +--rw acl* [name]
        |  +--rw name    string
        |  +--rw type?   acl-type
        |  +--rw aces
        |     +--rw ace* [name]
        |        +--rw name          string
        |        +--rw matches
        |        |  +--rw (l2)?
        |        |  |  +--:(eth)
        |        |  |     +--rw eth {match-on-eth}?
        |        |  |        +--rw destination-mac-address?
        |        |  |        |       yang:mac-address
        |        |  |        +--rw destination-mac-address-mask?
        |        |  |        |       yang:mac-address
        |        |  |        +--rw source-mac-address?
        |        |  |        |       yang:mac-address
        |        |  |        +--rw source-mac-address-mask?
        |        |  |        |       yang:mac-address
        |        |  |        +--rw ethertype?
        |        |  |                eth:ethertype
        |        |  +--rw (l3)?
        |        |  |  +--:(ipv4)
        |        |  |  |  +--rw ipv4 {match-on-ipv4}?
        |        |  |  |     +--rw dscp?
        |        |  |  |     |       inet:dscp
        |        |  |  |     +--rw ecn?
        |        |  |  |     |       uint8
        |        |  |  |     +--rw length?
        |        |  |  |     |       uint16
        |        |  |  |     +--rw ttl?
        |        |  |  |     |       uint8
        |        |  |  |     +--rw protocol?
        |        |  |  |     |       uint8
        |        |  |  |     +--rw ihl?
        |        |  |  |     |       uint8
        |        |  |  |     +--rw flags?
        |        |  |  |     |       bits
        |        |  |  |     +--rw offset?
        |        |  |  |     |       uint16
        |        |  |  |     +--rw identification?
        |        |  |  |     |       uint16
        |        |  |  |     +--rw (destination-network)?
        |        |  |  |     |  +--:(destination-ipv4-network)
        |        |  |  |     |     +--rw destination-ipv4-network?
        |        |  |  |     |             inet:ipv4-prefix
        |        |  |  |     +--rw (source-network)?
        |        |  |  |        +--:(source-ipv4-network)
        |        |  |  |           +--rw source-ipv4-network?
        |        |  |  |                   inet:ipv4-prefix
        |        |  |  +--:(ipv6)
        |        |  |     +--rw ipv6 {match-on-ipv6}?
        |        |  |        +--rw dscp?
        |        |  |        |       inet:dscp
        |        |  |        +--rw ecn?
        |        |  |        |       uint8
        |        |  |        +--rw length?
        |        |  |        |       uint16
        |        |  |        +--rw ttl?
        |        |  |        |       uint8
        |        |  |        +--rw protocol?
        |        |  |        |       uint8
        |        |  |        +--rw (destination-network)?
        |        |  |        |  +--:(destination-ipv6-network)
        |        |  |        |     +--rw destination-ipv6-network?
        |        |  |        |             inet:ipv6-prefix
        |        |  |        +--rw (source-network)?
        |        |  |        |  +--:(source-ipv6-network)
        |        |  |        |     +--rw source-ipv6-network?
        |        |  |        |             inet:ipv6-prefix
        |        |  |        +--rw flow-label?
        |        |  |                inet:ipv6-flow-label
        |        |  +--rw (l4)?
        |        |  |  +--:(tcp)
        |        |  |  |  +--rw tcp {match-on-tcp}?
        |        |  |  |     +--rw sequence-number?          uint32
        |        |  |  |     +--rw acknowledgement-number?   uint32
        |        |  |  |     +--rw data-offset?              uint8
        |        |  |  |     +--rw reserved?                 uint8
        |        |  |  |     +--rw flags?                    bits
        |        |  |  |     +--rw window-size?              uint16
        |        |  |  |     +--rw urgent-pointer?           uint16
        |        |  |  |     +--rw options?                  binary
        |        |  |  |     +--rw source-port
        |        |  |  |     |  +--rw (source-port)?
        |        |  |  |     |     +--:(range-or-operator)
        |        |  |  |     |        +--rw (port-range-or-operator)?
        |        |  |  |     |           +--:(range)
        |        |  |  |     |           |  +--rw lower-port
        |        |  |  |     |           |  |       inet:port-number
        |        |  |  |     |           |  +--rw upper-port
        |        |  |  |     |           |          inet:port-number
        |        |  |  |     |           +--:(operator)
        |        |  |  |     |              +--rw operator?     operator
        |        |  |  |     |              +--rw port
        |        |  |  |     |                      inet:port-number
        |        |  |  |     +--rw destination-port
        |        |  |  |        +--rw (destination-port)?
        |        |  |  |           +--:(range-or-operator)
        |        |  |  |              +--rw (port-range-or-operator)?
        |        |  |  |                 +--:(range)
        |        |  |  |                 |  +--rw lower-port
        |        |  |  |                 |  |       inet:port-number
        |        |  |  |                 |  +--rw upper-port
        |        |  |  |                 |          inet:port-number
        |        |  |  |                 +--:(operator)
        |        |  |  |                    +--rw operator?     operator
        |        |  |  |                    +--rw port
        |        |  |  |                            inet:port-number
        |        |  |  +--:(udp)
        |        |  |  |  +--rw udp {match-on-udp}?
        |        |  |  |     +--rw length?             uint16
        |        |  |  |     +--rw source-port
        |        |  |  |     |  +--rw (source-port)?
        |        |  |  |     |     +--:(range-or-operator)
        |        |  |  |     |        +--rw (port-range-or-operator)?
        |        |  |  |     |           +--:(range)
        |        |  |  |     |           |  +--rw lower-port
        |        |  |  |     |           |  |       inet:port-number
        |        |  |  |     |           |  +--rw upper-port
        |        |  |  |     |           |          inet:port-number
        |        |  |  |     |           +--:(operator)
        |        |  |  |     |              +--rw operator?     operator
        |        |  |  |     |              +--rw port
        |        |  |  |     |                      inet:port-number
        |        |  |  |     +--rw destination-port
        |        |  |  |        +--rw (destination-port)?
        |        |  |  |           +--:(range-or-operator)
        |        |  |  |              +--rw (port-range-or-operator)?
        |        |  |  |                 +--:(range)
        |        |  |  |                 |  +--rw lower-port
        |        |  |  |                 |  |       inet:port-number
        |        |  |  |                 |  +--rw upper-port
        |        |  |  |                 |          inet:port-number
        |        |  |  |                 +--:(operator)
        |        |  |  |                    +--rw operator?     operator
        |        |  |  |                    +--rw port
        |        |  |  |                            inet:port-number
        |        |  |  +--:(icmp)
        |        |  |     +--rw icmp {match-on-icmp}?
        |        |  |        +--rw type?             uint8
        |        |  |        +--rw code?             uint8
        |        |  |        +--rw rest-of-header?   binary
        |        |  +--rw egress-interface?    if:interface-ref
        |        |  +--rw ingress-interface?   if:interface-ref
        |        +--rw actions
        |        |  +--rw forwarding    identityref
        |        |  +--rw logging?      identityref
        |        +--ro statistics {acl-aggregate-stats}?
        |           +--ro matched-packets?   yang:counter64
        |           +--ro matched-octets?    yang:counter64
        +--rw attachment-points
           +--rw interface* [interface-id] {interface-attachment}?
              +--rw interface-id    if:interface-ref
              +--rw ingress
              |  +--rw acl-sets
              |     +--rw acl-set* [name]
              |        +--rw name              -> /acls/acl/name
              |        +--ro ace-statistics* [name] {interface-stats}?
              |           +--ro name
              |           |       -> /acls/acl/aces/ace/name
              |           +--ro matched-packets?   yang:counter64
              |           +--ro matched-octets?    yang:counter64
              +--rw egress
                 +--rw acl-sets
                    +--rw acl-set* [name]
                       +--rw name              -> /acls/acl/name
                       +--ro ace-statistics* [name] {interface-stats}?
                          +--ro name
                          |       -> /acls/acl/aces/ace/name
                          +--ro matched-packets?   yang:counter64
                          +--ro matched-octets?    yang:counter64

4. Модели YANG ACL

4.1. Модуль IETF Access Control List

Модуль ietf-access-control-list определяет контейнер acls с набором всех acl. Каждый узел acl имеет сведения, указывающие список доступа по имени (name) и список правил (aces), связанных с name. Каждая из записей списка (aces), индексируемая строкой name, имеет контейнеры, задающие сопоставления (matches) и действия (actions).

Модель определяет несколько типов и действий ACL в форме идентификаторов и свойств. Свойства применяются разработчиками для выбра типов ACL, которые система модет поддерживать, а идентификаторы служат для проверки пригодности выбранных типов. Эти типы неявно наследуются ace, защищая от ошибочной настройки типов ace в acl.

Контейнер matches задаёт критерии, служащие для идентификации шаблонов в ietf-packet-fields. Операторы выбора (choice) в контейнере сопоставления позволяют выбрать один из типов заголовков среди l2, l3 и l4. Контейнер actions определяет поведение в случае совпадения (match). В дополнение к разрешению (permit) и отказу (deny) опция записи (logging) для сопоставления позволяет регистрировать совпадения, что позднее можно использовать для нахождения соответствующих правил. Модель также задаёт возможность присоединения списков ACL к определённому интерфейсу.

В ACL можно собирать статистику для ace и interface. Заданные для статистики операторы feature позволяют выбрать статистику, собираемую для ace или interface.

Этот модуль импортирует определения из Common YANG Data Types [RFC6991] и A YANG Data Model for Interface Management [RFC8343].

<CODE BEGINS> file "ietf-access-control-list@2019-03-04.yang"

module ietf-access-control-list {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-access-control-list";
  prefix acl;

  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991 - Common YANG Data Types.";
  }

  import ietf-packet-fields {
    prefix pf;
    reference
      "RFC 8519 - YANG Data Model for Network Access Control
                  Lists (ACLs).";
  }

  import ietf-interfaces {
    prefix if;
    reference
      "RFC 8343 - A YANG Data Model for Interface Management.";
  }

  organization
    "IETF NETMOD (Network Modeling) Working Group.";

  contact
    "WG Web:  <https://datatracker.ietf.org/wg/netmod/> 
     WG List: netmod@ietf.org 

     Editor: Mahesh Jethanandani
             mjethanandani@gmail.com 
     Editor: Lisa Huang
             huangyi_99@yahoo.com 
     Editor: Sonal Agarwal
             sagarwal12@gmail.com 
     Editor: Dana Blair
             dana@blairhome.com"; 

  description
    "Этот модуль YANG задаёт компонент, описывающий настройку и
     мониторинг списков управления доступом (ACL).

     Ключевые слова ДОЛЖНО, НЕДОПУСТИМО, ТРЕБУЕТСЯ, НУЖНО, НЕ НУЖНО, 
     СЛЕДУЕТ, НЕ СЛЕДУЕТ, РЕКОМЕНДУЕТСЯ, НЕ РЕКОМЕНДУЕТСЯ, МОЖНО,
     НЕОБЯЗАТЕЛЬНО в этом документе трактуются в соответствии с 
     BCP 14 (RFC 2119) (RFC 8174) тогда и только тогда, когда они
     указаны заглавными буквами, как показано здесь.

     Авторские права (Copyright (c) 2019) принадлежат IETF Trust и
     лицам, указанным как авторы. Все права защищены.

     Распространение и применение модуля в исходной или двоичной 
     форме с изменениями или без таковых разрешено в соответствии с
     лицензией Simplified BSD License, изложенной в параграфе 4.c
     IETF Trust's Legal Provisions Relating to IETF Documents
     (https://trustee.ietf.org/license-info). 

     Эта версия модуля YANG является частью RFC 8519, где правовые
     аспекты приведены более полно.";

  revision 2019-03-04 {
    description
      "Исходный выпуск.";
    reference
      "RFC 8519: YANG Data Model for Network Access Control
                 Lists (ACLs).";
  }

  /*
   * Идентификаторы (отождествления)
   */

  /*
   * Действия по пересылке пакета
   */

  identity forwarding-action {
    description
      "базовое отождествление для действий при пересылке.";
  }

  identity accept {
    base forwarding-action;
    description
      "Воспринять пакет.";
  }

  identity drop {
    base forwarding-action;
    description
      "Отбросить пакет без передачи сообщения ICMP об ошибке.";
  }

  identity reject {
    base forwarding-action;
    description
      "Отбросить пакет с передачей источнику сообщения ICMP об ошибке.";
  }

  /*
   * Действия по регистрации для пакетов
   */

  identity log-action {
    description
      "Базовый идентификатор для указания получателя сведений.";
  }

  identity log-syslog {
    base log-action;
    description
      "Информация syslog для пакета.";
  }

  identity log-none {
    base log-action;
    description
      "Нет регистрации (logging) для пакета.";
  }

  /*
   * Идентификаторы типов ACL
   */

  identity acl-base {
    description
      "Базовый тип для всех ACL.";
  }

  identity ipv4-acl-type {
    base acl:acl-base;
    if-feature "ipv4";
    description
      "ACL для сопоставления полей заголовка IPv4 (например, адрес
       получателя IPv4) и L4 (например, порт получателя TCP). ACL типа
       ipv4 не имеют сопоставления полей заголовков Ethernet и IPv6.";
  }

  identity ipv6-acl-type {
    base acl:acl-base;
    if-feature "ipv6";
    description
      "ACL для сопоставления полей заголовка IPv6 (например, адрес
       получателя IPv6) и L4 (например, порт получателя TCP). ACL типа
       ipv6 не имеют сопоставления полей заголовков Ethernet и IPv4.";
  }

  identity eth-acl-type {
    base acl:acl-base;
    if-feature "eth";
    description
      "ACL для сопоставления полей заголовка Ethernet или Wi-Fi. ACL
       типа ethernet не включают сопоставления полей заголовков IPv4
       IPv6, L4.";
  }

  identity mixed-eth-ipv4-acl-type {
    base acl:eth-acl-type;
    base acl:ipv4-acl-type;
    if-feature "mixed-eth-ipv4";
    description
      "ACL для сопоставления полей заголовков Ethernet и IPv4. Могут
       также включать сопоставления полей заголовка L4.";
  }

  identity mixed-eth-ipv6-acl-type {
    base acl:eth-acl-type;
    base acl:ipv6-acl-type;
    if-feature "mixed-eth-ipv6";
    description
      "ACL для сопоставления полей заголовков Ethernet и IPv6. Могут
       также включать сопоставления полей заголовка L4.";
  }

  identity mixed-eth-ipv4-ipv6-acl-type {
    base acl:eth-acl-type;
    base acl:ipv4-acl-type;
    base acl:ipv6-acl-type;
    if-feature "mixed-eth-ipv4-ipv6";
    description
      "ACL для сопоставления полей заголовков Ethernet, IPv4 и IPv6. 
       Могут также включать сопоставления полей заголовка L4.";
  }

  /*
   * Свойства (функции)
   */

  /*
   * Функции, поддерживаемые устройством
   */
  feature match-on-eth {
    description
      "Устройство может сопоставлять заголовки Ethernet.";
  }

  feature match-on-ipv4 {
    description
      "Устройство может сопоставлять заголовки IPv4.";
  }

  feature match-on-ipv6 {
    description
      "Устройство может сопоставлять заголовки IPv6.";
  }

  feature match-on-tcp {
    description
      "Устройство может сопоставлять заголовки TCP.";
  }

  feature match-on-udp {
    description
      "Устройство может сопоставлять заголовки UDP.";
  }

  feature match-on-icmp {
    description
      "Устройство может сопоставлять заголовки ICMP (v4 и v6).";
  }

  /*
   * Комбинации сопоставления заголовков, поддерживаемые устройством
   */

  feature eth {
    if-feature "match-on-eth";
    description
      "Только Ethernet ACL.";
  }

  feature ipv4 {
    if-feature "match-on-ipv4";
    description
      "Только IPv4 ACL.";
  }

  feature ipv6 {
    if-feature "match-on-ipv6";
    description
      "Только IPv6 ACL.";
  }

  feature mixed-eth-ipv4 {
    if-feature "match-on-eth and match-on-ipv4";
    description
      "Ethernet и IPv4 ACL.";
  }

  feature mixed-eth-ipv6 {
    if-feature "match-on-eth and match-on-ipv6";
    description
      "Ethernet и IPv6 ACL.";
  }

  feature mixed-eth-ipv4-ipv6 {
    if-feature
      "match-on-eth and match-on-ipv4
       and match-on-ipv6";
    description
      "Ethernet, IPv4, IPv6 ACL.";
  }

  /*
   * Свойства (функции) статистики
   */
  feature interface-stats {
    description
      "Счётчики ACL доступны и возвращаются лишь для интерфейса.";
  }

  feature acl-aggregate-stats {
    description
      "Счётчики ACL доступны и возвращаются лишь для записи ACL.";
  }

  /*
   * Свойства (функции) точек присоединения
   */
  feature interface-attachment {
    description
      "ACL устанавливаются на интерфейсах.";
  }

  /*
   * Определения типов
   */
  typedef acl-type {
    type identityref {
      base acl-base;
    }
    description
      "Указывает тип ACL.";
  }

  /*
   * Группировки
   */
  grouping acl-counters {
    description
      "Базовая группа для счётчиков ACL.";
    leaf matched-packets {
      type yang:counter64;
      config false;
      description
        "Учёт числа пакетов, соответствующих текущей записи ACL.

         Всем реализациям следует поддерживать такие счётчики на уровне
         интерфейса и записи ACL,если это возможно.

         Если реализация поддерживает счётчики ACL лишь на уровне записи
         (не поддерживает на интерфейс), следует учитывать в значении 
         все интерфейсы.

         Реализации, поддерживающей счётчики для записи на уровне
         интерфейса, не требуется предоставлять агрегированный счётчик,
         например, на запись. Предполагается, что пользователь способен
         выполнить такое агрегирование, если это требуется.";
    }

    leaf matched-octets {
      type yang:counter64;
      config false;
      description
        "Учёт числа октетов (байтов), соответствующих текущей записи ACL.

         Реализациям следует поддерживать такие счётчики на уровне
         интерфейса и записи ACL,если это возможно.

         Если реализация поддерживает счётчики ACL лишь на уровне записи
         (не поддерживает на интерфейс), следует учитывать в значении 
         все интерфейсы.

         Реализации, поддерживающей счётчики для записи на уровне
         интерфейса, не требуется предоставлять агрегированный счётчик,
         например, на запись. Предполагается, что пользователь способен
         выполнить такое агрегирование, если это требуется.";
    }
  }

  /*
   * Узлы данных настройки и мониторинга
   */

  container acls {
    description
      "Контейнер верхнего уровня для ACL с 1 или множеством узлов acl.";
    list acl {
      key "name";
      description
        "ACL - упорядоченный список записей ACE, каждая из которых
         имеет список критериев и список действий. Поскольку имеется
         несколько типов ACL, реализуемых с разными атрибутами для
         различных производителей, модель позволяет настроить ACL для
         каждого типа и производителя.";
      leaf name {
        type string {
          length "1..64";
        }
        description
          "имя списка доступа. Устройство МОЖЕТ дополнительно сокращать
           размер имени. Пробелы и специальные символы не допускаются.";
      }
      leaf type {
        type acl-type;
        description
          "Тип ACL, указывающий основной тип критериев соответствия
           (например, Ethernet, IPv4, IPv6, mixed и т. л.) в списке.";
      }
      container aces {
        description
          "Контейнер с узлами ACE.";
        list ace {
          key "name";
          ordered-by user;
          description
            "Список записей ACE.";
          leaf name {
            type string {
              length "1..64";
            }
            description
              "Уникальное имя записи ACE.";
          }
          container matches {
            description
              "Правила этого набора задают поля для сопоставления перед
               выполнением каких-либо действий. Правила выбираются на 
               основе набора свойств (feature), заданного сервером, и 
               acl-type. Если для конкретного контейнера не заданы
               сопоставления, ему будет соответствовать любой пакет.
               Если соппоставления не заданы ни в одной записи ACE, 
               этой записи будет соответствовать любой пакет.";

            choice l2 {
              container eth {
                when "derived-from-or-self(/acls/acl/type, "
                   + "'acl:eth-acl-type')";
                if-feature "match-on-eth";
                uses pf:acl-eth-header-fields;
                description
                  "Набор правил для сопоставления заголовков Ethernet.";
              }
              description
                "Сопоставление заголовков L2, например, Ethernet.";
            }

            choice l3 {
              container ipv4 {
                when "derived-from-or-self(/acls/acl/type, "
                   + "'acl:ipv4-acl-type')";
                if-feature "match-on-ipv4";
                uses pf:acl-ip-header-fields;
                uses pf:acl-ipv4-header-fields;
                description
                  "Набор правил для сопоставления заголовков IPv4.";
              }

              container ipv6 {
                when "derived-from-or-self(/acls/acl/type, "
                   + "'acl:ipv6-acl-type')";
                if-feature "match-on-ipv6";
                uses pf:acl-ip-header-fields;
                uses pf:acl-ipv6-header-fields;
                description
                  "Набор правил для сопоставления заголовков IPv6.";
              }
              description
                "Выбор заголовков IPv4 или IPv6.";
            }

            choice l4 {
              container tcp {
                if-feature "match-on-tcp";
                uses pf:acl-tcp-header-fields;
                container source-port {
                  choice source-port {
                    case range-or-operator {
                      uses pf:port-range-or-operator;
                      description
                        "Определение порта источника из диапазона или 
                         оператора.";
                    }
                    description
                      "Выбор определения порта источника с применением
                       range/operator или выбор для поддержки будущих
                       операторов case, таких как возможность указать
                       группу портов источника.";
                  }
                  description
                    "Определение порта источника.";
                }
                container destination-port {
                  choice destination-port {
                    case range-or-operator {
                      uses pf:port-range-or-operator;
                      description
                        "Определение порта адресата из диапазона или 
                         оператора.";
                    }
                    description
                      "Выбор определения порта адресата с применением
                       range/operator или выбор для поддержки будущих
                       операторов case, таких как возможность указать
                       группу портов адресата.";
                  }
                  description
                    "Определение порта адресата.";
                }
                description
                  "Набор правил для сопоставления заголовков TCP.";
              }

              container udp {
                if-feature "match-on-udp";
                uses pf:acl-udp-header-fields;
                container source-port {
                  choice source-port {
                    case range-or-operator {
                      uses pf:port-range-or-operator;
                      description
                        "Определение порта адресата из range или 
                         operator.";
                    }
                    description
                      "Выбор определения порта источника с применением
                       range/operator или выбор для поддержки будущих
                       операторов case, таких как возможность указать
                       группу портов источника.";
                  }
                  description
                    "Определение порта источника.";
                }
                container destination-port {
                  choice destination-port {
                    case range-or-operator {
                      uses pf:port-range-or-operator;
                      description
                        "Определение порта адресата из range или 
                         operator.";
                    }
                    description
                      "Выбор определения порта адресата с применением
                       range/operator или выбор для поддержки будущих
                       операторов case, таких как возможность указать
                       группу портов адресата.";
                  }
                  description
                    "Определение порта адресата.";
                }
                description
                  "Набор правил для сопоставления заголовков UDP.";
              }

              container icmp {
                if-feature "match-on-icmp";
                uses pf:acl-icmp-header-fields;
                description
                  "Набор правил для сопоставления заголовков ICMP.";
              }
              description
                "Выбор заголовков TCP, UDP или ICMP.";
            }

            leaf egress-interface {
              type if:interface-ref;
              description
                "Выходной интерфейс. Это не следует применять, если ACL
                 подключён как выходной ACL (или значению следует
                 совпадать с интерфейсом, куда подключён ACL).";
            }

            leaf ingress-interface {
              type if:interface-ref;
              description
                "Входной интерфейс. Это не следует применять, если ACL
                 подключён как входной ACL (или значению следует
                 совпадать с интерфейсом, куда подключён ACL).";
            }
          }

          container actions {
            description
              "Задание действий для этой записи ace.";
            leaf forwarding {
              type identityref {
                base forwarding-action;
              }
              mandatory true;
              description
                "Задаёт действие пересылки для записи ace.";
            }

            leaf logging {
              type identityref {
                base log-action;
              }
              default "log-none";
              description
                "Задаёт регистрацию (log) пакета и адресата для 
                 соответствующих пакетов. По умолчанию пакеты не
                 регистрируются.";
            }
          }
          container statistics {
            if-feature "acl-aggregate-stats";
            config false;
            description
              "Статистика, собранная на всех точках присоединения
               данного ACL.";
            uses acl-counters;
          }
        }
      }
    }
    container attachment-points {
      description
        "Включающий (внешний) контейнер для списка точек присоединения,
         где установлены ACL.";
      /*
       * Группировки
       */
      grouping interface-acl {
        description
          "Группировка для данных входного ACL по интерфейсам.";
        container acl-sets {
          description
            "Включающий контейнер для списка входных ACL на
             интерфейсе.";
          list acl-set {
            key "name";
            ordered-by user;
            description
              "Список входных ACL на интерфейсе.";
            leaf name {
              type leafref {
                path "/acls/acl/name";
              }
              description
                "Ссылка на имя ACL, применяемого на входе.";
            }
            list ace-statistics {
              if-feature "interface-stats";
              key "name";
              config false;
              description
                "Список ACE.";
              leaf name {
                type leafref {
                  path "/acls/acl/aces/ace/name";
                }
                description
                  "Имя записи ace.";
              }
              uses acl-counters;
            }
          }
        }
      }

      list interface {
        if-feature "interface-attachment";
        key "interface-id";
        description
          "Список интерфейсов, где установлены ACL.";

        leaf interface-id {
          type if:interface-ref;
          description
            "Ссылка на ключ списка для идентификатора интерфейса.";
        }

        container ingress {
          uses interface-acl;
          description
            "ACL, примененные к входному интерфейсу.";
        }
        container egress {
          uses interface-acl;
          description
            "ACL, примененные к выходному интерфейсу.";
        }
      }
    }
  }
}
<CODE ENDS>

4.2. Модуль IETF Packet Fields

Модуль определяет требуемые группы для сопоставления полей пакетов, включая заголовки Ethernet, IPv4, IPv6 и транспортного уровня. Узел type определяет, какие из этих полей включаются в данный список ACL, кроме полей заголовков TCP, UDP и ICMP. Эти поля могут применяться вместе с указанными выше полями L2 или L3.

Поскольку критериев сопоставления очень много, базовая спецификация не включает их напрямую, а указывает из опрератором uses для сохранения простоты базового модуля. Если нужны дополнительные условия сопоставления, их можно добавить выбором дополнений (augment) в контейнере matches модели данных ietf-access-control-list.yang.

Этот модуль импортирует определения из Common YANG Data Types [RFC6991] и ссылается на Internet Protocol [RFC791], Internet Control Message Protocol [RFC792], Transmission Control Protocol [RFC793], Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers [RFC2474], The Addition of Explicit Congestion Notification (ECN) to IP [RFC3168], IPv6 Scoped Address Architecture [RFC4007], IP Version 6 Addressing Architecture [RFC4291], A Recommendation for IPv6 Address Text Representation [RFC5952], и Internet Protocol, Version 6 (IPv6) Specification [RFC8200].

<CODE BEGINS> file "ietf-packet-fields@2019-03-04.yang"

module ietf-packet-fields {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-packet-fields";
  prefix packet-fields;

  import ietf-inet-types {
    prefix inet;
    reference
      "RFC 6991 - Common YANG Data Types.";
  }

  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991 - Common YANG Data Types.";
  }

  import ietf-ethertypes {
    prefix eth;
    reference
      "RFC 8519 - YANG Data Model for Network Access Control
                  Lists (ACLs).";
  }

  organization
    "IETF NETMOD (Network Modeling) Working Group.";

  contact
    "WG Web:  <https://datatracker.ietf.org/wg/netmod/> 
     WG List: netmod@ietf.org 

     Editor: Mahesh Jethanandani
             mjethanandani@gmail.com 
     Editor: Lisa Huang
             huangyi_99@yahoo.com 
     Editor: Sonal Agarwal
             sagarwal12@gmail.com 
     Editor: Dana Blair
             dana@blairhome.com"; 

  description
    "Этот модуль YANG определяет группировки, применяемые модулем
     ietf-access-control-list. Их использование не ограничивается
     этим модулем и они могут применяться в любом подходящем месте.

     Авторские права (Copyright (c) 2019) принадлежат IETF Trust и
     лицам, указанным как авторы. Все права защищены.

     Распространение и применение модуля в исходной или двоичной 
     форме с изменениями или без таковых разрешено в соответствии с
     лицензией Simplified BSD License, изложенной в параграфе 4.c
     IETF Trust's Legal Provisions Relating to IETF Documents
     (https://trustee.ietf.org/license-info). 

     Эта версия модуля YANG является частью RFC 8519, где правовые
     аспекты приведены более полно.";

  revision 2019-03-04 {
    description
      "Исходный выпуск.";
    reference
      "RFC 8519: YANG Data Model for Network Access Control
                 Lists (ACLs).";
  }

  /*
   * Определения типов
   */
  typedef operator {
    type enumeration {
      enum lte {
        description
          "Меньше или равно.";
      }
      enum gte {
        description
          "Больше или равно.";
      }
      enum eq {
        description
          "Равно.";
      }
      enum neq {
        description
          "Не равно.";
      }
    }
    description
      "Определения диапазона портов источника и получателя можно
       уточнять с помощью типа operator. Это требуется лишь в случае,
       когда указан lower-port или не указан upper-port, поэтому
       operator уточняет только lower-port.";
  }

  /*
   * Groupings
   */
  grouping port-range-or-operator {
    choice port-range-or-operator {
      case range {
        leaf lower-port {
          type inet:port-number;
          must '. <= ../upper-port' {
            error-message
              "Значение lower-port должно быть не больше upper-port.";
          }
          mandatory true;
          description
            "Нижняя граница портов.";
        }
        leaf upper-port {
          type inet:port-number;
          mandatory true;
          description
            "Верхняя граница портов.";
        }
      }
      case operator {
        leaf operator {
          type operator;
          default "eq";
          description
            "Оператор для применения к порту, как указано ниже.";
        }
        leaf port {
          type inet:port-number;
          mandatory true;
          description
            "Номер порта и operator для применения.";
        }
      }
      description
        "Задание в operator диапазона или одного порта.";
    }
    description
      "Группировка для определений портов через оператор choice.";
  }

  grouping acl-ip-header-fields {
    description
      "Поля заголовка IP, общие для IPv4 и IPv6";
    reference
      "RFC 791: Internet Protocol.";

    leaf dscp {
      type inet:dscp;
      description
        "Код дифференцированного обслуживания (DSCP).";
      reference
        "RFC 2474: Definition of the Differentiated Services
                   Field (DS Field) in the IPv4 and IPv6
                   Headers.";
    }

    leaf ecn {
      type uint8 {
        range "0..3";
      }
      description
        "Явное уведомление о перегрузке (ECN).";
      reference
        "RFC 3168: The Addition of Explicit Congestion
                   Notification (ECN) to IP.";
    }

    leaf length {
      type uint16;
      description
        "В заголовке IPv4 это поле называют Total Length - размер 
         дейтаграммы в октетах, включая заголовок и данные.

         В заголовке IPv6 это поле называют Payload Length - размер
         данных IPv6, т. е. части после заголовка IPv6 (в октетах).";
      reference
        "RFC 791: Internet Protocol
         RFC 8200: Internet Protocol, Version 6 (IPv6) Specification.";
    }
    leaf ttl {
      type uint8;
      description
        "Задаёт максимальное время, которое дейтаграмма может находиться
         в системе internet. При значении 0 дейтаграмма отбрасывается.

         В IPv6 это поле называют Hop Limit.";
      reference
        "RFC 791: Internet Protocol
         RFC 8200: Internet Protocol, Version 6 (IPv6) Specification.";
    }
    leaf protocol {
      type uint8;
      description
        "Номер протокола Internet, указывающий протокол в поле данных.
         В IPv6 это поле называют next-header и при наличии заголовков
         расширения протокол указывается в заголовке «верхнего уровня».";
      reference
        "RFC 791: Internet Protocol
         RFC 8200: Internet Protocol, Version 6 (IPv6) Specification.";
    }
  }

  grouping acl-ipv4-header-fields {
    description
      "Поля заголовка IPv4.";
    leaf ihl {
      type uint8 {
        range "5..60";
      }
      description
        "В поле заголовка IPv4 Internet Header Length (IHL) указывает
         размер заголовка internet в 32-битовых словах, что показывает
         начало данных. Отметим, что значение должно быть не меньше 5.";
    }
    leaf flags {
      type bits {
        bit reserved {
          position 0;
          description
            "Резерв. Должно быть 0.";
        }
        bit fragment {
          position 1;
          description
            "0 разрешает фрагментирование, 1 - запрещает.";
        }
        bit more {
          position 2;
          description
            "0 указывает последний фрагмент, 1 - наличие других.";
        }
      }
      description
        "Определения битов поля Flags в заголовке IPv4.";
    }
    leaf offset {
      type uint16 {
        range "20..65535";
      }
      description
        "Смещение фрагмента в 8-октетных (64 бита) блоках. Первый
         фрагмент имеет смщение 0. Размер поля 13 битов";
    }
    leaf identification {
      type uint16;
      description
        "Значение, заданное отправителем для использования при сборке
         дейтаграммы из фрагментов.";
    }

    choice destination-network {
      case destination-ipv4-network {
        leaf destination-ipv4-network {
          type inet:ipv4-prefix;
          description
            "Префикс адресата IPv4.";
        }
      }
      description
        "Выбор указания адреса или группы адресов получателя IPv4.";
    }

    choice source-network {
      case source-ipv4-network {
        leaf source-ipv4-network {
          type inet:ipv4-prefix;
          description
            "Префикс источника IPv4.";
        }
      }
      description
        "Выбор указания адреса или группы адресов источника IPv4.";
    }
  }

  grouping acl-ipv6-header-fields {
    description
      "Поля заголовка IPv6.";

    choice destination-network {
      case destination-ipv6-network {
        leaf destination-ipv6-network {
          type inet:ipv6-prefix;
          description
            "Префикс адресата IPv6.";
        }
      }
      description
        "Выбор указания адреса или группы адресов получателя IPv6.";
    }

    choice source-network {
      case source-ipv6-network {
        leaf source-ipv6-network {
          type inet:ipv6-prefix;
          description
            "Source IPv6 address prefix.";
        }
      }
      description
        "Выбор указания адреса или группы адресов источника IPv6.";
    }

    leaf flow-label {
      type inet:ipv6-flow-label;
      description
        "Метка потока IPv6 (Flow label).";
    }
    reference
      "RFC 4291: IP Version 6 Addressing Architecture
       RFC 4007: IPv6 Scoped Address Architecture
       RFC 5952: A Recommendation for IPv6 Address Text
                 Representation.";
  }

  grouping acl-eth-header-fields {
    description
      "Поля заголовка Ethernet.";
    leaf destination-mac-address {
      type yang:mac-address;
      description
        "Адрес получателя IEEE 802 MAC.";
    }
    leaf destination-mac-address-mask {
      type yang:mac-address;
      description
        "Маска адреса получателя IEEE 802 MAC.";
    }
    leaf source-mac-address {
      type yang:mac-address;
      description
        "Адрес источника IEEE 802 MAC.";
    }
    leaf source-mac-address-mask {
      type yang:mac-address;
      description
        "Маска адреса источника IEEE 802 MAC.";
    }
    leaf ethertype {
      type eth:ethertype;
      description
        "Тип Ethernet (или Length) в каноническом порядке IEEE 802,
         использующем символы нижнего регистра.";
      reference
        "IEEE 802-2014, Clause 9.2.";
    }
    reference
      "IEEE 802: IEEE Standard for Local and Metropolitan
       Area Networks: Overview and Architecture.";
  }

  grouping acl-tcp-header-fields {
    description
      "Поля заголовка TCP, которые можно задать в сопоставлении.";
    leaf sequence-number {
      type uint32;
      description
        "Порядковый номер в пакете.";
    }
    leaf acknowledgement-number {
      type uint32;
      description
        "Номер подтверждения в пакете.";
    }
    leaf data-offset {
      type uint8 {
        range "5..15";
      }
      description
        "Размер заголовка TCP в 32-битовых словах. Минимальное значение
         - 5, максимальное - 15, т. е. заголовок размером от 20 до 60
         байтов, позволяющий включить до 40 байтов опций.";
    }
    leaf reserved {
      type uint8;
      description
        "Резерв на будущее.";
    }
    leaf flags {
      type bits {
        bit cwr {
          position 1;
          description
            "Флаг сокращения окна перегрузки (Congestion Window Reduced
             или CWR), устанавливаемый передающим хостом для индикации
             приёма сегмента TCP с установленным флагом ECN-Echo (ECE) и
             ответа на него механизмом контроля перегрузок.";
          reference
            "RFC 3168: The Addition of Explicit Congestion
                       Notification (ECN) to IP.";
        }
        bit ece {
          position 2;
          description
            "ECN-Echo играет 2 роли в зависимости от флага SYN. Если
             SYN установлен (1), партнёр TCP поддерживает ECN, а при
             сброшенном флаге SYN пакет с установленным флагом CE
             (ECN=11) в заголовке IP был принят при нормальной передаче
             (добавлен в заголовок RFC 3168). Это служит для указания
             перегрузки сети (или её приближения) отправителю TCP.";
          reference
            "RFC 3168: The Addition of Explicit Congestion
                       Notification (ECN) to IP.";
        }
        bit urg {
          position 3;
          description
            "Говорит о значимости поля Urgent Pointer.";
        }
        bit ack {
          position 4;
          description
            "Указывает значимость флага Acknowledgement. Во всех пакетах 
             от клиента после начального пакета SYN этот флаг следует 
             устанавливать.";
        }
        bit psh {
          position 5;
          description
            "Функция Push, запрашивающая выталкивание буферизованных 
             данных принимающему приложению.";
        }
        bit rst {
          position 6;
          description
            "Reset the connection.";
        }
        bit syn {
          position 7;
          description
            "Синхронизация порядковых номеров. Этот флаг устанавливается
             лишь в первом пакете каждой стороны. Некоторые флаги и поля
             могут менять смысл этого флага, другие действительны лишь
             при наличии этого флага, третьи - лишь при отсутствии.";
        }
        bit fin {
          position 8;
          description
            "Последний пакет от отправителя.";
        }
      }
      description
        "Известны также как Control Bit (9 однобитовых флагов).";
      reference
        "RFC 793: Transmission Control Protocol.";
    }
    leaf window-size {
      type uint16;
      units "bytes";
      description
        "Размер окна приёма, задаёт размер данных сверх номера 
         в поле Acknowledgement, которые отправитель этого сегмента
         готов в данный момент воспринять.";
    }
    leaf urgent-pointer {
      type uint16;
      description
        "Смещение от порядкового номера, указывающего последний байт
         срочных (urgent) данных.";
    }
    leaf options {
      type binary {
        length "1..40";
      }
      description
        "Размер этого поля определяется полем Data Offset. Опции могут
         иметь до 3 полей: Option-Kind (1 байт), Option-Length (1 байт),
         и Option-Data (переменный). Поле Option-Kind указывает тип
         опции и является обязательным. В зависимости от типа опции
         включаются два других поля. Option-Length указывает размер
         опции, а Option-Data - значение опции.";
    }
  }

  grouping acl-udp-header-fields {
    description
      "Набор полей заголовка UDP для сопоставлений.";
    leaf length {
      type uint16;
      description
        "Размер заголовка и данных UDP в байтах. Минимальный размер - 8
         байтов (размер заголовка). Это поле задаёт теоретический предел
         65535 байтов (8 байтов заголовка и 65527 байтов данных) для
         дейтаграмм UDP. Однако фактический предел размера данных
         нижележащий протокол IPv4 сокращает до 65507 байтов (20 байтов
         занимает заголовок IP).
         В джамбограммах IPv6 пакеты UDP могут быть больше 65535 байтов.
         RFC 2675 задаёт установку Length = 0, если размер заголовка и
         данных UDP превышает 65535 байтов.";
    }
  }

  grouping acl-icmp-header-fields {
    description
      "Поля заголовка ICMP для сопоставлений.";
    leaf type {
      type uint8;
      description
        "Называются также управляющими сообщениями.";
      reference
        "RFC 792: Internet Control Message Protocol
         RFC 4443: Internet Control Message Protocol (ICMPv6)
                   for Internet Protocol Version 6 (IPv6)
                   Specification.";
    }
    leaf code {
      type uint8;
      description
        "Субтип ICMP. Называются также управляющими сообщениями.";
      reference
        "RFC 792: Internet Control Message Protocol
         RFC 4443: Internet Control Message Protocol (ICMPv6)
                   for Internet Protocol Version 6 (IPv6)
                   Specification.";
    }
    leaf rest-of-header {
      type binary;
      description
        "Размер не ограничен, содержимое зависит от типа и кода
         ICMP. В ICMPv6 называется Message Body.";
      reference
        "RFC 792: Internet Control Message Protocol
         RFC 4443: Internet Control Message Protocol (ICMPv6)
                   for Internet Protocol Version 6 (IPv6)
                   Specification.";
    }
  }
}
<CODE ENDS>

4.3. Примеры ACL

Требование. Отвергать трафик tcp из подсети 192.0.2.0/24 в подсеть 198.51.100.0/24.

Ниже приведена конфигурация ACL в формате xml3.

   <?xml version="1.0" encoding="UTF-8"?>
   <config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <acls
       xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list">
       <acl>
         <name>sample-ipv4-acl</name>
         <type>ipv4-acl-type</type>
         <aces>
           <ace>
             <name>rule1</name>
             <matches>
               <ipv4>
                 <protocol>6</protocol>
                 <destination-ipv4-network>198.51.100.0/24</destination\
   -ipv4-network>
                 <source-ipv4-network>192.0.2.0/24</source-ipv4-network>
               </ipv4>
             </matches>
             <actions>
               <forwarding>drop</forwarding>
             </actions>
           </ace>
         </aces>
       </acl>
     </acls>
   </config>

ACL и ACE можно задать командами CLI, как показано ниже.

         acl ipv4 sample-ipv4-acl
         deny tcp 192.0.2.0/24 198.51.100.0/24

Требование. Принимать весь трафик DNS, направленный в подсеть 2001:db8::/32, на порту 53.

   <?xml version="1.0" encoding="UTF-8"?>
   <config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <acls
       xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list">
       <acl>
         <name>allow-dns-packets</name>
         <type>ipv6-acl-type</type>
         <aces>
           <ace>
             <name>rule1</name>
             <matches>
               <ipv6>
                 <destination-ipv6-network>2001:db8::/32</destination-i\
   pv6-network>
               </ipv6>
               <udp>
                 <destination-port>
                   <operator>eq</operator>
                   <port>53</port>
                 </destination-port>
               </udp>
             </matches>
             <actions>
               <forwarding>accept</forwarding>
             </actions>
           </ace>
         </aces>
       </acl>
     </acls>
   </config>

4.4. Применение диапазона портов и другие примеры

При наличии lower-port и upper-port они задают диапазон портов, включающий оба значения. При наличии лишь port задан только порт, а диапазон определяет operator.

Приведённый ниже пример XML показывает конфигурацию с отбрасыванием трафика TCP из портов 16384 — 16387.

   <?xml version="1.0" encoding="UTF-8"?>
   <config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <acls
       xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list">
       <acl>
         <name>sample-port-acl</name>
         <type>ipv4-acl-type</type>
         <aces>
           <ace>
             <name>rule1</name>
             <matches>
               <tcp>
                 <source-port>
                   <lower-port>16384</lower-port>
                   <upper-port>16387</upper-port>
                 </source-port>
               </tcp>
             </matches>
             <actions>
               <forwarding>drop</forwarding>
             </actions>
           </ace>
         </aces>
       </acl>
     </acls>
   </config>

Следующий пример XML представляет конфигурацию с отбрасыванием всех эхо-запросов IPv4 ICMP.

   <?xml version="1.0" encoding="UTF-8"?>
   <config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <acls
       xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list">
       <acl>
         <name>sample-icmp-acl</name>
         <aces>
           <ace>
             <name>rule1</name>
             <matches>
               <ipv4>
                 <protocol>1</protocol>
               </ipv4>
               <icmp>
                 <type>8</type>
                 <code>0</code>
               </icmp>
             </matches>
             <actions>
               <forwarding>drop</forwarding>
             </actions>
           </ace>
         </aces>
       </acl>
     </acls>
   </config>

Далее приведён пример XML с настройкой одного порта (21) для восприятия трафик TCP.

   <?xml version="1.0" encoding="UTF-8"?>
   <config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <acls
       xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list">
       <acl>
         <name>sample-ipv4-acl</name>
         <type>ipv4-acl-type</type>
         <aces>
           <ace>
             <name>rule1</name>
             <matches>
               <tcp>
                 <destination-port>
                   <operator>eq</operator>
                   <port>21</port>
                 </destination-port>
               </tcp>
             </matches>
             <actions>
               <forwarding>accept</forwarding>
             </actions>
           </ace>
         </aces>
       </acl>
     </acls>
   </config>

Ниже представлен пример XML с конфигурацией, задающей отбрасывание пакетов TCP для всех портов, кроме 21.

   <?xml version="1.0" encoding="UTF-8"?>
   <config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <acls
       xmlns="urn:ietf:params:xml:ns:yang:ietf-access-control-list">
       <acl>
         <name>sample-ipv4-acl</name>
         <type>ipv4-acl-type</type>
         <aces>
           <ace>
             <name>rule1</name>
             <matches>
               <tcp>
                 <destination-port>
                   <operator>neq</operator>
                   <port>21</port>
                 </destination-port>
               </tcp>
             </matches>
             <actions>
               <forwarding>drop</forwarding>
             </actions>
           </ace>
         </aces>
       </acl>
     </acls>
   </config>

5. Вопросы безопасности

Модули YANG в этом документе задают схему для данных, предназначенную для доступа по протоколам управления сетью, таким как NETCONF [RFC6241] и RESTCONF [RFC8040]. Нижним уровнем NETCONF является защищённый транспорт в обязательной реализацией Secure Shell (SSH) [RFC6242]. Для RESTCONF нижним уровнем является HTTPS с обязательной реализацией защищённого транспорта TLS [RFC8446].

Модель доступа к конфигурации сети (Network Configuration Access Control Model или NACM) [RFC8341] обеспечивает способы предоставления доступа лишь конкретным пользователям NETCONF и RESTCONF для предопределённых подмножеств протокольных операций и содержимого NETCONF и RESTCONF.

В заданных здесь модулях YANG имеется множество узлов данных с возможностью записи, создания и удаления (config true, как задано по умолчанию). Эти узлы могут быть конфиденциальными или уязвимыми в некоторых сетевых средах. Операции записи в такие узлы (например, edit-config) без подобающей защиты могут оказывать негативное влияние на работу сети. Ниже показаны ветви и узлы данных, чувствительные или уязвимы в плане операций записи.

/acls/acl/aces

Этот список содержит все записи управления доступом, заданные на устройстве. Несанкционированная запись в этот список позволяет нарушителям изменять записи, чтобы разрешить запрещённый трафик или запретить разрешенный. Первое может приводить к DoS-атакам или компрометации устройства, второе — к DoS-атакам. Несанкционированное чтение списка позволяет атакующему узнать действующие правила для организации атаки.

/acls/acl/aces/ace/actions/logging

Этот узел задаёт возможность регистрации пакетов, соответствующих записи. Несанкционированная запись позволяет атакующему включить регистрацию для одной или многих записей, перегружая сервер работой. Несанкционированное чтение позволяет злоумышленнику получить доступ к регистрируемым сведениям, что может послужить для организации атаки на сервер.

6. Взаимодействие с IANA

Этот документ регистрирует три URI и три модуля YANG.

6.1. Регистрация URI

Документ регистрирует указанные ниже URI в реестре IETF XML Registry [RFC3688].

   URI: urn:ietf:params:xml:ns:yang:ietf-access-control-list
   URI: urn:ietf:params:xml:ns:yang:ietf-packet-fields
   URI: urn:ietf:params:xml:ns:yang:ietf-ethertypes
   Registrant Contact: The IESG.
   XML: N/A; запрошенный URI является пространством имён XML.

6.2. Регистрация имён модулей YANG

Документ регистрирует три модуля YANG в реестре YANG Module Names [RFC6020].

   Name: ietf-access-control-list
   Namespace: urn:ietf:params:xml:ns:yang:ietf-access-control-list
   Prefix: acl
   Reference: RFC 8519

   Name: ietf-packet-fields
   Namespace: urn:ietf:params:xml:ns:yang:ietf-packet-fields
   Prefix: packet-fields
   Reference: RFC 8519

   Name: ietf-ethertypes
   Namespace: urn:ietf:params:xml:ns:yang:ietf-ethertypes
   Prefix: ethertypes
   Reference: RFC 8519

7. Литература

7.1. Нормативные документы

[RFC791] Postel, J., «Internet Protocol», STD 5, RFC 791, DOI 10.17487/RFC0791, September 1981, <https://www.rfc-editor.org/info/rfc791>.

[RFC792] Postel, J., «Internet Control Message Protocol», STD 5, RFC 792, DOI 10.17487/RFC0792, September 1981, <https://www.rfc-editor.org/info/rfc792>.

[RFC793] Postel, J., «Transmission Control Protocol», STD 7, RFC 793, DOI 10.17487/RFC0793, September 1981, <https://www.rfc-editor.org/info/rfc793>.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black, «Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers», RFC 2474, DOI 10.17487/RFC2474, December 1998, <https://www.rfc-editor.org/info/rfc2474>.

[RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, «The Addition of Explicit Congestion Notification (ECN) to IP», RFC 3168, DOI 10.17487/RFC3168, September 2001, <https://www.rfc-editor.org/info/rfc3168>.

[RFC4007] Deering, S., Haberman, B., Jinmei, T., Nordmark, E., and B. Zill, «IPv6 Scoped Address Architecture», RFC 4007, DOI 10.17487/RFC4007, March 2005, <https://www.rfc-editor.org/info/rfc4007>.

[RFC4291] Hinden, R. and S. Deering, «IP Version 6 Addressing Architecture», RFC 4291, DOI 10.17487/RFC4291, February 2006, <https://www.rfc-editor.org/info/rfc4291>.

[RFC5952] Kawamura, S. and M. Kawashima, «A Recommendation for IPv6 Address Text Representation», RFC 5952, DOI 10.17487/RFC5952, August 2010, <https://www.rfc-editor.org/info/rfc5952>.

[RFC6991] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6991, DOI 10.17487/RFC6991, July 2013, <https://www.rfc-editor.org/info/rfc6991>.

[RFC7950] Bjorklund, M., Ed., «The YANG 1.1 Data Modeling Language», RFC 7950, DOI 10.17487/RFC7950, August 2016, <https://www.rfc-editor.org/info/rfc7950>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8200] Deering, S. and R. Hinden, «Internet Protocol, Version 6 (IPv6) Specification», STD 86, RFC 8200, DOI 10.17487/RFC8200, July 2017, <https://www.rfc-editor.org/info/rfc8200>.

[RFC8343] Bjorklund, M., «A YANG Data Model for Interface Management», RFC 8343, DOI 10.17487/RFC8343, March 2018, <https://www.rfc-editor.org/info/rfc8343>.

7.2. Дополнительная литература

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004, <https://www.rfc-editor.org/info/rfc3688>.

[RFC6020] Bjorklund, M., Ed., «YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)», RFC 6020, DOI 10.17487/RFC6020, October 2010, <https://www.rfc-editor.org/info/rfc6020>.

[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <https://www.rfc-editor.org/info/rfc6241>.

[RFC6242] Wasserman, M., «Using the NETCONF Protocol over Secure Shell (SSH)», RFC 6242, DOI 10.17487/RFC6242, June 2011, <https://www.rfc-editor.org/info/rfc6242>.

[RFC7011] Claise, B., Ed., Trammell, B., Ed., and P. Aitken, «Specification of the IP Flow Information Export (IPFIX) Protocol for the Exchange of Flow Information», STD 77, RFC 7011, DOI 10.17487/RFC7011, September 2013, <https://www.rfc-editor.org/info/rfc7011>.

[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, «RESTCONF Protocol», RFC 8040, DOI 10.17487/RFC8040, January 2017, <https://www.rfc-editor.org/info/rfc8040>.

[RFC8340] Bjorklund, M. and L. Berger, Ed., «YANG Tree Diagrams», BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, <https://www.rfc-editor.org/info/rfc8340>.

[RFC8341] Bierman, A. and M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.

[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.

Приложение A. Примеры расширения модели ACL

A.1. Пример фирменного модуля

Модуль example-newco-acl служит примером фирменной модели организации, дополняющей модуль ietf-acl. Он показывает применение оператора augment в выражении XPath для добавления критериев соответствия, действий о операций по умолчанию при соответствии записи ACE. Все это является фирменными расширениями или расширениями свойств системы. Модуль example-newco-acl является лишь примером и предполагается разработка производителями своих фирменных моделей.

   module example-newco-acl {
     yang-version 1.1;
     namespace "http://example.com/ns/example-newco-acl";
     prefix example-newco-acl;

     import ietf-access-control-list {
       prefix acl;
     }

     organization
       "Группа моделирования Newco.";

     contact
       "abc@newco.com";
     description
       "Этот модуль YANG дополняет модуль YANG IETF ACL.";

     revision 2019-03-04 {
       description
         "Фирменные расширения NewCo для модели ietf-acl.";

       reference
         "RFC 8519: YANG Data Model for Network Access Control
                    Lists (ACLs).";
     }

     augment "/acl:acls/acl:acl/"
           + "acl:aces/acl:ace/"
           + "acl:matches" {
       description
         "Сопоставления для простых фильтров Newco.";

       choice protocol-payload-choice {
         description
           "Фирменное сопоставление Newco для содержимого.";
         list protocol-payload {
           key "value-keyword";
           ordered-by user;
           description
             "Содержимое протокола (payload).";
           uses match-simple-payload-protocol-value;
         }
       }

       choice metadata {
         description
           "Фирменное сопоставление Newco для интерфейсов.";
         leaf packet-length {
           type uint16;
           description
             "Сопоставление размера пакетов.";
         }
       }
     }

     augment "/acl:acls/acl:acl/"
           + "acl:aces/acl:ace/"
           + "acl:actions" {
       description
         "Действия простых фильтров Newco.";
       choice action {
         description
           "Выбор фирменных действий Newco.";
         case count {
           description
             "Число пакетов в имнованном счетечике.";
           leaf count {
             type uint32;
             description
               "Значение счётчика.";
           }
         }
         case policer {
           description
             "Имя правила (policer) для ограничения скорости трафика.";
           leaf policer {
             type string;
             description
               "Имя правила.";
           }
         }
         case hierarchical-policer {
           leaf hierarchical-policer {
             type string;
             description
               "Имя иерархического правила (policer).";
           }
           description
             "Имя иерархического правила для ограничения скорости 
              трафика.";
         }
       }
     }

     augment "/acl:acls/acl:acl"
           + "/acl:aces/acl:ace/"
           + "acl:actions" {
       leaf default-action {
         type identityref {
           base acl:forwarding-action;
         }
         default "acl:drop";
         description
           "Действия при соответствии ACE.";
       }
       description
         "Фирменное действие Newco по умолчанию.";
     }

     grouping match-simple-payload-protocol-value {
       description
         "Newco proprietary payload";
       leaf value-keyword {
         type enumeration {
           enum icmp {
             description
               "Протокол ICMP.";
           }
           enum icmp6 {
             description
               "Протокол ICMPv6.";
           }
           enum range {
             description
               "Диапазон значений.";
           }
         }
         description
           "(null).";
       }
     }
   }

Ниже представлено дерево модуля example-newco-acl. Здесь /ietf-acl:acls/ietf-acl:acl/ietf-acl:aces/ietf-acl:ace/ietf-acl:matches дополняется двумя операторами choice: protocol-payload-choice и metadata. Первый использует группировку с перечислением всех поддерживаемых протоколов. Метаданные сопоставляются с полями, связанными с пакетом, такими как общий размер пакета. В другом случае /ietf-acl:acls/ietf-acl:acl/ietf-acl:aces/ietf-acl:ace/ietf-acl:actions дополняется выбором действий.

   module: example-newco-acl
     augment /acl:acls/acl:acl/acl:aces/acl:ace/acl:matches:
       +--rw (protocol-payload-choice)?
       |  +--:(protocol-payload)
       |     +--rw protocol-payload* [value-keyword]
       |        +--rw value-keyword    enumeration
       +--rw (metadata)?
          +--:(packet-length)
             +--rw packet-length?      uint16
     augment /acl:acls/acl:acl/acl:aces/acl:ace/acl:actions:
       +--rw (action)?
          +--:(count)
          |  +--rw count?                   uint32
          +--:(policer)
          |  +--rw policer?                 string
          +--:(hierarchical-policer)
             +--rw hierarchical-policer?   string
     augment /acl:acls/acl:acl/acl:aces/acl:ace/acl:actions:
       +--rw default-action?   identityref

A.2. Linux nftables

Поскольку платформа Linux становится популярней сетевой платформы, модель данных Linux изменяется. Ранее списки ACL в Linux были строго привязаны к протоколам и применялись разные утилиты (iptables, ip6tables, arptables, ebtables) со своими моделями данных. Недавно это было изменено и разработан единый пакет nftables. Он позволяет использовать одну модель данных для фильтров межсетевых экранов и очень похода на модуль ietf-access-control, описанный в этом документе. Пакет nftables поддерживает входные и выходные ACE и в каждой записи ACE можно задать сопоставления и действия. Пример из параграфа 4.3. Примеры ACL можно настроить с помощью инструмента nft, как показано ниже.

         nft add table ip filter
         nft add chain filter input
         nft add rule ip filter input ip protocol tcp ip saddr \
             192.0.2.1/24 drop

Записи конфигурации будут иметь вид

         table ip filter {
           chain input {
             ip protocol tcp ip saddr 192.0.2.1/24 drop
           }
         }

Очевидно сходство Linux nftables и моделей YANG IETF ACL, а также их расширений. Модель YANG ACL из этого документа легко преобразовать в модель Linux nftables.

A.3. Ethertypes

Модуль ACL зависит от определений Ethertype, выделение которых контролирует IEEE. Приведённая ниже модель включена для того, чтобы обеспечить возможность включения этих типов, пока IEEE не опубликует модель с определениями Ethertype, которая отменит эту модель.

   <CODE BEGINS> file "ietf-ethertypes@2019-03-04.yang"

   module ietf-ethertypes {
     namespace "urn:ietf:params:xml:ns:yang:ietf-ethertypes";
     prefix ethertypes;

     organization
       "IETF NETMOD (Network Modeling) Working Group.";

     contact
       "WG Web:   <https://datatracker.ietf.org/wg/netmod/> 
        WG List:  <mailto:netmod@ietf.org> 

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

     description
       "Этот модуль содержит базовые определения для Ethertype,
        применяемых в других модулях. Это временный модуль, пока IEEE
        не начнёт определение этих Ethertype и не опубликует стандарт.
        После этого модуль утратит силу.

        Авторские права (Copyright (c) 2019) принадлежат IETF Trust и
        лицам, указанным как авторы. Все права защищены.

        Распространение и применение модуля в исходной или двоичной 
        форме с изменениями или без таковых разрешено в соответствии с
        лицензией Simplified BSD License, изложенной в параграфе 4.c
        IETF Trust's Legal Provisions Relating to IETF Documents
        (https://trustee.ietf.org/license-info). 

        Эта версия модуля YANG является частью RFC 8519, где правовые
        аспекты приведены более полно.";

     revision 2019-03-04 {
       description
         "Initial revision.";
       reference
         "RFC 8519: YANG Data Model for Network Access Control
                    Lists (ACLs).";
     }

     typedef ethertype {
       type union {
         type uint16;
         type enumeration {
           enum ipv4 {
             value 2048;
             description
               "Протокол IPv4 с шестнадцатеричным значением 0x0800.";
             reference
               "RFC 791: Internet Protocol.";
           }
           enum arp {
             value 2054;
             description
               "Протокол ARP с шестнадцатеричным значением 0x0806.";
             reference
               "RFC 826: An Ethernet Address Resolution Protocol: Or
                         Converting Network Protocol Addresses to 48.bit
                         Ethernet Address for Transmission on Ethernet
                         Hardware.";
           }
           enum wlan {
             value 2114;
             description
               "Wake-on-LAN с шестнадцатеричным значением 0x0842.";
           }
           enum trill {
             value 8947;
             description
               "TRILL с шестнадцатеричным значением 0x22F3.";
             reference
               "RFC 6325: Routing Bridges (RBridges): Base Protocol
                          Specification.";
           }
           enum srp {
             value 8938;
             description
               "Протокол резервирования потоков со значением 0x22EA.";
             reference
               "IEEE 801.1Q-2011.";
           }
           enum decnet {
             value 24579;
             description
               "DECnet Phase IV с шестнадцатеричным значением 0x6003.";
           }
           enum rarp {
             value 32821;
             description
               "RARP с шестнадцатеричным значением 0x8035.";
             reference
               "RFC 903: A Reverse Address Resolution Protocol.";
           }
           enum appletalk {
             value 32923;
             description
               "Appletalk (Ethertalk) со значением 0x809B.";
           }
           enum aarp {
             value 33011;
             description
               "Appletalk ARP с шестнадцатеричным значением 0x80F3.";
           }
           enum vlan {
             value 33024;
             description
               "Кадр с тегом VLAN (IEEE 802.1Q) и Shortest Path Bridging
                IEEE 802.1aq с совместимостью с NNI. Значение 0x8100.";
             reference
               "IEEE 802.1Q.";
           }
           enum ipx {
             value 33079;
             description
               "Протокол IPX с шестнадцатеричным значением 0x8137.";
           }
           enum qnx {
             value 33284;
             description
               "QNX Qnet с шестнадцатеричным значением 0x8204.";
           }
           enum ipv6 {
             value 34525;
             description
               "Протокол IPv6 с шестнадцатеричным значением 0x86DD.";
             reference
               "RFC 8200: Internet Protocol, Version 6 (IPv6)
                          Specification
                RFC 8201: Path MTU Discovery for IP version 6.";
           }
           enum efc {
             value 34824;
             description
               "Управление потоком данных Ethernet с применением кадров
                 pause. Значение 0x8808.";
             reference
               "IEEE 802.1Qbb.";
           }
           enum esp {
             value 34825;
             description
               "Протокол Ethernet Slow со значением 0x8809.";
             reference
               "IEEE 802.3-2015.";
           }
           enum cobranet {
             value 34841;
             description
               "CobraNet с шестнадцатеричным значением 0x8819.";
           }
           enum mpls-unicast {
             value 34887;
             description
               "Индивидуальный трафик MPLS со значением 0x8847.";
             reference
               "RFC 3031: Multiprotocol Label Switching Architecture.";
           }
           enum mpls-multicast {
             value 34888;
             description
               "Групповой трафик MPLS со значением 0x8848.";
             reference
               "RFC 3031: Multiprotocol Label Switching Architecture.";
           }
           enum pppoe-discovery {
             value 34915;
             description
               "PPPoE в процессе обнаружения. Значение 0x8863.";
             reference
               "RFC 2516: A Method for Transmitting PPP Over Ethernet
                          (PPPoE).";
           }
           enum pppoe-session {
             value 34916;
             description
               "PPPoE в сессии. Значение 0x8864.";
             reference
               "RFC 2516: A Method for Transmitting PPP Over Ethernet
                          (PPPoE).";
           }
           enum intel-ans {
             value 34925;
             description
               "Intel Advanced Networking Services. Значение 0x886D.";
           }
           enum jumbo-frames {
             value 34928;
             description
               "Кадры Jumbo или кадры Ethernet размером более 1500 байтов
                (до 9000).";
           }
           enum homeplug {
             value 34939;
             description
               "Различные протоколы для коммуникаций по цепям питания.
                Значение 0x887B.";
           }
           enum eap {
             value 34958;
             description
               "EAP в ЛВС  с шестнадцатеричным значением 0x888E.";
             reference
               "IEEE 802.1X.";
           }
           enum profinet {
             value 34962;
             description
               "PROFINET с шестнадцатеричным значением 0x8892.";
           }
           enum hyperscsi {
             value 34970;
             description
               "SCSIoE с шестнадцатеричным значением 0x889A.";
           }
           enum aoe {
             value 34978;
             description
               "ATAoE с шестнадцатеричным значением 0x88A2.";
           }
           enum ethercat {
             value 34980;
             description
               "EtherCAT с шестнадцатеричным значением 0x88A4.";
           }
           enum provider-bridging {
             value 34984;
             description
               "Provider Bridging (802.1ad) и Shortest Path Bridging
                (801.1aq). Значение 0x88A8.";
             reference
               "IEEE 802.1ad and IEEE 802.1aq).";
           }
           enum ethernet-powerlink {
             value 34987;
             description
               "Ethernet Powerlink со значением 0x88AB.";
           }
           enum goose {
             value 35000;
             description
               "GOOSE с шестнадцатеричным значением 0x88B8.";
             reference
               "IEC/ISO 8802-2 and 8802-3.";
           }
           enum gse {
             value 35001;
             description
               "Generic Substation Events. Значение 88B9.";
             reference
               "IEC 61850.";
           }
           enum sv {
             value 35002;
             description
               "Sampled Value Transmission. Значение 0x88BA.";
             reference
               "IEC 61850.";
           }
           enum lldp {
             value 35020;
             description
               "LLDP с шестнадцатеричным значением 0x88CC.";
             reference
               "IEEE 802.1AB.";
           }
           enum sercos {
             value 35021;
             description
               "Sercos Interface. Значение 0x88CD.";
           }
           enum wsmp {
             value 35036;
             description
               "WSMP с шестнадцатеричным значением 0x88DC.";
           }
           enum homeplug-av-mme {
             value 35041;
             description
               "HomePlug AV Mobile Management Entity (MME). Значение
                of 88E1.";
           }
           enum mrp {
             value 35043;
             description
               "MRP с шестнадцатеричным значением 0x88E3.";
             reference
               "IEC 62439-2.";
           }
           enum macsec {
             value 35045;
             description
               "MAC Security. Значение 0x88E5.";
             reference
               "IEEE 802.1AE.";
           }
           enum pbb {
             value 35047;
             description
               "PBB с шестнадцатеричным значением 0x88E7.";
             reference
               "IEEE 802.1ah.";
           }
           enum cfm {
             value 35074;
             description
               "CFM с шестнадцатеричным значением 0x8902.";
             reference
               "IEEE 802.1ag.";
           }
           enum fcoe {
             value 35078;
             description
               "FCoE с шестнадцатеричным значением 0x8906.";
             reference
               "T11 FC-BB-5.";
           }
           enum fcoe-ip {
             value 35092;
             description
               "FCoE Initialization Protocol. Значение 0x8914.";
           }
           enum roce {
             value 35093;
             description
               "RoCE с шестнадцатеричным значением 0x8915.";
           }
           enum tte {
             value 35101;
             description
               "TTE с шестнадцатеричным значением 0x891D.";
             reference
               "SAE AS6802.";
           }
           enum hsr {
             value 35119;
             description
               "HSR с шестнадцатеричным значением 0x892F.";
             reference
               "IEC 62439-3:2016.";
           }
         }
       }
       description
         "заполнитель типа uint16 определён для обеспечения пользователю
          возможности управлять своими ethertype, не включёнными в этот
          модуль. Можно также использовать определения enum для наиболее
          часто применяемых ethertype.";
     }
   }
   <CODE ENDS>

Благодарности

Alex Clemm, Andy Bierman и Lisa Huang начали с набросков первых версий на нескольких прошлых конференциях IETF. Этот документ включает структуру модели YANG ACL и большой набор сопоставления, а также подтверждает вклад Louis Fourie, Dana Blair, Tula Kraiser, Patrick Gili, George Serpa, Martin Bjorklund, Kent Watsen, Phil Shafer. Многие люди рецензировали предварительные версии документа в рамках IETF.

Dean Bogdanovic, Kiran Agrahara Sreenivasa, Lisa Huang и Dana Blair по отдельности оценивали модель YANG в предварительных версиях и совместно создавали предварительную версию ACL, поддержанную разными производителями. В этом документе исключены специфические для производителей свойства и даны примеры, позволяющие производителям расширить модель своими фирменными ACL. Этот предварительный вариант был переопределен настоящим документом с участием многих производителей.

Авторы благодарны Jason Sterne, Lada Lhotka, Juergen Schoenwalder, David Bannister, Jeff Haas, Kristian Larsson, Einar Nilsen-Nygaard за их рецензии и предложения.

Адреса авторов

Mahesh Jethanandani
VMware
Email: mjethanandani@gmail.com
 
Sonal Agarwal
Cisco Systems, Inc.
Email: sagarwal12@gmail.com
 
Lisa Huang
Email: huangyi_99@yahoo.com
 
Dana Blair
Email: dana@blairhome.com

Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

3Здесь и далее символ \ в конце строки служит для разделения длинной строки на части в соответствии с форматом.

Рубрика: RFC | Оставить комментарий

RFC 8529 YANG Data Model for Network Instances

Internet Engineering Task Force (IETF)                         L. Berger
Request for Comments: 8529                                      C. Hopps
Category: Standards Track                        LabN Consulting, L.L.C.
ISSN: 2070-1721                                                A. Lindem
                                                           Cisco Systems
                                                           D. Bogdanovic
                                                                  X. Liu
                                                          Volta Networks
                                                              March 2019

YANG Data Model for Network Instances

Модель данных YANG для экземпляров сетей

PDF

Аннотация

Этот документ определяет модуль для экземпляра сети, который может служить для управления разделением виртуальных ресурсов, которые могут присутствовать на сетевом устройстве. Примерами таких ресурсов являются экземпляры маршрутизации и пересылки VPN (VPN Routing and Forwarding или VRF) и виртуальных коммутаторов (Virtual Switch Instance или VSI).

Модель YANG в этом документе соответствует архитектуре хранилищ данных управления сетью (Network Management Datastore Architecture или NMDA), описанной в RFC 8342.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc8529.

Авторские права

Copyright (c) 2019. Авторские права принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

1. Введение

Этот документ определяет второй из двух новых модулей, предназначенных для поддержки настройки и эксплуатации сетевых устройств, позволяющих выделить ресурсы для работы и управления (или одного из них). Оба модуля используют функциональность YANG, заданную модулей монтирования схемы YANG [RFC8528]. Модель YANG в этом документе соответствует архитектуре хранилищ сетевой информации NMDA, определённой в [RFC8342].

Первая форма выделения ресурсов обеспечивает логическое разделение сетевого устройства, в котором каждый раздел управляется раздельно как независимый элемент сети, который «размещается» на базовом сетевом устройстве (host). Эти элементы называются логическими сетевыми элементами (logical network element или LNE) и поддерживаются модулем logical-network-element, заданным в [RFC8530]. Этот модуль служит для идентификации LNE и связанных с каждым LNE ресурсов сетевого устройства. Сами элементы LNE представляются в YANG как независимые сетевые устройства с независимым доступом. Примеры терминов производителей для LNE включают logical system, logical router, virtual switch, chassis, fabric.

Вторая форма, определённая в этом документе, обеспечивает поддержку того, что называется экземплярами маршрутизации и пересылки VPN (VPN Routing and Forwarding или VRF), а также экземплярами виртуальных коммутаторов (Virtual Switch Instance или VSI), описанными в [RFC4026] и [RFC4664]. В этом варианте разделения ресурсов создаётся множество экземпляров плоскостей пересылки, а также маршрутизации и коммутации, предоставляемых и поддерживаемых на одном сетевом устройстве (физическом или виртуальном). Это форму разделения ресурсов называют экземплярами сетей (Network Instance или NI) и она поддерживается определенным ниже модулем. Конфигурация и работа каждого экземпляра сети всегда осуществляется через сетевое устройство и модуль экземпляра сети.

Существенное различие между моделями LNE и NI состоит в том, что модель NI обеспечивает основу для управления VRF и VSI. В этом документе предусмотрено раздельное определение моделей для VRF и VSI, т. е. технологий L3 VPN и L2 VPN. Примеры имеются в новой модели L3VPN из [YANG-L3VPN] и представлены ниже.

1.1. Терминология

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

Предполагается знакомство читателя с концепциями YANG [RFC7950] и YANG Schema Mount [RFC8528]. В документе применяется графическое представление моделей данных, описанное в [RFC8340].

2. Обзор

В этом документе рассматриваются сетевые устройства, которые поддерживают протоколы и функции, определённые в IETF, например, маршрутизаторы, межсетевые экраны, хосты. Такие устройства могут быть физическими или виртуальными, например, классический маршрутизатор с нестандартным (custom) оборудованием или маршрутизатор внутри виртуальной машины на сервере, реализующей функцию виртуальной сети (VNF). Каждое устройство может выделять свои ресурсы в элементы LNE, каждый из которых является управляемым логическим устройством. Примеры терминов производителей для LNE включают logical system, logical router, virtual switch, chassis, fabric. Каждый LNE может также поддерживать функции маршрутизации и пересылки VPN (VPN Routing and Forwarding или VRF) и экземпляра виртуальной коммутации (Virtual Switching Instance или VSI), которые далее называются экземплярами сети (Network Instance или NI). Это разделение представлено на рисунке 1.

,'''''''''''''''''''''''''''''''''''''''''''''''.
|Сетевое устройство (физическое или виртуальное)|
| .....................   ..................... |
| :        LNE        :   :        LNE        : |
| :+-----+-----+-----+:   :+-----+-----+-----+: |
| :|  NI |  NI |  NI |:   :|  NI |  NI |  NI |: |
| :+-----+-----+-----+:   :+-----+-----+-----+: |
| :  | |   | |   | |  :   :  | |   | |   | |  : |
| :..|.|...|.|...|.|..:   :..|.|...|.|...|.|..: |
|    | |   | |   | |         | |   | |   | |    |
 ''''|'|'''|'|'''|'|'''''''''|'|'''|'|'''|'|'''''
     | |   | |   | |         | |   | |   | |
        Интерфейсы              Интерфейсы

Рисунок 1. Связи между элементами модуля.


Модель LNE описана в [RFC8530], а модель NI в разделе 3. Экземпляры сетей.

Текущая модель управления интерфейсом [RFC8343] затрагивается определениями LNE и NI. Этот документ и [RFC8530] определяют дополнения к модели интерфейса для поддержки LNE и NI.

Модель NI поддерживает конфигурации VRF и VSI. Каждый экземпляр поддерживается сведениями, относящимися к устройству, например, цель маршрута, применяемая при анонсировании маршрутов VRF с помощью механизмов [RFC4364], и информация, относящаяся к внутренней работе NI, такой как протоколы маршрутизации [RFC8349] и OSPF [YANG-OSPF]. В этом документе определён модуль network-instance, обеспечивающий основу для управления обоими типами информации.

Относящиеся к устройству сведения NI, включая назначение интерфейсов экземплярам NI, определена как часть этого документа. Заданный здесь модуль также обеспечивает замену (placeholder) для определения связанной с технологией NI информации на уровне устройства и внутренних операций NI. Сведения, относящиеся к внутренним операциям NI поддерживаются через монтирование схемы [RFC8528] и подходящих модулей в заданной точке. Определены общеизвестные точки монтирования для NI типов L3VPN, L2VPN, L2+L3VPN.

3. Экземпляры сетей

Контейнер network-instances служит для представления VRF и VSI, которые широко применяются для изоляции доменов маршрутизации и коммутации, например, при создании виртуальных частных сетей со своими активными протоколами и правилами маршрутизации и коммутации. Модель поддерживает экземпляры для ядра (провайдера) и виртуальные экземпляры. Сведения экземпляра ядра (провайдера) доступны на верхнем уровне сервера, а виртуального экземпляра — в корне монтирования схемы.

   module: ietf-network-instance
     +--rw network-instances
        +--rw network-instance* [name]
           +--rw name           string
           +--rw enabled?       boolean
           +--rw description?   string
           +--rw (ni-type)?
           +--rw (root-type)
              +--:(vrf-root)
              |  +--mp vrf-root
              +--:(vsi-root)
              |  +--mp vsi-root
              +--:(vv-root)
                 +--mp vv-root
   augment /if:interfaces/if:interface:
     +--rw bind-ni-name?   -> /network-instances/network-instance/name
   augment /if:interfaces/if:interface/ip:ipv4:
     +--rw bind-ni-name?   -> /network-instances/network-instance/name
   augment /if:interfaces/if:interface/ip:ipv6:
     +--rw bind-ni-name?   -> /network-instances/network-instance/name

   notifications:
     +---n bind-ni-name-failed
        +--ro name          -> /if:interfaces/interface/name
        +--ro interface
        |  +--ro bind-ni-name?
        |                  -> /if:interfaces/interface/ni:bind-ni-name
        +--ro ipv4
        |  +--ro bind-ni-name?
        |          -> /if:interfaces/interface/ip:ipv4/ni:bind-ni-name
        +--ro ipv6
        |  +--ro bind-ni-name?
        |          -> /if:interfaces/interface/ip:ipv6/ni:bind-ni-name
        +--ro error-info?   string

Экземпляр сети указывается строкой name, которая применяется как индекс в модуле экземпляра сети и для связывания ресурсов с экземпляром, как показано выше в дополнении к interface. Операторы выбора (choice) ni-type и root-type служат для поддержки разных типов технологий VPN для L2 и L3. Уведомление bind-ni-name-failed передаётся при некоторых типах отказов.

3.1. Типы NI и точки монтирования

Модуль network-instance структурирован для упрощения определений моделей информации для конкретных типов VRF и VSI с использованием дополнений (augment). Например, сведения, требуемые для поддержки L2VPN, таких как VPLS, и EVPN, явно различаются. Примеры разрабатываемых моделей, которые можно реструктурировать для использования преимуществ NI, включают модели для L3VPN [YANG-L3VPN] и L2VPN [YANG-L2VPN].

Документам с определениями новых моделей YANG для поддержки определённых типов экземпляров сетей следует дополнять модуль network-instance. Базовая структура, которую следует применять для таких дополнений, включает оператор case с контейнерами для данных конфигурации и состояния, а также (при необходимости) зависящей от типа точки монтирования. В общем случае предполагается, что типам NI не требуется задавать специфические точки монтирования, используя для таких целей общеизвестные точки, описанные в следующем параграфе. Ниже приведён пример зависящего от типа дополнения.

    augment "/ni:network-instances/ni:network-instance/ni:ni-type" {
      case l3vpn {
        container l3vpn {
            ...
        }
        container l3vpn-state {
            ...
        }
      }
    }

3.1.1. Общеизвестные точки монтирования

YANG Schema Mount [RFC8528] указывает в модуле точки монтирования по имени. Это позволяет указать точки монтирования, схемы которых могут быть доступны всем типам NI. Как отмечено выше, ni-type в значительной степени различаются по конфигурационным сведениям, требуемым в экземпляре ядра или верхнего уровня для поддержки NI, а не по сведениям, представленным в NI. Это позволяет применять общие точки монтирования для разных типов NI.

Предполагается, что есть очень немного разных схем, которые требуется определить для поддержки NI в реализации. В частности, предполагается, что будут нужна три указанных ниже формы схем NI, каждую из которых можно определить с общеизвестной точкой монтирования, пригодной для будущих модулей с определениями типов NI.

vrf-root

Предназначена для использования с типами NI для L3VPN.

vsi-root

Предназначена для использования с типами NI для L2VPN.

vv-root

Предназначена для использования с типами NI, поддерживающими сразу мосты L2VPN и маршрутизацию L3VPN.

Будущим определениям моделей следует использовать указанные выше точки монтирования, когда это возможно. Когда общеизвестные точки доступа не подходят, модель может определить свои точки монтирования через дополнения.

3.1.2. Пример типа NI

Ниже приведён пример L3VPN VRF, использующий гипотетическое дополнение к схеме NI, определённой в [YANG-L3VPN]. Более подробный пример приведён в Приложении A.

   module: ietf-network-instance
     +--rw network-instances
        +--rw network-instance* [name]
           +--rw name           string
           +--rw enabled?       boolean
           +--rw description?   string
           +--rw (ni-type)?
           |  +--:(l3vpn)
           |     +--rw l3vpn:l3vpn
           |     |  ... // Данные конфигурации
           |     +--ro l3vpn:l3vpn-state
           |     |  ... // данные состояния
           +--rw (root-type)
              +--:(vrf-root)
                 +--mp vrf-root
                    +--rw rt:routing/
                    |  +--rw router-id?                 yang:dotted-quad
                    |  +--rw control-plane-protocols
                    |     +--rw control-plane-protocol* [type name]
                    |     +--rw ospf:ospf
                    |          +--rw area* [area-id]
                    |             +--rw interfaces
                    |                +--rw interface* [name]
                    |                   +--rw name if:interface-ref
                    |                   +--rw cost?   uint16
                    +--ro if:interfaces@
                    |  ...

Здесь монтируются модули YANG Routing Management [RFC8349] и YANG OSPF [YANG-OSPF], которые ссылаться на информацию через parent-reference на контейнеры, определённые в [RFC8343].

3.2. NI и интерфейсы

Интерфейсы являются важной частью конфигурации и рабочего состояния любого сетевого устройства. Обычно они включают комбинацию необработанных (raw) физических интерфейсов, интерфейсов канального уровня, настройку адресов и логические интерфейсы, которые могут быть не привязаны ни к какому физическому интерфейсу. Некоторые системные службы, а также протоколы L2 и L3 тоже могут связывать свои данные конфигурации и рабочего состояния в различными типами интерфейсов (эти связи для простоты не показаны). Модель управления интерфейсом задана в [RFC8343].

Как показано ниже, модуль network-instance дополняет имеющуюся модель управления интерфейсом, добавляя имя, используемое в типе интерфейса или субинтерфейса для идентификации связанного NI. Это имя добавляется также для типов IPv4 и IPv6, как задано в [RFC8344].

Ниже приведён пример предполагаемого использования. Контейнер interfaces включает ряд часто применяемых элементов в качестве примеров.

   module: ietf-interfaces
      +--rw interfaces
      |  +--rw interface* [name]
      |     +--rw name                        string
      |     +--rw ip:ipv4!
      |     |  +--rw ip:enabled?                      boolean
      |     |  +--rw ip:forwarding?                   boolean
      |     |  +--rw ip:mtu?                          uint16
      |     |  +--rw ip:address* [ip]
      |     |  |  +--rw ip:ip               inet:ipv4-address-no-zone
      |     |  |  +--rw (ip:subnet)
      |     |  |     +--:(ip:prefix-length)
      |     |  |     |  +--rw ip:prefix-length?   uint8
      |     |  |     +--:(ip:netmask)
      |     |  |        +--rw ip:netmask?         yang:dotted-quad
      |     |  +--rw ip:neighbor* [ip]
      |     |  |  +--rw ip:ip                  inet:ipv4-address-no-zone
      |     |  |  +--rw ip:link-layer-address yang:phys-address
      |     |  +--rw ni:bind-network-instance-name?   string
      |     +--rw ni:bind-network-instance-name?   string

Модуль ietf-interfaces [RFC8343] структурирован для включения всех интерфейсов в плоский список без учёта логического выделения ресурсов, поддерживаемых на устройстве. Лист (leaf) bind-network-instance-name обеспечивают связь между интерфейсом и соответствующим NI (например, VRF или VSI). Отметим, что в настоящее время при назначении интерфейсу как LNE, так и NI нужно сначала выделять интерфейс для LNE с использованием механизма из [RFC8530], а потом в модели интерфейса этого LNE связывать представление LNE для интерфейса с экземпляром NI.

3.3. Управление NI

Модули, которые могут применяться для представления сведений NI, доступны от точки монтирования root, зависящей от ni-type. Для идентификации доступных модулей должен применяться метод shared-schema, заданный в модуле ietf-yang-schema-mount [RFC8528]. Будущие версии спецификации могут смягчить это требование. Смонтированным модулям следует определять доступ через подходящие parent-reference [RFC8528] монтирования схемы к ресурсам устройства, таким как интерфейсы. Реализация может ограничить сведения parent-reference информацией, связанной с конкретным экземпляром, например, разрешать ссылки только на интерфейсы с bind-network-instance-name, идентичным name для экземпляра.

Все модули, представляющие сведения плоскостей данных и управления могут присутствовать в точке монтирования root и предоставлять доступ через пути, изменённые в соответствии с [RFC8528]. Предполагается, что список доступных модулей будет зависеть от реализации, как и метод, применяемый реализацией для поддержки NI.

Приведённый ниже фрагмент может использоваться для определения организации данных в примере NI из параграфа 3.1.2. Пример типа NI.

     "ietf-yang-schema-mount:schema-mounts": {
       "mount-point": [
         {
           "module": "ietf-network-instance",
           "label": "vrf-root",
           "shared-schema": {
             "parent-reference": [
               "/*[namespace-uri() = 'urn:ietf:...:ietf-interfaces']"
             ]
           }
         }
       ]
     }

Данные модуля, идентифицированные в соответствии с модулем ietf-yang-schema-mount, будут создаваться в точке монтирования, указанной mount-point. Эти модули могут ссылаться на информацию обузлах, относящихся к модулям верхнего уровня, которые указаны в иерархии parent-reference. Эти сведения доступны клиентам через их пути верхнего уровня, а не из связанной точки монтирования.

Чтобы позволить клиенту понимать упомянутые выше ограничения экзампляра для сведений parent-reference, реализация может представить такие ограничения в листе-списке parent-reference. Например,

     "namespace": [
       {
         "prefix": "if",
         "uri": "urn:ietf:params:xml:ns:yang:ietf-interfaces"
       },
       {
         "prefix": "ni",
         "uri": "urn:ietf:params:xml:ns:yang:ietf-network-instance"
       }
     ],
     "mount-point": [
       {
         "module": "ietf-network-instance",
         "label": "vrf-root",
         "shared-schema": {
           "parent-reference": [
             "/if:interfaces/if:interface
                [ni:bind-network-instance-name = current()/../ni:name]",
             "/if:interfaces/if:interface/ip:ipv4
                [ni:bind-network-instance-name = current()/../ni:name]",
             "/if:interfaces/if:interface/ip:ipv6
                [ni:bind-network-instance-name = current()/../ni:name]"
           ]
         }
       }
     ],

Такие же ограничения parent-reference для реализаций, не соответствующих NMDA, можно представить на основе [RFC8343] и [RFC8344] как

     "namespace": [
       {
         "prefix": "if",
         "uri": "urn:ietf:params:xml:ns:yang:ietf-interfaces"
       },
       {
         "prefix": "ni",
         "uri": "urn:ietf:params:xml:ns:yang:ietf-network-instance"
       }
     ],
     "mount-point": [
       {
         "module": "ietf-network-instance",
         "label": "vrf-root",
         "shared-schema": {
           "parent-reference": [
             "/if:interfaces/if:interface
                [ni:bind-network-instance-name = current()/../ni:name]",
             "/if:interfaces-state/if:interface
                [if:name = /if:interfaces/if:interface
                  [ni:bind-ni-name = current()/../ni:name]/if:name]",
             "/if:interfaces/if:interface/ip:ipv4
                [ni:bind-network-instance-name = current()/../ni:name]",
             "/if:interfaces-state/if:interface/ip:ipv4
                [if:name = /if:interfaces/if:interface/ip:ipv4
                  [ni:bind-ni-name = current()/../ni:name]/if:name]",
             "/if:interfaces/if:interface/ip:ipv6
                [ni:bind-network-instance-name = current()/../ni:name]",
             "/if:interfaces-state/if:interface/ip:ipv6
                [if:name = /if:interfaces/if:interface/ip:ipv6
                  [ni:bind-ni-name = current()/../ni:name]/if:name]"
           ]
         }
       }
     ],

3.4. Создание экземпляра NI

Элементами NI может управлять клиент с использованием имеющегося списка операций. При создании записей списка порождается новый экземпляр NI. Предполагается, что модели, монтируемые в корень NI, будут зависеть от реализации сервера. При удалении записи списка уничтожается имеющийся элемент NI. Дополнительные сведения можно найти в параграфе 7.8.6 [RFC7950].

После создания экземпляра NI с ним можно связать ресурсы хост-устройства. Как отмечено ранее, этот документ дополняет ietf-interfaces листом bind-ni-name для поддержки таких ассоциаций с интерфейсами. При указании в bind-ni-name действительного имени NI реализация должна предпринять все требуемые шаги по назначению интерфейса элементу NI или возвратить сообщение об ошибке (см. ниже) с указанием причины отказа в назначении. Назначение может завершаться отказом во время обработки набора или по завершении асинхронной обработки. В последнем случае сведения об ошибке передаются через уведомление.

4. Вопросы безопасности

Заданный в этом документе модуль YANG определяет схему для данных, которая разработана для доступа через протоколы управления сетью, такие как NETCONF [RFC6241] и RESTCONF [RFC8040]. Нижним уровнем NETCONF является защищённый транспорт с обязательной реализацией Secure Shell (SSH) [RFC6242]. Нижним уровнем RESTCONF служит HTTPS с обязательной реализацией защищённого транспорта TLS [RFC8446].

Модель управления доступом NACM [RFC8341] обеспечивает средства, позволяющие предоставить доступ лишь конкретным пользователям NETCONF и RESTCONF к предопределённому подмножеству доступных в NETCONF или RESTCONF протокольных операций и содержимого.

В контексте этого документа нужно рассмотреть два аспекта безопасности. Один связан со сведениями, содержащимися в смонтированных модулях. Соображения безопасности для смонтированных модулей существенно не меняются на основе сведений, доступных из контекста NI. Например, при рассмотрении модулей, заданных в [RFC8349], указанные в этом документе соображения безопасности применимы независимо от доступа к модулям из корня сервера или корневого узла экземпляра NI.

Второй аспект безопасности относится к сведениям, содержащимся в самом модуле NI, представляющим конфигурацию сети и правила распространения маршрутов. Безопасность этих сведений важна, но принципиально не отличается от защиты других сведений о конфигурации устройства или интерфейса, рассмотренной в таких документах, как [RFC8343], [RFC8349].

Уязвимы могут быть параметры и ветви с config true, указанные ниже.

/network-instances/network-instance

Этот список указывает NI и связанные с ними протоколы плоскости управления, настроенные на устройстве.

/if:interfaces/if:interface/*/bind-network-instance-name

Этот лист указывает экземпляр NI, которому назначен интерфейс.

Несанкционированный доступ к любому из этих списков может негативно влиять на подсистему маршрутизации локального устройства и сети. Это может приводить к сбоям в работе сети, доставке пакетов в непредусмотренные места и иным проблемам.

5. Взаимодействие с IANA

Этот документ регистрирует URI в реестре IETF XML Registry [RFC3688].

        URI: urn:ietf:params:xml:ns:yang:ietf-network-instance
        Registrant Contact: The IESG.
        XML: N/A, the requested URI is an XML namespace.

Документ регистрирует модуль YANG в реестре YANG Module Names [RFC6020].

     name:        ietf-network-instance
     namespace:   urn:ietf:params:xml:ns:yang:ietf-network-instance
     prefix:      ni
     reference:   RFC 8529

6. Модель NI

Структура определённой в документе модели описана в представленном ниже модуле YANG.

   <CODE BEGINS> file "ietf-network-instance@2019-01-21.yang"
   module ietf-network-instance {
     yang-version 1.1;
     namespace "urn:ietf:params:xml:ns:yang:ietf-network-instance";
     prefix ni;

     // Импорт некоторых базовых типов

     import ietf-interfaces {
       prefix if;
       reference
         "RFC 8343: A YANG Data Model for Interface Management";
     }
     import ietf-ip {
       prefix ip;
       reference
         "RFC 8344: A YANG Data Model for IP Management";
     }
     import ietf-yang-schema-mount {
       prefix yangmnt;
       reference
         "RFC 8528: YANG Schema Mount";
     }

     organization
       "IETF Routing Area (rtgwg) Working Group";
     contact
       "WG Web:   <https://datatracker.ietf.org/wg/rtgwg> 
        WG List:  <mailto:rtgwg@ietf.org> 

        Author:   Lou Berger
                  <mailto:lberger@labn.net> 
        Author:   Christian Hopps
                  <mailto:chopps@chopps.org> 
        Author:   Acee Lindem
                  <mailto:acee@cisco.com> 
        Author:   Dean Bogdanovic
                  <mailto:ivandean@gmail.com>"; 
     description
       "Этот модуль служит для поддержки множества экземпляров сетей
        в одном физическом или виртуальном устройстве. Экземплярами
        сетей обычно служат VRF и VSI.

        Ключевые слова ДОЛЖНО, НЕДОПУСТИМО, ТРЕБУЕТСЯ, НУЖНО, НЕ СЛЕДУЕТ, 
        СЛЕДУЕТ, НЕ НУЖНО, РЕКОМЕДУЕТСЯ, НЕ РЕКОМЕНДУЕТСЯ, МОЖНО и
        НЕОБЯЗАТЕЛЬНО в этом документе интерпретируются в соответствии с
        BCP 14 (RFC 2119) (RFC 8174) тогда и только тогда, когда они
        указаны заглавными буквами, как показано здесь.

        Авторские права (Copyright (c) 2019) принадлежат IETF Trust
        и лицам, указанным в качестве авторов кода. Все права защищены.

        Распространение и использование в исходной или двоичной форме с
        изменениями или без таковых разрешено в соответствии с лицензией
        Simplified BSD, изложенной в разделе 4  IETF Trust's Legal
        Provisions применительно к документам IETF
        (http://trustee.ietf.org/license-info). 

        Эта версия данного модуля YANG является частью RFC 8529, где
        правовые вопросы рассмотрены более полно.";

     revision 2019-01-21 {
       description
         "Initial revision.";
       reference
         "RFC 8529";
     }

     // Операторы определения устройства верхнего уровня

     container network-instances {
       description
         "Экземпляры NI, каждый из которых состоит из VRF и/или VSI.";
       reference
         "RFC 8349: A YANG Data Model for Routing Management";
       list network-instance {
         key "name";
         description
           "Список экземпляров сетей.";
         leaf name {
           type string;
           mandatory true;
           description
             "Идентификатор экземпляра внутри устройства.";
         }
         leaf enabled {
           type boolean;
           default "true";
           description
             "Флаг, управляющий включением экземпляра сети.";
         }
         leaf description {
           type string;
           description
             "Описание экземпляра сети и его назначения.";
         }
         choice ni-type {
           description
             "Этот узел служит якорной точкой для разных типов NI.
              Предполагается, что каждый вариант (case) отличается в
              части информации, требуемой в родителе (ядре) для 
              поддержки NI, и может отличатся в определении монтируемой
              схемы. Когда смонтированные схемы не предполагаются
              одинаковыми для конкретного типа NI, следует задавать
              точку монтирования.";
         }
         choice root-type {
           mandatory true;
           description
             "Общеизвестные точки монтирования.";
           container vrf-root {
             description
               "Контейнер для точки монтирования.";
             yangmnt:mount-point "vrf-root" {
               description
                 "Корень для моделей L3VPN, обычно не типа inline.";
             }
           }
           container vsi-root {
             description
               "Контейнер для точки монтирования.";
             yangmnt:mount-point "vsi-root" {
               description
                 "Корень для моделей L2VPN, обычно не типа inline.";
             }
           }
           container vv-root {
             description
               "Контейнер для точки монтирования.";
             yangmnt:mount-point "vv-root" {
               description
                 "Корень для моделей, поддерживающих мосты L2VPN и
                  маршрутизацию L3VPN, обычно не типа inline.";
             }
           }
         }
       }
     }

     // Операторы дополнения (augment)

     augment "/if:interfaces/if:interface" {
       description
         "Добавляет узел для идентификации элемента сети, связанного
          со сведениями, настроенными на интерфейсе.

          Отметим, что будет возвращаться стандартная ошибка, если 
          указанный leafref отсутствует. Если интерфейс по какой-либо
          причине не может быть назначен, операцию НУЖНО прервать с
          возвратом error-tag operation-failed и error-app-tag 
          ni-assignment-failed. СЛЕДУЕТ также предоставлять значимый
          элемент error-info с указанием причины отказа в назначении.";
       leaf bind-ni-name {
         type leafref {
           path "/network-instances/network-instance/name";
         }
         description
           "Экземпляр сети, к которому привязан интерфейс.";
       }
     }
     augment "/if:interfaces/if:interface/ip:ipv4" {
       description
         "Добавляет узел для идентификации элемента сети, связанного
          со сведениями, настроенными на интерфейсе IPv4.

          Отметим, что будет возвращаться стандартная ошибка, если 
          указанный leafref отсутствует. Если интерфейс по какой-либо
          причине не может быть назначен, операцию НУЖНО прервать с
          возвратом error-tag operation-failed и error-app-tag 
          ni-assignment-failed. СЛЕДУЕТ также предоставлять значимый
          элемент error-info с указанием причины отказа в назначении.";
       leaf bind-ni-name {
         type leafref {
           path "/network-instances/network-instance/name";
         }
         description
           "Экземпляр сети, к которому привязан интерфейс IPv4.";
       }
     }
     augment "/if:interfaces/if:interface/ip:ipv6" {
       description
         "Добавляет узел для идентификации элемента сети, связанного
          со сведениями, настроенными на интерфейсе IPv6.

          Отметим, что будет возвращаться стандартная ошибка, если 
          указанный leafref отсутствует. Если интерфейс по какой-либо
          причине не может быть назначен, операцию НУЖНО прервать с
          возвратом error-tag operation-failed и error-app-tag 
          ni-assignment-failed. СЛЕДУЕТ также предоставлять значимый
          элемент error-info с указанием причины отказа в назначении.";
       leaf bind-ni-name {
         type leafref {
           path "/network-instances/network-instance/name";
         }
         description
           "Экземпляр сети, к которому привязан интерфейс IPv6.";
       }
     }

     // Оператор уведомления (notification)

     notification bind-ni-name-failed {
       description
         "Указывает ошибку при связывании интерфейса с NI. Создается
          лишь после первоначального успеха при установке bind-ni-name.

          Примечание. Некоторые ошибки может потребоваться сообщать
          для нескольких ассоциаций, например для IPv4 и IPv6
          bind-ni-name.

          В уведомление ДОЛЖЕН включаться хотя бы один контейнер
          с листом bind-ni-name.";
       leaf name {
         type leafref {
           path "/if:interfaces/if:interface/if:name";
         }
         mandatory true;
         description
           "Имя интерфейса, связанного с отказом.";
       }
       container interface {
         description
           "Базовый тип интерфейса.";
         leaf bind-ni-name {
           type leafref {
             path "/if:interfaces/if:interface"
                + "/ni:bind-ni-name";
           }
           description
             "Значение bind-ni-name, связанное с отказом.";
         }
       }
       container ipv4 {
         description
           "Интерфейс IPv4.";
         leaf bind-ni-name {
           type leafref {
             path "/if:interfaces/if:interface/ip:ipv4/ni:bind-ni-name";
           }
           description
             "Значение bind-ni-name, связанное с отказом.";
         }
       }
       container ipv6 {
         description
           "Интерфейс IPv6.";
         leaf bind-ni-name {
           type leafref {
             path "/if:interfaces/if:interface/ip:ipv6"
                + "/ni:bind-ni-name";
           }
           description
             "Значение bind-ni-name, связанное с отказом.";
         }
       }
       leaf error-info {
         type string;
         description
         "Указывает причину отказа (необязательный элемент).";
       }
     }
   }
   <CODE ENDS>

7. Литература

7.1. Нормативные документы

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004, <https://www.rfc-editor.org/info/rfc3688>.

[RFC6020] Bjorklund, M., Ed., «YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)», RFC 6020, DOI 10.17487/RFC6020, October 2010, <https://www.rfc-editor.org/info/rfc6020>.

[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <https://www.rfc-editor.org/info/rfc6241>.

[RFC6242] Wasserman, M., «Using the NETCONF Protocol over Secure Shell (SSH)», RFC 6242, DOI 10.17487/RFC6242, June 2011, <https://www.rfc-editor.org/info/rfc6242>.

[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, «RESTCONF Protocol», RFC 8040, DOI 10.17487/RFC8040, January 2017, <https://www.rfc-editor.org/info/rfc8040>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8340] Bjorklund, M. and L. Berger, Ed., «YANG Tree Diagrams», BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, <https://www.rfc-editor.org/info/rfc8340>.

[RFC8341] Bierman, A. and M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.

[RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., and R. Wilton, «Network Management Datastore Architecture (NMDA)», RFC 8342, DOI 10.17487/RFC8342, March 2018, <https://www.rfc-editor.org/info/rfc8342>.

[RFC8343] Bjorklund, M., «A YANG Data Model for Interface Management», RFC 8343, DOI 10.17487/RFC8343, March 2018, <https://www.rfc-editor.org/info/rfc8343>.

[RFC8344] Bjorklund, M., «A YANG Data Model for IP Management», RFC 8344, DOI 10.17487/RFC8344, March 2018, <https://www.rfc-editor.org/info/rfc8344>.

[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.

[RFC8528] Bjorklund, M. and L. Lhotka, «YANG Schema Mount», RFC 8528, DOI 10.17487/RFC8528, March 2019, <https://www.rfc-editor.org/info/rfc8528>.

7.2. Нормативные документы

[RFC4026] Andersson, L. and T. Madsen, «Provider Provisioned Virtual Private Network (VPN) Terminology», RFC 4026, DOI 10.17487/RFC4026, March 2005, <https://www.rfc-editor.org/info/rfc4026>.

[RFC4364] Rosen, E. and Y. Rekhter, «BGP/MPLS IP Virtual Private Networks (VPNs)», RFC 4364, DOI 10.17487/RFC4364, February 2006, <https://www.rfc-editor.org/info/rfc4364>.

[RFC4664] Andersson, L., Ed. and E. Rosen, Ed., «Framework for Layer 2 Virtual Private Networks (L2VPNs)», RFC 4664, DOI 10.17487/RFC4664, September 2006, <https://www.rfc-editor.org/info/rfc4664>.

[RFC7950] Bjorklund, M., Ed., «The YANG 1.1 Data Modeling Language», RFC 7950, DOI 10.17487/RFC7950, August 2016, <https://www.rfc-editor.org/info/rfc7950>.

[RFC8349] Lhotka, L., Lindem, A., and Y. Qu, «A YANG Data Model for Routing Management (NMDA Version)», RFC 8349, DOI 10.17487/RFC8349, March 2018, <https://www.rfc-editor.org/info/rfc8349>.

[RFC8530] Berger, L., Hopps, C., Lindem, A., Bogdanovic, D., and X. Liu, «YANG Model for Logical Network Elements», RFC 8530, DOI 10.17487/RFC8530, March 2019, <https://www.rfc-editor.org/info/rfc8530>.

[YANG-L2VPN] Shah, H., Brissette, P., Chen, I., Hussain, I., Wen, B., and K. Tiruveedhula, «YANG Data Model for MPLS-based L2VPN», Work in Progress, draft-ietf-bess-l2vpn-yang-09, October 2018.

[YANG-L3VPN] Jain, D., Patel, K., Brissette, P., Li, Z., Zhuang, S., Liu, X., Haas, J., Esale, S., and B. Wen, «Yang Data Model for BGP/MPLS L3 VPNs», Work in Progress, draft-ietf-bess-l3vpn-yang-04, October 2018.

[YANG-NETWORK] Lindem, A., Berger, L., Bogdanovic, D., and C. Hopps, «Network Device YANG Logical Organization», Work in Progress, draft-ietf-rtgwg-device-model-02, March 2017.

[YANG-OSPF] Yeung, D., Qu, Y., Zhang, Z., Chen, I., and A. Lindem, «YANG Data Model for OSPF Protocol», Work in Progress3, draft-ietf-ospf-yang-21, January 2019.

Приложение A. Пример использования NI

В этом приложении даны примеры использования NI.

A.1. Configuration Data

Ниже приведён пример настройки двух клиентских экземпляров сетей.

   {
     "ietf-network-instance:network-instances": {
       "network-instance": [
         {
           "name": "vrf-red",
           "vrf-root": {
             "ietf-routing:routing": {
               "router-id": "192.0.2.1",
               "control-plane-protocols": {
                 "control-plane-protocol": [
                   {
                     "type": "ietf-routing:ospf",
                     "name": "1",
                     "ietf-ospf:ospf": {
                       "af": "ipv4",
                       "areas": {
                         "area": [
                           {
                             "area-id": "203.0.113.1",
                             "interfaces": {
                               "interface": [
                                 {
                                   "name": "eth1",
                                   "cost": 10
                                 }
                               ]
                             }
                           }
                         ]
                       }
                     }
                   }
                 ]
               }
             }
           }
         },
         {
           "name": "vrf-blue",
           "vrf-root": {
             "ietf-routing:routing": {
               "router-id": "192.0.2.2",
               "control-plane-protocols": {
                 "control-plane-protocol": [
                   {
                     "type": "ietf-routing:ospf",
                     "name": "1",
                     "ietf-ospf:ospf": {
                       "af": "ipv4",
                       "areas": {
                         "area": [
                           {
                             "area-id": "203.0.113.1",
                             "interfaces": {
                               "interface": [
                                 {
                                   "name": "eth2",
                                   "cost": 10
                                 }
                               ]
                             }
                           }
                         ]
                       }
                     }
                   }
                 ]
               }
             }
           }
         }
       ]
     },

     "ietf-interfaces:interfaces": {
       "interface": [
         {
           "name": "eth0",
           "type": "iana-if-type:ethernetCsmacd",
           "ietf-ip:ipv4": {
             "address": [
               {
                 "ip": "192.0.2.10",
                 "prefix-length": 24
               }
             ]
           },
           "ietf-ip:ipv6": {
             "address": [
               {
                 "ip": "2001:db8:0:2::10",
                 "prefix-length": 64
               }
             ]
           }
         },
         {
           "name": "eth1",
           "type": "iana-if-type:ethernetCsmacd",
           "ietf-ip:ipv4": {
             "address": [
               {
                 "ip": "192.0.2.11",
                 "prefix-length": 24
               }
             ]
           },
           "ietf-ip:ipv6": {
             "address": [
               {
                 "ip": "2001:db8:0:2::11",
                 "prefix-length": 64
               }
             ]
           },
           "ietf-network-instance:bind-network-instance-name": "vrf-red"
         },
         {
           "name": "eth2",
           "type": "iana-if-type:ethernetCsmacd",
           "ietf-ip:ipv4": {
             "address": [
               {
                 "ip": "192.0.2.11",
                 "prefix-length": 24
               }
             ]
           },
           "ietf-ip:ipv6": {
             "address": [
               {
                 "ip": "2001:db8:0:2::11",
                 "prefix-length": 64
               }
             ]
           },
           "ietf-network-instance:bind-network-instance-name":
           "vrf-blue"
         }
       ]
     },

     "ietf-system:system": {
       "authentication": {
         "user": [
           {
             "name": "john",
             "password": "$0$password"
           }
         ]
       }
     }
   }

A.2. Данные состояния — без NMDA

Здесь показаны данные состояния для предыдущей конфигурации на основе [RFC8343], [RFC8344], [RFC8349].

{
  "ietf-network-instance:network-instances": {
    "network-instance": [
      {
        "name": "vrf-red",
        "vrf-root": {
          "ietf-yang-library:modules-state": {
            "module-set-id": "123e4567-e89b-12d3-a456-426655440000",
            "module": [
              {
                "name": "ietf-yang-library",
                "revision": "2019-01-04",
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-yang-library",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-ospf",
                "revision": "2019-01-24",
                "namespace": "urn:ietf:params:xml:ns:yang:ietf-ospf",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-routing",
                "revision": "2018-03-13",
                "namespace": "urn:ietf:params:xml:ns:yang:ietf-routing",
                "conformance-type": "implement"
              }
            ]
          },
          "ietf-routing:routing-state": {
            "router-id": "192.0.2.1",
            "control-plane-protocols": {
              "control-plane-protocol": [
                {
                  "type": "ietf-routing:ospf",
                  "name": "1",
                  "ietf-ospf:ospf": {
                    "af": "ipv4",
                    "areas": {
                      "area": [
                        {
                          "area-id": "203.0.113.1",
                          "interfaces": {
                            "interface": [
                              {
                                "name": "eth1",
                                "cost": 10
                              }
                            ]
                          }
                        }
                      ]
                    }
                  }
                }
              ]
            }
          }
        }
      },
      {
        "name": "vrf-blue",
        "vrf-root": {
          "ietf-yang-library:modules-state": {
            "module-set-id": "123e4567-e89b-12d3-a456-426655440000",
            "module": [
              {
                "name": "ietf-yang-library",
                "revision": "2019-01-04",
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-yang-library",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-ospf",
                "revision": "2019-01-24",
                "namespace": "urn:ietf:params:xml:ns:yang:ietf-ospf",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-routing",
                "revision": "2018-03-13",
                "namespace": "urn:ietf:params:xml:ns:yang:ietf-routing",
                "conformance-type": "implement"
              }
            ]
          },
          "ietf-routing:routing-state": {
            "router-id": "192.0.2.2",
            "control-plane-protocols": {
              "control-plane-protocol": [
                {
                  "type": "ietf-routing:ospf",
                  "name": "1",
                  "ietf-ospf:ospf": {
                    "af": "ipv4",
                    "areas": {
                      "area": [
                        {
                          "area-id": "203.0.113.1",
                          "interfaces": {
                            "interface": [
                              {
                                "name": "eth2",
                                "cost": 10
                              }
                            ]
                          }
                        }
                      ]
                    }
                  }
                }
              ]
            }
          }
        }
      }
    ]
  },

  "ietf-interfaces:interfaces-state": {
    "interface": [
      {
        "name": "eth0",
        "type": "iana-if-type:ethernetCsmacd",
        "oper-status": "up",
        "phys-address": "00:01:02:A1:B1:C0",
        "statistics": {
          "discontinuity-time": "2017-06-26T12:34:56-05:00"
        },
        "ietf-ip:ipv4": {
          "address": [
            {
              "ip": "192.0.2.10",
              "prefix-length": 24
            }
          ]
        },
        "ietf-ip:ipv6": {
          "address": [
            {
              "ip": "2001:db8:0:2::10",
              "prefix-length": 64
            }
          ]
        }
      },
      {
        "name": "eth1",
        "type": "iana-if-type:ethernetCsmacd",
        "oper-status": "up",
        "phys-address": "00:01:02:A1:B1:C1",
        "statistics": {
          "discontinuity-time": "2017-06-26T12:34:56-05:00"
        },
        "ietf-ip:ipv4": {
          "address": [
            {
              "ip": "192.0.2.11",
              "prefix-length": 24
            }
          ]
        },
        "ietf-ip:ipv6": {
          "address": [
            {
              "ip": "2001:db8:0:2::11",
              "prefix-length": 64
            }
          ]
        }
      },
      {
        "name": "eth2",
        "type": "iana-if-type:ethernetCsmacd",
        "oper-status": "up",
        "phys-address": "00:01:02:A1:B1:C2",
        "statistics": {
          "discontinuity-time": "2017-06-26T12:34:56-05:00"
        },
        "ietf-ip:ipv4": {
          "address": [
            {
              "ip": "192.0.2.11",
              "prefix-length": 24
            }
          ]
        },
        "ietf-ip:ipv6": {
          "address": [
            {
              "ip": "2001:db8:0:2::11",
              "prefix-length": 64
            }
          ]
        }
      }
    ]
  },

  "ietf-system:system-state": {
    "platform": {
      "os-name": "NetworkOS"
    }
  },

  "ietf-yang-library:modules-state": {
    "module-set-id": "123e4567-e89b-12d3-a456-426655440000",
    "module": [
      {
        "name": "iana-if-type",
        "revision": "2018-07-03",
        "namespace": "urn:ietf:params:xml:ns:yang:iana-if-type",
        "conformance-type": "import"
      },
      {
        "name": "ietf-inet-types",
        "revision": "2013-07-15",
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-inet-types",
        "conformance-type": "import"
      },
      {
        "name": "ietf-interfaces",
        "revision": "2018-02-20",
        "feature": [
          "arbitrary-names",
          "pre-provisioning"
        ],
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-interfaces",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-ip",
        "revision": "2018-01-09",
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-ip",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-network-instance",
        "revision": "2018-02-03",
        "feature": [
          "bind-network-instance-name"
        ],
        "namespace":
          "urn:ietf:params:xml:ns:yang:ietf-network-instance",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-ospf",
        "revision": "2019-01-24",
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-ospf",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-routing",
        "revision": "2018-03-13",
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-routing",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-system",
        "revision": "2014-08-06",
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-system",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-yang-library",
        "revision": "2019-01-04",
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-library",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-yang-schema-mount",
        "revision": "2019-01-14",
        "namespace":
          "urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-yang-types",
        "revision": "2013-07-15",
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-types",
        "conformance-type": "import"
      }
    ]
  },

  "ietf-yang-schema-mount:schema-mounts": {
    "mount-point": [
      {
        "module": "ietf-network-instance",
        "label": "vrf-root",
        "shared-schema": {
          "parent-reference": [
            "/*[namespace-uri() = 'urn:ietf:...:ietf-interfaces']"
          ]
        }
      }
    ]
  }
}

A.3. Данные состояния — NMDA

Здесь показаны данные состояния для предыдущей конфигурации на основе [RFC8343], [RFC8344], [RFC8349].

  {
    "ietf-network-instance:network-instances": {
      "network-instance": [
        {
          "name": "vrf-red",
          "vrf-root": {
            "ietf-yang-library:yang-library": {
              "content-id": "41e2ab5dc325f6d86f743e8da3de323f1a61a801",
              "module-set": [
                {
                  "name": "ni-modules",
                  "module": [
                    {
                      "name": "ietf-yang-library",
                      "revision": "2019-01-04",
                      "namespace":
                        "urn:ietf:params:xml:ns:yang:ietf-yang-library"
                    },
                    {
                      "name": "ietf-ospf",
                      "revision": "2019-01-24",
                      "namespace":
                        "urn:ietf:params:xml:ns:yang:ietf-ospf"
                    },
                    {
                      "name": "ietf-routing",
                      "revision": "2018-03-13",
                      "namespace":
                        "urn:ietf:params:xml:ns:yang:ietf-routing"
                    }
                  ],
                  "import-only-module": [
                    {
                      "name": "ietf-inet-types",
                      "revision": "2013-07-15",
                      "namespace":
                        "urn:ietf:params:xml:ns:yang:ietf-inet-types"
                    },
                    {
                      "name": "ietf-yang-types",
                      "revision": "2013-07-15",
                      "namespace":
                        "urn:ietf:params:xml:ns:yang:ietf-yang-types"
                    },
                    {
                      "name": "ietf-datastores",
                      "revision": "2018-02-14",
                      "namespace":
                        "urn:ietf:params:xml:ns:yang:ietf-datastores"
                    }
                  ]
                }
              ],
              "schema": [
                {
                  "name": "ni-schema",
                  "module-set": [ "ni-modules" ]
                }
              ],
              "datastore": [
                {
                  "name": "ietf-datastores:running",
                  "schema": "ni-schema"
                },
                {
                  "name": "ietf-datastores:operational",
                  "schema": "ni-schema"
                }
              ]
            },
            "ietf-routing:routing": {
              "router-id": "192.0.2.1",
              "control-plane-protocols": {
                "control-plane-protocol": [
                  {
                    "type": "ietf-routing:ospf",
                    "name": "1",
                    "ietf-ospf:ospf": {
                      "af": "ipv4",
                      "areas": {
                        "area": [
                          {
                            "area-id": "203.0.113.1",
                            "interfaces": {
                              "interface": [
                                {
                                  "name": "eth1",
                                  "cost": 10
                                }
                              ]
                            }
                          }
                        ]
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "name": "vrf-blue",
          "vrf-root": {
            "ietf-yang-library:yang-library": {
              "checksum": "41e2ab5dc325f6d86f743e8da3de323f1a61a801",
              "module-set": [
                {
                  "name": "ni-modules",
                  "module": [
                    {
                      "name": "ietf-yang-library",
                      "revision": "2019-01-04",
                      "namespace":
                        "urn:ietf:params:xml:ns:yang:ietf-yang-library",
                      "conformance-type": "implement"
                    },
                    {
                      "name": "ietf-ospf",
                      "revision": "2019-01-24",
                      "namespace":
                        "urn:ietf:params:xml:ns:yang:ietf-ospf",
                      "conformance-type": "implement"
                    },
                    {
                      "name": "ietf-routing",
                      "revision": "2018-03-13",
                      "namespace":
                        "urn:ietf:params:xml:ns:yang:ietf-routing",
                      "conformance-type": "implement"
                    }
                  ],
                  "import-only-module": [
                    {
                      "name": "ietf-inet-types",
                      "revision": "2013-07-15",
                      "namespace":
                        "urn:ietf:params:xml:ns:yang:ietf-inet-types"
                    },
                    {
                      "name": "ietf-yang-types",
                      "revision": "2013-07-15",
                      "namespace":
                        "urn:ietf:params:xml:ns:yang:ietf-yang-types"
                    },
                    {
                      "name": "ietf-datastores",
                      "revision": "2018-02-14",
                      "namespace":
                        "urn:ietf:params:xml:ns:yang:ietf-datastores"
                    }
                  ]
                }
              ],
              "schema": [
                {
                  "name": "ni-schema",
                  "module-set": [ "ni-modules" ]
                }
              ],
              "datastore": [
                {
                  "name": "ietf-datastores:running",
                  "schema": "ni-schema"
                },
                {
                  "name": "ietf-datastores:operational",
                  "schema": "ni-schema"
                }
              ]
            },
            "ietf-routing:routing": {
              "router-id": "192.0.2.2",
              "control-plane-protocols": {
                "control-plane-protocol": [
                  {
                    "type": "ietf-routing:ospf",
                    "name": "1",
                    "ietf-ospf:ospf": {
                      "af": "ipv4",
                      "areas": {
                        "area": [
                          {
                            "area-id": "203.0.113.1",
                            "interfaces": {
                              "interface": [
                                {
                                  "name": "eth2",
                                  "cost": 10
                                }
                              ]
                            }
                          }
                        ]
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    },

    "ietf-interfaces:interfaces": {
      "interface": [
        {
          "name": "eth0",
          "type": "iana-if-type:ethernetCsmacd",
          "oper-status": "up",
          "phys-address": "00:01:02:A1:B1:C0",
          "statistics": {
            "discontinuity-time": "2017-06-26T12:34:56-05:00"
          },
          "ietf-ip:ipv4": {
            "address": [
              {
                "ip": "192.0.2.10",
                "prefix-length": 24
              }
            ]
          },
          "ietf-ip:ipv6": {
            "address": [
              {
                "ip": "2001:db8:0:2::10",
                "prefix-length": 64
              }
            ]
          }
        },
        {
          "name": "eth1",
          "type": "iana-if-type:ethernetCsmacd",
          "oper-status": "up",
          "phys-address": "00:01:02:A1:B1:C1",
          "statistics": {
            "discontinuity-time": "2017-06-26T12:34:56-05:00"
          },
          "ietf-ip:ipv4": {
            "address": [
              {
                "ip": "192.0.2.11",
                "prefix-length": 24
              }
            ]
          },
          "ietf-ip:ipv6": {
            "address": [
              {
                "ip": "2001:db8:0:2::11",
                "prefix-length": 64
              }
            ]
          }
        },
        {
          "name": "eth2",
          "type": "iana-if-type:ethernetCsmacd",
          "oper-status": "up",
          "phys-address": "00:01:02:A1:B1:C2",
          "statistics": {
            "discontinuity-time": "2017-06-26T12:34:56-05:00"
          },
          "ietf-ip:ipv4": {
            "address": [
              {
                "ip": "192.0.2.11",
                "prefix-length": 24
              }
            ]
          },
          "ietf-ip:ipv6": {
            "address": [
              {
                "ip": "2001:db8:0:2::11",
                "prefix-length": 64
              }
            ]
          }
        }
      ]
    },

    "ietf-system:system-state": {
      "platform": {
        "os-name": "NetworkOS"
      }
    },

    "ietf-yang-library:yang-library": {
      "content-id": "75a43df9bd56b92aacc156a2958fbe12312fb285",
      "module-set": [
        {
          "name": "host-modules",
          "module": [
            {
              "name": "ietf-interfaces",
              "revision": "2018-02-20",
              "feature": [
                "arbitrary-names",
                "pre-provisioning"
              ],
              "namespace":
                "urn:ietf:params:xml:ns:yang:ietf-interfaces"
            },
            {
              "name": "ietf-ip",
              "revision": "2018-01-09",
              "namespace": "urn:ietf:params:xml:ns:yang:ietf-ip"
            },
            {
              "name": "ietf-network-instance",
              "revision": "2018-02-03",
              "feature": [
                "bind-network-instance-name"
              ],
              "namespace":
                "urn:ietf:params:xml:ns:yang:ietf-network-instance"
            },
            {
              "name": "ietf-ospf",
              "revision": "2019-01-24",
              "namespace":
                "urn:ietf:params:xml:ns:yang:ietf-ospf"
            },
            {
              "name": "ietf-routing",
              "revision": "2018-03-13",
              "namespace":
              "urn:ietf:params:xml:ns:yang:ietf-routing"
            },
            {
              "name": "ietf-system",
              "revision": "2014-08-06",
              "namespace": "urn:ietf:params:xml:ns:yang:ietf-system"
            },
            {
              "name": "ietf-yang-library",
              "revision": "2019-01-04",
              "namespace":
                "urn:ietf:params:xml:ns:yang:ietf-yang-library"
            },
            {
              "name": "ietf-yang-schema-mount",
              "revision": "2019-01-14",
              "namespace":
                "urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount"
            }
          ],
          "import-only-module": [
            {
              "name": "iana-if-type",
              "revision": "2018-07-03",
              "namespace": "urn:ietf:params:xml:ns:yang:iana-if-type"
            },
            {
              "name": "ietf-inet-types",
              "revision": "2013-07-15",
              "namespace":
                "urn:ietf:params:xml:ns:yang:ietf-inet-types"
            },
            {
              "name": "ietf-yang-types",
              "revision": "2013-07-15",
              "namespace":
                "urn:ietf:params:xml:ns:yang:ietf-yang-types"
            },
            {
              "name": "ietf-datastores",
              "revision": "2018-02-14",
              "namespace":
                "urn:ietf:params:xml:ns:yang:ietf-datastores"
            }
          ]
        }
      ],
      "schema": [
        {
          "name": "host-schema",
          "module-set": [ "host-modules" ]
        }
      ],
      "datastore": [
        {
          "name": "ietf-datastores:running",
          "schema": "host-schema"
        },
        {
          "name": "ietf-datastores:operational",
          "schema": "host-schema"
        }
      ]
    },

    "ietf-yang-schema-mount:schema-mounts": {
      "mount-point": [
        {
          "module": "ietf-network-instance",
          "label": "vrf-root",
          "shared-schema": {
            "parent-reference": [
              "/*[namespace-uri() = 'urn:ietf:...:ietf-interfaces']"
            ]
          }
        }
      ]
    }
  }

Благодарности

Команда разработчиков Routing Area Yang Architecture включала Acee Lindem, Anees Shaikh, Christian Hopps, Dean Bogdanovic, Lou Berger, Qin Wu, Rob Shakir, Stephane Litkowski, Yan Gang. Martin Bjorklund и John Scudder предоставили полезные обзорные комментарии.

Этот документ был выведен из Network Device YANG Logical Organization [YANG-NETWORK].

Спасибо за комментарии для Area Director и IETF last-call Alia Atlas, Liang Xia, Benoit Claise, Adam Roach.

Адреса авторов

Lou Berger
LabN Consulting, L.L.C.
Email: lberger@labn.net
 
Christian Hopps
LabN Consulting, L.L.C.
Email: chopps@chopps.org
 
Acee Lindem
Cisco Systems
301 Midenhall Way
Cary, NC 27513
United States of America
Email: acee@cisco.com
 
Dean Bogdanovic
Volta Networks
Email: ivandean@gmail.com
 
Xufeng Liu
Volta Networks
Email: xufeng.liu.ietf@gmail.com

Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

1Internet Engineering Task Force.

2Internet Engineering Steering Group.

3Опубликовано в RFC 9129. Прим. перев.

Рубрика: RFC | Оставить комментарий

RFC 8530 YANG Model for Logical Network Elements

Internet Engineering Task Force (IETF)                         L. Berger
Request for Comments: 8530                                      C. Hopps
Category: Standards Track                        LabN Consulting, L.L.C.
ISSN: 2070-1721                                                A. Lindem
                                                           Cisco Systems
                                                           D. Bogdanovic
                                                                  X. Liu
                                                          Volta Networks
                                                              March 2019

YANG Model for Logical Network Elements

Модель YANG для логических элементов сети

PDF

Аннотация

Этот документ определяет модуль для логических элементов сети YANG LNE, соответствующих архитектуре хранилищ данных управления сетью (Network Management Datastore Architecture или NMDA). Модуль может служить для управления разделением логических ресурсов, которые могут присутствовать на сетевом устройстве. Примерами таких логических устройств являются логические системы и логические маршрутизаторы. Модель YANG в этом документе соответствует архитектуре NMDA, описанной в RFC 8342.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc8530.

Авторские права

Copyright (c) 2019. Авторские права принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

1. Введение

Этот документ определяет соответствующий архитектуре NMDA модуль YANG [RFC6020] для поддержки создания логических сетевых элементов (logical network element или LNE) на сетевом устройстве. LNE — это независимо поддерживаемое сетевое устройство на основе ресурсов, выделенных ему хостом или родительским сетевым устройством. Элемент LNE, работающий на сетевом хосте, концептуально похож на виртуальную машину, работающую на хост-системе. В терминах виртуализации можно назвать LNE гостем (Guest), а содержащее его сетевое устройство — хостом (Host). Хотя LNE можно реализовать с помощью технологий виртуализации на хосте, это совсем не обязательно. Модель YANG в этом документе соответствует архитектуре хранилищ сетевой информации NMDA, определённой в [RFC8342].

Документ также определяет дополнения, требуемые для выделения хостом ресурсов данному LNE. Поскольку модель управления интерфейсом [RFC8343] является единственным модулем, определяющим в настоящее время ресурсы хоста, этот документ определяет лишь одно дополнение, охватывающее назначение интерфейса элементу LNE. Предполагается, что будущие модули, определяющие поддержку управления ресурсами хост-устройства, будут при необходимости поддерживать выделение контролируемых ресурсов элементам LNE.

Поскольку элемент LNE является независимо управляемым устройством, у каждого LNE будет набор моделируемых в YANG данных, независимый от хост-устройства и других LNE. Например, несколько LNE могут иметь свой интерфейс Tunnel0, который не будет конфликтовать с интерфейсами других LNE и не будет присутствовать в модели интерфейсов хоста. LNE будет иметь свои интерфейсы управления, возможно включая независимые серверы NETCONF, RESTCONF и т. п. для поддержки настройки своих моделей YANG. Реализация может полностью переименовать выделенные интерфейсы и, например, на хосте выделенный LNE интерфейс может называться Ethernet0/1, а в LNE — eth1.

В дополнение к стандартным интерфейсам управления реализация хост-устройства может обеспечивать доступ к конфигурации LNE и операционные модели YANG напрямую с хост-системы. Такой доступ может происходить через точку монтирования yang-schema-mount [RFC8528], в которой обращаться к корневому уровню моделей YANG LNE .

Примеры терминов производителей для LNE включают logical system, logical router, virtual switch, chassis, fabric.

1.1. Терминология

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

Предполагается знакомство читателя с концепциями YANG [RFC7950] и YANG Schema Mount [RFC8528]. В документе применяется графическое представление моделей данных, описанное в [RFC8340].

2. Обзор

В этом документе рассматриваются сетевые устройства, которые поддерживают протоколы и функции, определённые в рамках IETF Routing Area, например, маршрутизаторы, межсетевые экраны, хосты. Такие устройства могут быть физическими или виртуальными, например, классический маршрутизатор с нестандартным (custom) оборудованием или маршрутизатор внутри виртуальной машины на сервере, реализующей функцию виртуальной сети (virtual network function или VNF). Каждое устройство может выделять свои ресурсы в элементы LNE, каждый из которых является управляемым логическим устройством. Примеры терминов производителей для LNE включают logical system, logical router, virtual switch, chassis, fabric. Каждый LNE может также поддерживать функции маршрутизации и пересылки VPN (VPN Routing and Forwarding или VRF) и экземпляра виртуальной коммутации (Virtual Switching Instance или VSI), которые далее называются экземплярами сети (Network Instance или NI). Это разделение представлено на рисунке 1.

,'''''''''''''''''''''''''''''''''''''''''''''''.
|Сетевое устройство (физическое или виртуальное)|
| .....................   ..................... |
| :        LNE        :   :        LNE        : |
| :+-----+-----+-----+:   :+-----+-----+-----+: |
| :|  NI |  NI |  NI |:   :|  NI |  NI |  NI |: |
| :+-----+-----+-----+:   :+-----+-----+-----+: |
| :  | |   | |   | |  :   :  | |   | |   | |  : |
| :..|.|...|.|...|.|..:   :..|.|...|.|...|.|..: |
|    | |   | |   | |         | |   | |   | |    |
 ''''|'|'''|'|'''|'|'''''''''|'|'''|'|'''|'|'''''
     | |   | |   | |         | |   | |   | |
        Интерфейсы              Интерфейсы

Рисунок 1. Связи между элементами модуля.


Модель для LNE представлена в разделе 3. Логические элементы сети, а модель для NI — в [RFC8529].

Текущая модель управления интерфейсом [RFC8343] затрагивается определениями LNE и NI. Этот документ и [RFC8529] определяют дополнения к модели интерфейса для поддержки LNE и NI. Похожие элементы (возможно, только для LNE) могут потребоваться включить и в будущие модули для оборудования и QoS.

Интерфейсы являются важной частью конфигурации и рабочего состояния любого сетевого устройства. Обычно они включают комбинацию необработанных (raw) физических интерфейсов, интерфейсов канального уровня, настройку адресов и логические интерфейсы, которые могут быть не привязаны ни к какому физическому интерфейсу. Некоторые системные службы, а также протоколы L2 и L3 тоже могут связывать свои данные конфигурации и рабочего состояния в различными типами интерфейсов (эти связи для простоты не показаны). Модель управления интерфейсом задана в [RFC8343]. Модуль logical-network-element дополняет имеющиеся модели управления интерфейсами, добавляя идентификатор, который применяется на интерфейсах для указания связанного LNE. Относящееся к интерфейсам дополнение показано ниже.

       module: ietf-logical-network-element
         augment /if:interfaces/if:interface:
           +--rw bind-lne-name?   ->
                /logical-network-elements/logical-network-element/name

Модель интерфейса в [RFC8343] структурирована так, чтобы включить все интерфейсы в плоский список без учёта логического выделения ресурсов, поддерживаемых на устройстве. Лист (leaf) и bind-lne-name обеспечивают связь между интерфейсом и соответствующим LNE. Отметим, что в настоящее время при назначении интерфейсу как LNE, так и NI нужно сначала выделять интерфейс для LNE, а потом в модели интерфейса этого LNE связывать представление LNE для этого интерфейса с экземпляром NI с помощью механизма, заданного в [RFC8529].

3. Логические элементы сети

Элементы LNE поддерживают способность некоторых устройств разделять ресурсы на независимые логические коммутаторы и маршрутизаторы. Поддержка устройствами нескольких LNE зависит от реализации. Системам без таких возможностей не требуется включать поддержку модуля logical-network-element. В физических устройствах некоторые аппаратные возможности совместно используются разделами (partition), но экземпляры протоколов плоскости управления (например, маршрутизации), таблицы и конфигурация поддерживаются раздельно. Например, для логических маршрутизаторов или VNF может создаваться несколько логических экземпляров, использующих один программный образ. Модель поддерживает настройку множества экземпляров на одном устройстве за счёт создания списка LNE, каждый из которых имеет свою конфигурацию и рабочее состояние в части протоколов маршрутизации и коммутации. Модель LNE можно представить в форме

   module: ietf-logical-network-element
     +--rw logical-network-elements
        +--rw logical-network-element* [name]
           +--rw name           string
           +--rw managed?       boolean
           +--rw description?   string
           +--mp root
     augment /if:interfaces/if:interface:
       +--rw bind-lne-name?
             -> /logical-network-elements/logical-network-element/name

     notifications:
       +---n bind-lne-name-failed
          +--ro name             -> /if:interfaces/interface/name
          +--ro bind-lne-name
          |       -> /if:interfaces/interface/lne:bind-lne-name
          +--ro error-info?      string

Узел name указывает логический элемент сети, managed показывает, будет ли сервер, обеспечивающий хост-устройство, предоставлять клиенту сведения LNE через структуру root. Корнем данных конкретного LNE является точка монтирования схемы (root). Узел bind-lne-name служит для связывания интерфейса с LNE, а bind-lne-name-failed применяется при некоторых типах отказов.

Корень LNE должен содержать хотя бы библиотеку YANG [RFC7895] и модуль интерфейса [RFC8343].

3.1. Создание экземпляра LNE и выделение ресурсов

Элементами LNE может управлять клиент с использованием имеющегося списка операций. При создании записей списка порождается новый экземпляр LNE. Предполагается, что модели, монтируемые в корень LNE, будут зависеть от реализации сервера. При удалении записи списка уничтожается имеющийся элемент LNE. Дополнительные сведения можно найти в параграфе 7.8.6 [RFC7950].

После создания экземпляра LNE с ним можно связать ресурсы хост-устройства. Как отмечено ранее, этот документ дополняет ietf-interfaces листом bind-lne-name для поддержки таких ассоциаций с интерфейсами. При указании в bind-lne-name действительного имени LNE реализация должна предпринять все требуемые шаги по назначению интерфейса элементу LNE или возвратить сообщение об ошибке (см. ниже) с указанием причины отказа в назначении. Назначение может завершаться отказом во время обработки набора или по завершении асинхронной обработки. В последнем случае сведения об ошибке передаются через уведомление.

При успешном назначении интерфейса элементу LNE реализация должна также обеспечить LNE доступные ресурсы, предоставив LNE созданный системой интерфейс. Имя этого интерфейса определяется локально и может совпадать или отличаться от имени, применяемого в контексте хост-устройства. Созданный системой интерфейс следует раскрывать через экземпляр подели интерфейса [RFC8343] конкретного LNE.

3.2. Управление LNE с точки зрения LNE

Предполагается, что каждый экземпляр LNE будет поддерживать функции управления из контекста корня LNE через сервер, предоставляющий информацию с корнем LNE в качестве корня устройства. Функции управления, работающие в контексте LNE, доступны через стандартные интерфейсы управления LNE, например, NETCONF и SNMP. Исходная конфигурация LNE, как и исходная конфигурация хост-устройства определяется локальной реализацией.

При доступе к LNE через его интерфейс управления будет представлен образ (representation) сетевого устройства, но область действия будет ограничена конкретным LNE. Обычные механизмы YANG и NETCONF вместе с требуемым экземпляром библиотеки YANG [RFC7895] могут применяться для идентификации доступных модулей. Каждый поддерживаемый модель будет представляться как модуль верхнего уровня. В связанных с ресурсами модулях будут отражаться лишь связанные с LNE ресурсы, такие как интерфейсы, оборудование и (возможно) QoS. С точки зрения системы управления не будет различий между доступным представлением LNE и физическим сетевым устройством.

3.3. Управление LNE с точки зрения хоста

Существует несколько подходов к реализации, позволяющих сетевому устройству поддерживать модуль logical-network-element и множество LNE. Некоторые варианты предоставляют функциям управления, работающим на сетевом устройстве, доступ к конфигурации и рабочему состоянию LNE, но даже при наличии такой возможности управление LNE с сетевого устройства может быть запрещено правилами.

Независимо от выбранного метода реализации упомянутый выше логический узел managed служит для контроля возможности управления LNE из контекста сетевого устройства. При managed false элементом LNE невозможно управлять с хост-системы и управление разрешено лишь из контекста LNE, как описанов в параграфе 3.2. Попытки доступа к информации ниже корневого узла, для которого установлено managed false, должны приводит к указанному ниже сообщению об ошибке. В некоторых реализациях смена значения может оказаться невозможной. Например, при реализации LNE с использованием виртуальной машины и традиционных технологий гипервизора вполне вероятно, что возможно будет лишь значение managed false.

Реализация самостоятельно решает вопрос возможности доступа и изменения информации из контекста LNE или даже из контекста хост-устройства. При установке managed true, к сведениям LNE нужно предоставлять доступ из контекста хост-устройства. Когда в связанном определении schema-mount установлено config true, для данных LNE нужно также предоставлять возможность изменения из контекста хост-устройства. Когда сведения LNE доступны из контекста хост-устройства и LNE, те же сведения должны быть доступны через элемент root с изменёнными в соответствии с [RFC8528] путями.

Реализация может представлять схему LNE с использованием подхода inline или shared-schema, как описано в [RFC8528], выбор которого полностью определяется реализацией. Вариант inline обычно предполагается в случаях, когда для листа managed всегда установлено значение false. Вариант shared-schema считается более полезным в случаях, когда все LNE используют общую схему. При использовании shared-schema с точкой монтирования LNE библиотека YANG с корнем в точке монтирования должна соответствовать схеме, определённой в соответствии с модулем ietf-yang-schema-mount.

Помимо двух модулей, всегда присутствующих для LNE, поскольку сам элемент LNE является сетевым устройством, все модули, которые могут присутствовать в сетевом устройстве верхнего уровня, могут быть представлены и для LNE. Предполагается, что список доступных модулей будет зависеть от реализации, как и метод поддержки элементов LNE. Примеры использования LNE представлены в Приложении A.

4. Вопросы безопасности

Заданный в этом документе модуль YANG определяет схему для данных, которая разработана для доступа через протоколы управления сетью, такие как NETCONF [RFC6241] и RESTCONF [RFC8040]. Нижним уровнем NETCONF является защищённый транспорт с обязательной реализацией Secure Shell (SSH) [RFC6242]. Нижним уровнем RESTCONF служит HTTPS с обязательной реализацией защищённого транспорта TLS [RFC8446].

Модель управления доступом NACM [RFC8341] обеспечивает средства, позволяющие предоставить доступ лишь конкретным пользователям NETCONF и RESTCONF к предопределённому подмножеству доступных в NETCONF или RESTCONF протокольных операций и содержимого.

Данные LNE содержат сведения о конфигурации устройства и сети, поэтому безопасность этих сведений важна, но принципиально не отличается от защиты других сведений о конфигурации устройства или интерфейса, рассмотренной в таких документах, как [RFC8343], [RFC7317], [RFC8349].

Уязвимы могут быть параметры и ветви с config true, указанные ниже.

/logical-network-elements/logical-network-element

Этот список задаёт логические элементы сети и связанные с ними конфигурации.

/logical-network-elements/logical-network-element/managed

Хотя этот лист содержится в предыдущем списке, он заслуживает особого внимания, поскольку определяет доступность сведений из точки монтирования LNE из контекста хост-устройства и LNE. Содержимое этого листа может быть чувствительным в средах, где LNE управляется стороной, отличной от хост-устройства и не желающей делиться сведениями LNE с оператором хост-устройства.

/if:interfaces/if:interface/bind-lne-name

Этот лист указывает экземпляр LNE, которому назначен интерфейс. Реализациям следует обращать пристальное внимание к разрешению изменений в этом листе, поскольку удаление интерфейса из LNE может оказывать серьёзное влияние на работу LNE, подобно физическому удалению интерфейса из устройства. Реализации могут отвергать переназначение, используя описанные выше сообщения об ошибках.

Несанкционированный доступ к любому из этих списков может негативно влиять на безопасность локального устройства и сети. Это может приводить к сбоям в работе сети, доставке пакетов в непредусмотренные места и иным проблемам.

5. Взаимодействие с IANA

Этот документ регистрирует URI в реестре IETF XML Registry [RFC3688].

        URI: urn:ietf:params:xml:ns:yang:ietf-logical-network-element
        Registrant Contact: The IESG.
        XML: N/A, the requested URI is an XML namespace.

Документ регистрирует модуль YANG в реестре YANG Module Names [RFC6020].

   name:        ietf-logical-network-element
   namespace:   urn:ietf:params:xml:ns:yang:ietf-logical-network-element
   prefix:      lne
   reference:   RFC 8530

6. Модель логического элемента сети

Структура определённой в документе модели описана в представленном ниже модуле YANG.

 <CODE BEGINS> file "ietf-logical-network-element@2019-01-25.yang"
 module ietf-logical-network-element {
   yang-version 1.1;

   // Пространство имен

   namespace "urn:ietf:params:xml:ns:yang:ietf-logical-network-element";
   prefix lne;

   // Импорт некоторых базовых типов

   import ietf-interfaces {
     prefix if;
     reference
       "RFC 8343: A YANG Data Model for Interface Management";
   }
   import ietf-yang-schema-mount {
     prefix yangmnt;
     reference
       "RFC 8528: YANG Schema Mount";
   }

   organization
     "IETF Routing Area (rtgwg) Working Group";
   contact
     "WG Web:   <https://datatracker.ietf.org/wg/rtgwg/> 
      WG List:  <mailto:rtgwg@ietf.org> 

      Author:   Lou Berger
                <mailto:lberger@labn.net> 

      Author:   Christian Hopps
                <mailto:chopps@chopps.org> 

      Author:   Acee Lindem
                <mailto:acee@cisco.com> 

      Author:   Dean Bogdanovic
                <mailto:ivandean@gmail.com>"; 
   description
     "Этот модуль служит для поддержки множества логических
      сетевых элементов в одной физической или виртуальной системе.

      Авторские права (Copyright (c) 2019) принадлежат IETF Trust
      и лицам, указанным в качестве авторов кода. Все права защищены.

      Распространение и использование в исходной или двоичной форме с
      изменениями или без таковых разрешено в соответствии с лицензией
      Simplified BSD, изложенной в разделе 4  IETF Trust's Legal
      Provisions применительно к документам IETF
      (http://trustee.ietf.org/license-info). 

      Эта версия данного модуля YANG является частью RFC 8530, где
      правовые вопросы рассмотрены более полно.";

   revision 2019-01-25 {
     description
       "Исходный выпуск.";
     reference
       "RFC 8530: YANG Model for Logical Network Elements";
   }

   // Операторы определения устройства верхнего уровня

   container logical-network-elements {
     description
       "Позволяет сетевому устройству поддерживать множество экземпляров
        логических сетевых элементов (устройств).";
     list logical-network-element {
       key "name";
       description
         "Список логических сетевых элементов.";
       leaf name {
         type string;
         description
           "Уникальный на устройстве идентификатор LNE.";
       }
       leaf managed {
         type boolean;
         default "true";
         description
           "Значение true разрешает хосту доступ к сведениям LNE через
            корень точки монтирования. Это значение неизменно во всех
            реализациях.";
       }
       leaf description {
         type string;
         description
           "Описание логического элемента сети.";
       }
       container root {
         description
           "Контейнер для точки монтирования.";
         yangmnt:mount-point "root" {
           description
             "Корень для моделей, поддерживаемых на LNE. Эта точка
              монтирования может быть встроенной (inline) в 
              зависимости от реализации сервера. В неё всегда
              НУЖНО включать библиотеку YANG и экземпляр интерфейса.

              Кода связанный лист managed имеет значение false, при
              любой операции доступа к информации ниже корня НУЖНО 
              возвращать отказ с error-tag access-denied и 
              error-app-tag lne-not-managed.";
         }
       }
     }
   }

   // Оператор дополнения (augment)
   augment "/if:interfaces/if:interface" {
     description
       "Добавляет узел для идентификации логического элемента,
        связанного с интерфейсом. Применяется к интерфейсам, которые
        могут быть назначены логическим элементам.

        Отметим, что будет возвращаться стандартная ошибка, если 
        указанный leafref отсутствует. Если интерфейс по какой-либо
        причине не может быть назначен, операцию НУЖНО прервать с
        возвратом error-tag = operation-failed и error-app-tag =
        lne-assignment-failed. СЛЕДУЕТ также предоставлять значимый
        элемент error-info с указанием причины отказа в назначении.";
     leaf bind-lne-name {
       type leafref {
         path "/logical-network-elements/logical-network-element/name";
       }
       description
         "Идентификатор LNE, с которым связан интерфейс.";
     }
   }

   // Оператор уведомления (notification)

   notification bind-lne-name-failed {
     description
       "Указывает ошибку при связывании интерфейса с LNE. Создается
        лишь после первоначального успеха при установке bind-lne-name.";
     leaf name {
       type leafref {
         path "/if:interfaces/if:interface/if:name";
       }
       mandatory true;
       description
         "Имя интерфейса, связанного с отказом.";
     }
     leaf bind-lne-name {
       type leafref {
         path "/if:interfaces/if:interface/lne:bind-lne-name";
       }
       mandatory true;
       description
         "Значение bind-lne-name, связанное с отказом.";
     }
     leaf error-info {
       type string;
       description
         "Указывает причину отказа (необязательный элемент).";
     }
   }
 }
 <CODE ENDS>

7. Литература

7.1. Нормативные документы

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004, <https://www.rfc-editor.org/info/rfc3688>.

[RFC6020] Bjorklund, M., Ed., «YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)», RFC 6020, DOI 10.17487/RFC6020, October 2010, <https://www.rfc-editor.org/info/rfc6020>.

[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <https://www.rfc-editor.org/info/rfc6241>.

[RFC6242] Wasserman, M., «Using the NETCONF Protocol over Secure Shell (SSH)», RFC 6242, DOI 10.17487/RFC6242, June 2011, <https://www.rfc-editor.org/info/rfc6242>.

[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, «RESTCONF Protocol», RFC 8040, DOI 10.17487/RFC8040, January 2017, <https://www.rfc-editor.org/info/rfc8040>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8341] Bierman, A. and M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.

[RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., and R. Wilton, «Network Management Datastore Architecture (NMDA)», RFC 8342, DOI 10.17487/RFC8342, March 2018, <https://www.rfc-editor.org/info/rfc8342>.

[RFC8343] Bjorklund, M., «A YANG Data Model for Interface Management», RFC 8343, DOI 10.17487/RFC8343, March 2018, <https://www.rfc-editor.org/info/rfc8343>.

[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.

[RFC8528] Bjorklund, M. and L. Lhotka, «YANG Schema Mount», RFC 8528, DOI 10.17487/RFC8528, March 2019, <https://www.rfc-editor.org/info/rfc8528>.

7.2. Дополнительная литература

[DEVICE-MODEL] Lindem, A., Berger, L., Bogdanovic, D., and C. Hopps, «Network Device YANG Logical Organization», Work in Progress, draft-ietf-rtgwg-device-model-02, March 2017.

[OSPF-YANG] Yeung, D., Qu, Y., Zhang, Z., Chen, I., and A. Lindem, «YANG Data Model for OSPF Protocol», Work in Progress3, draft-ietf-ospf-yang-21, January 2019.

[RFC7317] Bierman, A. and M. Bjorklund, «A YANG Data Model for System Management», RFC 7317, DOI 10.17487/RFC7317, August 2014, <https://www.rfc-editor.org/info/rfc7317>.

[RFC7895] Bierman, A., Bjorklund, M., and K. Watsen, «YANG Module Library», RFC 7895, DOI 10.17487/RFC7895, June 2016, <https://www.rfc-editor.org/info/rfc7895>.

[RFC7950] Bjorklund, M., Ed., «The YANG 1.1 Data Modeling Language», RFC 7950, DOI 10.17487/RFC7950, August 2016, <https://www.rfc-editor.org/info/rfc7950>.

[RFC8340] Bjorklund, M. and L. Berger, Ed., «YANG Tree Diagrams», BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, <https://www.rfc-editor.org/info/rfc8340>.

[RFC8348] Bierman, A., Bjorklund, M., Dong, J., and D. Romascanu, «A YANG Data Model for Hardware Management», RFC 8348, DOI 10.17487/RFC8348, March 2018, <https://www.rfc-editor.org/info/rfc8348>.

[RFC8349] Lhotka, L., Lindem, A., and Y. Qu, «A YANG Data Model for Routing Management (NMDA Version)», RFC 8349, DOI 10.17487/RFC8349, March 2018, <https://www.rfc-editor.org/info/rfc8349>.

[RFC8529] Berger, L., Hopps, C., Lindem, A., Bogdanovic, D., and X. Liu, «YANG Data Model for Network Instances», RFC 8529, DOI 10.17487/RFC8529, March 2019, <https://www.rfc-editor.org/info/rfc8529>.

Приложение A. Примеры

В последующих параграфах представлены примеры использования элементов LNE.

A.1. LNE, управляемый хост-устройством

Ниже описан пример модели LNE, применяющей монтирование схемы для родительского управления. Пример устройства поддерживает несколько экземпляров LNE (логических маршрутизаторов), каждый из которых поддерживает интерфейсы L2 и L3 [RFC8343], базу маршрутных данных [RFC8349] и протокол OSPF [OSPF-YANG]. Каждое из этих свойств задано моделью YANG и свойства объединяются с использованием монтирования схемы YANG, как показано ниже. В примере указаны не все монтируемые модули, например, может монтироваться также модель управления оборудованием, заданная в [RFC8348].

   module: ietf-logical-network-element
     +--rw logical-network-elements
        +--rw logical-network-element* [name]
           +--rw name           string
           +--mp root
              +--ro yanglib:modules-state/
              |  +--ro module-set-id    string
              |  +--ro module* [name revision]
              |     +--ro name                yang:yang-identifier
              +--rw sys:system/
              |  +--rw contact?          string
              |  +--rw hostname?         inet:domain-name
              |  +--rw authentication {authentication}?
              |     +--rw user-authentication-order*   identityref
              |     +--rw user* [name] {local-users}?
              |        +--rw name              string
              |        +--rw password?         ianach:crypt-hash
              |        +--rw authorized-key* [name]
              |           +--rw name         string
              |           +--rw algorithm    string
              |           +--rw key-data     binary
              +--ro sys:system-state/
              |     ...
              +--rw rt:routing/
              |  +--rw router-id?                 yang:dotted-quad
              |  +--rw control-plane-protocols
              |     +--rw control-plane-protocol* [type name]
              |        +--rw ospf:ospf/
              |          +--rw areas
              |             +--rw area* [area-id]
              |                +--rw interfaces
              |                   +--rw interface* [name]
              |                      +--rw name if:interface-ref
              |                      +--rw cost?   uint16
              +--rw if:interfaces/
                 +--rw interface* [name]
                    +--rw name            string
                    +--rw ip:ipv4!/
                    |  +--rw address* [ip]
                    |  ...

   module: ietf-interfaces
     +--rw interfaces
        +--rw interface* [name]
           +--rw name                        string
           +--rw lne:bind-lne-name?          string
           +--ro oper-status        enumeration

   module: ietf-yang-library
     +--ro modules-state
        +--ro module-set-id    string
        +--ro module* [name revision]
           +--ro name                yang:yang-identifier

   module: ietf-system
     +--rw system
     |  +--rw contact?          string
     |  +--rw hostname?         inet:domain-name
     |  +--rw authentication {authentication}?
     |     +--rw user-authentication-order*   identityref
     |     +--rw user* [name] {local-users}?
     |        +--rw name              string
     |        +--rw password?         ianach:crypt-hash
     |        +--rw authorized-key* [name]
     |           +--rw name         string
     |           +--rw algorithm    string
     |           +--rw key-data     binary
     +--ro system-state
        +--ro platform
        |  +--ro os-name?      string
        |  +--ro os-release?   string

Для реализации приведённой выше схемы устройство применяет показанный ниже экземпляр монтирования схемы.

   "ietf-yang-schema-mount:schema-mounts": {
     "mount-point": [
       {
         "module": "ietf-logical-network-element",
         "label": "root",
         "shared-schema":  {}
       }
     ]
   }

Применяя реализацию монтирования схемы YANG, оператор может создавать экземпляры логических маршрутизаторов. Маршрутизатору может быть назначен интерфейс, к которому это маршрутизатор будет иметь доступ. Затем на этом интерфейсе можно включить протокол OSPF.

Для этой реализации родительская сессия управления имеет доступ к схемам родительской хост-системы и дочерним логическим маршрутизаторам. Кроме того, каждый логический маршрутизатор может предоставлять свою сессию управления, имеющую показанную ниже схему.

   module: ietf-yang-library
     +--ro modules-state
        +--ro module-set-id    string
        +--ro module* [name revision]
           +--ro name                yang:yang-identifier

   module: ietf-system
     +--rw system
     |  +--rw contact?          string
     |  +--rw hostname?         inet:domain-name
     |  +--rw authentication {authentication}?
     |     +--rw user-authentication-order*   identityref
     |     +--rw user* [name] {local-users}?
     |        +--rw name              string
     |        +--rw password?         ianach:crypt-hash
     |        +--rw authorized-key* [name]
     |           +--rw name         string
     |           +--rw algorithm    string
     |           +--rw key-data     binary
     +--ro system-state
        +--ro platform
           +--ro os-name?      string
           +--ro os-release?   string

   module: ietf-routing
     rw-- routing
        +--rw router-id?                 yang:dotted-quad
        +--rw control-plane-protocols
           +--rw control-plane-protocol* [type name]
              +--rw ospf:ospf/
                +--rw areas
                   +--rw area* [area-id]
                      +--rw interfaces
                         +--rw interface* [name]
                            +--rw name    if:interface-ref
                            +--rw cost?   uint16

   module: ietf-interfaces
     +--rw interfaces
        +--rw interface* [name]
           +--rw name                        string
           +--ro oper-status        enumeration

A.1.1. Данные конфигурации

Далее приведён пример с настройкой двух коинетских элементов LNE.

   {
     "ietf-logical-network-element:logical-network-elements": {
       "logical-network-element": [
         {
           "name": "cust1",
           "root": {
             "ietf-system:system": {
               "authentication": {
                 "user": [
                   {
                     "name": "john",
                     "password": "$0$password"
                   }
                 ]
               }
             },
             "ietf-routing:routing": {
               "router-id": "192.0.2.1",
               "control-plane-protocols": {
                 "control-plane-protocol": [
                   {
                     "type": "ietf-routing:ospf",
                     "name": "1",
                     "ietf-ospf:ospf": {
                       "af": "ipv4",
                       "areas": {
                         "area": [
                           {
                             "area-id": "203.0.113.1",
                             "interfaces": {
                               "interface": [
                                 {
                                   "name": "eth1",
                                   "cost": 10
                                 }
                               ]
                             }
                           }
                         ]
                       }
                     }
                   }
                 ]
               }
             },
             "ietf-interfaces:interfaces": {
               "interface": [
                 {
                   "name": "eth1",
                   "type": "iana-if-type:ethernetCsmacd",
                   "ietf-ip:ipv4": {
                     "address": [
                       {
                         "ip": "192.0.2.11",
                         "prefix-length": 24
                       }
                     ]
                   },
                   "ietf-ip:ipv6": {
                     "address": [
                       {
                         "ip": "2001:db8:0:2::11",
                         "prefix-length": 64
                       }
                     ]
                   }
                 }
               ]
             }
           }
         },
         {
           "name": "cust2",
           "root": {
             "ietf-system:system": {
               "authentication": {
                 "user": [
                   {
                     "name": "john",
                     "password": "$0$password"
                   }
                 ]
               }
             },
             "ietf-routing:routing": {
               "router-id": "192.0.2.2",
               "control-plane-protocols": {
                 "control-plane-protocol": [
                   {
                     "type": "ietf-routing:ospf",
                     "name": "1",
                     "ietf-ospf:ospf": {
                       "af": "ipv4",
                       "areas": {
                         "area": [
                           {
                             "area-id": "203.0.113.1",
                             "interfaces": {
                               "interface": [
                                 {
                                   "name": "eth1",
                                   "cost": 10
                                 }
                               ]
                             }
                           }
                         ]
                       }
                     }
                   }
                 ]
               }
             },
             "ietf-interfaces:interfaces": {
               "interface": [
                 {
                   "name": "eth1",
                   "type": "iana-if-type:ethernetCsmacd",
                   "ietf-ip:ipv4": {
                     "address": [
                       {
                         "ip": "192.0.2.11",
                         "prefix-length": 24
                       }
                     ]
                   }
                 }
               ]
             }
           }
         }
       ]
     },

     "ietf-interfaces:interfaces": {
       "interface": [
         {
           "name": "eth0",
           "type": "iana-if-type:ethernetCsmacd",
           "ietf-ip:ipv4": {
             "address": [
               {
                 "ip": "192.0.2.10",
                 "prefix-length": 24
               }
             ]
           },
           "ietf-ip:ipv6": {
             "address": [
               {
                 "ip": "2001:db8:0:2::10",
                 "prefix-length": 64
               }
             ]
           }
         },
         {
           "name": "cust1:eth1",
           "type": "iana-if-type:ethernetCsmacd",
           "ietf-logical-network-element:bind-lne-name": "cust1"
         },
         {
           "name": "cust2:eth1",
           "type": "iana-if-type:ethernetCsmacd",
           "ietf-logical-network-element:bind-lne-name": "cust2"
         }
       ]
     },

     "ietf-system:system": {
       "authentication": {
         "user": [
           {
             "name": "root",
             "password": "$0$password"
           }
         ]
       }
     }
   }

A.1.2. Данные состояния

Следующий пример показывает возможные данные состояний, связанные с предыдущей конфигурацией.

{
  "ietf-logical-network-element:logical-network-elements": {
    "logical-network-element": [
      {
        "name": "cust1",
        "root": {
          "ietf-yang-library:modules-state": {
            "module-set-id": "123e4567-e89b-12d3-a456-426655440000",
            "module": [
              {
                "name": "iana-if-type",
                "revision": "2014-05-08",
                "namespace": "urn:ietf:params:xml:ns:yang:iana-if-type",
                "conformance-type": "import"
              },
              {
                "name": "ietf-inet-types",
                "revision": "2013-07-15",
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-inet-types",
                "conformance-type": "import"
              },
              {
                "name": "ietf-interfaces",
                "revision": "2014-05-08",
                "feature": [
                  "arbitrary-names",
                  "pre-provisioning"
                ],
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-interfaces",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-ip",
                "revision": "2014-06-16",
                "namespace": "urn:ietf:params:xml:ns:yang:ietf-ip",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-ospf",
                "revision": "2018-03-03",
                "namespace": "urn:ietf:params:xml:ns:yang:ietf-ospf",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-routing",
                "revision": "2018-03-13",
                "namespace": "urn:ietf:params:xml:ns:yang:ietf-routing",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-system",
                "revision": "2014-08-06",
                "namespace": "urn:ietf:params:xml:ns:yang:ietf-system",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-yang-library",
                "revision": "2016-06-21",
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-yang-library",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-yang-types",
                "revision": "2013-07-15",
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-yang-types",
                "conformance-type": "import"
              }
            ]
          },
          "ietf-system:system-state": {
            "platform": {
              "os-name": "NetworkOS"
            }
          },
          "ietf-routing:routing": {
            "router-id": "192.0.2.1",
            "control-plane-protocols": {
              "control-plane-protocol": [
                {
                  "type": "ietf-routing:ospf",
                  "name": "1",
                  "ietf-ospf:ospf": {
                    "af": "ipv4",
                    "areas": {
                      "area": [
                        {
                          "area-id": "203.0.113.1",
                          "interfaces": {
                            "interface": [
                              {
                                "name": "eth1",
                                "cost": 10
                              }
                            ]
                          }
                        }
                      ]
                    }
                  }
                }
              ]
            }
          },
          "ietf-interfaces:interfaces": {
            "interface": [
              {
                "name": "eth1",
                "type": "iana-if-type:ethernetCsmacd",
                "oper-status": "up",
                "phys-address": "00:01:02:A1:B1:C1",
                "statistics": {
                  "discontinuity-time": "2017-06-26T12:34:56-05:00"
                },
                "ietf-ip:ipv4": {
                  "address": [
                    {
                      "ip": "192.0.2.11",
                      "prefix-length": 24
                    }
                  ]
                },
                "ietf-ip:ipv6": {
                  "address": [
                    {
                      "ip": "2001:db8:0:2::11",
                      "prefix-length": 64
                    }
                  ]
                }
              }
            ]
          }
        }
      },
      {
        "name": "cust2",
        "root": {
          "ietf-yang-library:modules-state": {
            "module-set-id": "123e4567-e89b-12d3-a456-426655440000",
            "module": [
              {
                "name": "iana-if-type",
                "revision": "2014-05-08",
                "namespace": "urn:ietf:params:xml:ns:yang:iana-if-type",
                "conformance-type": "import"
              },
              {
                "name": "ietf-inet-types",
                "revision": "2013-07-15",
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-inet-types",
                "conformance-type": "import"
              },
              {
                "name": "ietf-interfaces",
                "revision": "2014-05-08",
                "feature": [
                  "arbitrary-names",
                  "pre-provisioning"
                ],
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-interfaces",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-ip",
                "revision": "2014-06-16",
                "namespace": "urn:ietf:params:xml:ns:yang:ietf-ip",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-ospf",
                "revision": "2018-03-03",
                "namespace": "urn:ietf:params:xml:ns:yang:ietf-ospf",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-routing",
                "revision": "2018-03-13",
                "namespace": "urn:ietf:params:xml:ns:yang:ietf-routing",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-system",
                "revision": "2014-08-06",
                "namespace": "urn:ietf:params:xml:ns:yang:ietf-system",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-yang-library",
                "revision": "2016-06-21",
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-yang-library",
                "conformance-type": "implement"
              },
              {
                "name": "ietf-yang-types",
                "revision": "2013-07-15",
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-yang-types",
                "conformance-type": "import"
              }
            ]
          },
          "ietf-system:system-state": {
            "platform": {
              "os-name": "NetworkOS"
            }
          },
          "ietf-routing:routing": {
            "router-id": "192.0.2.2",
            "control-plane-protocols": {
              "control-plane-protocol": [
                {
                  "type": "ietf-routing:ospf",
                  "name": "1",
                  "ietf-ospf:ospf": {
                    "af": "ipv4",
                    "areas": {
                      "area": [
                        {
                          "area-id": "203.0.113.1",
                          "interfaces": {
                            "interface": [
                              {
                                "name": "eth1",
                                "cost": 10
                              }
                            ]
                          }
                        }
                      ]
                    }
                  }
                }
              ]
            }
          },
          "ietf-interfaces:interfaces": {
            "interface": [
              {
                "name": "eth1",
                "type": "iana-if-type:ethernetCsmacd",
                "oper-status": "up",
                "phys-address": "00:01:02:A1:B1:C2",
                "statistics": {
                  "discontinuity-time": "2017-06-26T12:34:56-05:00"
                },
                "ietf-ip:ipv4": {
                  "address": [
                    {
                      "ip": "192.0.2.11",
                      "prefix-length": 24
                    }
                  ]
                }
              }
            ]
          }
        }
      }
    ]
  },

  "ietf-interfaces:interfaces": {
    "interface": [
      {
        "name": "eth0",
        "type": "iana-if-type:ethernetCsmacd",
        "oper-status": "up",
        "phys-address": "00:01:02:A1:B1:C0",
        "statistics": {
          "discontinuity-time": "2017-06-26T12:34:56-05:00"
        },
        "ietf-ip:ipv4": {
          "address": [
            {
              "ip": "192.0.2.10",
              "prefix-length": 24
            }
          ]
        },
        "ietf-ip:ipv6": {
          "address": [
            {
              "ip": "2001:db8:0:2::10",
              "prefix-length": 64
            }
          ]
        }
      },
      {
        "name": "cust1:eth1",
        "type": "iana-if-type:ethernetCsmacd",
        "oper-status": "up",
        "phys-address": "00:01:02:A1:B1:C1",
        "statistics": {
          "discontinuity-time": "2017-06-26T12:34:56-05:00"
        },
        "ietf-logical-network-element:bind-lne-name": "cust1"
      },
      {
        "name": "cust2:eth1",
        "type": "iana-if-type:ethernetCsmacd",
        "oper-status": "up",
        "phys-address": "00:01:02:A1:B1:C2",
        "statistics": {
          "discontinuity-time": "2017-06-26T12:34:56-05:00"
        },
        "ietf-logical-network-element:bind-lne-name": "cust2"
      }
    ]
  },

  "ietf-system:system-state": {
    "platform": {
      "os-name": "NetworkOS"
    }
  },

  "ietf-yang-library:modules-state": {
    "module-set-id": "123e4567-e89b-12d3-a456-426655440000",
    "module": [
      {
        "name": "iana-if-type",
        "revision": "2014-05-08",
        "namespace": "urn:ietf:params:xml:ns:yang:iana-if-type",
        "conformance-type": "import"
      },
      {
        "name": "ietf-inet-types",
        "revision": "2013-07-15",
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-inet-types",
        "conformance-type": "import"
      },
      {
        "name": "ietf-interfaces",
        "revision": "2014-05-08",
        "feature": [
          "arbitrary-names",
          "pre-provisioning"
        ],
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-interfaces",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-ip",
        "revision": "2014-06-16",
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-ip",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-logical-network-element",
        "revision": "2017-03-13",
        "feature": [
          "bind-lne-name"
        ],
        "namespace":
          "urn:ietf:params:xml:ns:yang:ietf-logical-network-element",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-ospf",
        "revision": "2018-03-03",
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-ospf",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-routing",
        "revision": "2018-03-13",
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-routing",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-system",
        "revision": "2014-08-06",
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-system",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-yang-library",
        "revision": "2016-06-21",
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-library",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-yang-schema-mount",
        "revision": "2017-05-16",
        "namespace":
          "urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount",
        "conformance-type": "implement"
      },
      {
        "name": "ietf-yang-types",
        "revision": "2013-07-15",
        "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-types",
        "conformance-type": "import"
      }
    ]
  },

  "ietf-yang-schema-mount:schema-mounts": {
    "mount-point": [
      {
        "module": "ietf-logical-network-element",
        "label": "root",
        "shared-schema": {}
      }
    ]
  }
}

A.2. LNE с самоуправлением

Здесь приведён пример модели LNE с монтированием схемы для независимого от потомка управления. Устройство поддерживает несколько экземпляров LNE (логических маршрутизаторов), , каждый из которых поддерживает интерфейсы L2 и L3 [RFC8343], базу маршрутных данных [RFC8349] и протокол OSPF [OSPF-YANG]. Каждое из этих свойств задано моделью YANG и свойства объединяются с использованием монтирования схемы YANG, как показано ниже.

    module: ietf-logical-network-element
      +--rw logical-network-elements
         +--rw logical-network-element* [name]
            +--rw name           string
            +--mp root
               // Внутренние модули LNE не видны родительскому 
               // управлению. Потомок управляет своими модулями,
               // включая ietf-routing и ietf-interfaces.

    module: ietf-interfaces
      +--rw interfaces
         +--rw interface* [name]
            +--rw name                        string
            +--rw lne:bind-lne-name?          string
            +--ro oper-status        enumeration

    module: ietf-yang-library
      +--ro modules-state
         +--ro module-set-id    string
         +--ro module* [name revision]
            +--ro name                yang:yang-identifier

    module: ietf-system
      +--rw system
      |  +--rw contact?          string
      |  +--rw hostname?         inet:domain-name
      |  +--rw authentication {authentication}?
      |     +--rw user-authentication-order*   identityref
      |     +--rw user* [name] {local-users}?
      |        +--rw name              string
      |        +--rw password?         ianach:crypt-hash
      |        +--rw authorized-key* [name]
      |           +--rw name         string
      |           +--rw algorithm    string
      |           +--rw key-data     binary
      +--ro system-state
         +--ro platform
         |  +--ro os-name?      string
         |  +--ro os-release?   string

Для реализации этой схемы устройство применяет показанный ниже экземпляр монтирования схемы.

   "ietf-yang-schema-mount:schema-mounts": {
     "mount-point": [
       {
         "module": "ietf-logical-network-element",
         "label": "root",
         "inline": {}
       }
     ]
   }

С использованием монтирования схемы YANG оператор может создавать экземпляры логических маршрутизаторов, каждый из которых имеет свои встроенные (inline) модули. Логическому маршрутизатору может быть назначен интерфейс, к которому маршрутизатор имеет доступ. Каждый логический маршрутизатор независимо управляет своим набором модулей, который может различаться у разных маршрутизаторов. Ниже приведён пример набора схем, реализованного одним из логических маршрутизаторов.

    module: ietf-yang-library
      +--ro modules-state
         +--ro module-set-id    string
         +--ro module* [name revision]
            +--ro name                yang:yang-identifier

    module: ietf-system
      +--rw system
      |  +--rw contact?          string
      |  +--rw hostname?         inet:domain-name
      |  +--rw authentication {authentication}?
      |     +--rw user-authentication-order*   identityref
      |     +--rw user* [name] {local-users}?
      |        +--rw name              string
      |        +--rw password?         ianach:crypt-hash
      |        +--rw authorized-key* [name]
      |           +--rw name         string
      |           +--rw algorithm    string
      |           +--rw key-data     binary
      +--ro system-state
         +--ro platform
         |  +--ro os-name?      string
         |  +--ro os-release?   string

    module: ietf-routing
      +--rw routing
         +--rw router-id?                 yang:dotted-quad
         +--rw control-plane-protocols
            +--rw control-plane-protocol* [type name]
               +--rw ospf:ospf/
                  +--rw areas
                    +--rw area* [area-id]
                       +--rw interfaces
                          +--rw interface* [name]
                             +--rw name    if:interface-ref
                             +--rw cost?   uint16

    module: ietf-interfaces
      +--rw interfaces
         +--rw interface* [name]
            +--rw name                        string
            +--ro oper-status        enumeration

A.2.1. Данные конфигурации

Каждый из дочерних виртуальных маршрутизаторов управляется через свои сессии и данные конфигурации.

A.2.1.1. Логический элемент vnf1

Ниже показан пример данных конфигурации для LNE с именем vnf1.

   {
     "ietf-system:system": {
       "authentication": {
         "user": [
           {
             "name": "john",
             "password": "$0$password"
           }
         ]
       }
     },
     "ietf-routing:routing": {
       "router-id": "192.0.2.1",
       "control-plane-protocols": {
         "control-plane-protocol": [
           {
             "type": "ietf-routing:ospf",
             "name": "1",
             "ietf-ospf:ospf": {
               "af": "ipv4",
               "areas": {
                 "area": [
                   {
                     "area-id": "203.0.113.1",
                     "interfaces": {
                       "interface": [
                         {
                           "name": "eth1",
                           "cost": 10
                         }
                       ]
                     }
                   }
                 ]
               }
             }
           }
         ]
       }
     },
     "ietf-interfaces:interfaces": {
       "interface": [
         {
           "name": "eth1",
           "type": "iana-if-type:ethernetCsmacd",
           "ietf-ip:ipv4": {
             "address": [
               {
                 "ip": "192.0.2.11",
                 "prefix-length": 24
               }
             ]
           }
         }
       ]
     }
   }
A.2.1.2. Логический элемент vnf2

Ниже показан пример данных конфигурации для LNE с именем vnf2.

   {
     "ietf-system:system": {
       "authentication": {
         "user": [
           {
             "name": "john",
             "password": "$0$password"
           }
         ]
       }
     },
     "ietf-routing:routing": {
       "router-id": "192.0.2.2",
       "control-plane-protocols": {
         "control-plane-protocol": [
           {
             "type": "ietf-routing:ospf",
             "name": "1",
             "ietf-ospf:ospf": {
               "af": "ipv4",
               "areas": {
                 "area": [
                   {
                     "area-id": "203.0.113.1",
                     "interfaces": {
                       "interface": [
                         {
                           "name": "eth1",
                           "cost": 10
                         }
                       ]
                     }
                   }
                 ]
               }
             }
           }
         ]
       }
     },
     "ietf-interfaces:interfaces": {
       "interface": [
         {
           "name": "eth1",
           "type": "iana-if-type:ethernetCsmacd",
           "ietf-ip:ipv4": {
             "address": [
               {
                 "ip": "192.0.2.11",
                 "prefix-length": 24
               }
             ]
           }
         }
       ]
     }
   }

A.2.2. Данные состояния

Далее показаны возможные данные состояния, связанные с описанными выше конфигурациями. Отметим, что здесь имеется три представления — для хост-устройства и каждого из LNE.

A.2.2.1. Хост-устройство

Ниже приведены данные состояния устройства, где размещены примеры элементов LNE.

   {
     "ietf-logical-network-element:logical-network-elements": {
       "logical-network-element": [
         {
           "name": "vnf1",
           "root": {
           }
         },
         {
           "name": "vnf2",
           "root": {
           }
         }
       ]
     },

     "ietf-interfaces:interfaces": {
       "interface": [
         {
           "name": "eth0",
           "type": "iana-if-type:ethernetCsmacd",
           "oper-status": "up",
           "phys-address": "00:01:02:A1:B1:C0",
           "statistics": {
             "discontinuity-time": "2017-06-26T12:34:56-05:00"
           },
           "ietf-ip:ipv4": {
             "address": [
               {
                 "ip": "192.0.2.10",
                 "prefix-length": 24
               }
             ]
           }
         },
         {
           "name": "vnf1:eth1",
           "type": "iana-if-type:ethernetCsmacd",
           "oper-status": "up",
           "phys-address": "00:01:02:A1:B1:C1",
           "statistics": {
             "discontinuity-time": "2017-06-26T12:34:56-05:00"
           },
           "ietf-logical-network-element:bind-lne-name": "vnf1"
         },
         {
           "name": "vnf2:eth2",
           "type": "iana-if-type:ethernetCsmacd",
           "oper-status": "up",
           "phys-address": "00:01:02:A1:B1:C2",
           "statistics": {
             "discontinuity-time": "2017-06-26T12:34:56-05:00"
           },
           "ietf-logical-network-element:bind-lne-name": "vnf2"
         }
       ]
     },

     "ietf-system:system-state": {
       "platform": {
         "os-name": "NetworkOS"
       }
     },

     "ietf-yang-library:modules-state": {
       "module-set-id": "123e4567-e89b-12d3-a456-426655440000",
       "module": [
         {
           "name": "iana-if-type",
           "revision": "2014-05-08",
           "namespace": "urn:ietf:params:xml:ns:yang:iana-if-type",
           "conformance-type": "import"
         },
         {
           "name": "ietf-inet-types",
           "revision": "2013-07-15",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-inet-types",
           "conformance-type": "import"
         },
         {
           "name": "ietf-interfaces",
           "revision": "2014-05-08",
           "feature": [
             "arbitrary-names",
             "pre-provisioning"
           ],
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-interfaces",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-ip",
           "revision": "2014-06-16",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-ip",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-logical-network-element",
           "revision": "2017-03-13",
           "feature": [
             "bind-lne-name"
           ],
           "namespace":
             "urn:ietf:params:xml:ns:yang:ietf-logical-network-element",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-system",
           "revision": "2014-08-06",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-system",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-yang-library",
           "revision": "2016-06-21",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-library",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-yang-schema-mount",
           "revision": "2017-05-16",
           "namespace":
             "urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-yang-types",
           "revision": "2013-07-15",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-types",
           "conformance-type": "import"
         }
       ]
     },

     "ietf-yang-schema-mount:schema-mounts": {
       "mount-point": [
         {
           "module": "ietf-logical-network-element",
           "label": "root",
           "inline": {}
         }
       ]
     }
   }
A.2.2.2. Логический элемент vnf1

Ниже показаны данные состояния для элемента LNE с именем vnf1.

   {
     "ietf-yang-library:modules-state": {
       "module-set-id": "123e4567-e89b-12d3-a456-426655440000",
       "module": [
         {
           "name": "iana-if-type",
           "revision": "2014-05-08",
           "namespace": "urn:ietf:params:xml:ns:yang:iana-if-type",
           "conformance-type": "import"
         },
         {
           "name": "ietf-inet-types",
           "revision": "2013-07-15",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-inet-types",
           "conformance-type": "import"
         },
         {
           "name": "ietf-interfaces",
           "revision": "2014-05-08",
           "feature": [
             "arbitrary-names",
             "pre-provisioning"
           ],
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-interfaces",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-ip",
           "revision": "2014-06-16",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-ip",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-ospf",
           "revision": "2018-03-03",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-ospf",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-routing",
           "revision": "2018-03-13",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-routing",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-system",
           "revision": "2014-08-06",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-system",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-yang-library",
           "revision": "2016-06-21",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-library",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-yang-types",
           "revision": "2013-07-15",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-types",
           "conformance-type": "import"
         }
       ]
     },

     "ietf-system:system-state": {
       "platform": {
         "os-name": "NetworkOS"
       }
     },

     "ietf-routing:routing": {
       "router-id": "192.0.2.1",
       "control-plane-protocols": {
         "control-plane-protocol": [
           {
             "type": "ietf-routing:ospf",
             "name": "1",
             "ietf-ospf:ospf": {
               "af": "ipv4",
               "areas": {
                 "area": [
                   {
                     "area-id": "203.0.113.1",
                     "interfaces": {
                       "interface": [
                         {
                           "name": "eth1",
                           "cost": 10
                         }
                       ]
                     }
                   }
                 ]
               }
             }
           }
         ]
       }
     },

     "ietf-interfaces:interfaces": {
       "interface": [
         {
           "name": "eth1",
           "type": "iana-if-type:ethernetCsmacd",
           "oper-status": "up",
           "phys-address": "00:01:02:A1:B1:C1",
           "statistics": {
             "discontinuity-time": "2017-06-26T12:34:56-05:00"
           },
           "ietf-ip:ipv4": {
             "address": [
               {
                 "ip": "192.0.2.11",
                 "prefix-length": 24
               }
             ]
           }
         }
       ]
     }
   }
A.2.2.3. Логический элемент vnf2

Ниже показаны данные состояния для элемента LNE с именем vnf2.

   {
     "ietf-yang-library:modules-state": {
       "module-set-id": "123e4567-e89b-12d3-a456-426655440000",
       "module": [
         {
           "name": "iana-if-type",
           "revision": "2014-05-08",
           "namespace": "urn:ietf:params:xml:ns:yang:iana-if-type",
           "conformance-type": "import"
         },
         {
           "name": "ietf-inet-types",
           "revision": "2013-07-15",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-inet-types",
           "conformance-type": "import"
         },
         {
           "name": "ietf-interfaces",
           "revision": "2014-05-08",
           "feature": [
             "arbitrary-names",
             "pre-provisioning"
           ],
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-interfaces",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-ip",
           "revision": "2014-06-16",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-ip",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-ospf",
           "revision": "2018-03-03",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-ospf",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-routing",
           "revision": "2018-03-13",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-routing",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-system",
           "revision": "2014-08-06",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-system",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-yang-library",
           "revision": "2016-06-21",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-library",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-yang-types",
           "revision": "2013-07-15",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-types",
           "conformance-type": "import"
         }
       ]
     },

     "ietf-system:system-state": {
       "platform": {
         "os-name": "NetworkOS"
       }
     },

     "ietf-routing:routing": {
       "router-id": "192.0.2.2",
       "control-plane-protocols": {
         "control-plane-protocol": [
           {
             "type": "ietf-routing:ospf",
             "name": "1",
             "ietf-ospf:ospf": {
               "af": "ipv4",
               "areas": {
                 "area": [
                   {
                     "area-id": "203.0.113.1",
                     "interfaces": {
                       "interface": [
                         {
                           "name": "eth1",
                           "cost": 10
                         }
                       ]
                     }
                   }
                 ]
               }
             }
           }
         ]
       }
     },

     "ietf-interfaces:interfaces": {
       "interface": [
         {
           "name": "eth1",
           "type": "iana-if-type:ethernetCsmacd",
           "oper-status": "up",
           "phys-address": "00:01:02:A1:B1:C2",
           "statistics": {
             "discontinuity-time": "2017-06-26T12:34:56-05:00"
           },
           "ietf-ip:ipv4": {
             "address": [
               {
                 "ip": "192.0.2.11",
                 "prefix-length": 24
               }
             ]
           }
         }
       ]
     }
   }

Благодарности

Команда разработчиков Routing Area Yang Architecture включала Acee Lindem, Anees Shaikh, Christian Hopps, Dean Bogdanovic, Lou Berger, Qin Wu, Rob Shakir, Stephane Litkowski, Yan Gang. Полезные обзорные комментарии также представили Martin Bjorklund, John Scudder, Dan Romascanu, Taylor Yu.

Этот документ был выведен из Network Device YANG Logical Organization [DEVICE-MODEL].

Спасибо Alvaro Retana за рецензию IESG.

Адреса авторов

Lou Berger
LabN Consulting, L.L.C.
Email: lberger@labn.net
 
Christian Hopps
LabN Consulting, L.L.C.
Email: chopps@chopps.org
 
Acee Lindem
Cisco Systems
301 Midenhall Way
Cary, NC 27513
United States of America
Email: acee@cisco.com
 
Dean Bogdanovic
Volta Networks
Email: ivandean@gmail.com
 
Xufeng Liu
Volta Networks
Email: xufeng.liu.ietf@gmail.com

Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

1Internet Engineering Task Force.

2Internet Engineering Steering Group.

3Опубликовано в RFC 9129. Прим. перев.

Рубрика: RFC | Оставить комментарий

RFC 8528 YANG Schema Mount

Internet Engineering Task Force (IETF)                      M. Bjorklund
Request for Comments: 8528                                Tail-f Systems
Category: Standards Track                                      L. Lhotka
ISSN: 2070-1721                                                   CZ.NIC
                                                              March 2019

YANG Schema Mount

Монтирование схемы YANG

PDF

Аннотация

Этот документ определяет механизм добавления элементов деревьев схемы, определённых набором модулей YANG, в точку монтирования дерева схемы в другом модуле YANG .

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc8528.

Авторские права

Copyright (c) 2019. Авторские права принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

1. Введение

Модульность и расширяемость являются одними из ведущих принципов разработки языка моделирования данных YANG. В результате модуль YANG можно комбинировать с разными наборами других модулей для формирования модели данных, приспособленной к требованиям конкретного варианта применения. От разработчиков серверов требуется лишь задать все модули YANG, составляющие модель данных (вместе с их выпусками и другими необязательными параметрами), в данных библиотеки YANG ([RFC7895], [RFC8525] и параграф 5.6.4 в [RFC7950]), реализованной сервером. Такие модули YANG появляются в модели данных «бок о бок», т. е. узлы верхнего уровня каждого модуля (при наличии) будут узлами верхнего уровня модели данных в целом.

В YANG имеется два механизма лобавления иерархии схемы, определённой в другом месте, к содержимому внутреннего узла дерева схемы. Эти механизмы реализуются указанными ниже операторами YANG.

  • Оператор uses явно встраивает содержимое группировки, определённой в том же или ином модуле (см. параграф 4.2.6 в [RFC7950]).

  • Оператор augment явно добавляет содержимое к целевому узлу, определённому в том же или ином модуле (см. параграф 4.2.8 в [RFC7950]).

В обоих случаях модуль YANG с оператором uses или augment явно определяет точное место в дереве схемы, куда помещаются новые узлы.

В некоторых случаях этих механизмов недостаточно — иногда нужно добавить имеющийся модуль (набор модулей) в модель данных, начиная с места, отличающегося от корня. Например, имеются модули YANG, такие как ietf-interfaces [RFC8343], для использования в модели данных физического устройства. Предположим, что нужна модель устройства, поддерживающего множество логических устройств [RFC8530], каждое из которых имеет свой экземпляр ietf-interfaces и, возможно, других модулей. В то же время нужна возможность управления всеми этими логическими устройствами с одного главного устройства. Для этого нужно дерево схемы, показанное ниже.

     +--rw interfaces
     |  +--rw interface* [name]
     |     ...
     +--rw logical-network-element* [name]
        +--rw name
        |   ...
        +--rw interfaces
          +--rw interface* [name]
             ...

При использовании оператора uses полное дерево схемы ietf-interfaces будет помещено в группировку, а затем эта группировка должна будет использоваться на верхнем уровне (для главного устройства), а также в списке logical-network-element (для логических устройств). Здесь возникает несколько недостатков.

  • Не поддерживается расширяемость, поскольку при каждом добавлении в модель логического устройства нового модуля YANG придётся добавлять в эту модель другой оператор uses, извлекающий содержимое нового модуля.

  • Абсолютные ссылки на узлы группировки могут не работать, если группировка применяется в разных местах.

  • Узлы, заданные внутри группировки, относятся к пространству имён, в котором группировка применяется, что затрудняет или даже делает невозможными ссылки на такие узлы из других модулей.

  • Производителям сложно добавлять фирменные (proprietary) модули, когда операторы uses определены в стандартном модуле.

При использовании оператора augment модуль ietf-interfaces будет дополнять все узлы списка logical-network-element, в то же время определяя все узлы списка на верхнем уровне. В результате одна и та же иерархия узлов будет задана дважды, что явно не способствует расширяемости.

В этом документе задан новый механизм, названный монтированием схемы (schema mount), который позволяет смонтировать одну модель данных, состоящую из любого числа модулей YANG, в заданном месте другой (родительской) схемы. В отличие от рассмотренных выше подходов с операторами uses и augment, монтируемые модули не требуют специальной подготовки, поэтому имеющиеся модули (такие как ietf-interfaces) можно монтировать без каких-либо изменений.

Основная идея монтирования схемы состоит в том, что в родительской схеме узел данных помечается как точка монтирования, а затем определяется полная модель данных для присоединения к точке монтирования так, что помеченный узел данных фактически становится корневым узлом примонтированной модели данных. В принципе, монтируемую схему можно задать на трёх разных этапах жизненного цикла модели данных.

  1. При разработке монтируемая схема задаётся вместе с точкой монтирования в родительском модуле YANG. В этом случае монтируемая схема будет одинакова для всех реализаций родительского модуля.

  2. В процессе реализации монтируемая схема задаётся разработчиком сервера и остаётся такой же стабильной, как информация библиотеки YANG для сервера.

  3. Во время работы монтируемая схема задаётся данными экземпляра, которые являются частью монтируемой модели данных. При наличии нескольких экземпляров одной точки монтирования (например, в нескольких записях списка) монтируемые для каждого экземпляра модели данных могут различаться.

Определённый в этом документе механизм монтирования схемы поддерживает лишь два последних случая. Монтирование при разработке выходит за рамки документа и может быть рассмотрено в будущей версии языка YANG.

Монтирование схемы применяется к модели данных и, в частности, не принимает каких-либо допущений об источнике данных экземпляра для монтируемых схем. Это можно реализовать с применением тех же инструментов, что и для остальной системы, или реализовать через запрос к какой-либо иной системе. В будущих спецификациях могут быть заданы механизмы для контроля и мониторинга реализации конкретных точек монтирования.

Время и способ создания конкртных экземпляров точек монтирования на сервере выходят за рамки документа и могут быть заданы в будущих спецификациях.

Этот документ разрешает монтировать лишь полные модели данных. Другие спецификации могут расширить этот подход, определяя дополнительные механизмы, такие как монтирование субиерархии модуля.

Модули YANG в этом документе соответствуют архитектуре хранилищ данных управления сетью (Network Management Datastore Architecture или NMDA) [RFC8342].

2. Термины и обозначения

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

Ниже указаны термины, определённые в [RFC7950] и не переопределяемые здесь:

  • action;

  • container;

  • data node;

  • list;

  • RPC operation;

  • schema node;

  • schema tree.

Ниже указаны термины, определённые в [RFC8342] и не переопределяемые здесь:

  • client;

  • notification;

  • operational state;

  • server

Термин system-controlled interface определён в [RFC8343] и не переопределяется здесь.

Термин YANG library content identifier определён в [RFC8525] и не переопределяется здесь.

Ниже приведены дополнительные определения применяемых в документе терминов.

mount point — точка монтирования

Контейнер (container) или список (list), определения которого содержат оператор расширения mount-point. Аргумент оператора mount-point задаёт метку для точки монтирования.

schema — схема

Набор деревьев схемы с общим корнем.

top-level schema — схема верхнего уровня

Схема с корнем в корневом узле.

mounted schema — смонтированная схема

Схема с корнем в точке монтирования.

parent schema (of a mounted schema) — родительская схема (смонтированной схемы)

Схема, содержащая точку монтирования.

schema mount — монтирование схемы

Механизм объединения моделей данных, определённый в этом документе.

2.1. Диаграммы деревьев

В диаграммах деревьев в этом документе применяются обозначения, заданные в [RFC8340].

2.2. Префиксы пространств имен

В этом документе имена узлов данных, расширения YANG, действия и другие элементы модели данных зачастую указываются без префикса, когда модуль YANG, где они определены, ясен из контекста. В остальных случаях применяется стандартный префикс, связанный с соответствующим модулем YANG, как показано в таблице 1.

Таблица 1. Префиксы пространств имен.

 

Префикс

Модуль YANG

Документ

yangmnt

ietf-yang-schema-mount

Раздел 9

inet

ietf-inet-types

[RFC6991]

yang

ietf-yang-types

[RFC6991]

yanglib

ietf-yang-library

[RFC7895], [RFC8525]

 

3. Монтирование схемы

Определённое здесь монтирование схемы предоставляет новый механизм расширения для использования с YANG 1.1 [RFC7950]. В этличие от имеющихся механизмов, упомянутых в разделе 1, монтирование схемы задаёт взаимодействие между исходным и целевым модулем YANG за пределами этих модулей.

3.1. Определение точки монтирования

Узел контейнера или списка становится точкой монтирования, если в его определении применён оператор расширения mount-point (задан в модуле ietf-yang-schema-mount). Это расширение может присутствовать лишь внутри операторов container и list.

Аргументом оператора mount-point является идентификатор YANG, указывающий метку точки монтирования. Модуль может включать несколько операторов mount-point с одинаковым аргументом.

Решение о размещении точки монтирования принимает разработчик родительской схемы. Точка монтирования может быть условной, если контейнер или список с точкой монтирования содержат оператор if-feature и/или when, представляющий эту точку.

Оператор расширения mount-point недопустимо применять в модулях YANG версии 1 [RFC6020], поскольку в таких случаях невозможно будет вызвать примонтированные операции RPC и получить примонтированные уведомления (см. 5. Операции RPC и уведомления). Отднако примонтированы могут быть модули с любой версией YANG (включая 1).

Отметим, что оператор расширения mount-point не создаёт нового узла данных.

3.2. Модель данных

Этот документ определяет модуль YANG 1.1 [RFC7950] ietf-yang-schema-mount с показанной ниже структурой.

   module: ietf-yang-schema-mount
     +--ro schema-mounts
        +--ro namespace* [prefix]
        |  +--ro prefix    yang:yang-identifier
        |  +--ro uri?      inet:uri
        +--ro mount-point* [module label]
           +--ro module                 yang:yang-identifier
           +--ro label                  yang:yang-identifier
           +--ro config?                boolean
           +--ro (schema-ref)
              +--:(inline)
              |  +--ro inline!
              +--:(shared-schema)
                 +--ro shared-schema!
                    +--ro parent-reference*   yang:xpath1.0

3.3. Спецификация смонтированной схемы

Смонтированные схемы для всех точек монтирования в родительской схеме определяются из данных состояния в контейнере /schema-mounts.

Как правило модули, монтируемые в указанной точке, не связаны с модулями в родительской схеме. В частности, монтируемый модуль может (но не обязан) присутствовать в родительской схеме. Если модуль имеется в родительской схеме, он обычно не связан с данными родителя. Исключения возможны и должны определяться в самой модели, например, в [RFC8530] определён механизм привязки интерфейсов к смонтированным логическим элементам.

Контейнер /schema-mounts включает список mount-point в качестве одного из потомков. Каждая запись списка указывает (по ключу) точку монтирования и задаёт монтируемую схему.

Если точка монтирования задана в родительской схеме, но не имеет записи в списке mount-point, монтируемая схема отсутствует, т. е. экземплярам этой точки монтирования НЕДОПУСТИМО включать какие-либо данные, кроме определенных в родительской схеме.

Если в одном модуле задано несколько одноимённых точек монтирования (наприямую или путём определения в группировке, применяемой неоднократно), соответствующая запись mount-point применяется ко всем таким точкам.

Свойство config в узлах монтируемой схемы переопределяется и все узлы монтируемой схемы делаются доступными лишь для чтения (config false), если выполняется хотя бы одно из условий для точки монтирования:

  • точка монтирования задана с config false;

  • для листа config в соответствующей записи списка mount-point установлено значение false.

Запись списка mount-point может указывать монтируемую схему двумя способами inline (встроенная) или shared-schema (схема общего пользования).

Монтируемая схема определяется во время исполнения, каждый экземпляр точки монтирования, имеющийся в рабочем состоянии, должен содержать копию библиотечных данных YANG, определяющих монтируемую схему так же, как и схемы верхнего уровня. Предполагается, что клиент извлечёт эти данные из дерева экземпляров. В случае inline экземпляры одной точки монтирования могут применять разные схемы монтирования, тогда как для случая shared-schema все экземпляры должны использовать одну схему. Это значит, что в режиме shared-schema все экземпляры точки монтирования должны иметь один идентификатор содержимого библиотеки YANG. В случае inline применение двумя экземпляра одного идентификатора содержимого библиотеки YANG не гарантируется совпадение содержимого для этих экземпляров библиотеки YANG.

Примеры inline и shared-schema представлены в приложениях A.2 и A.3, соответственно.

3.4. Несколько уровней монтирования схем

Модули YANG в смонтированной схеме могут включать свои точки монтирования, в которых могут монтироваться другие схемы. Таким образом, можно создавать модели с произвольным числом примонтированных схем. Схему для точки монтирования в примонтированном модуле можно задать путём реализации модулей ietf-yang-library и ietf-yang-schema-mount в смонтированной схеме и заданием схем также, как описано выше для монтирования верхнего уровня.

4. Ссылка на узлы данных в родительской схеме

Фундаментальным принципом монтирования схем является работа смонтированной схемы точно так же, как схемы верхнего уровня, как будто та помещена в mount jail (тюрьма монтирования). Это означает, что все пути в примонтированной схеме (в leafref, instance-identifier, выражениях XPath [XPATH] и целевых узлах операторов augment) интерпретируются с корневым узлом в точке монтирования. Модули YANG смонтированной схемы, а также соответствующие данные экземпляра в результате не могут ссылаться на узлы схемы или данные экземпляров за переделами mount jail.

Однако такое ограничение иной раз слишком жёстко. Типичным примером служат экземпляры сетей (NI) [RFC8529], где каждый NI имеет свою машину маршрутизации, но список интерфейсов является глобальным и используется всеми NI. Если смоделировать это с монтированием схемы NI, общая схема будет иметь вид

     +--rw interfaces
     |  +--rw interface* [name]
     |     ...
     +--rw network-instances
        +--rw network-instance* [name]
           +--rw name
           +--mp root
              +--rw routing
                 ...

Здесь контейнер root является точкой монтирования для схемы NI. Конфигурация маршрутизации внутри NI зачастую должна ссылаться на интерфейсы (по меньшей мере назначенные NI), что невозможно, если такая ссылка не может указывать узел в родительской схеме (имя интерфейса). Поэтому монтирование схемы допускает такие ссылки. Для каждой точки монтирования в случае shared-schema можно задать leaf-list с именем parent-reference, который может содержать выражения XPath 1.0. Каждое из таких выражений оценивается с узлом в родительском дереве данных, где точка монтирования задана как узел контекста. Результатом оценки должен быть набор node-set (см. описание узла parent-reference, где полностью определён контекст оценки). Для целей оценки выражений XPath внутри смонтированного дерева данных объединение всех таких node-set добавляется к доступному дереву данных.

Следует подчеркнуть, что узлы, указанные в parent-reference (leaf-list) доступны в смонтированной схеме лишь для оценки XPath. В частности, доступ к ним из смонтированной схемы невозможен по протоколам управления сетью, таким как NETCONF [RFC6241] и RESTCONF [RFC8040].

5. Операции RPC и уведомления

Если смонтированный модуль YANG задаёт операцию RPC, клиенты могут вызывать эту операцию, как будто она определена как действие для соответствующей точки монтирования (см. параграф 7.15 в [RFC7950]). Пример этого представлен в приложении A.4. Вызов операций RPC

Если сервер отправляет уведомление, заданное на верхнем уровне какого-либо примонтированного модуля, оно должно быть представленным как соединенное с точкой монтирования (см. параграф 7.16 в [RFC7950]).

Отметим, что встроенные (inline) действия и уведомления не будут работать, если они содержатся внутри списка (list) без оператора key (см. параграфы 7.15 и 7.16 в [RFC7950]). Поэтому, чтобы быть полезными, соделям с RPC, action и notification не следует иметь какого-либо предка, являющегося списком без оператора key. Это требование относится к определениям модулей, использующих оператор расширения mount-point.

6. Взаимодействие с NMDA

Решение для монтирования схем, представленное в этом документе, рассчитано на работу с серверами, реализующими NMDA [RFC8342] и старыми серверами, не поддерживающими NMDA. В частности, не поддерживающий NMDA сервер может реализовать выпуск 2016-06-21 модуля ietf-yang-library [RFC7895] в точке монтирования. Сервер с поддержкой NMDA MUST должен реализовать выпуск 2019-01-04 (или более свежий) модуля ietf-yang-library [RFC8525] в точке монтирования.

7. Взаимодействие с NACM

Если на сервере реализована модель управления доступом к конфигурации сети (Network Configuration Access Control Model или NACM) [RFC8341], она служит для контроля доступа к узлам, определенным примонтированной схемой так же, как для узлов схемы верхнего уровня. Предположим, например, что модуль ietf-interfaces смонтирован в контейнере root списка logical-network-element, определённого в [RFC8530]. Тогда можно использовать приведённый ниже путь NACM для управления доступом к контейнеру interfaces (символ \ служит для разделения длинной строки на части).

     <path xmlns:lne=
             "urn:ietf:params:xml:ns:yang:ietf-logical-network-element"
           xmlns:if="urn:ietf:params:xml:ns:yang:ietf-interfaces">
       /lne:logical-network-elements\
         /lne:logical-network-element/lne:root/if:interfaces
     </path>

8. Замечания для разработчиков

Сетевое управление устройствами, использующими модель данных с монтированием схемы, можно реализовать разными способами. В качестве типовых предусмотрены указанные ниже варианты.

Совместное управление

Данные экземпляра родительской и смонтированной схемы доступные в одном сеансе управления.

Раздельное управление

Одна (ведущая) сессия управления имеет доступ к данным экземпляра родительской и смонтированной схемы, а дополнительная сессия для каждого экземпляра точки монтирования имеет доступ лишь к своему примонтированному дереву.

9. Модуль YANG Schema Mount

Этот модуль ссылается на [RFC6991] и [RFC7950].

   <CODE BEGINS> file "ietf-yang-schema-mount@2019-01-14.yang"

   module ietf-yang-schema-mount {
     yang-version 1.1;
     namespace "urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount";
     prefix yangmnt;

     import ietf-inet-types {
       prefix inet;
       reference
         "RFC 6991: Common YANG Data Types";
     }

     import ietf-yang-types {
       prefix yang;
       reference
         "RFC 6991: Common YANG Data Types";
     }

     organization
       "IETF NETMOD (NETCONF Data Modeling Language) Working Group";

     contact
       "WG Web:   <https://datatracker.ietf.org/wg/netmod/> 
        WG List:  <mailto:netmod@ietf.org> 

        Editor:   Martin Bjorklund
                  <mailto:mbj@tail-f.com> 

        Editor:   Ladislav Lhotka
                  <mailto:lhotka@nic.cz>"; 

     description
       "Этот модуль определяет оператор расширения YANG, который может
        служить для встраивания в модуль моделей данных, определённых в
        другом модуле YANG. Он также определяет данные рабочего 
        состояния, которые задают общую структуру модели данных.

        Ключевые слова ДОЛЖНО, НЕДОПУСТИМО, ТРЕБУЕТСЯ, НУЖНО, НЕ СЛЕДУЕТ, 
        СЛЕДУЕТ, НЕ НУЖНО, РЕКОМЕДУЕТСЯ, НЕ РЕКОМЕНДУЕТСЯ, МОЖНО и
        НЕОБЯЗАТЕЛЬНО в этом документе интерпретируются в соответствии с
        BCP 14 (RFC 2119) (RFC 8174) тогда и только тогда, когда они
        указаны заглавными буквами, как показано здесь.

        Авторские права (Copyright (c) 2019) принадлежат IETF Trust
        и лицам, указанным в качестве авторов кода. Все права защищены.

        Распространение и использование в исходной или двоичной форме с
        изменениями или без таковых разрешено в соответствии с лицензией
        Simplified BSD, изложенной в разделе 4  IETF Trust's Legal
        Provisions применительно к документам IETF
        (http://trustee.ietf.org/license-info). 

        Эта версия данного модуля YANG является частью RFC 8528, где
        правовые вопросы рассмотрены более полно.";

     revision 2019-01-14 {
       description
         "Исходный выпуск.";
       reference
         "RFC 8528: YANG Schema Mount";
     }

     /*
      * Расширения
      */

     extension mount-point {
       argument label;
       description
         "Аргумент label является идентификатором YANG, т. е. имеет тип
          yang:yang-identifier.

          Оператор mount-point НЕДОПУСТИМО применять в модулях YANG
          версии 1, ни явно, ни через оператор uses.

          Оператор mount-point МОЖЕТ присутствовать как субоператор
          в container и list и НЕДОПУСТИМО его включение в другие места.
          НЕДОПУСТИМО включение более одного оператора mount-point в
          данный оператор container или list.

          Если точка монтирования определена в группировке, её метка 
          привязывается к модулю, где группировка применяется.

          Точка монтирования задаёт место в иерархии узла, куда
          присоединяются другие модели данных. Сервер, реализующий 
          модуль с точкой монтирования заполняет список 
          /schema-mounts/mount-point подробными сведениями о моделях
          данных, монтируемых в каждой точке.

          Оператор mount-point не определяет нового узла данных.";
     }

     /*
      * Узлы данных состояния
      */

     container schema-mounts {
       config false;
       description
         "Содержит сведения о структуре смонтированной модели данных, 
          реализованной на сервере.";
       list namespace {
         key "prefix";
         description
           "Список сопоставления префиксов пространств имён, применяемых
            в выражениях XPath листьев parent-reference, с URI 
            соответствующих пространств имен.";
         leaf prefix {
           type yang:yang-identifier;
           description
             "Префикс пространства имен.";
         }
         leaf uri {
           type inet:uri;
           description
             "URI пространства имен.";
         }
       }
       list mount-point {
         key "module label";
         description
           "Каждая запись списка задаёт схему для конкретной точки
            монтирования.

            Каждая точка монтирования ДОЛЖНА быть определена с
            использованием расширения mount-point в одном из модулей, 
            указанных в серверном экземпляре библиотеки YANG с типом
            соответствия implement.";
         leaf module {
           type yang:yang-identifier;
           description
             "Имя модуля, содержащего точку монтирования.";
         }
         leaf label {
           type yang:yang-identifier;
           description
             "метка точки монтирования, определённой оператором
              mount-point.";
         }
         leaf config {
           type boolean;
           default "true";
           description
             "Если этот лист имеет значение false, все узлы данных 
              смонтированной схемы будут доступны лишь для чтения
              (config false), независимо от их свойства config.";
         }
         choice schema-ref {
           mandatory true;
           description
             "Варианты для задания схемы.";
           container inline {
             presence
               "Полная, самодостаточная схема монтируется в точке.";
             description
               "Этот узел указывает, что сервер смонтировал по меньшей 
                мере модуль ietf-yang-library в точке монтирования и его
                создание обеспечивает сведения о смонтированной схемы.

                В разных экземплярах точки монтирования могут 
                монтироваться разные схемы.";
           }
           container shared-schema {
             presence
               "Смонтированная схема вместе с parent-reference 
                составляют схему для этой точки монтирования.";
             description
               "Этот узел указывает, что сервер смонтировал по меньшей 
                мере модуль ietf-yang-library в точке монтирования и его
                создание обеспечивает сведения о смонтированной схемы.
                При оценке выражения XPath в смонтированной схеме 
                принимается во внимание лист-список parent-reference.

                Разные экземпляры точки монтирования ДОЛЖНЫ иметь одну
                и ту же смонтированную схему.";
             leaf-list parent-reference {
               type yang:xpath1.0;
               description
                 "Записями этого leaf-list служат выражения XPath 1.0,
                  которые оцениваются в указанном ниже контексте.

                  - Узлом контекста служит узел родительского дерева
                    данных, где определена точка mount-point.

                  - Доступным деревом является родительское дерево
                    данных без узлов, определённых в модулях, 
                    смонтированных внутри родительской схемы.

                  - Положение и размер контекста равны 1.

                  - Набор привязок переменных пуст.

                  - Библиотекой функций служит библиотека функций ядра,
                    определённая в документе W3C XPath 1.0
                    (http://www.w3.org/TR/1999/REC-xpath-19991116) и 
                    функции, определённые в разделе 10 RFC 7950.

                  - набор деклараций пространств имён определяется 
                    списком namespace в иерархии schema-mounts.

                  Каждое выражение XPath ДОЛЖНО оцениваться в node-set
                  (возможно пустой). Для вычисления выражений XPath,
                  для которых узлы контекста заданы в смонтированной
                  схеме, объединение всех node-set и узлов родителя
                  добавляется в дерево доступных данных.

                  Отметим, что при монтировании самого модуля
                  ietf-yang-schema-mount узел parent-reference в
                  смонтированном модуле может ссылаться на узлы,
                  перенесенные в доступное дерево через parent-reference
                  в родительской схеме.";
             }
           }
         }
       }
     }
   }
   <CODE ENDS>

10. Взаимодействие с IANA

Этот документ регистрирует URI в реестре IETF XML Registry [RFC3688].

        URI: urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount
        Registrant Contact: The IESG.
        XML: N/A, the requested URI is an XML namespace.

Документ также регистрирует модуль YANG в реестре YANG Module Names [RFC6020].

     name:        ietf-yang-schema-mount
     namespace:   urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount
     prefix:      yangmnt
     reference:   RFC 8528

11. Вопросы безопасности

Заданный в этом документе модуль YANG определяет схему для данных, которая разработана для доступа через протоколы управления сетью, такие как NETCONF [RFC6241] и RESTCONF [RFC8040]. Нижним уровнем NETCONF является защищённый транспорт с обязательной реализацией Secure Shell (SSH) [RFC6242]. Нижним уровнем RESTCONF служит HTTPS с обязательной реализацией защищённого транспорта TLS [RFC8446].

Модель управления доступом NACM [RFC8341] обеспечивает средства, позволяющие предоставить доступ лишь конкретным пользователям NETCONF и RESTCONF к предопределённому подмножеству доступных в NETCONF или RESTCONF протокольных операций и содержимого.

Некоторые из доступных для чтения узлов этого модуля YANG могут быть конфиденциальными или уязвимыми в некоторых сетевых средах. Важно контролировать доступ к считыванию таких узлов данных (например, через операции get, get-config, notification). Ниже указаны ветви и узлы данных конфиденциальные или уязвимые в плане их чтения.

/schema-mounts

Схема, задаваемая этими данными состояния предоставляет подробные сведения о реализации сервера, которые могут помочь злоумышленнику определить возможности сервера и реализации с известными ошибками. Уязвимости сервера могут быть связаны с конкретными модулями, включёнными в схему, выпусками и функциями (feature) и даже отклонениями модулей. Например, если определённая операция над конкретным узлом данных заведомо вызывает аварию на сервере или существенному снижению производительности устройства, сведения схемы могут помочь атакующему идентифицировать сервер с таким дефектом, чтобы организовать DoS3-атаку на устройство.

Важно учитывать соображения безопасности для всех узлов монтируемых схем и контролировать доступ к этим узлам с использованием механизмов, описанных в разделе 7. Взаимодействие с NACM.

Необходимо соблюдать осторожность при создании выражений XPath parent-reference, поскольку результат оценки этих выражений добавляется в доступное дерево для любого выражения XPath найденного в смонтированной схеме.

12. Литература

12.1. Нормативные документы

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004, <https://www.rfc-editor.org/info/rfc3688>.

[RFC6020] Bjorklund, M., Ed., «YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)», RFC 6020, DOI 10.17487/RFC6020, October 2010, <https://www.rfc-editor.org/info/rfc6020>.

[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <https://www.rfc-editor.org/info/rfc6241>.

[RFC6242] Wasserman, M., «Using the NETCONF Protocol over Secure Shell (SSH)», RFC 6242, DOI 10.17487/RFC6242, June 2011, <https://www.rfc-editor.org/info/rfc6242>.

[RFC6991] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6991, DOI 10.17487/RFC6991, July 2013, <https://www.rfc-editor.org/info/rfc6991>.

[RFC7895] Bierman, A., Bjorklund, M., and K. Watsen, «YANG Module Library», RFC 7895, DOI 10.17487/RFC7895, June 2016, <https://www.rfc-editor.org/info/rfc7895>.

[RFC7950] Bjorklund, M., Ed., «The YANG 1.1 Data Modeling Language», RFC 7950, DOI 10.17487/RFC7950, August 2016, <https://www.rfc-editor.org/info/rfc7950>.

[RFC8040] Bierman, A., Bjorklund, M., and K. Watsen, «RESTCONF Protocol», RFC 8040, DOI 10.17487/RFC8040, January 2017, <https://www.rfc-editor.org/info/rfc8040>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8341] Bierman, A. and M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.

[RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., and R. Wilton, «Network Management Datastore Architecture (NMDA)», RFC 8342, DOI 10.17487/RFC8342, March 2018, <https://www.rfc-editor.org/info/rfc8342>.

[RFC8446] Rescorla, E., «The Transport Layer Security (TLS) Protocol Version 1.3», RFC 8446, DOI 10.17487/RFC8446, August 2018, <https://www.rfc-editor.org/info/rfc8446>.

[RFC8525] Bierman, A., Bjorklund, M., Schoenwaelder, J., Watsen, K., and R. Wilton, «YANG Library», RFC 8525, DOI 10.17487/RFC8525, March 2019, <https://www.rfc-editor.org/info/rfc8525>.

[XPATH] Clark, J. and S. DeRose, «XML Path Language (XPath) Version 1.0», World Wide Web Consortium Recommendation REC-xpath-19991116, November 1999, <http://www.w3.org/TR/1999/REC-xpath-19991116>.

12.2. Дополнительная литература

[DEVICE-YANG] Lindem, A., Ed., Berger, L., Ed., Bogdanovic, D., and C. Hopps, «Network Device YANG Logical Organization», Work in Progress, draft-ietf-rtgwg-device-model-02, March 2017.

[IS-IS-YANG] Litkowski, S., Yeung, D., Lindem, A., Zhang, J., and L. Lhotka, «YANG Data Model for IS-IS protocol», Work in Progress4, draft-ietf-isis-yang-isis-cfg-34, January 2019.

[RFC8340] Bjorklund, M. and L. Berger, Ed., «YANG Tree Diagrams», BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, <https://www.rfc-editor.org/info/rfc8340>.

[RFC8343] Bjorklund, M., «A YANG Data Model for Interface Management», RFC 8343, DOI 10.17487/RFC8343, March 2018, <https://www.rfc-editor.org/info/rfc8343>.

[RFC8529] Berger, L., Hopps, C., Lindem, A., Bogdanovic, D., and X. Liu, «YANG Data Model for Network Instances», RFC 8529, DOI 10.17487/RFC8529, March 2019, <https://www.rfc-editor.org/info/rfc8529>.

[RFC8530] Berger, L., Hopps, C., Lindem, A., Bogdanovic, D., and X. Liu, «YANG Model for Logical Network Elements», RFC 8530, DOI 10.17487/RFC8530, March 2019, <https://www.rfc-editor.org/info/rfc8530>.

[YANG-MOUNT] Clemm, A., Voit, E., and J. Medved, «Mounting YANG-Defined Information from Remote Datastores», Work in Progress, draft-clemm-netmod-mount-06, March 2017.

Приложение A. Пример модели устройства с LNE и NI

Этот ненормативный пример показывает реализацию модели устройства (раздел 2 [DEVICE-YANG]), использующего логические элементы сети (logical network element или LNE) и экземпляры сетей (network instance или NI).

В примерах ниже символ \ служит для разделения на части длинных строк.

A.1. Физическое устройство

Модель данных физического устройства можно описать содержимым библиотеки YANG в предположении поддержки сервером архитектуры NMDA.

   {
      "ietf-yang-library:yang-library": {
        "content-id": "14e2ab5dc325f6d86f743e8d3ade233f1a61a899",
        "module-set": [
          {
            "name": "physical-device-modules",
            "module": [
              {
                "name": "ietf-datastores",
                "revision": "2018-02-14",
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-datastores"
              },
              {
                "name": "iana-if-type",
                "revision": "2015-06-12",
                "namespace": "urn:ietf:params:xml:ns:yang:iana-if-type"
              },
              {
                "name": "ietf-interfaces",
                "revision": "2018-02-20",
                "feature": ["arbitrary-names", "pre-provisioning" ],
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-interfaces"
              },
              {
                "name": "ietf-ip",
                "revision": "2018-02-22",
                "namespace": "urn:ietf:params:xml:ns:yang:ietf-ip"
              },
              {
                "name": "ietf-logical-network-element",
                "revision": "2018-03-20",
                "feature": [ "bind-lne-name" ],
                "namespace":
                  "urn:ietf:params:xml:ns:yang:\
                  ietf-logical-network-element"
              },
              {
                "name": "ietf-yang-library",
                "revision": "2019-01-04",
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-yang-library"
              },
              {
                "name": "ietf-yang-schema-mount",
                "revision": "2019-01-14",
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount"
              }
            ],
            "import-only-module": [
              {
                "name": "ietf-inet-types",
                "revision": "2013-07-15",
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-inet-types"
              },
              {
                "name": "ietf-yang-types",
                "revision": "2013-07-15",
                "namespace":
                  "urn:ietf:params:xml:ns:yang:ietf-yang-types"
              }
            ]
          }
        ],
        "schema": [
          {
            "name": "physical-device-schema",
            "module-set": [ "physical-device-modules" ]
          }
        ],
        "datastore": [
          {
            "name": "ietf-datastores:running",
            "schema": "physical-device-schema"
          },
          {
            "name": "ietf-datastores:operational",
            "schema": "physical-device-schema"
          }
        ]
      }
   }

A.2. Логические элементы сети

Каждый элемент LNE может иметь конкретную модель данных, которая определяется во время работы, поэтому приемлемо монтирование по методу inline. В результате применяются указанные ниже данные schema-mounts.

   {
     "ietf-yang-schema-mount:schema-mounts": {
       "mount-point": [
         {
           "module": "ietf-logical-network-element",
           "label": "root",
           "inline": {}
         }
       ]
     }
   }

Администратор хоста с устройством настраивает запись для каждого экземпляра LNE, например,

   {
     "ietf-interfaces:interfaces": {
       "interface": [
         {
           "name": "eth0",
           "type": "iana-if-type:ethernetCsmacd",
           "enabled": true,
           "ietf-logical-network-element:bind-lne-name": "eth0"
         }
       ]
     },
     "ietf-logical-network-element:logical-network-elements": {
       "logical-network-element": [
         {
           "name": "lne-1",
           "managed": true,
           "description": "LNE with NIs",
           "root": {
             ...
           }
         }
         ...
       ]
     }
   }

а затем помещает требуемые данные состояния как содержимое экземпляра root, куда следует включить хотя бы:

  • данные библиотеки YANG, задающие модель данных LNE, например, предположение, что сервер не реализует NMDA

   {
     "ietf-yang-library:modules-state": {
       "module-set-id": "9358e11874068c8be06562089e94a89e0a392019",
       "module": [
         {
           "name": "iana-if-type",
           "revision": "2014-05-08",
           "namespace": "urn:ietf:params:xml:ns:yang:iana-if-type",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-inet-types",
           "revision": "2013-07-15",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-inet-types",
           "conformance-type": "import"
         },
         {
           "name": "ietf-interfaces",
           "revision": "2014-05-08",
           "feature": [
             "arbitrary-names",
             "pre-provisioning"
           ],
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-interfaces",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-ip",
           "revision": "2014-06-16",
           "feature": [
             "ipv6-privacy-autoconf"
           ],
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-ip",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-network-instance",
           "revision": "2018-03-20",
           "feature": [
             "bind-network-instance-name"
           ],
           "namespace":
             "urn:ietf:params:xml:ns:yang:ietf-network-instance",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-yang-library",
           "revision": "2016-06-21",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-library",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-yang-schema-mount",
           "revision": "2019-01-14",
           "namespace":
             "urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount",
           "conformance-type": "implement"
         },
         {
           "name": "ietf-yang-types",
           "revision": "2013-07-15",
           "namespace": "urn:ietf:params:xml:ns:yang:ietf-yang-types",
           "conformance-type": "import"
         }
       ]
     }
   }
  • данные состояния для интерфейсов, назначенных экземпляру LNE (которые фактически становятся управляемыми системой интерфейсами для LNE), например,

   {
     "ietf-interfaces:interfaces": {
       "interface": [
         {
           "name": "eth0",
           "type": "iana-if-type:ethernetCsmacd",
           "oper-status": "up",
           "statistics": {
             "discontinuity-time": "2016-12-16T17:11:27+02:00"
           },
           "ietf-ip:ipv6": {
             "address": [
               {
                 "ip": "fe80::42a8:f0ff:fea8:24fe",
                 "origin": "link-layer",
                 "prefix-length": 64
               }
             ]
           }
         }
       ]
     }
   }

A.3. Экземпляры сетей

В предположении, что экземпляры сетей используют общую модель данных, их можно монтировать по методу shared-schema, как показано ниже.

   {
     "ietf-yang-schema-mount:schema-mounts": {
       "namespace": [
         {
             "prefix": "if",
             "uri": "urn:ietf:params:xml:ns:yang:ietf-interfaces"
         },
         {
             "prefix": "ni",
             "uri": "urn:ietf:params:xml:ns:yang:ietf-network-instance"
         }
       ],
       "mount-point": [
         {
           "module": "ietf-network-instance",
           "label": "root",
             "shared-schema": {
               "parent-reference": [
                 "/if:interfaces/if:interface[\
                 ni:bind-network-instance-name = current()/../ni:name]"
               ]
             }
         }
       ]
     }
   }

Отметим, что модуль ietf-interfaces появляется в листе-списке parent-reference для смонтированной схемы NI. Это значит, что ссылки на интерфейсы LNE, такие как outgoing-interface в статических маршрутах, будут действительны, несмотря на то, что ietf-interfaces не является частью схемы NI.

A.4. Вызов операций RPC

Предположим, что смонтированная модель данных NI реализует модуль ietf-isis [IS-IS-YANG]. Операция RPC, заданная в этом модуле (папример, clear-adjacency), может быть вызвана в клиентской сессии с сервером RESTCONF этого LNE, как действие, привязанное к точке монтирования конкретного экземпляра сети с использованием URI запроса (в одну строку) вида

     POST /restconf/data/ietf-network-instance:network-instances/
         network-instance=rtrA/root/ietf-isis:clear-adjacency HTTP/1.1

Участники работы

Идея о каком-либо способе объединения схем из разных модулей YANG была независимо предложена рядом людей.

Адреса авторов

Martin Bjorklund
Tail-f Systems
Email: mbj@tail-f.com
 
Ladislav Lhotka
CZ.NIC
Email: lhotka@nic.cz

Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

1Internet Engineering Task Force.

2Internet Engineering Steering Group.

3Denial-of-service — отказ в обслуживании.

4Опубликовано в RFC 9130. Прим. перев.

Рубрика: RFC | Оставить комментарий

RFC 8520 Manufacturer Usage Description Specification

Internet Engineering Task Force (IETF)                           E. Lear
Request for Comments: 8520                                 Cisco Systems
Category: Standards Track                                       R. Droms
ISSN: 2070-1721                                                   Google
                                                            D. Romascanu
                                                              March 2019

Manufacturer Usage Description Specification

Спецификация описаний применения от изготовителя

PDF

Аннотация

Этот документ задаёт компонентную архитектуру описаний применения от изготовителя (Manufacturer Usage Description или MUD). Цель MUD заключается в предоставлении конечным устройствам возможности сообщать сети о том, какой тип доступа и сетевые функции нужны им для нормальной работы. Исходно основное внимание уделено контроль доступа, а в последующих работах могут быть рассмотрены другие аспекты.

Документ задаёт два модуля YANG, опции IPv4 и IPv6 DHCP, LLDP1 TLV, URL и расширение сертификатов X.509, а также средства для подписания и проверки описаний.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF2 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG3. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc8520.

Авторские права

Copyright (c) 2019. Авторские права принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

1. Введение

Сеть Internet создавалась в основном для компьютеров общего назначения, устройств, применяемых в соответствии с целями их владельцев. В [RFC1984] предполагалось, что конечные устройства способны защищать себя самостоятельно. Это имело смысл, когда типичными устройствами были рабочие станции и мэйнфреймы, и продолжает быть осмысленным для современных вычислительных устройств общего назначения, включая ноутбуки, смартфоны и планшеты.

В [RFC7452] рассмотрены шаблоны устройства интеллектуальных объектов и связанные с этим вопросы. Затем появились объекты, не предназначенные специально для вычислительных задач общего назначения. Эти устройства, называемые в документе Вещами (Things), имеют конкретное назначение, поэтому иные варианты их применения не рассматриваются. Если из небольшого числа вариантов применения следует небольшое число шаблонов взаимодействия (коммуникаций), эти два утверждения можно переформулировать как описание использования от изготовителя (MUD), которое может применяться в разных точках сети. MUD относится в первую очередь к угрозам для устройства, а не исходящим от него угрозам. Однако в некоторых обстоятельствах MUD может обеспечивать некоторую защиту в последнем случае в зависимости от способа передачи MUD URL и аутентификации устройств и взаимодействий между ними.

В этом контексте термин «изготовитель» (manufacturer) используется достаточно вольно для обозначения субъекта или организации, определяющих варианты использования устройства. Например, для лампочек это может быть их производитель, для интеллектуальных устройств со стеком Linux — интегратор устройств. Важно, что предполагается ограниченное применение самого устройства и наличие в цепочке поставок организации, отвечающей за информировании сети о назначении устройства.

Назначение MUD указано ниже.

  • Существенное сокращение фронта угроз на устройстве до уровня предусмотренного изготовителем.

  • Предоставление средств расширения политики с учётом роста числа типов устройств в сети.

  • Предоставление способа устранять хотя бы часть уязвимостей быстрее, чем происходит обновление системы. Это особенно важно для систем, поддержка которых прекращена.

  • Минимизация расходов на внедрение системы.

  • Предоставление изготовителям средств расширения для представления возможностей и требований к устройства.

MUD состоит за 3 архитектурных блоков:

  • дескриптор URL, по которому можно найти описание;

  • само описание, включая его интерпретацию;

  • способы извлечения описания локальными системами управления сетью.

Наибольшая эффективность MUD обеспечивается, когда сеть способна тем или иным способом идентифицировать удалённые точки, с которыми будут взаимодействовать Вещи (Things).

В этой спецификации описан каждый из указанных выше архитектурных блоков и способы их предполагаемого совместного использования. Однако блоки могут применяться и по отдельности, независимо данной спецификации, в соответствии с целями локальной системы.

1.1. Что MUD не делает

Описание MUD не предназначено для сетевого контроля полномочий компьютеров общего назначения, поскольку их изготовители не могут предусмотреть конкретную картину взаимодействий для описания. Кроме того, даже устройства с одним или небольшим числом вариантов применения могут иметь существенно различающиеся картины взаимодействий и MUD для них не подходит.

Хотя MUD может предоставлять сетевым администраторам некоторую дополнительную защиту при наличии в устройстве уязвимостей, это не заменяет для производителей необходимости устранять уязвимости.

Что бы ни указывал производитель в файле MUD, это будут рекомендации, а не директивы. Их применение на местах будет зависеть от многих факторов и в конечном итоге администратор сети должен решить, что будет уместно в конкретных обстоятельствах.

1.2. Простой пример

Лампочка предназначены для освещения помещения и может управляться дистанционно через сеть, а также использовать службу rendezvous (доступ к которой может обеспечиваться через приложение на смартфоне). Можно сказать что для этой лампочки нежелательны все иные варианты доступа к ней через сеть. Она не будет взаимодействовать со службой новостей, разговаривать с холодильником и ей не нужен принтер или иные устройства. У лампочки нет друзей в социальных сетях. Поэтому применение списка доступа, в котором указано, что лампочка может подключаться только к службе rendezvous, не помешает выполнению основных функций и в то же время позволит сети обеспечивать лампочке и другим устройствам дополнительный уровень защиты.

1.3. Терминология

MUD

Описание применения от изготовителя

MUD file — файл MUD

Файл, содержащий JSON-представление на основе YANG, который описывает Вещь (Thing) и связанное с ней предполагаемое поведение сети.

MUD file server — сервер файлов MUD

Сервер web, где хранится файл MUD.

MUD manager — диспетчер MUD

Система, которая запрашивает и получает файл MUD от сервера MUD. После обработки файла MUD эта система может направлять изменения в соответствующие элементы сети.

MUD controller — контроллер MUD

Синоним для диспетчера MUD.

MUD URL

Дескриптор URL, который может использоваться диспетчером MUD для получения файла MUD.

Thing — Вещь

Устройство, выдающее MUD URL.

Manufacturer — изготовитель

Организация, которая настраивает Вещь (Thing) для выдачи MUD URL и задаёт рекомендации в файле MUD. Изготовителем не обязательно является организация, создавшая Вещь (Thing). Это может быть, например, системный интегратор и даже поставщик компонентов.

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

1.4. Задание предполагаемого использования

Понятие целевого использования само по себе не ново. Администраторы сетей постоянно применяют списки доступа, чтобы разрешать лишь предусмотренное поведение. Понятие «белого списка» хорошо описано Chapman и Zwicky в [FW95]. Системы профилирования, применяющие эвристику для идентификации типов систем тоже существуют много лет.

Вещь (Thing) может легко сообщить сети требуемый тип доступа, не вдаваясь в детали своего типа. По сути, это было бы оборотной стороной [RFC7488]. Однако в поисках общего решения предполагается, что устройство реализует функциональность, требуемую для его ограниченных целей. Это базовое экономическое ограничение. Пока сеть не отвергает доступ к такому устройству, его разработчикам не нужно предоставлять сети какие-либо сведения. На сегодняшний это утверждение остаётся верным.

1.5. Нахождение правил — MUD URL

Работа начинается с выдачи устройством универсального локатора ресурса (URL) [RFC3986], который служит для классификации типа устройства и определения местоположения файла правил (политики). В MUD URL должна применяться схема https [RFC7230].

Этот документ определяет 3 способа выдачи MUD URL, перечисленных ниже.

  • Опция DHCP [RFC2131] [RFC8415], которую клиент DHCP использует для информирования сервера DHCP. Сервер может предпринять дальнейшие действия, например, выступив в роли диспетчера MUD или передав MUD URL диспетчеру MUD.

  • Ограничения X.509. В IEEE разработан стандарт IEEE 802.1AR [IEEE8021AR] для выбора подхода к передаче характеристик устройства на основе сертификата. Этот стандарт основан на [RFC5280]. Расширение MUD URL является некритическим, как того требует IEEE 802.1AR. Для передачи сертификата могут применяться различные средства, включая расширяемый туннельный протокол аутентификации (Tunnel Extensible Authentication Protocol или TEAP) [RFC7170].

  • Кадр протокола обнаружения канального уровня (Link Layer Discovery Protocol или LLDP), определённого в [IEEE8021AB].

Возможны и другие способы получения MUD URL сетью. Некоторые устройства могут уже быть введены в эксплуатацию или иметь очень ограниченные возможности передачи MUD URL, но при этом могут быть идентифицированы тем или иным способом, например, по серийному номеру или открытому ключу. В таких случаях изготовители могут сопоставлять эти идентификаторы с конкретными MUD URL (или даже с файлами). В ситуациях с отсутствием или ограниченностью доступа в Internet могут быть доступны альтернативные механизмы распознавания, которые не описываются в этом документе. Разработчикам рекомендуется обеспечивать гибкость при выборе способа получения MUD URL.

1.6. Обработка MUD URL

Диспетчерам MUD, имеющим такую возможность, следует извлекать MUD URL и файлы подписи в соответствии с [RFC7230], используя метод GET [RFC7231]. Они должны проверять сертификаты по правилам параграфа 3.1 из [RFC2818].

В запросы для MUD URL следует включать поля заголовков Accept ([RFC7231], параграф 5.3.2) с полем application/mud+json, Accept-Language ([RFC7231], параграф 5.3.5) и User-Agent ([RFC7231], параграф 5.5.3).

Диспетчерам MUD следует автоматически обрабатывать отклики с кодами состояния 3xx.

Если диспетчер MUD не способен извлечь MUD URL, можно применять другие средства импорта файлов MUD и связанных с ними файлов подписей. Файлы, подписи которых могут быть подтверждены, допускается использовать. В таких средах контроллерам следует предупреждать администраторов о приближении конца срока действия cache-validity, чтобы они могли проверить наличие новых файлов.

У диспетчера MUD может не быть возможности извлечь файл MUD в данный момент. В таких случаях диспетчеру следует считать безопасным использование имеющегося файла в течение какого-то времени. По истечении некоторого времени следует занести запись о невозможности извлечения файла в системный журнал. Для таких отказов могут быть очень веские причины, включая возможность отключения (offline) диспетчера MUD или отказ локального соединения с Internet. Возможно также вмешательство злоумышленника в процесс развёртывания устройства. Поведение в таких ситуациях определяется местными условиями.

1.7. Типы политики

После распознания MUD URL диспетчер MUD извлекает файл, описывающий коммуникационные взаимодействия, предусмотренные для устройства. Изготовитель может задать конкретные хосты для облачных служб или определённые классы доступа в работающей сети. Примером такого класса могут быть устройства определённого типа, который задан изготовителем и указан компонентом полномочий (например, именем домена) в MUD URL. Другим примером может служить разрешение или запрет локального доступа. Как и для других правил, здесь возможны комбинации, например,

  • разрешается доступ к устройствам того же изготовителя;

  • разрешается доступ к контроллерам и от них по протоколу приложений с ограничениями (Constrained Application Protocol или COAP) [RFC7252];

  • разрешается доступ к локальному DNS/NTP;

  • запрещаются все прочие варианты доступа.

Принтер, например, может иметь описание, в котором:

  • разрешён доступ к порту IPP или LPD;

  • разрешён локальный доступ к порту HTTP;

  • запрещены все иные варианты доступа.

В этом случае каждый может печатать на принтере, но для работы с интерфейсом управления нужен локальный доступ.

Извлекаемые файлы должны быть хорошо согласованы с сетевой инфраструктурой, чтобы их было легко развернуть. Язык YANG [RFC7950] выбран потому, что он обеспечивает точные и адекватные модели для использования сетевыми устройствами. Для сериализации применяется формат JSON [RFC8259], являющийся более компактным и удобочитаемым, нежели XML. В последующих версиях MUD могут быть выбраны другие форматы.

Хотя приведённые здесь примеры правил ориентированы на контроль доступа, это не является единственным направлением. Структурируя описанную в документе модель и чёткими точками расширения, можно включить и другие описания. Одним из таких описаний является качество обслуживания.

Заданные здесь модули YANG являются расширениями [RFC8519]. Расширения этой модели позволяют изготовителю выразить классы систем, которые он считает требуемыми для корректной работы устройства. В документе заданы два модуля. Первый указывает средства использования доменных имён в списках контроля доступа (Access Control List или ACL), чтобы для устройств, имеющих контроллеры в облаке, можно было должным образом проверить полномочия по доменным именам в случаях, когда сопоставление этих имён с адресами может быстро меняться.

Во втором модуле адреса IP абстрагируются в некие классы, которые связываются с реальными IP-адресами в процессе локальной обработки. С помощью этих классов изготовители могут задать для устройств способы коммуникаций, чтобы элементы сети можно было настраивать локальным системам, знающим местную топологию. Таким образом, при внедрении заполняются классы, заданные изготовителем. Перечисленные ниже абстракции могут сопоставляться с хостами.

Manufacturer — изготовитель

Устройство конкретного изготовителя, как указано полномочным компонентом MUD URL.

Same-manufacturer — тот же изготовитель

Устройства с тем же компонентом authority в MUD URL.

controller — контроллер

Устройства, отнесённые локальным администратором сети к определённому классу.

my-controller — мой контроллер

Устройства, предназначенные быть контроллерами для MUD URL, выданного Вещью (Thing).

local — локальный

Класс адресов IP, находящихся внутри некой административной границы (по умолчанию в локальной подсети).

Классы manufacturer могут быть легко заданы изготовителем, а классы controller по замыслу задаются админстратором.

Поскольку изготовители не знают, кто будет использовать их устройства, важно, чтобы функциональность, указываемая в описании применения, была достаточно естественной и однозначной. Поэтому конфигурация на основе YANG в файле MUD ограничивается модулями, заданными или упоминаемыми в этом документе или в документированных расширениях.

1.8. Архитектура MUD

Эти компоненты являются основой для архитектуры, как показано на рисунке 1.

.......................................
.                      ____________   .           _____________
.                     |            |  .          |             |
.                     |  Диспетчер |-->get URL-->| Сервер      |
.                     |  MUD       |  .(https)   | файлов MUD  |
.Сеть конечной системы|____________|<-файл MUD<-<|_____________|
.                             .       .
.                             .       .
. _______                 __________  .
.|       | (DHCP и пр.)  |маршрутиз.| .
.| Thing |--->MUD URL--->|   или    | .
.|_______|               |коммутатор| .
.                        |__________| .
.......................................

Рисунок . Архитектура MUD.


На приведённой выше схеме коммутатор или маршрутизатор собирает MUD URL и пересылает их диспетчеру MUD (системе управления сетью) для обработки. Это выполняется по-разному в зависимости от способа передачи URL. Например, при использовании DHCP сервер DHCP может получать и обрабатывать URL. В случае IEEE 802.1X [IEEE8021X] коммутатор может передавать URL в сертификате серверу проверки подлинности по расширяемому протоколу аутентификации (Extensible Authentication Protocol или EAP) через Radius [RFC3748] для последующей обработки. Одним из методов является протокол TEAP, описанный в [RFC7170]. Расширение сертификата описано ниже.

Информация, возвращаемая сервером файлов MUD, действительна, пока Вещь (Thing) остаётся подключённой. Завершение срока действия не предусмотрено, однако при обнаружении менеджером MUD изменения файла MUD для Thing ему следует оперативно обновить правила, полностью учитывая поток одобрения, требуемый при внедрении. Это позволяет своевременно обрабатывать новые рекомендации от изготовителя.

Возвращаемая сервером файлов MUD (web-сервер) действительна в течение всего срока соединения с Thing или задаётся описанием. Таким образом при отключении Thing все связанные с Вещью настройки можно удалить из коммутатора. Описание может также время от времени меняться при появлении новых возможностей или шаблонов взаимодействия, а также при обнаружении новых уязвимостей.

Сервер web обычно работает у изготовителя или от его имени в ином месте. Его доменное имя соответствует органу (authority), указанному в MUD URL. Для унаследованных вариантов, где Things не может выпускать URL, коммутатор может служить прокси, если он может определить подходящий локатор URL. В тривиальном случае коммутатор может жёстко задать (hardcode) MUD URL на своём порту или организовать сопоставление MUD URL с неким доступным идентификатором, таким как адрес L2 или хэш сертификата.

Диспетчер MUD в такой среде выполняет указанные ниже действия:

  • приём MUD URL;

  • извлечение файлов MUD;

  • трансляция абстракций из файлов MUD в конкретную конфигурацию элемента сети;

  • поддержка и обновление всех требуемых сопоставления с абстракциями;

  • обновление конфигурации элементов сети.

Диспетчер MUD может быть компонентом системы проверки подлинности и полномочий, а также учёта (Authentication, Authorization, and Accounting или AAA) или системы управления сетью. Коммуникации внутри таких систем и между ними и элементами сети выходят за рамки этого документа.

1.9. Порядок операций

Как отмечено выше, MUD состоит из архитектурных блоков и порядок операций может меняться. Ниже приведён пример возможного порядка операций.

  1. Вещь выдаёт URL.

  2. URL пересылается диспетчеру MUD ближайшим коммутатором (это зависит от способа выдачи MUD URL).

  3. Диспетчер MUD извлекает файл MUD и подпись с файлового сервера MUD, если у него их ещё нет. После проверки подписи диспетчер может проверить URL на сервере web или в службе репутации домена, а также проверить все указанные в файле хосты в службе репутации, если сочтёт нужным.

  4. Диспетчер MUD может запросить у администратора разрешение добавить Вещь и связанные с ней правила. Если Вещь или её тип известны, этот шаг можно пропустить.

  5. Диспетчер MUD создаёт локальную конфигурацию на основе заданных в этом документе абстракций.

  6. Диспетчер MUD настраивает ближаший к Вещи коммутатор и может настроить другие системы.

  7. При отсоединении Вещи правила (политика) удаляются.

2. Модель MUD и семантическое значение

Файл MUD содержит экземпляр модель YANG в представлении JSON [RFC7951]. Для целей MUD узлами, которые могут быть изменены, являются списки доступа, добавленные этой моделью. В файл MUD можно помещать представление лишь нескольких схем YANG:

  • ietf-access-control-list [RFC8519];

  • ietf-mud (RFC 8520);

  • ietf-acldns (RFC 8520).

Для добавления схем могут применяться расширения, как описано ниже.

Для обеспечения возможности широчайшего внедрения издателям файлов MUD следует использовать абстракции из этого документа и избегать указания адресов IP. Диспетчеру MUD не следует автоматически реализовать файлы MUD с адресами IP, особенно теми, которые могут иметь локальную значимость. Адресация стороны из списка доступа является неявной в зависимости от применения как to-device-policy или from-device-policy.

Издателям файлов MUD следует ограничиваться применением модели ACL для узлов-листьев, указанных в этой спецификации, за исключением имени (name) ACL, типа (type), имени (name) записи контроля доступа (Access Control Entry или ACE) и сведений о портах TCP и UDP у получателя и отправителя. При отсутствии расширений предполагается, что в файлах MUD реализованы лишь свойства модели ACL match-on-ipv4, match-on-ipv6, match-on-tcp, match-on-udp, match-on-icmp.

Кроме того, следует включать только действия accept или drop. Диспетчер MUD может интерпретировать reject как drop, все прочие действия ему следует игнорировать. Это обусловлено тем, что изготовитель не знает точно контекста локального внедрения, чтобы понять, уместно ли действие reject. Решение следует предоставить администратору сети.

С учётом того, что MUD не работает с интерфейсами, поддержка модуля ietf-interfaces [RFC8343] не требуется. В частности, не требуется поддержка связанных с интерфейсами функций и ветвей (например, interface-attachment и interface-stats) модуля YANG ACL.

Фактически, диспетчеры MUD могут игнорировать любой компонент описания и описание целиком и им следует тщательно проверять все описания MUD. Издателям файлов MUD недопустимо включать узлы, не описанные в параграфе 3.9.

2.1. Модуль YANG IETF-MUD

Модуль состоит из трёх частей:

  • контейнер mud со сведениями, относящимися к извлечению и проверке самого файла MUD, а также правил, нацеленных на Вещь и от неё;

  • второй компонент дополняет контейнер сопоставления модели ACL для добавления нескольких узлов, относящихся к MUD URL или абстрагированных для использования в локальном окружении;

  • третий компонент дополняет контейнер tcp-acl модели ACL для добавления сопоставления по направлению организации соединения TCP.

Действительный файл MUD содержит два корневых объекта — контейнеры mud и acls. При необходимости можно добавить корневые объекты с помощью расширений. Напомним, что при анализе acls элементы из блока match объединяются логической операцией И (AND). В общем случае следует применять одну абстракцию в операторе match. Например, не имеет смысла сопоставлять с аргументом my-controller и controller, поскольку вероятность совпадения их значений очень мала.

В документе применяется простое графическое представление моделей данных в соответствии с [RFC8340].

   module: ietf-mud
     +--rw mud!
        +--rw mud-version           uint8
        +--rw mud-url               inet:uri
        +--rw last-update           yang:date-and-time
        +--rw mud-signature?        inet:uri
        +--rw cache-validity?       uint8
        +--rw is-supported          boolean
        +--rw systeminfo?           string
        +--rw mfg-name?             string
        +--rw model-name?           string
        +--rw firmware-rev?         string
        +--rw software-rev?         string
        +--rw documentation?        inet:uri
        +--rw extensions*           string
        +--rw from-device-policy
        |  +--rw acls
        |     +--rw access-list* [name]
        |        +--rw name    -> /acl:acls/acl/name
        +--rw to-device-policy
           +--rw acls
              +--rw access-list* [name]
                 +--rw name    -> /acl:acls/acl/name

     augment /acl:acls/acl:acl/acl:aces/acl:ace/acl:matches:
       +--rw mud
          +--rw manufacturer?        inet:host
          +--rw same-manufacturer?   empty
          +--rw model?               inet:uri
          +--rw local-networks?      empty
          +--rw controller?          inet:uri
          +--rw my-controller?       empty
     augment
       /acl:acls/acl:acl/acl:aces/acl:ace/acl:matches
          /acl:l4/acl:tcp/acl:tcp:
       +--rw direction-initiated?   direction

3. Определения модели MUD для корневого контейнера mud

3.1. mud-version

Этот узел задаёт целочисленный номер версии спецификации MUD. Данный документ соответствует версии 1.

3.2. MUD URL

URL для указания файла MUD. Это полезно в случаях, когда файл и связанная с ним подпись загружаются вручную, например, в автономном режиме (offline).

3.3. Контейнеры to-device-policy и from-device-policy

Списки доступа описаны в [RFC8519]. В случае MUD файл MUD должен явно описывать взаимодействие с Вещью, включая указание того, что должно быть разрешено или запрещено в каждом направлении взаимодействия. Следовательно, каждый из этих контейнеров указывает соответствующее направление потока применительно к конкретной Вещи. Контейнеры содержат ссылки на конкретные списки доступа.

3.4. last-update

Значение date-and-time для момента создания файла MUD. Оно похоже на номер версии и имеет форму из [RFC6991].

3.5. cache-validity

Это значение uint8 указывает интервал в времени (в часах), который станция сетевого управления должна выждать между последним извлечением данных и проверкой наличия обновлений. Для любой поддерживаемой Вещи рекомендуется устанавливать значение не менее 24 и недопустимы значения больше 168. Следует задавать интервал не короче интервалов, определяемых директивами кэширования HTTP (например, cache-control или Expires). Важно подчеркнуть, что по истечении этого времени диспетчер MUD не обязан отбрасывать файл MUD или прерывать доступ к Вещи. Более подробные сведения представлены в разделе 16.

3.6. is-supported

Это логическое значение от изготовителя указывает администратору сети, поддерживается ли данная вещь. В этом контексте Вещь считается не поддерживаемой, если изготовитель предполагает не выпускать для неё обновлений микрокода или программ и не обновлять файл MUD. Диспетчер MUD всё равно может проверять обновления.

3.7. systeminfo

Текстовое (UTF-8) описание подключаемой Вещи, предназначенное для информирования администраторов. Не следует использовать более 60 символов.

3.8. mfg-name, software-rev, model-name, firmware-rev

Необязательные поля в соответствии с [RFC8348]. Поля firmware-rev и software-rev недопустимо указывать в файле MUD, если устройство может обновляться, но MUD URL не может (например, MUD URL с сертификатами 802.1AR).

3.9. Расширения

Необязательный лист-список с именами расширений MUD, применяемых в файле MUD. Отметим, что расширения MUD недопустимо применять в файле MUD без их объявления. Реализации должны игнорировать в файле любые непонятные узлы. Расширения могут применяться, как описано выше, или ссылаться на другие работы. Пример расширения приведён в Приложении B.

4. Дополнение модели ACL

Термин «сопоставление» (match) в этом разделе относится к узлу matches модели ACL.

4.1. manufacturer

Этот узел содержит имя хоста, которое будет сопоставляться с компонентом authority в MUD URL другой Вещи. В простейшей форме узлы manufacturer и same-manufacturer могут быть реализованы как списки доступа, в более сложных могут применяться дополнительные возможности сети. Например, если в manufacturer указано flobbity.example.com4, все Вещи, зарегистрированные с MUD URL, где содержится flobbity.example.com в разделе authority, будут соответствовать.

4.2. same-manufacturer

Этот пустой (null-valued) узел является эквивалентом применения элемента manufacturer для индикации того, что authority в MUD URL другой Вещи совпадает с authority в MUD URL данной Вещи. Например, если MUD URL Вещи имеет значение https://b1.example.com/ThingV1, все устройства, имеющие MUD URL с разделом authority b1.example.com, будут соответствовать.

4.3. documentation

Этот идентификатор URI содержит URL для документации к устройству и файлу MUD. Это может быть особенно полезно при использовании класса controller, чтобы объяснить его применение.

4.4. model

Эта строка сопоставляется с полным MUD URL, охватывая модель, уникальную в контексте данного authority. Строка может включать не только сведения о модели, но и данные о версии и другие сведения, которые изготовитель сочтёт нужными. Строка предназначена для того, чтобы разрешить или запретить взаимодействия между устройствами с точно совпадающим классом.

4.5. local-networks

Этот пустой (null-valued) узел преобразуется для включения локальных сетей. Приятое по умолчанию преобразование служит для того, чтобы для пакетов не применялся маршрут по умолчанию, полученный от маршрутизатора. Однако администраторы могут преобразовать это выражение в соответствии с потребностями своё сети.

4.6. controller

Этот идентификатор URI задаёт значение, которое контроллер будет регистрировать в диспетчере MUD. Затем этот узел преобразуется в набор зарегистрированных таким способом устройств. Узел может быть также URN, описывающим в этом случае стандартизованную общеизвестную службу, например DNS или NTP (см. параграф 17.7).

При использовании my-controller администратору может быть предложено заполнять этот класс для каждой модели. Использование controller с именованным классом позволяет пользователю заполнять этот класс однократно для множества разных моделей, которые может выпускать изготовитель.

URI контроллера могут иметь форму URL (например, http[s]://), однако менеджерам MUD недопустимо преобразовывать (resolve) ссылки и извлекать такие файлы, а рекомендуется, чтобы в данный момент таких файлов не было, поскольку их форма и назначение могут быть определены в будущем. В настоящее время URL следует просто играть роль класса имён, которые могут заполняться локальным администратором.

Диспетчерам MUD следует соблюдать особую осторожность при вызове класса controller в форме URL. Во-первых, для этого требуется понимание администратора в плане применимости. Приветствуется предварительная регистрация таких классов на сервере MUD. Механизм регистрации выходит за рамки этого документа.

4.7. my-controller

Этот пустой (null-valued) узел сигнализирует диспетчеру MUD об использовании сопоставления, которое у него есть для данного MUD URL, с конкретной группой хостов. Для этого может потребоваться запрос администратору о членах класса. В последующих работах следует стремиться к автоматизации управления принадлежностью к классу.

4.8. direction-initiated

Этот узел должен применяться только для TCP и сопоставляется с направлением, в котором инициируется соединение TCP. Когда соединение инициирует устройство (from-device), пакеты, передаваемые в направлении Вещи, должны отбрасываться, если только Вещь не инициировала первой соединение TCP. Например, этот узел может быть реализован в простейшей форме путём просмотра явных битов SYN, а также иными способами с использованием механизмов с большей поддержкой состояний.

При использовании узла пакеты соответствовать будут пакеты потока, инициированного в соответствующем направлении. В [RFC6092] приведены рекомендации для IPv6. Хотя документ разработан специально для IPv6, его содержимое применимо и к IPv4.

5. Обработка файла MUD

Для сохранения простоты в дополнение к имеющимся определениям добавлены два варианта принятого по умолчанию поведения:

  • запрещено все, что не разрешено явно;

  • взаимодействие с локальным DNS и NTP по умолчанию разрешено в обоих направлениях относительно Вещи.

Явное описание принятых по умолчанию правил приведено в Приложении A. Эти правила применяются после всех правил, заданных явно. Таким образом, принятое по умолчанию поведение можно изменить действием drop.

6. Как выглядит MUD URL?

В MUD URL требуется применять схему https для отождествления серверов файлов MUD и обеспечения целостности MUD-файлов. В качестве MUD URL может применяться любой URL https://, например,

     https://things.example.org/product_abc123/v5
     https://www.example.net/mudfiles/temperature_sensor/
     https://example.com/lightbulbs/colour/v1

Изготовитель может создавать MUD URL любым способом при условии использования схемы https.

7. Модель YANG MUD

   <CODE BEGINS>file "ietf-mud@2019-01-28.yang"
   module ietf-mud {
     yang-version 1.1;
     namespace "urn:ietf:params:xml:ns:yang:ietf-mud";
     prefix ietf-mud;

     import ietf-access-control-list {
       prefix acl;
     }
     import ietf-yang-types {
       prefix yang;
     }
     import ietf-inet-types {
       prefix inet;
     }

     organization
       "IETF OPSAWG (Operations and Management Area Working Group)";
     contact
       "WG Web: <https://datatracker.ietf.org/wg/opsawg/> 
        WG List: opsawg@ietf.org 

        Author: Eliot Lear
                lear@cisco.com 

        Author: Ralph Droms
                rdroms@gmail.com 

        Author: Dan Romascanu
                dromasca@gmail.com 
       ";
     description
       "Этот модуль YANG задаёт дополнение к описанию IETF для списков
        доступа. Модуль сосредоточен на дополнительных фильтрах,
        включающих local, model и same-manufacturer.

        Модуль предназначен для представления в формате JSON и сохранения
        в файле, как описано в RFC 8520.

        Ключевые слова ДОЛЖНО, НЕДОПУСТИМО, ТРЕБУЕТСЯ, НУЖНО, НЕ НУЖНО, 
        СЛЕДУЕТ, НЕ СЛЕДУЕТ, РЕКОМЕНДУЕТСЯ, НЕ РЕКОМЕНДУЕТСЯ, МОЖНО,
        НЕОБЯЗАТЕЛЬНО в этом документе трактуются в соответствии с 
        BCP 14 (RFC 2119) (RFC 8174) тогда и только тогда, когда они
        указаны заглавными буквами, как показано здесь.
        Авторские права (Copyright (c) 2019) принадлежат IETF Trust
        и лицам, указанным в качестве авторов кода. Все права защищены.

        Распространение и использование в исходной или двоичной форме с
        изменениями или без таковых разрешено в соответствии с лицензией
        Simplified BSD, изложенной в разделе 4  IETF Trust's Legal
        Provisions применительно к документам IETF
        (http://trustee.ietf.org/license-info). 

        Эта версия данного модуля YANG является частью RFC 8520,
        где правовые вопросы рассмотрены более полно.";

     revision 2019-01-28 {
       description
         "Исходный предложенный стандарт.";
       reference
         "RFC 8520: Manufacturer Usage Description Specification";
     }

     typedef direction {
       type enumeration {
         enum to-device {
           description
             "Пакеты или потоки для целевой Вещи.";
         }
         enum from-device {
           description
             "Пакеты или потоки от целевой Вещи.";
         }
       }
       description
         "О каком направлении идёт речь?";
     }

     container mud {
       presence "Разрешено для этого конкретного MUD URL";
       description
         "Связанные с MUD сведения в соответствии с RFC 8520.";
       uses mud-grouping;
     }

     grouping mud-grouping {
       description
         "Сведения о времени завершения и обновления поддержки.";
       leaf mud-version {
         type uint8;
         mandatory true;
         description
           "Версия спецификации MUD (этот документ задаёт версию 1)";
       }
       leaf mud-url {
         type inet:uri;
         mandatory true;
         description
           "MUD URL, связанный с записью в файле MUD.";
       }
       leaf last-update {
         type yang:date-and-time;
         mandatory true;
         description
           "Предполагается, что это время создания текущего файла MUD.
            Диспетчерам MUD НЕ СЛЕДУЕТ проверять наличие обновлений в
            интервале между этим моментом и сроком действия кэша.";
       }
       leaf mud-signature {
         type inet:uri;
         description
           "URI, преобразующийся в подпись с соответствии с этой
            спецификацией.";
       }
       leaf cache-validity {
         type uint8 {
           range "1..168";
         }
         units "hours";
         default "48";
         description
           "Сведения, получаемые от сервера MUD, действительны в течение
            указанного числа часов, после чего их следует обновить. 
            Важно отметить, что реализации диспетчера MUD не обязаны
            отбрасывать файлы MUD по истечении этого времени.";
       }
       leaf is-supported {
         type boolean;
         mandatory true;
         description
           "Указывает, поддерживается ли сейчас эта Вещь изготовителем.";
       }
       leaf systeminfo {
         type string;
         description
           "Описание (UTF-8) данной Вещи. Следует давать краткие 
            сведения, которые могут выводиться пользователю для 
            определения возможности установки Вещи в сеть.";
       }
       leaf mfg-name {
         type string;
         description
           "Заданное изготовителем имя в соответствии с модулем 
            YANG ietf-hardware.";
       }
       leaf model-name {
         type string;
         description
           "Имя модели, как описано в модуле YANG ietf-hardware.";
       }
       leaf firmware-rev {
         type string;
         description
           "firmware-rev, как описано в модуле YANG ietf-hardware.
            Отметим, что это поле НЕДОПУСТИМО включать, если 
            устройство можно обновить, а MUD URL - нет.";
       }
       leaf software-rev {
         type string;
         description
           "software-rev, как описано в модуле YANG ietf-hardware.
            Отметим, что это поле НЕДОПУСТИМО включать, если 
            устройство можно обновить, а MUD URL - нет.";       }
       leaf documentation {
         type inet:uri;
         description
           "URL для документации, относящейся к устройству и любым 
            классам, используемым в файле MUD. Отметим, что диспетчерам 
            MUD не требуется преобразовывать этот URL и достаточно 
            просто предоставить его администратору. Разбор HTML не
            входит в число функций диспетчера MUD.";
       }
       leaf-list extensions {
         type string {
           length "1..40";
         }
         description
           "Список имён расширений, используемых в файле MUD. Имена
            регистрируются IANA, а расширения описываются в RFC.";
       }
       container from-device-policy {
         description
           "Правила, применяемые к трафику от устройства. Правила не
            обязательно предназначены для применения в одной точке и
            могут разбираться контроллером для любой соответствующей
            точки применения правил в сети или ином месте.";
         uses access-lists;
       }
       container to-device-policy {
         description
           "Правила, применяемые к трафику на устройство. Правила не
            обязательно предназначены для применения в одной точке и
            могут разбираться контроллером для любой соответствующей
            точки применения правил в сети или ином месте.";
         uses access-lists;
       }
     }

     grouping access-lists {
       description
         "Группировка списков доступа в контексте правил устройства.";
       container access-lists {
         description
           "Списки доступа, которые следует применять для трафика 
            от устройства или для него.";
         list access-list {
           key "name";
           description
             "Каждая запись списка указывает ACL, который следует
              указывать в общей модели данных списков доступа. ACL
              идентифицируются по имени и типу.";
           leaf name {
             type leafref {
               path "/acl:acls/acl:acl/acl:name";
             }
             description
               "Имя ACL для этой записи.";
           }
         }
       }
     }

     augment "/acl:acls/acl:acl/acl:aces/acl:ace/acl:matches" {
       description
         "Добавление абстракций для избавления от необходимости
          использовать адреса IP.";
       container mud {
         description
           "Связанные с MUD сопоставления.";
         leaf manufacturer {
           type inet:host;
           description
             "Домен, предназначенный для сопоставления с разделом 
              authority в MUD URL. Узел служит для указания одного
              или нескольких изготовителей, которым следует разрешать
              доступ к устройству.";
         }
         leaf same-manufacturer {
           type empty;
           description
             "Узел, сопоставляемый с разделом authority в MUD URL Вещи.
              Узел предназначен для предоставления доступа ко всем
              устройствам с таким разделом authority.";
         }
         leaf model {
           type inet:uri;
           description
             "Устройства с указанным типом модели будут соответствовать,
              при идентичности MUD URL.";
         }
         leaf local-networks {
           type empty;
           description
             "Адреса IP будут соответствовать этому узлу, если они
              считаются локальными (список локально заданных префиксов и
              масок, указывающий конкретную административную область.";
         }
         leaf controller {
           type inet:uri;
           description
             "Именует класс, с которым могут быть связаны адреса IP для
              сопоставления. Это может быть привязано к изготовителю или
              стандартному URN.";
         }
         leaf my-controller {
           type empty;
           description
             "Этот узел сопоставляется с элементами сети, настроенными в
              качестве контроллеров для этой Вещи, на основе MUD URL.";
         }
       }
     }
     augment "/acl:acls/acl:acl/acl:aces/acl:ace/acl:matches"
           + "/acl:l4/acl:tcp/acl:tcp" {
       description
         "add direction-initiated";
       leaf direction-initiated {
         type direction;
         description
           "Этот узел сопоставляется с направлением, в котором 
            инициировано соединение. Способы определения направления
            рассмотрены в этом документе.";
       }
     }
   }
   <CODE ENDS>

8. Расширение для доменных имён в модели ACL

Этот модуль задаёт расширение модели IETF-ACL, позволяющее указывать доменные имена, путём добавления узла matches. Разные реализации могут применять свои методы поддержки сопоставления адресов IP с доменными именами. Однако назначением является разрешение (или запрет) по спискам доступа для ресурсов, указанных именами. Структура изменений показана ниже.

   module: ietf-acldns
     augment /acl:acls/acl:acl/acl:aces/acl:ace/
       acl:matches/acl:l3/acl:ipv4/acl:ipv4:
       +--rw src-dnsname?   inet:host
       +--rw dst-dnsname?   inet:host
     augment /acl:acls/acl:acl/acl:aces/acl:ace/
       acl:matches/acl:l3/acl:ipv6/acl:ipv6:
       +--rw src-dnsname?   inet:host
       +--rw dst-dnsname?   inet:host

Выбор конкретных точек в модели списка управления доступом основывается на допущении наличия некого способа указания связанных с IP ресурсов, например, по именам DNS. Доменные имена в этом контексте соответствуют определению [RFC6991]. Дополнения реплицируются через IPv4 и IPv6, чтобы авторы файлов MUD могли контролировать версию IP, которую Вещь может применять.

Узлы модуля описаны ниже.

8.1. src-dnsname

Аргумент соответствует доменному имени источника, указанному inet:host. Для распознавания хостов могут использоваться разные методы. Важно, чтобы такое распознавание было совместимо с ACL, которые требуются для корректной работы Вещи.

8.2. dst-dnsname

Аргумент соответствует доменному имени адресата, указанному inet:host. Распознавание имён описано выше (параграф 8.1).

Отметим, что при использовании любого из аргументов в файле MUD в этот файл недопустимо включать в ACL src-dnsname, связанный с from-device-policy, или dst-dnsname, связанный с to-device-policy, поскольку доступ относится к конкретной Вещи.

8.3. Модель ietf-acldns

   <CODE BEGINS>file "ietf-acldns@2019-01-28.yang"
   module ietf-acldns {
     yang-version 1.1;
     namespace "urn:ietf:params:xml:ns:yang:ietf-acldns";
     prefix ietf-acldns;

     import ietf-access-control-list {
       prefix acl;
     }
     import ietf-inet-types {
       prefix inet;
     }

     organization
       "IETF OPSAWG (Operations and Management Area Working Group)";
     contact
       "WG Web: <https://datatracker.ietf.org/wg/opsawg/> 
        WG List: opsawg@ietf.org

        Author: Eliot Lear
                lear@cisco.com 

        Author: Ralph Droms
                rdroms@gmail.com 

        Author: Dan Romascanu
                dromasca@gmail.com 
       ";
     description
       "Этот модуль YANG задаёт дополнение к описанию IETF для списков
        доступа, позволяющее сопоставления по именам DNS.

        Авторские права (Copyright (c) 2019) принадлежат IETF Trust
        и лицам, указанным в качестве авторов кода. Все права защищены.

        Распространение и использование в исходной или двоичной форме с
        изменениями или без таковых разрешено в соответствии с лицензией
        Simplified BSD, изложенной в разделе 4  IETF Trust's Legal
        Provisions применительно к документам IETF
        (http://trustee.ietf.org/license-info). 

        Эта версия данного модуля YANG является частью RFC 8520,
        где правовые вопросы рассмотрены более полно.";

     revision 2019-01-28 {
       description
         "Базовая версия расширения dnsname для модели ACL.";
       reference
         "RFC 8520: Manufacturer Usage Description Specification";
     }

     grouping dns-matches {
       description
         "Доменные имена для сопоставления.";
       leaf src-dnsname {
         type inet:host;
         description
           "Доменное имя для сопоставления.";
       }
       leaf dst-dnsname {
         type inet:host;
         description
           "Доменное имя для сопоставления.";
       }
     }

     augment "/acl:acls/acl:acl/acl:aces/acl:ace/acl:matches"
           + "/acl:l3/acl:ipv4/acl:ipv4" {
       description
         "Добавление доменных имён для сопоставления.";
       uses dns-matches;
     }
     augment "/acl:acls/acl:acl/acl:aces/acl:ace/acl:matches"
           + "/acl:l3/acl:ipv6/acl:ipv6" {
       description
         "Добавление доменных имён для сопоставления .";
       uses dns-matches;
     }
   }
   <CODE ENDS>

9. Пример файла MUD

В этом примере показаны два списка для управления исходящим доступом к облачному сервису на порту TCP 443.

   {
     "ietf-mud:mud": {
       "mud-version": 1,
       "mud-url": "https://lighting.example.com/lightbulb2000",
       "last-update": "2019-01-28T11:20:51+01:00",
       "cache-validity": 48,
       "is-supported": true,
       "systeminfo": "The BMS Example Light Bulb",
       "from-device-policy": {
         "access-lists": {
           "access-list": [
             {
               "name": "mud-76100-v6fr"
             }
           ]
         }
       },
       "to-device-policy": {
         "access-lists": {
           "access-list": [
             {
               "name": "mud-76100-v6to"
             }
           ]
         }
       }
     },
     "ietf-access-control-list:acls": {
       "acl": [
         {
           "name": "mud-76100-v6to",
           "type": "ipv6-acl-type",
           "aces": {
             "ace": [
               {
                 "name": "cl0-todev",
                 "matches": {
                   "ipv6": {
                     "ietf-acldns:src-dnsname": "test.example.com",
                     "protocol": 6
                   },
                   "tcp": {
                     "ietf-mud:direction-initiated": "from-device",
                     "source-port": {
                       "operator": "eq",
                       "port": 443
                     }
                   }
                 },
                 "actions": {
                   "forwarding": "accept"
                 }
               }
             ]
           }
         },
         {
           "name": "mud-76100-v6fr",
           "type": "ipv6-acl-type",
           "aces": {
             "ace": [
               {
                 "name": "cl0-frdev",
                 "matches": {
                   "ipv6": {
                     "ietf-acldns:dst-dnsname": "test.example.com",
                     "protocol": 6
                   },
                   "tcp": {
                     "ietf-mud:direction-initiated": "from-device",
                     "destination-port": {
                       "operator": "eq",
                       "port": 443
                     }
                   }
                 },
                 "actions": {
                   "forwarding": "accept"
                 }
               }
             ]
           }
         }
       ]
     }
   }

В этом примере объявлено два правила — одно для трафика от Вещи, другое — к ней. В каждом правиле указано имя списка доступа, применяемого для пакетов. В каждом из списков доступ разрешается для пакетов, связанных с доменным именем test.example.com5. В каждом из списков предполагается, что соединение инициировано Вещью.

10. Опции DHCP MUD URL

Опция IPv4 MUD URL имеет показанный ниже формат

     +------+-----+------------------------------
     | code | len |  MUDstring
     +------+-----+------------------------------

Код OPTION_MUD_URL_V4 (161) выделен IANA, len — 1-октетное значение, указывающее размер MUDstring в октетах. Определение MUDstring приведено ниже.

    MUDstring = mudurl [ " " reserved ]
    mudurl = URI; URL [RFC3986] со схемой https [RFC7230]
    reserved = 1*( OCTET ) ; [RFC5234]

Опции недопустимо занимать более 255 октетов. Если после MUD URL следует пробел, за ним помещается зарезервированная строка, которая будет определена в последующих спецификациях. Диспетчеры MUD, не понимающие это поле, должны игнорировать его.

Формат опции клиента IPv6 MUD URL показан ниже.

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |         OPTION_MUD_URL_V6     |        option-length          |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                            MUDstring                          |
     |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

OPTION_MUD_URL_V6

112.

option-length

Размер MUDstring (см. определение выше) в октетах.

Назначением этой опции является предоставление сети нового классификатора Вещи, а также предоставление некоторых рекомендуемых конфигураций маршрутизаторам, реализующим эту опцию. Однако решение об этих сведениях принимает сетевая система, управляемая администратором сети. Основной задачей этой опции является просто идентификация типа Вещи для сети структурированным способом, чтобы правила можно было легко найти с помощью имеющихся инструментов.

10.1. Поведение клиента

Клиент DHCPv4 может передавать опцию DHCPv4, а клиент DHCPv6 — опцию DHCPv6. Эти опции являются одиночными (singleton), как указано в [RFC7227]. Поскольку предполагается, что у клиента имеется не более одно MUD URL, связанного с ним, тот может передавать не более одной опции MUD URL по протоколу DHCPv4 и одной — по протоколу DHCPv6. При передаче обеих опций DHCP (v4 и v6) должно указываться одно значение URL.

10.2. Поведение сервера

Сервер DHCP может игнорировать эти опции или предпринимать на их основе действия. Приняв опцию, сервер будет пересылать URL и соответствующую информацию клиента (такую как адрес шлюзе или giaddr и запрошенный адрес IP, а также продолжительность аренды) системе управления сетью или извлечь само описание применения по URL.

Серверы DHCP могут реализовать функциональность MUD самостоятельно или передавать вместе с соответствующими сведениями системе управления сетью или диспетчеру MUD. Сервер DHCP, обрабатывающий MUD URL должен придерживаться процесса, описанного в [RFC2818] и [RFC5280] для проверки сертификата TLS web-сервера, где размещается файл MUD. Такие серверы извлекают файл, обрабатывают его, а также создают и устанавливают требуемую конфигурацию на соответствующем элементе сети. Серверам следует отслеживать на шлюзе изменения состояний данного интерфейса. Сервер DHCP без функциональности MUD, пересылающий MUD URL диспетчеру MUD, должен уведомлять диспетчер MUD о любом соответствующих изменениях состояния DHCP для клиента, таких как завершение срока или явное прекращение аренды.

В случае отказа сервера DHCP с функциональностью диспетчера MUD любым резервным механизмам следует включать состояние MUD, а серверу следует распознавать статус своих клиентов после запуска, как он делал бы это при отсутствии функциональности MUD. Если сервер DHCP пересылает информацию диспетчеру MUD, тот использует для получения информации резервные серверы DHCP или сбрасывает состояние на основе других сведений из сети, таких как статус порта коммутатора, отслеживаемый через SNMP, учёт Radius или аналогичные механизмы.

10.3. Требования к ретранслятору

К ретрансляторам не предъявляется дополнительных требований.

11. Расширение MUD URL X.509

В этом разделе задано некритическое расширение сертификата X.509, содержащее один URL, указывающий на доступное через описание MUD, относящееся к субъекту сертификата. Идентификатор URI должен представляться, как описано в параграфе 7.4 [RFC5280]. Идентификаторы ресурсов на других языках (Internationalized Resource Identifier или IRI) должны отображаться на URI, как указано в параграфе 3.1 [RFC3987], до их включения в расширение сертификата. Семантика URL определена в разделе 6 этого документа.

Значение id-pe выбирается в соответствии с рекомендациями параграфа 4.2.2 в [RFC5280].

Эти расширения могут служить для направления приложений к доступным через сеть сведениям об эмитенте или субъекте.

MUD URL является именно таким и указывает доступные через сеть сведения о конкретном субъекте.

Кроме того, определено новое расширение id-pe-mudsigner, содержащее поле субъекта из сертификата подписи файла MUD. Обработка поля описана в параграфе 13.2.

Подпись предназначена для подтверждения действительности найденного на сервере файла MUD для данного устройства, независимо от других факторов. В разделе 16 приведены связанные с этим соображения безопасности.

Определён также новый тип содержимого (content-type) id-ct-mud. Хотя в настоящее время подписи отделены, при передаче файла MUD в криптографическом сообщении (Cryptographic Message Syntax или CMS) следует применять этот content-type.

В модуле используется импорт из [RFC5912] и [RFC6268]. Новые расширения показаны ниже.

   <CODE BEGINS>
      MUDURLExtnModule-2016 { iso(1) identified-organization(3) dod(6)
                   internet(1) security(5) mechanisms(5) pkix(7)
                   id-mod(0) id-mod-mudURLExtn2016(88) }
       DEFINITIONS IMPLICIT TAGS ::= BEGIN

       -- Экспорт всего --
      IMPORTS
        -- RFC 5912
        EXTENSION
        FROM PKIX-CommonTypes-2009
             { iso(1) identified-organization(3) dod(6) internet(1)
               security(5) mechanisms(5) pkix(7) id-mod(0)
               id-mod-pkixCommon-02(57) }

        -- RFC 5912
        id-ct
        FROM PKIXCRMF-2009
             { iso(1) identified-organization(3) dod(6) internet(1)
               security(5)  mechanisms(5) pkix(7) id-mod(0)
               id-mod-crmf2005-02(55) }

        -- RFC 6268
        CONTENT-TYPE
        FROM CryptographicMessageSyntax-2010
          { iso(1) member-body(2) us(840) rsadsi(113549)
            pkcs(1) pkcs-9(9) smime(16) modules(0) id-mod-cms-2009(58) }

        -- RFC 5912
        id-pe, Name
        FROM PKIX1Explicit-2009
              { iso(1) identified-organization(3) dod(6) internet(1)
                security(5) mechanisms(5) pkix(7) id-mod(0)
                id-mod-pkix1-explicit-02(51) } ;

       --
       -- Расширения сертификата
       --
       MUDCertExtensions EXTENSION ::=
          { ext-MUDURL | ext-MUDsigner, ... }

       ext-MUDURL EXTENSION ::=
          { SYNTAX MUDURLSyntax IDENTIFIED BY id-pe-mud-url }

       id-pe-mud-url OBJECT IDENTIFIER ::= { id-pe 25 }

       MUDURLSyntax ::= IA5String

       ext-MUDsigner EXTENSION ::=
          { SYNTAX MUDsignerSyntax IDENTIFIED BY id-pe-mudsigner }

       id-pe-mudsigner OBJECT IDENTIFIER ::= { id-pe 30 }

       MUDsignerSyntax ::= Name

       --
       -- Типы содержимого CMS
       --
       MUDContentTypes CONTENT-TYPE ::=
          { ct-mud, ... }

        ct-mud CONTENT-TYPE ::=
          { -- Включение содержимого напрямую
            IDENTIFIED BY id-ct-mudtype }
          -- Двоичные данные в форме application/mud+json кодируются
          -- напрямую как подписанные данные (без кодирования ASN.1).

       id-ct-mudtype OBJECT IDENTIFIER ::= { id-ct 41 }
       END
   <CODE ENDS>

Хотя это расширение может присутствовать как в сертификате изготовителя 802.AR (IDevID) или сертификате внедрения (LDevID), его наличие и передача не гарантируется. Реализациям диспетчеров MUD рекомендуется поддерживать таблицу сопоставления Вещей с MUD URL на основе IDevID.

12. Расширение MUD LLDP

Протокол обнаружения на канальном уровне (Link Layer Discovery Protocol или LLDP) IEEE802.1AB является локальным (one-hop), не зависящим от производителя протоколом канального уровня, используемым Вещами для анонсирования своих отождествлений, возможностей и соседей в локальной сети IEEE 802. Элемент TLV6 позволяет задавать фирменные (vendor-specific) расширения. Агентство IANA зарегистрировало уникальный идентификатор организации (organizationally unique identifier или OUI) IEEE 802, определённый в соответствии с [RFC7042]. Расширение MUD LLDP использует определённый в этом документе субтип для передачи MUD URL. Формат кадра LLDP приведён ниже.

   +---------+---------+----------+---------+--------------
   |TLV Type |  len    |   OUI    |subtype  | MUDString
   |  =127   |         |= 00 00 5E|  = 1    |
   |(7 битов)|(9 битов)|(3 октета)|(1 октет)|(1-255 октетов)
   +---------+---------+----------+---------+--------------

TLV Type = 127

Указывает фирменный элемент TLV.

len

Указывает размер строки TLV.

OUI = 00 00 5E

Уникальный идентификатор организации, выделенный IANA.

subtype = 1

Значение, выделенное IANA для MUDstring.

MUDstring

Строке недопустимо иметь размер более 255 октетов.

Назначение этого расширения состоит в предоставлении сети нового классификатора Вещи, а также некой рекомендуемой конфигурации для маршрутизаторов, реализующих правила. Однако решение о применении этих сведений полностью определяется сетевой системой, управляемой администратором. Основная функция расширения состоит в идентификации типа Вещи для сети структурированным способом, чтобы правила можно было легко найти с помощью имеющихся инструментов.

Хосты, маршрутизаторы и другие элементы сети, реализующие эту опцию, должны иметь не более одного связанного с ними MUD URL, поэтому они могут передавать не более одного значения MUD URL. Хосты, маршрутизаторы и другие элементы сети, реализующие эту опцию, могут игнорировать её или выполнять на основе опции те или иные действия, например, вносить сведения в соответствующие расширения LLDP MIB7. LLDP работает в одном направлении. Обмен блоками данных протокола (Link Layer Discovery Protocol Data Unit или LLDPDU) не происходит в форме запросов одной Вещи и откликов другой. Приём полученных Вещью сведений LLDP эта Вещь не подтверждает Вещи-отправителю. Определённое поведение сети не гарантируется. Когда Вещь воспринимает это расширение, она может переслать URL и соответствующие сведения от удалённой вещи диспетчеру MUD или извлечь описание использования путём распознавания URL в соответствии с обычной семантикой HTTP.

13. Создание и обработка подписанных файлов MUD

Поскольку файлы MUD содержат сведения, которые могут служить для настройки сетевых списков доступа, они могут быть конфиденциальными. Для предотвращения возможности подделки важно подписывать файлы. Для этого служит синтаксис кодированных сообщений (Cryptographic Message Syntax или CMS) [RFC5652] с кодированием DER.

13.1. Создание подписи файла MUD

Файл MUD должен быть подписан с использованием CMS как необрабатываемого двоичного объекта. Для повышения вероятности успешной проверки следует включать промежуточные сертификаты. Подпись хранится в указанном файлом MUD месте. Подписи передаются с применением типа содержимого application/pkcs7-signature. Например,

   % openssl cms -sign -signer mancertfile -inkey mankey \
                 -in mudfile -binary -outform DER -binary \
                 -certfile intermediatecert -out mudfile.p7s

Примечание. Может потребоваться повторная подпись файла MUD, если срок действия прежней подписи истёк.

13.2. Проверка подписи файла MUD

Перед обработкой остальной части файла MUD диспетчер MUD должен получить подпись MUD путём извлечения поля mud-signature и проверки подписи в файле MUD. В сертификате подписи должно присутствовать расширение Key Usage с битом digitalSignature(0). При наличии расширения id-pe-mudsigner в сертификате устройства X.509 файл подписи MUD должен генерироваться с сертификатом, в котором subject соответствует содержимому id-pe-mudsigner. Если это условие не выполняется или не удаётся проверить цепочку доверия до известной привязки доверия, диспетчер MUD должен прекратить обработку файла MUD до получения разрешения от администратора.

Цель подписи состоит в назначение ответственного, репутация которого может помочь администратору при решении вопроса о восприятии данного файла MUD. Проверка репутации местоположения сервера, где размещён файл, уже стала обычным делом для web. Хотя вероятно, что изготовитель будет подписывать файл, но это необязательно, а иногда может быть нежелательным. С одной стороны, в некоторых средах интеграторы могут устанавливать свои сертификаты, с другой, может быть более важна ответственность за рекомендации, а не только взаимоотношения между Вещью и файлом. Например,

   % openssl cms -verify -in mudfile.p7s -inform DER -content mudfile

Следует отметить дополнительную проверку общего корня доверия.

14. Расширяемость

Одной из целей является понимание файлов MUD как можно более широким кругом систем. В сочетании с решением применять имеющиеся механизмы не остаётся возможности согласовывать расширения, а возможности их добавления ограничены. В связи с этим используется двухуровневая модель расширяемости, как указано ниже.

  1. На грубом уровне версия протокола включается в MUD URL (этот документ задаёт версию 1). При использовании этой версии принимаются все изменения, а переходы на другие версии будут рассматриваться в будущих документах.

  2. На более тонком уровне принимаются лишь расширения не влекущие дополнительных рисков для Вещи. В частности, добавление узлов в контейнер mud разрешается при понимании того, что эти расширения будут игнорироваться не понимающими их реализациями. Все такие расширения нужно стандартизовать через процесс IETF и они должны включаться в список extensions. Диспетчеры MUD должны игнорировать непонятные узлы YANG и следует создавать расширения, которые администратор может разрешить для предотвращения каких-либо несоответствий в правилах.

15. Вопросы внедрения

Поскольку MUD состоит из множества архитектурных блоков, можно применять различные варианты развёртывания. Одним из ключевых аспектов является место применения правил. Для защиты Вещи от других Вещей внутри локального развёртывания правила могут применяться на ближайшем коммутаторе или точке доступа. Для ограничения нежелательного трафика внутри сети целесообразно применять правила как можно ближе к Internet. В некоторых случаях применение правил на ближайшем этапе пересылки (hop) может оказаться невозможным. В этом случае повышается риск вторичного заражения (заражения устройств, расположенных близко одно к другому) возрастает для многих Вещей, которые могут взаимодействовать без защиты.

Предупреждение для некоторых классов. Включение Вещи в классы manufacturer и same-manufacturer может влиять на доступ к другим Вещам. Иными словами, такое включение может расширять список доступа на коммутаторах, соединённых с другими Вещами, в зависимости от управления доступом. Следует внимательно относиться к расширению списка доступа. Для сохранения разумных пределов расширения списка могут применяться дополнительные методы, такие как сегментация сети.

Поскольку на момент написания этого документа концепция MUD является новой, можно предположить, что на многих устройствах она ещё не реализована. Решение о предоставлении первому подключившемуся устройству широкого или ограниченного доступа остаётся за локальной системой. Кроме того, как отмечено во введении, при развёртывании может быть выбрано игнорирование политики MUD в целом и простое восприятие MUD URL как классификатора для применения в локальной политике.

Ниже приведены сведения о сроке действия и использовании доменных имён.

16. Вопросы безопасности

В зависимости от способа выдачи MUD URL Вещь может быть способна обманывать пользователя, получая дополнительный доступ в сеть. Это может выполняться разными способами при выдаче MUD URL через DHCP или LLDP. Например, неправомерное включение в класс (такой как same-manufacturer), будет давать доступ к устройствам, таким как my-controller, или к ресурсам Internet, который иначе был бы запрещён. Такие возможности зависят ото конкретного развёртывания. Реализации следует делать настраиваемыми для запрета дополнительного доступа к устройствам с использованием MUD URL, которые не выдаются защищённым путём, например, в сертификате. Реализациям не следует предоставлять расширенные разрешения (помимо предоставляемых устройствам без политики MUD) устройствам, которые не привязывают строго своё отождествление к передачам L2/L3. При использовании диспетчером MUD незащищённых методов, в классы не следует включать устройства, применяющие защищённые и незащищённые методы, чтобы предотвратить атаки с повышением полномочий, и недопустимо включать устройства с одним MUD URL, полученным с помощью строгих и слабых методов аутентификации.

Устройства могут подделывать сведения об источнике (L2/L3). При внедрении следует применять подобающие средства защиты для привязки взаимодействий к аутентификации. Для аутентификации 802.1X одним из средств является IEEE 802.1AE (MACsec) [IEEE8021AE]. Похожий подход может применяться с 802.11i (Wi-Fi Protected Access 2 (WPA2)) [IEEE80211i]. Для иных технологий нижнего уровня доступны другие варианты. Реализациям, применяющим ориентированный на сессии доступ без криптографической привязки, следует озаботиться удалением состояния при обнаружении разрыва сессии по любой причине.

Мошеннический удостоверяющий центр (certification authority или CA) может подписывать сертификаты с тем же именем субъекта, которое указано в поле MUDsigner сертификата изготовителя, разрешая, тем самым, подмену файла MUD для устройства. Имеется два способа смягчения таких угроз. Во-первых, смена подписывающей стороны может быть отмечена диспетчером MUD как особая ситуация. Во-вторых, при смене файла MUD диспетчеру MUD следует запрашивать разрешение у администратора (это следует делать в любом случае). При любых обстоятельствах диспетчер MUD должен поддерживать для этих целей кэш доверенных CA. При обнаружении мошенника его следует удалять. Дополнительные меры смягчения описаны ниже.

При отсутствии сертификатов Вещи, заявляющие принадлежность к конкретному производителю, не следует включать в группу этого производителя без той или иной проверки. Это актуально при использовании диспетчером MUD таких примитивов, как manufacturer, для доступа Вещей определённого типа. Системы управления сетью могут быть способны получать «отпечатки» (fingerprint) Вещей. В таких случаях MUD URL может служить классификатором для разрешения или запрета. Отпечатки могут давать и другие преимущества, например, при использовании сертификатов 802.1AR, которые сами не могут меняться и отпечатки позволяют добавить в MUDstring артефакты в форме резервного поля, описанного в разделе 10. Значение таких артефактов будут рассмотрено в последующих работах.

Диспетчерам MUD не следует воспринимать описание применения для Вещей с тем же MAC-адресом, который указывает смену полномочности (authority) URL, без дополнительной проверки (например, администратором сети). Новые Вещи, представляющие не проверенный на подлинность MUD URL, следует проверять тем или иным внешним способом, если они получают расширенный доступ в сеть.

Недобросовестный изготовитель может неправомерно применить анализатор файлов MUD, чтобы воспользоваться уязвимостью. Для борьбы с такими угрозами рекомендуется два подхода. Первый заключается в проверке того, что подписавшая файл MUD сторона известна и является доверенной для диспетчера MUD. Второй заключается в предварительном сканировании файла для проверки возможности его разбора и некого уровня правдоподобия. Файлы MUD вероятно будут относительно небольшими, чтобы сделать это. Числу ACE, используемых любой данной Вещью, следует также быть относительно небольшим. Полезно также может быть извлечение MUD URL лишь с известных файлов, имеющих достойную репутацию в web или домене.

При работе с URL требуется использовать доменные имена. Если имя владельца доменного имени меняется, новый владелец может предоставить файлы MUD, которые диспетчеры MUD сочтут действительными. Диспетчерам MUD следует кэшировать сертификаты, используемые сервером файлов MUD. При извлечении нового сертификата (по какой-либо причине) диспетчеру MUD следует проверить, не сменился ли владелец домена. Подходящим программным способом такой проверки является смена серверов доменных имён. Если фактический файл MUD изменён, диспетчер MUD может обратиться к базе данных WHOIS для просмотра сведений о владельце домена. Если произошли изменения или по каким-то причинам невозможно определить смену владельца, может потребоваться дополнительная проверка. Отметим, что в данном случае не рассматриваются ситуации, когда Вещь произведена достаточно давно, а в эксплуатацию введена недавно, или был установлен новый диспетчер MUD.

Публикация Вещью MUD URL раскрывает Вещь и даёт злоумышленникам представление о возможных уязвимостях. Хотя от MUD URL не требуется уникальность для конкретной Вещи, публикация URL в сочетании с другими сведениями может помочь наблюдателям идентифицировать людей. Для решения этих проблем разработчикам следует принимать во внимание дополнительные сведения, анонсируемые с помощью таких механизмов, как Multicast DNS (mDNS) [RFC67628], а также способы идентификации Вещи в иных случаях, возможно, по поведению при подключении к сети, предназначению Вещи для индивидуального использования или передачи персональных данных, и затем применять подходящие методы минимизации данных. Один из подходов заключается в применении TEAP [RFC7170] в качестве средства обмена информацией с полномочными компонентами сети. Элементы сети также могут помочь в ограничении доступа к MUD URL с помощью таких механизмов, как DHCPv6-Shield [RFC7610].

Существует опасность слежения за самим диспетчером MUD с целью определения подключённых к сети Вещей. Для снижения риска диспетчеры MUD могут применять доверенные TLS-прокси, которые будут агрегировать информацию.

Следует отметить, что соображения безопасности из параграфа 3.7 в [RFC8407] в этом случае неприменимы, поскольку сериализованная форма YANG не предназначена для доступа через NETCONF. Однако для тех, кто пытается внедрить эту модель в элемент сети про протоколу настройки сети (Network Configuration Protocol или NETCONF), все объекты в каждой модели, описанной в этом документе, обладают характеристики безопасности, аналогичными указанным в [RFC8519]. Основным назначением MUD является настройка доступа, что не позволяет использовать MUD для разрушительных действий неуполномоченных сторон.

17. Взаимодействия с IANA

17.1. Регистрация модулей YANG

Указанные ниже модули YANG включены в реестр YANG Module Names.

      Name: ietf-mud
      URN: urn:ietf:params:xml:ns:yang:ietf-mud
      Prefix: ietf-mud
      Registrant contact: The IESG
      Reference: RFC 8520

      Name: ietf-acldns
      URI: urn:ietf:params:xml:ns:yang:ietf-acldns
      Prefix: ietf-acldns
      Registrant contact: The IESG
      Reference: RFC 8520

17.2. Регистрация URI

Агентство IANA добавило в реестр IETF XML registry указанные ниже записи.

   URI: urn:ietf:params:xml:ns:yang:ietf-acldns
   Registrant Contact: The IESG.
   XML: N/A. Запрошенный URI является пространством имён XML.

   URI: urn:ietf:params:xml:ns:yang:ietf-mud
   Registrant Contact: The IESG.
   XML: N/A. Запрошенный URI является пространством имён XML.

17.3. Опции DHCPv4 и DHCPv6

Агентство IANA выделило значение OPTION_MUD_URL_V4 (161) в реестр Dynamic Host Configuration Protocol (DHCP) and Bootstrap Protocol (BOOTP) Parameters и OPTION_MUD_URL_V6 (112) в реестр Dynamic Host Configuration Protocol for IPv6 (DHCPv6), как описано в разделе 10.

17.4. Расширения PKIX

Агенство IANA выделило указанные ниже значения.

  • Модуль ASN.1 MUDURLExtnModule-2016 (88) в реестре SMI Security for PKIX Module Identifier (1.3.6.1.5.5.7.0).

  • Идентификатор объекта id-pe-mud-url (25) в реестре SMI Security for PKIX Certificate Extension (1.3.6.1.5.5.7.1).

  • Идентификатор объекта id-pe-mudsigner (30) в реестре SMI Security for PKIX Certificate Extension.

  • Идентификатор объекта id-ct-mudtype (41) в реестре SMI Security for S/MIME CMS Content Type.

Использование этих значений описано в разделе 11.

17.5. Регистрация типов носителей для файлов MUD

Для передачи фалов MUD задан указанный ниже тип носителя.

Имя типа: application.

Имя субтипа: mud+json.

Требуемые параметры: N/A.

Необязательные параметры: N/A.

Кодирование: 8 битов, значения application/mud+json представляются объектами JSON, должна применяться кодировка UTF-8 [RFC3629].

Вопросы безопасности: см. раздел «Вопросы безопасности» в RFC 8520 и раздел 12 в [RFC8259].

Вопросы функциональной совместимости: N/A

Опубликованная спецификация: RFC 8520

Приложения, использующие этот тип носителя: диспетчеры MUD, описанные в RFC 8520.

Вопросы идентификаторов фрагментов: N/A

Дополнительные сведения:

Magic number(s): N/A

Расширения файлов: N/A

Код типа файлов Macintosh: N/A

Контактные данные:

Eliot Lear <lear@cisco.com>, Ralph Droms <rdroms@gmail.com>,

Dan Romascanu <dromasca@gmail.com>

Предполагаемое использование: COMMON

Ограничения на использование: нет

Авторы:

Eliot Lear <lear@cisco.com>

Ralph Droms <rdroms@gmail.com>

Dan Romascanu <dromasca@gmail.com>

Контролёр изменений: IESG

Временная регистрация? (только для стандартных деревьев): нет.

17.6. Реестр IANA для субтипов LLDP TLV

Агентство IANA создало новый реестр IANA Link Layer Discovery Protocol (LLDP) TLV Subtypes в IEEE 802 Numbers с процедурой выделения значений Expert Review [RFC8126]. Максимальное число записей в реестре — 256. Исходное содержимое реестра указано ниже.

   Значение субтипа LLDP: 1 (остальные значения указаны как Unassigned) 
   Описание: ссылка MUD URL
   Документ: RFC 8520

17.7. Общеизвестное имя MUD URN

В соответствии с [RFC3553] добавлен указанный ниже реестр параметров.

      Имя реестра: MUD Well-Known Uniform9 Resource Name (URN)
      Спецификация: RFC 8520
      Репозиторий: https://www.iana.org/assignments/mud 
      Значение индекса: Кодируется аналогично именам служб для портов TCP/UDP
                        в соответствии с параграфом 5.1 в [RFC6335]

В реестр MUD Well-Known Uniform Resource Name (URN) добавлена указанная ниже запись.

   urn:ietf:params:mud:dns указывает службу, заданную [RFC1123], 
   urn:ietf:params:mud:ntp - службу, заданную [RFC5905].

17.8. Реестр расширений

Агентство IANA организовало указанный ниже реестр расширений.

      Имя реестра: MUD Extensions
      Процедура регистрации: Standards Action
      Документ: RFC 8520
      Имя расширения: строка UTF-8, не более 40 символов.

Само расширение должно следовать правилам, указанным в этой спецификации. IANA выдаёт упреждающие назначения в соответствии с [RFC7120].

18. Литература

18.1. Нормативные документы

[IEEE8021AB] IEEE, «IEEE Standard for Local and Metropolitan Area Networks— Station and Media Access Control Connectivity Discovery», IEEE 802.1AB.

[RFC1123] Braden, R., Ed., «Requirements for Internet Hosts — Application and Support», STD 3, RFC 1123, DOI 10.17487/RFC1123, October 1989, <https://www.rfc-editor.org/info/rfc1123>.

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC2131] Droms, R., «Dynamic Host Configuration Protocol», RFC 2131, DOI 10.17487/RFC2131, March 1997, <https://www.rfc-editor.org/info/rfc2131>.

[RFC2818] Rescorla, E., «HTTP Over TLS», RFC 2818, DOI 10.17487/RFC2818, May 2000, <https://www.rfc-editor.org/info/rfc2818>.

[RFC3629] Yergeau, F., «UTF-8, a transformation format of ISO 10646», STD 63, RFC 3629, DOI 10.17487/RFC3629, November 2003, <https://www.rfc-editor.org/info/rfc3629>.

[RFC3748] Aboba, B., Blunk, L., Vollbrecht, J., Carlson, J., and H. Levkowetz, Ed., «Extensible Authentication Protocol (EAP)», RFC 3748, DOI 10.17487/RFC3748, June 2004, <https://www.rfc-editor.org/info/rfc3748>.

[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, «Uniform Resource Identifier (URI): Generic Syntax», STD 66, RFC 3986, DOI 10.17487/RFC3986, January 2005, <https://www.rfc-editor.org/info/rfc3986>.

[RFC3987] Duerst, M. and M. Suignard, «Internationalized Resource Identifiers (IRIs)», RFC 3987, DOI 10.17487/RFC3987, January 2005, <https://www.rfc-editor.org/info/rfc3987>.

[RFC5234] Crocker, D., Ed. and P. Overell, «Augmented BNF for Syntax Specifications: ABNF», STD 68, RFC 5234, DOI 10.17487/RFC5234, January 2008, <https://www.rfc-editor.org/info/rfc5234>.

[RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., Housley, R., and W. Polk, «Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile», RFC 5280, DOI 10.17487/RFC5280, May 2008, <https://www.rfc-editor.org/info/rfc5280>.

[RFC5652] Housley, R., «Cryptographic Message Syntax (CMS)», STD 70, RFC 5652, DOI 10.17487/RFC5652, September 2009, <https://www.rfc-editor.org/info/rfc5652>.

[RFC5905] Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, «Network Time Protocol Version 4: Protocol and Algorithms Specification», RFC 5905, DOI 10.17487/RFC5905, June 2010, <https://www.rfc-editor.org/info/rfc5905>.

[RFC5912] Hoffman, P. and J. Schaad, «New ASN.1 Modules for the Public Key Infrastructure Using X.509 (PKIX)», RFC 5912, DOI 10.17487/RFC5912, June 2010, <https://www.rfc-editor.org/info/rfc5912>.

[RFC6268] Schaad, J. and S. Turner, «Additional New ASN.1 Modules for the Cryptographic Message Syntax (CMS) and the Public Key Infrastructure Using X.509 (PKIX)», RFC 6268, DOI 10.17487/RFC6268, July 2011, <https://www.rfc-editor.org/info/rfc6268>.

[RFC6335] Cotton, M., Eggert, L., Touch, J., Westerlund, M., and S. Cheshire, «Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Service Name and Transport Protocol Port Number Registry», BCP 165, RFC 6335, DOI 10.17487/RFC6335, August 2011, <https://www.rfc-editor.org/info/rfc6335>.

[RFC6991] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6991, DOI 10.17487/RFC6991, July 2013, <https://www.rfc-editor.org/info/rfc6991>.

[RFC7120] Cotton, M., «Early IANA Allocation of Standards Track Code Points», BCP 100, RFC 7120, DOI 10.17487/RFC7120, January 2014, <https://www.rfc-editor.org/info/rfc7120>.

[RFC7227] Hankins, D., Mrugalski, T., Siodelski, M., Jiang, S., and S. Krishnan, «Guidelines for Creating New DHCPv6 Options», BCP 187, RFC 7227, DOI 10.17487/RFC7227, May 2014, <https://www.rfc-editor.org/info/rfc7227>.

[RFC7230] Fielding, R., Ed. and J. Reschke, Ed., «Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing», RFC 7230, DOI 10.17487/RFC7230, June 2014, <https://www.rfc-editor.org/info/rfc7230>.

[RFC7231] Fielding, R., Ed. and J. Reschke, Ed., «Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content», RFC 7231, DOI 10.17487/RFC7231, June 2014, <https://www.rfc-editor.org/info/rfc7231>.

[RFC7610] Gont, F., Liu, W., and G. Van de Velde, «DHCPv6-Shield: Protecting against Rogue DHCPv6 Servers», BCP 199, RFC 7610, DOI 10.17487/RFC7610, August 2015, <https://www.rfc-editor.org/info/rfc7610>.

[RFC7950] Bjorklund, M., Ed., «The YANG 1.1 Data Modeling Language», RFC 7950, DOI 10.17487/RFC7950, August 2016, <https://www.rfc-editor.org/info/rfc7950>.

[RFC7951] Lhotka, L., «JSON Encoding of Data Modeled with YANG», RFC 7951, DOI 10.17487/RFC7951, August 2016, <https://www.rfc-editor.org/info/rfc7951>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8259] Bray, T., Ed., «The JavaScript Object Notation (JSON) Data Interchange Format», STD 90, RFC 8259, DOI 10.17487/RFC8259, December 2017, <https://www.rfc-editor.org/info/rfc8259>.

[RFC8340] Bjorklund, M. and L. Berger, Ed., «YANG Tree Diagrams», BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, <https://www.rfc-editor.org/info/rfc8340>.

[RFC8348] Bierman, A., Bjorklund, M., Dong, J., and D. Romascanu, «A YANG Data Model for Hardware Management», RFC 8348, DOI 10.17487/RFC8348, March 2018, <https://www.rfc-editor.org/info/rfc8348>.

[RFC8415] Mrugalski, T., Siodelski, M., Volz, B., Yourtchenko, A., Richardson, M., Jiang, S., Lemon, T., and T. Winters, «Dynamic Host Configuration Protocol for IPv6 (DHCPv6)», RFC 8415, DOI 10.17487/RFC8415, November 2018, <https://www.rfc-editor.org/info/rfc8415>.

[RFC8519] Jethanandani, M., Agarwal, S., Huang, L., and D. Blair, «YANG Data Model for Network Access Control Lists (ACLs)», RFC 8519, DOI 10.17487/RFC8519, March 2019, <https://www.rfc-editor.org/info/rfc8519>.

18.2. Дополнительная литература

[FW95] Chapman, D. and E. Zwicky, «Building Internet Firewalls», First Edition, November 1995.

[IEEE80211i] IEEE, «IEEE Standard for information technology — Telecommunications and information exchange between systems-Local and metropolitan area networks-Specific requirements — Part 11: Wireless LAN Medium Access Control (MAC) and Physical Layer (PHY) specifications: Amendment 6: Medium Access Control (MAC) Security Enhancements», IEEE 802.11i.

[IEEE8021AE] IEEE, «IEEE Standard for Local and metropolitan area networks-Media Access Control (MAC) Security», IEEE 802.1AE.

[IEEE8021AR] IEEE, «IEEE Standard for Local and metropolitan area networks — Secure Device Identity», IEEE 802.1AR.

[IEEE8021X] IEEE, «IEEE Standard for Local and metropolitan area networks—Port-Based Network Access Control», IEEE 802.1X.

[RFC1984] IAB and IESG, «IAB and IESG Statement on Cryptographic Technology and the Internet», BCP 200, RFC 1984, DOI 10.17487/RFC1984, August 1996, <https://www.rfc-editor.org/info/rfc1984>.

[RFC3553] Mealling, M., Masinter, L., Hardie, T., and G. Klyne, «ACK IETF URN Sub-namespace for Registered Protocol Parameters», BCP 73, RFC 3553, DOI 10.17487/RFC3553, June 2003, <https://www.rfc-editor.org/info/rfc3553>.

[RFC6092] Woodyatt, J., Ed., «Recommended Simple Security Capabilities in Customer Premises Equipment (CPE) for Providing Residential IPv6 Internet Service», RFC 6092, DOI 10.17487/RFC6092, January 2011, <https://www.rfc-editor.org/info/rfc6092>.

[RFC6762] Cheshire, S. and M. Krochmal, «Multicast DNS», RFC 6762, DOI 10.17487/RFC6762, February 2013, <https://www.rfc-editor.org/info/rfc6762>

[RFC7042] Eastlake 3rd, D. and J. Abley, «IANA Considerations and IETF Protocol and Documentation Usage for IEEE 802 Parameters», BCP 141, RFC 7042, DOI 10.17487/RFC7042, October 2013, <https://www.rfc-editor.org/info/rfc7042>.

[RFC7170] Zhou, H., Cam-Winget, N., Salowey, J., and S. Hanna, «Tunnel Extensible Authentication Protocol (TEAP) Version 1», RFC 7170, DOI 10.17487/RFC7170, May 2014, <https://www.rfc-editor.org/info/rfc7170>.

[RFC7252] Shelby, Z., Hartke, K., and C. Bormann, «The Constrained Application Protocol (CoAP)», RFC 7252, DOI 10.17487/RFC7252, June 2014, <https://www.rfc-editor.org/info/rfc7252>.

[RFC7452] Tschofenig, H., Arkko, J., Thaler, D., and D. McPherson, «Architectural Considerations in Smart Object Networking», RFC 7452, DOI 10.17487/RFC7452, March 2015, <https://www.rfc-editor.org/info/rfc7452>.

[RFC7488] Boucadair, M., Penno, R., Wing, D., Patil, P., and T. Reddy, «Port Control Protocol (PCP) Server Selection», RFC 7488, DOI 10.17487/RFC7488, March 2015, <https://www.rfc-editor.org/info/rfc7488>.

[RFC8126] Cotton, M., Leiba, B., and T. Narten, «Guidelines for Writing an IANA Considerations Section in RFCs», BCP 26, RFC 8126, DOI 10.17487/RFC8126, June 2017, <https://www.rfc-editor.org/info/rfc8126>.

[RFC8343] Bjorklund, M., «A YANG Data Model for Interface Management», RFC 8343, DOI 10.17487/RFC8343, March 2018, <https://www.rfc-editor.org/info/rfc8343>.

[RFC8407] Bierman, A., «Guidelines for Authors and Reviewers of Documents Containing YANG Data Models», BCP 216, RFC 8407, DOI 10.17487/RFC8407, October 2018, <https://www.rfc-editor.org/info/rfc8407>.

Приложение A. Принятые по умолчанию узлы MUD

Ниже показана часть файла MUD, разрешающая трафик DNS к контроллеру, зарегистрированному с URN urn:ietf:params:mud:dns, и трафик NTP к контроллеру, зарегистрированному с urn:ietf:params:mud:ntp. Это считается принятым по умолчанию поведением и ACE фактически добавляются к другим записям ace в файле MUD. Для блокирования DNS или NTP повторяется оператор сопоставления с заменой при пересылке (forwarding) действия accept на drop. Поскольку ACE обрабатываются в порядке получения, принятые по умолчанию значения не будут достигнуты. Диспетчер MUD может выполнить дополнительную оптимизацию, просто не включая принятые по умолчанию значения, если они переопределены.

Ниже приведены 4 записи списка acl, реализующие принятые по умолчанию узлы MUD, две для IPv4 и две для IPv6 (по одной для каждого направления в обеих версиях IP). Отметим, что имя списка доступа и имя ace не требуется сохранять или как-то применять в реализациях, они указаны лишь для полноты.

    "ietf-access-control-list:acls": {
       "acl": [
         {
           "name": "mud-59776-v4to",
           "type": "ipv4-acl-type",
           "aces": {
             "ace": [
               {
                 "name": "ent0-todev",
                 "matches": {
                   "ietf-mud:mud": {
                     "controller": "urn:ietf:params:mud:dns"
                   },
                   "ipv4": {
                     "protocol": 17
                   },
                   "udp": {
                     "source-port": {
                       "operator": "eq",
                       "port": 53
                     }
                   }
                 },
                 "actions": {
                   "forwarding": "accept"
                 }
               },
               {
                 "name": "ent1-todev",
                 "matches": {
                   "ietf-mud:mud": {
                     "controller": "urn:ietf:params:mud:ntp"
                   },
                   "ipv4": {
                     "protocol": 17
                   },
                   "udp": {
                     "source-port": {
                       "operator": "eq",
                       "port": 123
                     }
                   }
                 },
                 "actions": {
                   "forwarding": "accept"
                 }
               }
             ]
           }
         },
         {
           "name": "mud-59776-v4fr",
           "type": "ipv4-acl-type",
           "aces": {
             "ace": [
               {
                 "name": "ent0-frdev",
                 "matches": {
                   "ietf-mud:mud": {
                     "controller": "urn:ietf:params:mud:dns"
                   },
                   "ipv4": {
                     "protocol": 17
                   },
                   "udp": {
                     "destination-port": {
                       "operator": "eq",
                       "port": 53
                     }
                   }
                 },
                 "actions": {
                   "forwarding": "accept"
                 }
               },
               {
                 "name": "ent1-frdev",
                 "matches": {
                   "ietf-mud:mud": {
                     "controller": "urn:ietf:params:mud:ntp"
                   },
                   "ipv4": {
                     "protocol": 17
                   },
                   "udp": {
                     "destination-port": {
                       "operator": "eq",
                       "port": 123
                     }
                   }
                 },
                 "actions": {
                   "forwarding": "accept"
                 }
               }
             ]
           }
         },
         {
           "name": "mud-59776-v6to",
           "type": "ipv6-acl-type",
           "aces": {
             "ace": [
               {
                 "name": "ent0-todev",
                 "matches": {
                   "ietf-mud:mud": {
                     "controller": "urn:ietf:params:mud:dns"
                   },
                   "ipv6": {
                     "protocol": 17
                   },
                   "udp": {
                     "source-port": {
                       "operator": "eq",
                       "port": 53
                     }
                   }
                 },
                 "actions": {
                   "forwarding": "accept"
                 }
               },
               {
                 "name": "ent1-todev",
                 "matches": {
                   "ietf-mud:mud": {
                     "controller": "urn:ietf:params:mud:ntp"
                   },
                   "ipv6": {
                     "protocol": 17
                   },
                   "udp": {
                     "source-port": {
                       "operator": "eq",
                       "port": 123
                     }
                   }
                 },
                 "actions": {
                   "forwarding": "accept"
                 }
               }
             ]
           }
         },
         {
           "name": "mud-59776-v6fr",
           "type": "ipv6-acl-type",
           "aces": {
             "ace": [
               {
                 "name": "ent0-frdev",
                 "matches": {
                   "ietf-mud:mud": {
                     "controller": "urn:ietf:params:mud:dns"
                   },
                   "ipv6": {
                     "protocol": 17
                   },
                   "udp": {
                     "destination-port": {
                       "operator": "eq",
                       "port": 53
                     }
                   }
                 },
                 "actions": {
                   "forwarding": "accept"
                 }
               },
               {
                 "name": "ent1-frdev",
                 "matches": {
                   "ietf-mud:mud": {
                     "controller": "urn:ietf:params:mud:ntp"
                   },
                   "ipv6": {
                     "protocol": 17
                   },
                   "udp": {
                     "destination-port": {
                       "operator": "eq",
                       "port": 123
                     }
                   }
                 },
                 "actions": {
                   "forwarding": "accept"
                 }
               }
             ]
           }
         }
       ]
     }

Приложение B. Пример расширения DETNET-indicator

В этом примере базовая модель MUD дополняется для индикации устройством реализации DETNET. Если устройство заявляет, что оно не использует DETNET, а затем пытается применить его, может генерироваться уведомление или особый случай. Пример предназначен лишь для иллюстрации.

Имя расширения: Example-Extension (для использования в списке расширений).

Стандарт: RFC 8520 (без регистрации примера).

Это расширение дополняет модель MUD, включая один узел с использованием приведённого ниже модуля с деревом

   module: ietf-mud-detext-example
     augment /ietf-mud:mud:
       +--rw is-detnet-required?   boolean

Модель приведена ниже.

   <CODE BEGINS>file "ietf-mud-detext-example@2019-01-28.yang"
   module ietf-mud-detext-example {
     yang-version 1.1;
     namespace "urn:ietf:params:xml:ns:yang:ietf-mud-detext-example";
     prefix ietf-mud-detext-example;

     import ietf-mud {
       prefix ietf-mud;
     }

     organization
       "IETF OPSAWG (Operations and Management Area Working Group)";
     contact
       "WG Web: <https://datatracker.ietf.org/wg/opsawg/> 
        WG List: opsawg@ietf.org 

        Author: Eliot Lear
                lear@cisco.com 

        Author: Ralph Droms
                rdroms@gmail.com 

        Author: Dan Romascanu
                dromasca@gmail.com 
       ";
     description
       "Пример расширения модуля MUD для индикации поддержки DETNET.";

     revision 2019-01-28 {
       description
         "Исходный выпуск.";
       reference
         "RFC 8520: Manufacturer Usage Description Specification";
     }

     augment "/ietf-mud:mud" {
       description
         "Добавление простого расширения для указания производителем 
          необходимости DETNET.";
       leaf is-detnet-required {
         type boolean;
         description
           "Значение true указывает необходимость поддержки DETNET
            для корректной работы.";
       }
     }
   }
   <CODE ENDS>

При использовании показанного выше примера расширение будет выражаться в показанной ниже форме.

   {
     "ietf-mud:mud": {
       "mud-version": 1,
       "mud-url": "https://lighting.example.com/lightbulb2000",
       "last-update": "2019-01-28T11:20:51+01:00",
       "cache-validity": 48,
       "extensions": [
           "ietf-mud-detext-example"
        ],
       "ietf-mud-detext-example:is-detnet-required": "false",
       "is-supported": true,
       "systeminfo": "The BMS Example Light Bulb",
       "from-device-policy": {
         "access-lists": {
           "access-list": [
             {
               "name": "mud-76100-v6fr"
             }
           ]
         }
       },
       "to-device-policy": {
         "access-lists": {
           "access-list": [
             {
               "name": "mud-76100-v6to"
             }
           ]
         }
       }
     },
     "ietf-access-control-list:acls": {
       "acl": [
         {
           "name": "mud-76100-v6to",
           "type": "ipv6-acl-type",
           "aces": {
             "ace": [
               {
                 "name": "cl0-todev",
                 "matches": {
                   "ipv6": {
                     "ietf-acldns:src-dnsname": "test.example.com",
                     "protocol": 6
                   },
                   "tcp": {
                     "ietf-mud:direction-initiated": "from-device",
                     "source-port": {
                       "operator": "eq",
                       "port": 443
                     }
                   }
                 },
                 "actions": {
                   "forwarding": "accept"
                 }
               }
             ]
           }
         },
         {
           "name": "mud-76100-v6fr",
           "type": "ipv6-acl-type",
           "aces": {
             "ace": [
               {
                 "name": "cl0-frdev",
                 "matches": {
                   "ipv6": {
                     "ietf-acldns:dst-dnsname": "test.example.com",
                     "protocol": 6
                   },
                   "tcp": {
                     "ietf-mud:direction-initiated": "from-device",
                     "destination-port": {
                       "operator": "eq",
                       "port": 443
                     }
                   }
                 },
                 "actions": {
                   "forwarding": "accept"
                 }
               }
             ]
           }
         }
       ]
     }
   }

Благодарности

Авторы признательны Einar Nilsen-Nygaard, в одиночку обновившему модель в соответствии с обновлённой моделью ACL, а также Bernie Volz, Tom Gindin, Brian Weis, Sandeep Kumar, Thorsten Dahm, John Bashinski, Steve Rich, Jim Bieda, Dan Wing, Joe Clarke, Henk Birkholz, Adam Montville, Jim Schaad, Robert Sparks за ценные советы и рецензии. Russ Housley полностью переписал раздел 11, сделав модуль полноценным. Adrian Farrel предоставил основу для рассмотрения вопросов приватности, Kent Watsen — обзор архитектуры и модель YANG. Ответственность за ошибки в данной работе полностью принимают на себя авторы.

Адреса авторов

Eliot Lear
Cisco Systems
Richtistrasse 7
Wallisellen CH-8304
Switzerland
Phone: +41 44 878 9200
Email: lear@cisco.com
 
Ralph Droms
Google
355 Main St., 5th Floor
Cambridge, MA 02142
United States of America
Phone: +1 978 376 3731
Email: rdroms@gmail.com
 
Dan Romascanu
Phone: +972 54 5555347
Email: dromasca@gmail.com

Перевод на русский язык

nmalykh@protokols.ru


1Link Layer Discovery Protocol — протокол обнаружения на канальном уровне.

2Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

3Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

4В оригинале ошибочно указано flobbidy.example.com, см. https://www.rfc-editor.org/errata/eid6295. Прим. перев.

5В оригинале ошибочно указано service.bms.example.com, см. https://www.rfc-editor.org/errata/eid7173. Прим. перев.

6Type-Length-Value — тип, размер, значение.

7Management Information Base — база сведений для управления.

8В оригинале ошибочно указано RFC6872, см. https://www.rfc-editor.org/errata/eid5702. Прим. перев.

9В оригинале ошибочно указано Universal, см. https://www.rfc-editor.org/errata/eid5664. Прим. перев.

Рубрика: RFC | Оставить комментарий

RFC 8526 NETCONF Extensions to Support the Network Management Datastore Architecture

Internet Engineering Task Force (IETF)                      M. Bjorklund
Request for Comments: 8526                                Tail-f Systems
Updates: 6241, 7950                                     J. Schoenwaelder
Category: Standards Track                              Jacobs University
ISSN: 2070-1721                                                P. Shafer
                                                        Juniper Networks
                                                               K. Watsen
                                                         Watsen Networks
                                                               R. Wilton
                                                           Cisco Systems
                                                              March 2019

NETCONF Extensions to Support the Network Management Datastore Architecture

Расширения NETCONF для поддержки архитектуры хранилищ управления сетью

PDF

Аннотация

Этот документ расширяет протокол настройки сети (Network Configuration Protocol или NETCONF), определённый в RFC 6241, для поддержки архитектуры хранилищ данных управления сетью (Network Management Datastore Architecture или NMDA), определённой в RFC 8342.

Документ обновляет RFC 6241 и RFC 7950. Обновление RFC 6241 добавляет операции <get-data> и <edit-data>, а также обновляет имеющиеся операции <lock>, <unlock> и <validate>. Обновление RFC 7950 требует использования библиотеки YANG (описана в RFC 8525) серверами NETCONF, реализующими NMDA.

Статус документа

Документ относится к категории Internet Standards Track.

Документ является результатом работы IETF1 и представляет согласованный взгляд сообщества IETF. Документ прошёл открытое обсуждение и был одобрен для публикации IESG2. Дополнительную информацию о стандартах Internet можно найти в разделе 2 в RFC 7841.

Информацию о текущем статусе документа, ошибках и способах обратной связи можно найти по ссылке https://www.rfc-editor.org/info/rfc8526.

Авторские права

Авторские права (Copyright (c) 2019) принадлежат IETF Trust и лицам, указанным в качестве авторов документа. Все права защищены.

К документу применимы права и ограничения, указанные в BCP 78 и IETF Trust Legal Provisions и относящиеся к документам IETF (http://trustee.ietf.org/license-info), на момент публикации данного документа. Прочтите упомянутые документы внимательно. Фрагменты программного кода, включённые в этот документ, распространяются в соответствии с упрощённой лицензией BSD, как указано в параграфе 4.e документа IETF Trust Legal Provisions, без каких-либо гарантий (как указано в Simplified BSD License).

1. Введение

Этот документ расширяет протокол NETCONF [RFC6241] для поддержки архитектуры хранилищ данных (Network Management Datastore Architecture или NMDA), определённой в[RFC8342].

Документ обновляет [RFC6241] для поддержки взаимодействия клиентов NETCONF со всеми хранилищами данных, поддерживаемыми серверами, реализующими NMDA. Обновление добавляет операции <get-data> и <edit-data> и дополняет имеющиеся операции <lock>, <unlock> и <validate>.

Документ также обновляет [RFC7950] для поддержки клиентами NETCONF обнаружения хранилищ данных, поддерживающих серверами NETCONF, и определения модулей, которые поддерживаются в каждом хранилище. Это требует от серверов NETCONF, реализующих NMDA, поддержки библиотеки YANG [RFC8525].

1.1. Терминология

В этом документе используется терминология, определённая в NMDA [RFC8342]. Термин «идентификатор содержимого библиотеки YANG» (YANG library content identifier) определён в [RFC8525].

Ключевые слова необходимо (MUST), недопустимо (MUST NOT), требуется (REQUIRED), нужно (SHALL), не следует (SHALL NOT), следует (SHOULD), не нужно (SHOULD NOT), рекомендуется (RECOMMENDED), не рекомендуется (NOT RECOMMENDED), возможно (MAY), необязательно (OPTIONAL) в данном документе интерпретируются в соответствии с BCP 14 [RFC2119] [RFC8174] тогда и только тогда, когда они выделены шрифтом, как показано здесь.

1.2. Диаграммы деревьев

Диаграммы деревьев в этом документе используют обозначения из [RFC8340].

2. Хранилище и требования к библиотеке YANG

Поддерживающий NMDA сервер NETCONF должен реализовать модуль ietf-netconf-nmda, определённый в этом документе, должен поддерживать хранилище рабочего состояния (operational) и должен реализовать последний выпуск (2019-01-04) модуля ietf-yang-library, определённого в [RFC8525].

Клиент NETCONF может раскрыть поддерживаемые сервером хранилища и модули YANG путём чтения данных библиотеки YANG из хранилища данных рабочего состояния.

Сервер должен анонсировать в своём сообщении <hello> указанные ниже возможности (перевод строки и пробелы используются лишь для форматирования).

     urn:ietf:params:netconf:capability:yang-library:1.1?
       revision=<date>&content-id=<content-id-value>

Параметр revision имеет такое же значение как дата выпуска модуля ietf-yang-library, реализуемого сервером. Этот параметр должен присутствовать.

Параметр content-id содержит идентификатор содержимого библиотеки YANG [RFC8525]. Этот параметр должен присутствовать.

С помощью этого механизма клиент может кэшировать поддерживаемые сервером хранилища и модули YANG и обновлять кэш лишь при смене значения content-id в сообщении <hello>.

Этот документ обновляет параграф 5.6.4 [RFC7950], чтобы позволить серверам анонсировать возможность :yang-library:1.1 вместо :yang-library:1.0 и реализовать субдерево /yang-library [RFC8525] взамен /modules-state.

3. Расширения NETCONF

В этом разделе описаны расширения NETCONF, требуемые для поддержки NMDA. Эти расширения определены в новом модуле YANG ietf-netconf-nmda [RFC7950].

Изменения включают использование исходных и целевых параметров на основе отождествления datastore, определённого в модуле ietf-datastores [RFC8342]. Применения отождествления позволят вносить расширения, которые не разрешала исходная стратегия на основе выбора (например, <get-config> и <edit-config>).

3.1. Новые операции NETCONF

В этом документе определены операции <get-data> и <edit-data> для поддержки NMDA. Операции похожи на <get-config> и <edit-config>, но могут работать с расширяемыми наборами хранилищ.

3.1.1. Операция <get-data>

Операция <get-data> извлекает данные из указанного хранилища NMDA. Операция похожа на NETCONF <get-config>, определённую в [RFC6241], но позволяет более гибко указывать исходное хранилище данных.

   +---x get-data
      +---w input
      |  +---w datastore                      ds:datastore-ref
      |  +---w (filter-spec)?
      |  |  +--:(subtree-filter)
      |  |  |  +---w subtree-filter?          <anydata>
      |  |  +--:(xpath-filter)
      |  |     +---w xpath-filter?            yang:xpath1.0 {nc:xpath}?
      |  +---w config-filter?                 boolean
      |  +---w (origin-filters)? {origin}?
      |  |  +--:(origin-filter)
      |  |  |  +---w origin-filter*           or:origin-ref
      |  |  +--:(negated-origin-filter)
      |  |     +---w negated-origin-filter*   or:origin-ref
      |  +---w max-depth?                     union
      |  +---w with-origin?                   empty {origin}?
      |  +---w with-defaults?                 with-defaults-mode
      +--ro output
         +--ro data?   <anydata>

Параметр datastore указывает хранилище для извлечения искомых данных. Это отождествление datastore.

Операция <get-data> принимает содержимое параметра фильтрации, подобно параметру filter в <get-config>, но использует явные узлы для фильтрации субдерева (subtree-filter) и фильтрацию XPath (xpath-filter).

Параметр config-filter может служить для извлечения лишь узлов config true или config false.

Параметр origin-filter, которые может указываться неоднократно, выбирает совпадающие узлы или узлы, выведенные из любого данного значения. Параметр negated-origin-filter, которые может указываться несколько раз, выбирает совпадающие узлы или узлы, выведенные из любого данного значения. Параметры origin-filter и negated-origin-filter не могут применяться совместно.

Параметр max-depth может применяться клиентом для ограничения числа уровней субдерева, возвращаемых в отклике.

3.1.1.1. Аннотация метаданных origin

Операция <get-data> определяет параметр with-origin, наличие которого запрашивает у сервера включение аннотации метаданных metadata в свой отклик, как задано в NMDA. Этот параметр действителен лишь для хранилища данных рабочего состояния и других хранилищ с отождествлениями, выведенными из operational. В противном случае возвращается ошибка, если указано не подходящее хранилище данных , как определено в модуле ietf-netconf-nmda (раздел 4). Отметим, что аннотации метаданных origin не включаются в отклик, пока клиент явно не запрашивает их.

Данные в хранилище рабочего состояния могут поступать из разных источников. Серверу следует возвращать значение аннотации метаданных origin, наиболее точно указывающее источник рабочего значения, как указано в параграфе 5.3.4 [RFC8342].

При кодировании аннотации метаданных origin для иерархии возвращаемых узлов, аннотация может пропускаться для дочерних узлов, когда значение соответствует родительскому узлу, как описано в модуле YANG ietf-origin [RFC8342].

Поддержка параметра with-origin необязательна. Параметр идентифицируется свойством origin.

3.1.1.2. Взаимодействия with-defaults

Если сервер поддерживает свойство with-defaults, параметр with-defaults, определённый в [RFC6243], поддерживается для операций <get-data>, нацеленных на унаследованные хранилища конфигурации.

Поддержка параметра with-defaults необязательна для операций <get-data> с целью <operational>. Связанная возможность для указания поддержки сервером идентифицируется URI

     urn:ietf:params:netconf:capability:with-operational-defaults:1.0

Если параметр with-defaults поддерживается для операций <get-data> над хранилищем <operational>, все режимы извлечения, заданные в параметре basic-mode или also-supported со свойством with-defaults, будут разрешены. Поведение параметра with-defaults для хранилища <operational> описано ниже.

  • Если параметр with-defaults не задан или имеет значение explicit, report-all или report-all-tagged, значения in use, как указано в параграфе 5.3 [RFC8342], возвращаются из хранилища рабочего состояния, даже если узел имеет оператор default в модуле YANG и это принятое по умолчанию значение используется сервером. Если для параметра with-defaults установлено значение report-all-tagged, любые значения, соответствующие принятым в схеме по умолчанию, помещаются дополнительными метаданными, как указано в параграфе 3.4 [RFC6243].

  • Если для параметра with-defaults установлено значение trim, возвращаются все значения in use, за исключением фильтруемых на выходе для исключения всех значений, которые соответствуют принятым по умолчанию в схеме YANG.

Поддержку with-defaults в операциях <get-data> на любых хранилищах данных, не определённых в [RFC8342], следует определять в спецификациях хранилищ данных.

3.1.1.3. Пример нахождения полного субдерева из хранилища <running>

Ниже приведён пример, показывающий вариант <get-data> примера <get-config> из параграфа 7.1 в [RFC6241] с выбором всего субдерева /users.

   <rpc message-id="101"
        xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <get-data xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-nmda"
               xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores">
       <datastore>ds:running</datastore>
       <subtree-filter>
         <top xmlns="http://example.com/schema/1.2/config">
           <users/>
         </top>
       </subtree-filter>
     </get-data>
   </rpc>

   <rpc-reply message-id="101"
        xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <data xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-nmda">
       <top xmlns="http://example.com/schema/1.2/config">
         <users>
           <user>
             <name>root</name>
             <type>superuser</type>
             <full-name>Charlie Root</full-name>
             <company-info>
               <dept>1</dept>
               <id>1</id>
             </company-info>
           </user>
           <!-- Здесь указываются дополнительные элементы <user> ... -->
         </users>
       </top>
     </data>
   </rpc-reply>
3.1.1.4. Пример нахождения фильтрованного субдерева из хранилища <operational>

Ниже приведён пример, показывающий использование origin-filter для извлечения узлов из хранилища <operational>. В примере используются синтезированная модель данных из приложения C к [RFC8342].

   <rpc message-id="102"
        xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <get-data xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-nmda"
               xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores"
               xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin">
       <datastore>ds:operational</datastore>
       <subtree-filter>
         <bgp xmlns="http://example.com/ns/bgp"/>
       </subtree-filter>
       <origin-filter>or:intended</origin-filter>
       <origin-filter>or:system</origin-filter>
       <with-origin/>
     </get-data>
   </rpc>

   <rpc-reply message-id="102"
       xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <data xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-nmda">
       <bgp xmlns="http://example.com/ns/bgp"
            xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin"
            or:origin="or:intended">
         <peer>
           <name>2001:db8::2:3</name>
           <local-port or:origin="or:system">60794</local-port>
           <state>established</state>
         </peer>
       </bgp>
     </data>
   </rpc-reply>

Чтобы не извлекать узлы данных состояния системы можно применить фильтр config-filter.

   <rpc message-id="103"
        xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <get-data xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-nmda"
               xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores"
               xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin">
       <datastore>ds:operational</datastore>
       <subtree-filter>
         <bgp xmlns="http://example.com/ns/bgp"/>
       </subtree-filter>
       <config-filter>true</config-filter>
       <origin-filter>or:intended</origin-filter>
       <origin-filter>or:system</origin-filter>
       <with-origin/>
     </get-data>
   </rpc>

   <rpc-reply message-id="103"
              xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <data xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-nmda">
       <bgp xmlns="http://example.com/ns/bgp"
            xmlns:or="urn:ietf:params:xml:ns:yang:ietf-origin"
            or:origin="or:intended">
         <peer>
           <name>2001:db8::2:3</name>
           <local-port or:origin="or:system">60794</local-port>
         </peer>
       </bgp>
     </data>
   </rpc-reply>

3.1.2. Операция <edit-data>

Операция <edit-data> меняет содержимое доступного для записи хранилища, подобно операции <edit-config>, определённой в [RFC6241], но с большей гибкостью в именовании целевого хранилища данных. Если операция <edit-data> вызывается для хранилища без возможности записи, возвращается ошибка, как указано в модуле ietf-netconf-nmda (см. раздел 4).

   +---x edit-data
      +---w input
         +---w datastore            ds:datastore-ref
         +---w default-operation?   enumeration
         +---w (edit-content)
            +--:(config)
            |  +---w config?        <anydata>
            +--:(url)
               +---w url?           inet:uri {nc:url}?

Параметр datastore является отождествлением datastore, указывающим желаемое целевое хранилище, куда следует внести изменения.

Параметр default-operation задаёт используемую по умолчанию информацию. Он является копией параметра default-operation операции <edit-config>.

Параметр edit-content задаёт содержимое операции редактирования. Он отражает выбор edit-content операции <edit-config>. Отметим однако, что элемент config в выборе edit-content операции <edit-data> использует anydata (введён в YANG 1.1 [RFC7950]), тогда как элемент config в выборе edit-content операции <edit-config> использует anyxml.

Операция <edit-data> не поддерживает параметры error-option и test-option, которые были частью операции <edit-config>. Поведение <edit-data> при ошибках соответствует значению rollback-on-error в параметре error-option.

Если сервер поддерживает свойство with-defaults, семантика режимов редактирования такая же как для операции <edit-config>, описанной в параграфе 4.5.2 [RFC6243].

Семантику with-defaults в операциях <edit-data> на любом нетрадиционном хранилище данных конфигурации следует задавать в спецификации хранилища данных.

3.1.2.1. Пример установки листа на интерфейсе в хранилище <running>

Ниже приведён вариант <edit-data> для первого примера <edit-config> из параграфа 7.2 в [RFC6241]. Здесь установлено MTU = 1500 на интерфейсе Ethernet0/0 в хранилище рабочей конфигурации (running).

   <rpc message-id="103"
        xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <edit-data xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-nmda"
                xmlns:ds="urn:ietf:params:xml:ns:yang:ietf-datastores">
       <datastore>ds:running</datastore>
       <config>
         <top xmlns="http://example.com/schema/1.2/config">
           <interface>
             <name>Ethernet0/0</name>
             <mtu>1500</mtu>
           </interface>
         </top>
       </config>
     </edit-data>
   </rpc>

   <rpc-reply message-id="103"
        xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
     <ok/>
   </rpc-reply>

Другие примеры <edit-config> из параграфа 7.2 в [RFC6241] можно преобразовать в <edit-data> аналогичным путём.

3.2. Дополнения операций NETCONF

Некоторые из операций, определённых в базовом модуле NETCONF YANG ietf-netconf [RFC6241], можно использовать с новыми хранилищами данных. Операции <lock>, <unlock> и <validate> дополнены листом datastore, которы позволяет выбрать желаемое хранилище. Если операция <lock>, <unlock>, <validate> не поддерживается конкретным хранилищем данных, возвращается ошибка, как указано в модуле ietf-netconf-nmda (раздел 4).

4. Модуль YANG хранилищ NETCONF

Этот модуль импортирует определения из [RFC6991], [RFC6241], [RFC6243], [RFC8342].

   <CODE BEGINS> file "ietf-netconf-nmda@2019-01-07.yang"

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

     import ietf-yang-types {
       prefix yang;
       reference
         "RFC 6991: Common YANG Data Types";
     }
     import ietf-inet-types {
       prefix inet;
       reference
         "RFC 6991: Common YANG Data Types";
     }
     import ietf-datastores {
       prefix ds;
       reference
         "RFC 8342: Network Management Datastore Architecture
                    (NMDA)";
     }
     import ietf-origin {
       prefix or;
       reference
         "RFC 8342: Network Management Datastore Architecture
                    (NMDA)";
     }
     import ietf-netconf {
       prefix nc;
       reference
         "RFC 6241: Network Configuration Protocol (NETCONF)";
     }
     import ietf-netconf-with-defaults {
       prefix ncwd;
       reference
         "RFC 6243: With-defaults Capability for NETCONF";
     }

     organization
       "IETF NETCONF Working Group";

     contact
       "WG Web:   <https://datatracker.ietf.org/wg/netconf/> 

        WG List:  <mailto:netconf@ietf.org> 

        Author:   Martin Bjorklund
                  <mailto:mbj@tail-f.com> 

        Author:   Juergen Schoenwaelder
                  <mailto:j.schoenwaelder@jacobs-university.de> 

        Author:   Phil Shafer
                  <mailto:phil@juniper.net> 

        Author:   Kent Watsen
                  <mailto:kent+ietf@watsen.net> 

        Author:   Robert Wilton
                  <mailto:rwilton@cisco.com>"; 
     description
       "Этот модуль YANG определяет набор операций NETCONF для поддержки
        архитектуры хранилищ данных управления сетью (NMDA).

        Ключевые слова MUST (ДОЛЖНО), MUST NOT (НЕДОПУСТИМО), REQUIRED
        (ТРЕБУЕТСЯ), SHALL (НУЖНО), SHALLNOT (НЕ НУЖНО), SHOULD (СЛЕДУЕТ, 
        SHOULD NOT (НЕ СЛЕДУЕТ), RECOMMENDED (РЕКОМЕДУЕТСЯ), NOT RECOMMENDED
        (НЕ РЕКОМЕНДУЕТСЯ), MAY (МОЖНО), OPTIONAL (НЕОБЯЗАТЕЛЬНО) в этом 
        документе трактуются в соответствии с BCP 14 (RFC 2119) (RFC 8174)
        тогда и только тогда, когда они выделены шрифтом, как показано здесь.

        Авторские права (Copyright (c) 2019) принадлежат IETF Trust и лицам,
        указанным как авторы. Все права защищены.

        Распространение и использование в исходной или двоичной форме в
        изменениями или без таковых разрешено в соответствии с условиями,
        указанными в Simplified BSD License раздела 4.c IETF Trust's Legal 
        Provisions применительно к документам IETF
        (https://trustee.ietf.org/license-info). 

        Эта версия модуля является частью RFC 8526, где правовые аспекты
        изложены более полно.";

     revision 2019-01-07 {
       description
         "Исходный выпуск.";
       reference
         "RFC 8526: NETCONF Extensions to Support the Network Management
                    Datastore Architecture";
     }

     feature origin {
       description
         "Указывает, что сервер поддерживает аннотации origin.";
       reference
         "RFC 8342: Network Management Datastore Architecture (NMDA)";
     }

     feature with-defaults {
       description
         "Свойство NETCONF :with-defaults. Если сервер анонсирует свойство
          :with-defaults для сессии, эта функция должна быть включена в
          сессии. В ином случае включение функции недопустимо.";
       reference
         "RFC 6243: With-defaults Capability for NETCONF, Section 4; and
          RFC 8526: NETCONF Extensions to Support the Network Management
                    Datastore Architecture, Section 3.1.1.2";
     }

     rpc get-data {
       description
         "Извлечение данных из хранилища NMDA. Содержимое, возвращаемое
          get-data, должно соответствовать всем фильтра (AND для фильтров).

          Все узлы-предки (включая ключи списков), выбранные фильтрами, 
          включаются в отклик.

          Параметр with-origin действителен лишь для рабочего (operational)
          хранилища. Если with-origin используется с непригодным хранилищем,
          сервер ДОЛЖЕН возвращать элемент <rpc-error> с <error-tag> =
          invalid-value.

          Параметр with-defaults применяется к рабочему хранилищу, если 
          анонсируется NETCONF со свойствами :with-defaults и
          :with-operational-defaults. Если параметр with-defaults
          присутствует в запросе, для которого он не поддерживается, сервер
          ДОЛЖЕН возвращать элемент <rpc-error> с <error-tag> =
          invalid-value.";
       input {
         leaf datastore {
           type ds:datastore-ref;
           mandatory true;
           description
             "Хранилище, из которого извлекаются данные.

              Если сервер не поддерживает хранилище, он ДОЛЖЕН возвращать
              элемент <rpc-error> с <error-tag> = invalid-value.";
         }
         choice filter-spec {
           description
             "Спецификация фильтра содержимого для запроса.";
           anydata subtree-filter {
             description
               "Указывает части целевого хранилища для извлечения.";
             reference
               "RFC 6241: Network Configuration Protocol (NETCONF),
                          Section 6";
           }
           leaf xpath-filter {
             if-feature "nc:xpath";
             type yang:xpath1.0;
             description
               "Выражение XPath, указывающее часть хранилища для извлечения.

                Если выражение возвращает node-set, все узлы набора 
                выбираются фильтром. В противном случае, операция 
                <get-data> завершается отказом.

                Выражение оценивается в приведённом ниже контексте XPath.

                  o  Набор объявлений пространств имён в области действия
                     листа xpath-filter.

                  o  Пустой набор привязок переменных.

                  o  Библиотекой функций служит библиотека ядра и функции
                     XPath, заданные в разделе 10 RFC 7950.

                  o  Узлом контекста является корневой узел целевого хранилища.";
           }
         }
         leaf config-filter {
           type boolean;
           description
             "Фильтр для узлов с данным значением свойства config. При
              значении true выбираются лишь узлы config true, при значении
              false — только config false. При отсутствии этого листа 
              узлы не фильтруются.";
         }
         choice origin-filters {
           when 'derived-from-or-self(datastore, "ds:operational")';
           if-feature "origin";
           description
             "Фильтрация узлов конфигурации по аннотации origin. Узлы
              конфигурации без аннотации origin, считаются имеющими 
              аннотацию origin со значением or:unknown.

              Узлы состояния системы не обрабатываются origin-filters. 
              Эти узлы могут фильтроваться листом config-filter.";

           leaf-list origin-filter {
             type or:origin-ref;
             description
               "Фильтр по аннотации origin. Узел конфигурации соответствует
                фильтру, если его аннотация origin совпадает или выводится
                из заданных значений фильтра.";
           }
           leaf-list negated-origin-filter {
             type or:origin-ref;
             description
               "Фильтр по аннотации origin. Узел конфигурации соответствует
                фильтру, если его аннотация origin не совпадает и не 
                выводится из заданных значений фильтра.";
           }
         }
         leaf max-depth {
           type union {
             type uint16 {
               range "1..65535";
             }
             type enumeration {
               enum unbounded {
                 description
                   "Включаются все узлы-наследники.";
               }
             }
           }
           default "unbounded";
           description
             "Для каждого узла, выбранного фильтрами, этот параметр указывает,
              сколько уровней концептуального субдерева следует возвращать в
              отклике. Если задана глубина 1, отклик включает лишь выбранные
              узлы без потомков. При неограниченной (unbounded) глубине
              включаются все узлы-наследники.";
         }
         leaf with-origin {
           when 'derived-from-or-self(../datastore, "ds:operational")';
           if-feature "origin";
           type empty;
           description
             "При наличии этого параметра сервер будет возвращать аннотацию
              origin для имеющих её узлов.";
         }
         uses ncwd:with-defaults-parameters {
           if-feature "with-defaults";
         }
       }
       output {
         anydata data {
           description
             "Копирование подмножества исходного хранилища, соответствующего
              критериям фильтра (при наличии). Пустой контейнер данных 
              указывает, что запрос не возвращает каких-либо результатов.";
         }
       }
     }

     rpc edit-data {
       description
         "Редактирование данных в хранилище NMDA.

          При возникновении ошибки, такой как генерация элемента
          <rpc-error>, сервер будет прерывать обработку операции
          <edit-data> и восстанавливать для указанной конфигурации
          её полное состояние на момент запуска <edit-data>.";
       input {
         leaf datastore {
           type ds:datastore-ref;
           mandatory true;
           description
             "Хранилище для выполнения операции <edit-data>.

              Если запись в целевое хранилище невозможна или не
              поддерживается сервером, сервер ДОЛЖЕН возвращать 
              элемент <rpc-error> с <error-tag> = invalid-value.";
         }
         leaf default-operation {
           type enumeration {
             enum merge {
               description
                 "По умолчанию выполняется операция слияния.";
             }
             enum replace {
               description
                 "По умолчанию выполняется операция замены.";
             }
             enum none {
               description
                 "Операция по умолчанию не задана.";
             }
           }
           default "merge";
           description
             "Используемая по умолчанию операция.";
         }
         choice edit-content {
           mandatory true;
           description
             "Содержимое для операции редактирования.";
           anydata config {
             description
               "Встроенное содержимое конфигурации.";
           }
           leaf url {
             if-feature "nc:url";
             type inet:uri;
             description
               "URL содержимого конфигурации.";
           }
         }
       }
     }

     /*
      * Дополнение параметра datastore к операциям <lock> и <unlock>.
      */

     augment "/nc:lock/nc:input/nc:target/nc:config-target" {
       description
         "Добавление хранилища NMDA в качестве цели.";
       leaf datastore {
         type ds:datastore-ref;
         description
           "Хранилище данных для операции lock.

            Операция <lock> поддерживается лишь для хранилищ с
            возможностью записи.

            Если сервер не поддерживает операцию <lock> на заданном
            целевом хранилище, он ДОЛЖЕН возвращать элемент
            <rpc-error> с <error-tag> = invalid-value.";
       }
     }

     augment "/nc:unlock/nc:input/nc:target/nc:config-target" {
       description
         "Добавление хранилища NMDA в качестве цели.";
       leaf datastore {
         type ds:datastore-ref;
         description
           "Хранилище данных для операции unlock.

            Операция <unlock> поддерживается лишь для хранилищ с
            возможностью записи.

            Если сервер не поддерживает операцию <unlock> на заданном
            целевом хранилище, он ДОЛЖЕН возвращать элемент
            <rpc-error> с <error-tag> = invalid-value.";
       }
     }

     /* Дополнение параметра datastore к операции <validate>. */

     augment "/nc:validate/nc:input/nc:source/nc:config-source" {
       description
         "Добавление хранилища NMDA в качестве источника.";
       leaf datastore {
         type ds:datastore-ref;
         description
           "Хранилище данных для проверки.

            Операция <validate> поддерживается лишь на хранилищах
            конфигурации.

            Если сервер не поддерживает операцию <validate> на
            указанном целевом хранилище, он ДОЛЖЕН возвращать
            элемент <rpc-error> с <error-tag> = invalid-value.";
       }
     }
   }

   <CODE ENDS>

5. Взаимодействие с IANA

Этот документ регистрирует два URN идентификаторов возможностей в реестре Network Configuration Protocol (NETCONF) Capability URNs.

Индекс

Идентификатор возможности

:yang-library:1.1

urn:ietf:params:netconf:capability:yang-library:1.1

:with-operational-defaults

urn:ietf:params:netconf:capability:with-operational-defaults:1.0

Документ регистрирует URI в реестре IETF XML Registry [RFC3688] в соответствии с форматом RFC 3688.

     URI: urn:ietf:params:xml:ns:yang:ietf-netconf-nmda
     Registrant Contact: The IESG.
     XML: N/A, the requested URI is an XML namespace.

Документ регистрирует модуль YANG в реестре YANG Module Names [RFC6020].

     name:         ietf-netconf-nmda
     namespace:    urn:ietf:params:xml:ns:yang:ietf-netconf-nmda
     prefix:       ncds
     reference:    RFC 8526

6. Вопросы безопасности

Определённый здесь модуль YANG расширяет базовые операции протокола NETCONF [RFC6241]. Нижним уровнем NETCONF является защищённый транспортный уровень с обязательной реализацией защищённого транспорта Secure Shell (SSH) [RFC6242].

Модель управления доступом к конфигурации сети (Network Configuration Access Control Model или NACM) [RFC8341] обеспечивает способы ограничения доступа конкретным пользователям NETCONF к предопределённому набору доступных операций и содержимого протокола NETCONF.

Вопросы безопасности базовых операций протокола NETCONF (раздел 9 в [RFC6241]) применимы и к новым операциям NETCONF <get-data> и <edit-data>, определенным в этом документе.

7. Литература

7.1. Нормативные документы

[RFC2119] Bradner, S., «Key words for use in RFCs to Indicate Requirement Levels», BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <https://www.rfc-editor.org/info/rfc2119>.

[RFC3688] Mealling, M., «The IETF XML Registry», BCP 81, RFC 3688, DOI 10.17487/RFC3688, January 2004, <https://www.rfc-editor.org/info/rfc3688>.

[RFC6020] Bjorklund, M., Ed., «YANG — A Data Modeling Language for the Network Configuration Protocol (NETCONF)», RFC 6020, DOI 10.17487/RFC6020, October 2010, <https://www.rfc-editor.org/info/rfc6020>.

[RFC6241] Enns, R., Ed., Bjorklund, M., Ed., Schoenwaelder, J., Ed., and A. Bierman, Ed., «Network Configuration Protocol (NETCONF)», RFC 6241, DOI 10.17487/RFC6241, June 2011, <https://www.rfc-editor.org/info/rfc6241>.

[RFC6242] Wasserman, M., «Using the NETCONF Protocol over Secure Shell (SSH)», RFC 6242, DOI 10.17487/RFC6242, June 2011, <https://www.rfc-editor.org/info/rfc6242>.

[RFC6243] Bierman, A. and B. Lengyel, «With-defaults Capability for NETCONF», RFC 6243, DOI 10.17487/RFC6243, June 2011, <https://www.rfc-editor.org/info/rfc6243>.

[RFC6991] Schoenwaelder, J., Ed., «Common YANG Data Types», RFC 6991, DOI 10.17487/RFC6991, July 2013, <https://www.rfc-editor.org/info/rfc6991>.

[RFC7950] Bjorklund, M., Ed., «The YANG 1.1 Data Modeling Language», RFC 7950, DOI 10.17487/RFC7950, August 2016, <https://www.rfc-editor.org/info/rfc7950>.

[RFC8174] Leiba, B., «Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words», BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8341] Bierman, A. and M. Bjorklund, «Network Configuration Access Control Model», STD 91, RFC 8341, DOI 10.17487/RFC8341, March 2018, <https://www.rfc-editor.org/info/rfc8341>.

[RFC8342] Bjorklund, M., Schoenwaelder, J., Shafer, P., Watsen, K., and R. Wilton, «Network Management Datastore Architecture (NMDA)», RFC 8342, DOI 10.17487/RFC8342, March 2018, <https://www.rfc-editor.org/info/rfc8342>.

[RFC8525] Bierman, A., Bjorklund, M., Schoenwaelder, J., Watsen, K., and R. Wilton, «YANG Library», RFC 8525, DOI 10.17487/RFC8525, March 2019, <https://www.rfc-editor.org/info/rfc8525>.

7.2. Дополнительная литература

[RFC8340] Bjorklund, M. and L. Berger, Ed., «YANG Tree Diagrams», BCP 215, RFC 8340, DOI 10.17487/RFC8340, March 2018, <https://www.rfc-editor.org/info/rfc8340>.

Адреса авторов

Martin Bjorklund
Tail-f Systems
Email: mbj@tail-f.com
 
Juergen Schoenwaelder
Jacobs University
Email: j.schoenwaelder@jacobs-university.de
 
Phil Shafer
Juniper Networks
Email: phil@juniper.net
 
Kent Watsen
Watsen Networks
Email: kent+ietf@watsen.net
 
Robert Wilton
Cisco Systems
Email: rwilton@cisco.com

Перевод на русский язык

Николай Малых

nmalykh@protokols.ru

1Internet Engineering Task Force — комиссия по решению инженерных задач Internet.

2Internet Engineering Steering Group — комиссия по инженерным разработкам Internet.

Рубрика: RFC, Мониторинг и управление | Оставить комментарий