Coding, Network: API и методы работы с ним (SOAP, REST, JSON, XML, YAML, YANG, TOML, protocol buffers/Apache Thrift, graphQL; SWAGGER, WSDL, WADL; restconf, netconf; Cisco PXGRID)

  • В общем про api и методы взаимодействия с ними (soap, rest, yang, soap, xml, json, restconf/netconf, etc) в отдельной статье
  • О применении разных современных протоколов и инструментов для мониторинга отдельная статья
  • Использование json в разных языках php, ruby

Пример почему API это нужно и важно – большая часть современных Security продуктов Cisco имеют API (ISE, FirePower, Stealthwatch, AMP, CloudLock, DUO) для поддержки мониторинга/конфигурации с использованием API.

 

 

 

SOAP

SOAP (Simple Object Access Protocol) – очень много использовался раньше и до сих пор можно встретить в “старых” приложениях, изначально разработан Microsoft. SOAP для своей работы использует XML, который в свою очередь определяется XML схемой. Спецификация SOAP. SOAP и REST используются HTTP protocol как транспорт. SOAP был создан для замены старых решений на основе DCOM и CORBA.

Simple Object Access Protocol (SOAP): This standards-based web services access protocol was originally developed by Microsoft and has been used by numerous legacy applications for many years. SOAP exclusively uses XML to provide API services.

Soap exlusively uses XML to provide API services. XML- based specifications are governed by XML Schema Definition (XSD) documents. SOAP was created to replace older solutions such as the Distributed Component Object Model (DCOM) and Common Object Request Broker Architecture (CORBA).
 
YAML & JSON

Общая практика: json для машин, yaml для людей

 

REST (json)

REST (restful) API проще использовать в сравнении с SOAP. Самый популярный сейчас способ работы с API и по сути industry standard для взаимодействия application to application. В том числе сетевом облорудовании – Cisco, Mellanox (ниже), Arista (EOS API). Считается проще и более гибким в сравнении с SOAP.

rest (restful) apis used in many implementations nowadays.

Вместо XML используется JSON. SOAP и REST используются HTTP protocol как транспорт. Representational State Transfer (REST): This API standard is easier to use than SOAP. It uses JSON instead of XML, and it uses standards such as Swagger and the OpenAPI Specification (https://www.openapis.org) for ease of documentation and to encourage adoption.

Swagger (OpenAPI): Swagger is a modern framework of API documentation and development that is the basis of the OpenAPI Specification (OAS).

JSON появился позже XML, но во многом заменил его т.к. он проще и быстрее. XML требует больше ресурсов и его сложнее использовать для представления данных. JSON изначально “родился” из JavaScript – использовался для взаимодействия между программами на JavaScript и серверами на Java, но в последующем (после упрощения и “стандартизации”) начал применяться в разных языках.

JSON интересен тем, что не имеет версии и это считается плюсом – он не поменяется и на него можно всегда полагаться.

JSON используется даже в сетевом оборудовании – у Mellanox помимо CLI (странно похожего на Cisco IOS ;)) есть json api, в который можно делать запросы с командами. В том числе для запросов, которые обрабатываются долго, есть вариант запроса с json в варианте async – отправляешь запрос, тебе возвращается job id, потом по этому job id ты можешь получить с устройства результат. Блеск.

{ "commands": [ "show 1/1", "show 1/2" ] }

{ "execution_type":"async", "cmd": "show 1/1" }

Asynchronous requests will return immediately after sending the request with a reply containing a “job_id” key. The user can use the given job ID to later query for request status and execution results. Queries for asynchronous request results are guaranteed to be accessible up to 60 seconds after the request has been completed.

{"execution_type":"async",
"commands": ["interface ib 1/1 description test description",
"show interfaces ib 1/1 status"]}

{
"executed_command": "",
"status": "OK",
"status_message": "",
"data": "",
"job_id": "91329386"
}

