ГлавнаяАкадемияCOURSE-16: Основы Интернета Вещей и практическое применение → Безопасность и управление данными в облаке: Практическое руководство для платформы HI

Безопасность и управление данными в облаке: Практическое руководство для платформы HI

Урок · COURSE-16: Основы Интернета Вещей и практическое применение · theory

COURSE-16-M04-L01 — Безопасность и управление данными в облаке: Практическое руководство для платформы HI

Введение в облачную безопасность для IoT

Облачные платформы являются ключевым элементом масштабируемых IoT-систем, предоставляя практически неограниченные ресурсы для хранения, обработки и анализа данных. Контроллер HI выступает в роли "edge" устройства — он собирает данные с датчиков и отправляет их в облако, а также получает команды из облака для управления исполнительными устройствами.

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

Модель угроз: что может пойти не так?

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

Фундаментальные принципы защиты данных на платформе HI

Для защиты облачного канала связи на платформе HI применяется многоуровневый подход, основанный на трех столпах: шифрование, аутентификация и авторизация. Мы рассмотрим их на примере наиболее распространенного протокола для IoT — MQTT.

1. Шифрование канала передачи данных (Encryption in Transit)

Задача: Сделать данные нечитаемыми для любого, кто их перехватит. Решение: Использование протокола TLS (Transport Layer Security) поверх стандартного MQTT.

💡 Практика на HI: При настройке узла `mqtt out` в Node-RED необходимо всегда использовать порт 8883 и включать опцию "Enable secure (SSL/TLS) connection". Для этого потребуется настроить TLS-конфигурацию, указав путь к сертификату CA (Центра Сертификации), который подтверждает подлинность облачного сервера.

2. Аутентификация: кто вы? (Authentication)

Задача: Убедиться, что к облачному брокеру подключается именно наш, доверенный контроллер HI, а не устройство злоумышленника. Решение: Использование клиентских сертификатов (Client-Side Certificates).

Хотя аутентификация по логину и паролю возможна, она менее безопасна. Пароль может быть перехвачен, подобран или скомпрометирован. Гораздо более надежный метод — использование уникальной пары "сертификат + приватный ключ" для каждого контроллера.