curl -b /tmp/cookie -X GET "https://10.10.10.10/admin/
launch?script=json&job_id=91329386"

{
"results": [
{
"status": "OK",
"executed_command": "interface ib 1/1 description test description",
"status_message": "",
"data": ""
},
{
"status": "OK",
"executed_command": "show interfaces ib 1/1 status",
"status_message": "",
"data": {
"IB1/1": [
{
"Description": "test description",
"Speed": "fdr",
"Logical port state": "Initialize",
"Physical port state": "LinkUp",
"Current line rate": "56.0 Gbps",
"IB Subnet": "infiniband-default"
}
]
}
}
]
}

 

 

 

 

 

GRAphql

GraphQL – популярный в современных приложениях/дашбордах, но не в сетевом оборудовании язык разметки.

GraphQL is a query language for APIs that provides many developer tools. GraphQL is now used for many mobile applications and online dashboards.

Protocol Buffers

Wiki

Protocol Buffers — протокол сериализации (передачи) структурированных данных, предложенный Google как эффективная бинарная альтернатива текстовому формату XML. Разработчики сообщают, что Protocol Buffers проще, компактнее и быстрее, чем XML, поскольку осуществляется передача бинарных данных, оптимизированных под минимальный размер сообщения.

По заявлениям Google, Protocol Buffers по сравнению с XML:

  • проще;
  • от 3 до 10 раз меньше;
  • от 20 до 100 раз быстрее;
  • более однозначный;
  • позволяет создавать классы, которые в дальнейшем легче использовать программно.

Protocol Buffers не предназначен для чтения пользователем и представляет собой двоичный формат. Для десериализации данных необходим отдельный .proto-файл, в котором определяется формат сообщения.

 

YANG
  • YANG описан в RFC 6020
  • Спецификация, описанная на YANG часто называется YANG module, а набор YANG module называют yang set или YANG model
  • В NETCONF и RESTCONF реализациях YANG
    • контроллером YANG выступает client (по сути NMA, Network Management Application)
    • сервером YANG выступает сервер/сетевое устройство (управляемое устройство, например роутер/свич)

YANG – признанный лидер для замещения snmp как языка, представляющего данные (tail-f). Имеет разные преимущества – читаемость человеком, версионность, иерархичность, etc.

Примеры того, что клиент может сделать, используя разные YANG module (по сути все то, что зачастую делается с использованием snmp и скриптов).
  • Конфигурация – напр. включение протокола маршрутизации на устройстве
  • Получение нотификаций – уведомления безопасности по превышению количества попыток аутентификации, падение интерфейсов и проч
  • Мониторинг – получение информации о загрузке CPU/памяти, счетчиках
  • Действия – сброс счетчиков, перезагрузка системы, сохранение конфига и проч.

- Configure: for example, enabling a routing protocol on a particular interface
- Receive notifications: an example of notification can be repeated login failures, interface failures, and so on
- Monitor status: for example, retrieving information about CPU and memory utilization, packet counters, and so on
- Invoke actions: for instance, resetting packet counter, rebooting the system, and so on
YANG модель устройства часто называют schema. Эта schema выполняет роль аналогичную xml schema (snmp mib) – определяет структуру и содержимое между приложением и устройством.
The YANG model of a device is often called a “schema” defining the structure and content of messages exchanged between the application and the device.
YANG язык предоставляет гибкость и масштабируемость которая не представлена в других языках:
  • Когда вы создаете новую YANG model, вы можете использовать иерархии данных из других модулей
  • Yang модель может легко масштабироваться – язык позволяет создавать новые параметры
When you create new YANG modules, you can leverage the data hierarchies defined in other modules.

YANG also permits new statements to be defined, allowing the language itself to be expanded in a consistent way.
 
 

 

 

NETCONF
Netconf is defined in RFCs 6241 and 6242.
Netconf was created to overcome the challenges in legacy Simple Network Management Protocol (SNMP) implementations.
  • Важным фактом является то, что NETCONF придуман до YANG. Поэтому другие языки (напр. XML) использовались для работы NETCONF ранее. Сейчас по факту работа NETCONF широко поддерживается с использованием YANG.
  • На сайте devnet есть sandbox’ы Cisco образов, с которыми можно попрактиковаться для работы с netconf (да и в целом с кучей других вещей)

  • ncclient – open source python библиотека для netconf
  • scrapli_netconf – еще одна open source python библиотека для netconf, лучше Ncclient тем, что async
pip3 install ncclient
pip3 install scrapli_netconf

NETCONF протокол реализует возможность CRUD работы с сетевыми устройствами.

NETCONF provides a mechanism to install, manipulate, and delete the configuration of network devices. It uses an ((по факту так же и YANG см. выше)) Extensible Markup Language (XML)-based data encoding for the configuration data as well as the protocol messages. NETCONF uses a simple Remote Procedure Call (RPC) based mechanism to facilitate communication between a client and a server.
- The first step is to enable NETCONF on the Cisco IOS XE device
- The second and final step is set the subscription between the collector and the device, along with the subscripton type (either cadence or on-change) and eventually the cadence frequency.
В архитектуре NETCONF есть клиент (по сути Network management application) и сервер (управляемое устройство, например роутер/свич).
 
Так же между клиентом и сервером может быть промежуточное устройство в виде NETCONF контроллера. Он выступает по сути прокси/релей сервером. Насколько понимаю, возможность работы через прокси сделана для легкой масштабирования решения и в случае проблем с сетевым доступом от основного NETCONF клиента к какой то локации из серверов. NETCONF контроллер:
    • Для клиентов (NMA, Network Management Application) он работает как сервер
    • Для серверов (сетевых устройств) он работает как клиент
 
Установка сессии управления между клиентом и сервером состоит из ряда последовательных XML/YANG сообщений (описаны в RFC), отправляемых поверх канала ssh (по умолчанию порт 830, не 22), поэтому для python ncclient  в зависимых библиотеках paramiko:
  1. клиент отправляет hello с указанием поддерживаемой версии NETCONF
  2. сервер отправляет hello с указанием поддерживаемой версии NETCONF и  поддерживаемыми «capabilities»
 
 

 

RESTCONF
  • Многие администраторы хотели реализацию функционала netconf поверх REST API (используя http протокол и его методы для взаимодействия с сетевым устройством) – в итоге появился такой вариант в виде RESTCONF
  • Описан он в RFC 8040
  • Сейчас поддерживается на многих сетевых устройствах
Many network administrators wanted to have the capabilities of netconf over “REST”. This is why a REST-based variant of NETCONF (RESTCONF) was created. Defined in RFC 8040.
Принцип взаимодействия клиента и сервера аналогичен NETCONF. Так же есть возможность создать контроллер (уровневая модель).
 
Различия NETCONF и RESTCONF:
  • RESTCONF требует от сервера частичного сохранения состояния клиента.
  • Любой запрос, который отправляет RESTCONF client исполняется на сервере сразу. Невозможно отправить несколько связных транзакций – эта фича NETCONF не поддерживается.
RESTCONF requires the server to keep some client state. Any request the RESTCONF client sends is acted upon by the server immediately. You cannot send any transactions that span multiple RESTCONF messages.

 

deckofcards

Тренировка использования api.

SWAGGER, WSDL, WADL

SWAGGER – framework API документации, основа OpenAPI спецификации. Помимо Swagger так же есть еще WSDL и WADL.

- Swagger (OpenAPI): Swagger is a modern framework of API documentation and development that is the basis of the OpenAPI Specification (OAS).

- Web Services Description Language (WSDL) documents: WSDL is an XML-based language that is used to document the functionality of a web service.

- Web Application Description Language (WADL) documents: WADL is an XML-based language for describing web applications.
 