Как это работает:
  • Для каждого контроллера HI генерируется уникальная пара: `client.key` (секретный ключ) и `client.crt` (публичный сертификат).
  • Секретный ключ `client.key` надежно хранится на контроллере (например, в `/etc/nodered/certs/`) и никогда его не покидает.
  • Публичный сертификат `client.crt` загружается в облачный сервис и привязывается к "личности" контроллера.
  • При подключении контроллер предоставляет свой сертификат. Облачный брокер проверяет, что он подписан доверенным центром (CA) и соответствует загруженному ранее.
  • 💡 Практика на HI: В настройках TLS узла `mqtt out` в Node-RED необходимо указать пути к трем файлам на файловой системе контроллера:

    3. Авторизация: что вам можно делать? (Authorization)

    Задача: Ограничить права аутентифицированного контроллера, чтобы даже в случае его компрометации ущерб был минимальным. Решение: Настройка списков контроля доступа (ACL — Access Control Lists) на стороне MQTT-брокера.

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

    Пример ACL для контроллера с ID `HI-CTRL-OFFICE-042`:

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

    Практическая реализация: безопасная отправка данных в облако

    Рассмотрим полный цикл безопасной отправки данных с датчика температуры на контроллере HI в облачный MQTT-брокер.

    Сценарий: `SCN-CLOUD-001` — Безопасная передача телеметрии. Flow: `FLOW-CLOUD-TEMP-001` ASCII-схема потока в Node-RED:
               +---------------------+    +--------------------------+    +----------------------+
    

    [Inject] -> | ds18b20 (1-Wire In) | -> | Function: Validate/Format| -> | mqtt out (MQTTS) |

    (раз в 60с) +---------------------+ +--------------------------+ +----------------------+

    | (on error)

    v

    +---------------------+ +--------------------------+

    | Catch | -> | Function: Format Error | -> [Log to MySQL]

    +---------------------+ +--------------------------+

    Шаг 1: Чтение данных с датчика

    Используется стандартный узел для чтения датчика 1-Wire, подключенного к универсальному входу контроллера.

    Шаг 2: Валидация и форматирование (узел `Function`)

    Этот узел реализует паттерн "Контракт сообщения" и выполняет первичную обработку.

    // Код для узла "Function: Validate/Format"
    

    // ID потока: FLOW-CLOUD-TEMP-001

    // 1. Получаем и валидируем сырое значение

    const temp = parseFloat(msg.payload);

    if (isNaN(temp) || temp < -55 || temp > 125) {

    node.status({fill:"red", shape:"dot", text:"Invalid reading: " + msg.payload});

    node.error("Некорректное значение температуры: " + msg.payload, msg);

    return null; // Останавливаем поток

    }

    // 2. Формируем сообщение по стандарту "Контракт сообщения"

    msg.payload = {

    value: temp,

    source: "28-01234567abcd", // Уникальный ID датчика 1-Wire

    ts: Date.now(),

    unit: "°C"

    };

    // 3. Устанавливаем топик для отправки в облако согласно ACL

    // Предполагаем, что ID контроллера хранится в переменной окружения

    const controllerId = env.get("CONTROLLER_ID") || "HI-CTRL-UNKNOWN";

    msg.topic = `telemetry/${controllerId}/temperature/room1`;

    node.status({fill:"green", shape:"dot", text:"OK: " + temp + " °C"});

    return msg;

    Шаг 3: Безопасная отправка (узел `mqtt out`)

    Это самый важный узел в данной схеме.

    * `CA Certificate`: `/etc/nodered/certs/ca.pem`

    * `Client Certificate`: `/etc/nodered/certs/HI-CTRL-OFFICE-042.crt`

    * `Client Key`: `/etc/nodered/certs/HI-CTRL-OFFICE-042.key`

    Управление жизненным циклом данных на стороне контроллера

    Отправлять все сырые данные в облако — дорого и неэффективно. Контроллер HI должен выполнять предварительную обработку и агрегацию.

    ---

    Лабораторные работы

    COURSE-16-M04-LAB01 — Настройка небезопасного MQTT-канала

    Цель: Научиться отправлять данные с контроллера на MQTT-брокер по открытому каналу и убедиться в его уязвимости. Оборудование: Контроллер HI, ПК с MQTT-клиентом (например, MQTT Explorer). Ход работы:
  • Разверните на ПК или в локальной сети публичный MQTT-брокер (например, Mosquitto) без TLS и аутентификации (порт 1883).
  • Создайте в Node-RED на контроллере HI поток, который раз в 5 секунд отправляет случайное число в топик `insecure/test`.
  • Настройте узел `mqtt out` для подключения к вашему брокеру по порту 1883 без TLS.
  • С помощью MQTT Explorer на ПК подпишитесь на топик `insecure/#` и убедитесь, что вы видите сообщения от контроллера.
  • Опубликуйте из MQTT Explorer сообщение в тот же топик. Убедитесь, что вы можете "подделать" данные.
  • Рубрика оценивания:

    COURSE-16-M04-LAB02 — Внедрение безопасного канала MQTTS с аутентификацией

    Цель: Защитить канал передачи данных с помощью TLS и клиентских сертификатов. Оборудование: Контроллер HI, ПК с настроенным Mosquitto, OpenSSL. Ход работы:
  • С помощью OpenSSL создайте самоподписанный Центр Сертификации (CA), сертификат сервера для брокера и клиентский сертификат для контроллера HI.
  • Настройте Mosquitto для работы по порту 8883 с использованием TLS, требуя обязательную аутентификацию по клиентскому сертификату.
  • Скопируйте файлы `ca.pem`, `client.crt` и `client.key` на контроллер HI в директорию `/home/hi_admin/certs/`.
  • В потоке из LAB01 измените настройки узла `mqtt out`: укажите порт 8883, включите TLS и пропишите пути к трем файлам сертификатов.
  • Перезапустите поток. Убедитесь, что контроллер успешно подключается к брокеру.
  • Попробуйте подключиться к брокеру из MQTT Explorer без предоставления клиентского сертификата. Убедитесь, что брокер отклоняет соединение.
  • Рубрика оценивания:

    ---

    Тест для самопроверки (COURSE-16-M04-QUIZ)

  • Какой порт стандартно используется для защищенного протокола MQTTS?
  • a) 1883

    b) 80

    c) 443

    d) 8883

  • Что такое "Man-in-the-Middle" атака в контексте IoT?
  • a) Атака на физическое устройство с целью его кражи.

    b) Перехват и возможное изменение данных между контроллером и облаком.

    c) Отправка ложных команд из облака.

    d) Подбор пароля к MQTT-брокеру.

  • Какой метод аутентификации является наиболее надежным для IoT-устройства?
  • a) Логин и пароль.

    b) API-ключ, передаваемый в заголовке.

    c) Клиентский TLS-сертификат.

    d) IP-адрес устройства.

  • Что определяет механизм ACL (Access Control Lists) на MQTT-брокере?
  • a) Кто может подключаться к брокеру.

    b) Какие топики может публиковать и на какие подписываться конкретный клиент.

    c) Как часто клиент может отправлять сообщения.

    d) Какой версией протокола MQTT должен пользоваться клиент.

  • Какую задачу решает шифрование "in transit" (в пути)?
  • a) Защищает данные, хранящиеся в базе данных облака.

    b) Защищает данные от перехвата во время их передачи по сети.

    c) Защищает данные, хранящиеся на SD-карте контроллера.

    d) Уменьшает размер передаваемых данных.

  • В чем заключается принцип "минимизации данных"?
  • a) В сжатии данных перед отправкой.

    b) В сборе и отправке только тех данных, которые действительно необходимы.

    c) В использовании коротких имен для MQTT-топиков.

    d) В удалении старых данных из облака.

  • Какой файл никогда не должен покидать контроллер HI?
  • a) Сертификат CA (`ca.pem`).

    b) Публичный сертификат клиента (`client.crt`).

    c) Приватный ключ клиента (`client.key`).

    d) Файл конфигурации Node-RED (`settings.js`).

  • Зачем нужен узел `RBE` (Report by Exception) в потоке Node-RED?
  • a) Для отправки сообщений об ошибках.

    b) Для перезапуска потока в случае сбоя.

    c) Для уменьшения трафика путем отправки данных только при их значительном изменении.

    d) Для преобразования формата данных.

  • Что такое "аудит-журнал" (audit log) на контроллере?
  • a) Список всех установленных в Node-RED узлов.

    b) Локальная запись всех критически важных событий (отправка команд, ошибки связи).

    c) Файл с настройками безопасности.

    d) Список всех пользователей, имеющих доступ к контроллеру.

  • Какова роль `msg.topic` в безопасной архитектуре?
  • a) Он не важен для безопасности.

    b) Он используется для форматирования данных.

    c) Он является основой для правил авторизации (ACL).

    d) Он определяет, будет ли сообщение зашифровано.

    ---

    Мини-runbook: "Что-то пошло не так"

    📋 Проблема: Узел `mqtt out` в Node-RED показывает статус "disconnected" или "connecting..." при попытке подключения к облаку.

  • Проверка сети:
  • * Зайдите в терминал контроллера HI по SSH.

    * Выполните команду `ping mqtt.your-cloud-provider.com`. Если пинга нет, проблема в сетевых настройках контроллера (DNS, шлюз) или в файрволе.

    * Выполните `telnet mqtt.your-cloud-provider.com 8883`. Если соединение не устанавливается, порт заблокирован на пути к серверу.

  • Проверка сертификатов:
  • * Пути к файлам: Убедитесь, что пути к файлам сертификатов в настройках узла `mqtt out` указаны абсолютно верно (`/home/hi_admin/certs/...`).

    * Права доступа: Проверьте права на файлы сертификатов. Выполните `ls -l /home/hi_admin/certs/`. Файлы должны быть доступны для чтения пользователю, от имени которого запущен Node-RED.

    * Срок действия: Убедитесь, что сертификаты (серверный и клиентский) не просрочены. `openssl x509 -in client.crt -noout -enddate`.

  • Проверка логов брокера:
  • * Изучите логи MQTT-брокера на облачном сервере. Там будет точная причина отказа в соединении: `unknown ca`, `certificate revoked`, `bad username or password` (если используется), или ошибка, связанная с ACL.

  • Проверка конфигурации брокера:
  • * Убедитесь, что на брокере включен TLS, указаны правильные CA, серверный сертификат и ключ.

    * Проверьте, что брокер настроен на обязательную проверку клиентского сертификата (`require_certificate true` в Mosquitto).

  • Проверка Client ID:
  • * Убедитесь, что `Client ID`, указанный в узле `mqtt out`, уникален. Если другой клиент уже подключился с таким же ID, брокер разорвет старое соединение. Это может вызывать постоянные переподключения.