PxGRID, threat response API 
  • У Cisco есть threat response API – для интеграции security продуктов Cisco с системами других вендоров. По сути pxGrid для решения задачи ИБ. В итоге ускоряется процесс реагирования на инциденты. Для ознакомления с этим api на devnet есть несколько лаб.
  • Legacy версия pxGrid поддерживала XMPP для взаимодействия – реализация старая и имела множество недостатков
    • published-subscribe model (pub/sub) модель требовала модификации всех XML сообщений между клиентом и сервером
    • серверная часть XMPP изначально создана для пользовательских чатов, а не взаимодействия machine to machine (MtM) or application to application (может требоваться передача большого количества сообщений долгое время)
  • Current версия pxGrid поддерживает REST/websocket (industry standard) для взаимодействия
    • websocket – обеспечивает двунаправленную передачу данных быстро и масштабируемо, так же websocket используется для pub/sub
    • rest – предоставляет сервисы API (подробнее выше), сообщения кодируются json
  • Cisco на git выложила примеры rest/websocket работы с pxGrid на java/go/python

Cisco pxGrid (Cisco Platform Exchange GRID) – технология для кросс-платформенной интеграции продуктов Cisco (напр. Cisco ISE) с решениями других вендоров (security monitoring, threat detection systems, network policy systems, SIEM, etc). Использование pxGrid в общем случае позволяет увеличить видимость и ускорить реагирование на инциденты. pxGrid предоставляет унифицированный метод публикации и подписки к соответствующему контексту тулзам разных вендоров. Обмен информацией может происходить как однонаправленно, так и двунаправленно.
Cisco pxGrid provides a unified ecosystem to integrate multivendor tools to exchange information either unidirectionally or bidirectionally.

Integrate your security products
With Cisco pxGrid (Platform Exchange Grid), your multiple security products can now share data and work together. This open, scalable, and IETF standards-driven platform helps you automate security to get answers and contain threats faster.
На скрине два pxGrid сервера/контроллера взаимодействуют с нодами. Ноды взаимодействуют с pxGrid сервером не напрямую, они делают программные вызовы к Grid Client Library (GCL), которая в свою очередь подключается и уже взаимодействует с pxGrid сервером. В базовых сценариях деплоймент может быть несколько нод pxGrid, но в крупных enterprise их могут быть тысячи.
 
 
Существует два типа pxGrid клиентов:
  • pxGrid service consumer – потребитель сервиса, должен аутентифицироваться клиентским сертификатом на сервере (более безопасно, рекомендуемый Cisco способ) или с использованием username/password (менее безопасно)
  • pxGrid service provider – хостер сервиса
The are two different types of pxgrid clients: a pxgrid service consumer and a pxgrid service provider.
You can generate passwords via the pxgrid account create API, however, certificate-based SSL authentication is far more secure and is the recommended way to authenticate pxgrid clients.
 
Все pxGrid клиенты должны активировать аккаунт через запросы к rest API серверу на pxGrid сервере пока сообщение “enabled” не будет получено от сервера.
Pxgrid clients poll on this REST API call until a “enabled” message is received from the server.
pxGrid service provider регистрирует/удаляет сервисы в service api и предоставляет/обновляет необходимые URL по которым сервисы доступны для pxGrid service customers/clients. 
Service providers use the Register/Unregister Service APIs to provide and update the necessary URLs from which their sevices are accessible for other pxgrid clients.
Все pxGrid service customers/clients используют service lookup api для динамического обнаружения всех доступных сервисов провайдера и их местоположения (URL). pxGrid клиенты после этого могут выполнять REST операции через service query/subscribe api или устанавливать websocket связь для получения информации.
All pxgrid clients use the service lookup api to dynamically discover all available provider services and their locations.
Pxgrid clients can then perform rest-based queries (via the service query/subscribe api) or build websocket connections to receive information.
 
 

 

Leave a Reply