Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описываются доступные варианты защиты службы подготовки устройств Azure Центра Интернета вещей (DPS). Служба подготовки использует проверку подлинности и разрешения для предоставления доступа к каждой конечной точке. Разрешения позволяют процессу проверки подлинности ограничить доступ к экземпляру службы на основе функциональных возможностей.
В этой статье рассматривается следующее:
Процесс аутентификации и токены, которые служба подготовки использует для проверки разрешений как для REST API служб, так и для REST API устройств.
Различные разрешения, которые можно предоставить серверному приложению для доступа к API службы.
Аутентификация
API устройства поддерживает аутентификацию устройств на основе ключей и сертификатов X.509.
API службы поддерживает проверку подлинности на основе ключей для внутренних приложений.
При использовании проверки подлинности на основе ключей служба подготовки устройств использует маркеры безопасности для проверки подлинности служб, чтобы избежать отправки ключей на провод. Кроме того, маркеры безопасности ограничены сроком действия и областью действия. Пакеты SDK для подготовки устройств Интернета вещей Azure автоматически создают маркеры, не требуя специальной конфигурации.
В некоторых случаях может потребоваться использовать REST API службы подготовки устройств HTTP напрямую, не используя SDK. В следующих разделах описывается, как производить проверку подлинности непосредственно с помощью REST API.
Проверка подлинности API устройства
API устройств используется устройствами для аттестации службы обеспечения устройства и для получения подключения к Центру Интернета вещей.
Примечание.
Чтобы получить аутентифицированное подключение, устройства сначала должны быть зарегистрированы в службе подготовки устройств путем регистрации. Используйте API службы для программной регистрации устройства посредством процедуры регистрации.
Устройство должно аутентифицироваться в интерфейсе API устройства в рамках процесса конфигурирования. Метод, который устройство использует для проверки подлинности, определяется при настройке группы регистрации или отдельной регистрации. Независимо от метода проверки подлинности, устройство должно выполнить команду HTTPS PUT на следующий URL-адрес для настройки.
https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01
При использовании проверки подлинности на основе ключей маркер безопасности передается в заголовке запроса авторизации HTTP в следующем формате:
SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}
Структура токена безопасности для аутентификации на основе ключей
Маркер безопасности передается в заголовке запроса авторизации HTTP в следующем формате:
SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}
Ожидаемые значения:
Ценность | Описание |
---|---|
{signature} |
Строка подписи HMAC-SHA256 формата {URL-encoded-resourceURI} + "\n" + expiry .
Важно: ключ декодируется из base64 и используется в качестве ключа для выполнения HMAC-SHA256 вычислений. |
{expiry} |
Текстовые строки UTF8 для количества секунд с эпохи 00:00:00 UTC 1 января 1970 года. |
{URL-encoded-resourceURI} |
Кодирование URL в нижнем регистре {ID_Scope}/registrations/{registration_id} |
{policyName} |
Для API устройств это правило всегда "регистрация". |
В следующем фрагменте Python показана функция с именем generate_sas_token
, которая вычисляет маркер из входных данных uri
, key
, policy_name
, expiry
для отдельной регистрации с использованием типа проверки подлинности симметричного ключа.
from base64 import b64encode, b64decode, encode
from hashlib import sha256
from time import time
from urllib.parse import quote_plus, urlencode
from hmac import HMAC
def generate_sas_token(uri, key, policy_name, expiry=3600):
ttl = time() + expiry
sign_key = "%s\n%d" % ((quote_plus(uri)), int(ttl))
signature = b64encode(HMAC(b64decode(key), sign_key.encode('utf-8'), sha256).digest())
rawtoken = {
'sr' : uri,
'sig': signature,
'se' : str(int(ttl)),
'skn' : policy_name
}
return 'SharedAccessSignature ' + urlencode(rawtoken)
print(generate_sas_token("myIdScope/registrations/mydeviceregistrationid", "00mysymmetrickey", "registration"))
Результат должен выглядеть следующим образом:
SharedAccessSignature sr=myIdScope%2Fregistrations%2Fmydeviceregistrationid&sig=SDpdbUNk%2F1DSjEpeb29BLVe6gRDZI7T41Y4BPsHHoUg%3D&se=1630175722&skn=registration
В следующем примере показано, как сигнатура общего доступа используется для проверки подлинности с помощью API устройства.
curl -L -i -X PUT -H 'Content-Type: application/json' -H 'Content-Encoding: utf-8' -H 'Authorization: [token]' -d '{"registrationId": "[registration_id]"}' https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01
При использовании группы регистрации на основе симметричного ключа необходимо сначала создать device symmetric
ключ, используя ключ группы регистрации. Используйте первичный или вторичный ключ группы регистрации для вычисления HMAC-SHA256 идентификатора регистрации для устройства. Затем результат преобразуется в формат Base64, чтобы получить производный ключ устройства. Чтобы просмотреть примеры кода, см. статью "Подготовка устройств с помощью групп регистрации симметричного ключа". После получения симметричного ключа устройства можно зарегистрировать устройство с помощью предыдущих примеров.
Предупреждение
Чтобы избежать включения главного ключа группы в код устройства, процесс получения ключа устройства следует выполнять вне устройства.
Проверка подлинности на основе сертификатов
Если вы настроили отдельную регистрацию или группу регистрации для аутентификации на основе сертификатов X.509, устройству потребуется использовать выданный сертификат X.509 для проверки с помощью API устройства. Сведения о настройке регистрации и создании сертификата устройства см. в следующих статьях.
Краткое руководство - Настройка симулированного устройства X.509 на узле IoT Azure
Быстрый старт - Регистрация устройств X.509 в службе автоматической подготовки устройств Azure
После настройки регистрации и выдачи сертификата устройства в следующем примере показано, как выполнить проверку подлинности в API устройств с помощью сертификата X.509 устройства.
curl -L -i -X PUT –cert ./[device_cert].pem –key ./[device_cert_private_key].pem -H 'Content-Type: application/json' -H 'Content-Encoding: utf-8' -d '{"registrationId": "[registration_id]"}' https://global.azure-devices-provisioning.net/[ID_Scope]/registrations/[registration_id]/register?api-version=2021-06-01
Проверка подлинности API службы
API службы используется для получения состояния регистрации и удаления регистраций устройств. Служба также используется внутренними приложениями для программного управления отдельными группами и группами регистрации. API службы поддерживает проверку подлинности на основе ключей для внутренних приложений.
Для доступа к любой конечной точке API службы необходимо иметь соответствующие разрешения. Например, серверное приложение должно содержать маркер, содержащий учетные данные безопасности, а также каждое сообщение, которое отправляется в службу.
Служба подготовки устройств в Azure IoT Hub предоставляет доступ к конечным точкам, проверяя токен в соответствии с политиками общего доступа. Учетные данные безопасности, такие как симметричные ключи, никогда не отправляются по проводу.
Управление доступом и разрешения
Вы можете предоставить разрешения следующим образом:
Политики авторизации общего доступа. Политики общего доступа могут предоставлять любое сочетание разрешений. Политики можно определить на портале Azure или программным способом с помощью REST API службы подготовки устройств. По умолчанию для только что созданной службы подготовки задана следующая политика по умолчанию:
provisioningserviceowner: Политика со всеми разрешениями. Дополнительные сведения см. в разрешениях .
Примечание.
Поставщик ресурсов службы предварительной настройки устройств защищен через вашу подписку Azure, как и все поставщики в Azure Resource Manager.
Дополнительные сведения о создании и использовании маркеров безопасности см. в следующем разделе.
HTTP является единственным поддерживаемым протоколом и реализует проверку подлинности, включив допустимый маркер в заголовок запроса авторизации .
Пример
SharedAccessSignature sr =
mydps.azure-devices-provisioning.net&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501&skn=provisioningserviceowner`\
Примечание.
Пакеты SDK службы подготовки устройств Azure IoT автоматически создают токены при подключении к службе.
Маркеры безопасности
Служба подготовки устройств использует маркеры безопасности для проверки подлинности служб, чтобы избежать отправки ключей в проводной сети. Кроме того, маркеры безопасности ограничены сроком действия и областью действия. Пакеты SDK службы подготовки устройств Интернета вещей Azure автоматически создают маркеры, не требуя специальной конфигурации. Некоторые сценарии требуют создания и использования маркеров безопасности напрямую. Такие сценарии включают прямое использование поверхности HTTP.
Структура маркеров безопасности
Вы используете токены безопасности для предоставления службам доступа к определенным функциям в службе подготовки устройств Интернета вещей на ограниченный период времени. Чтобы получить авторизацию для подключения к службе обеспечения, службы должны отправлять маркеры безопасности, подписанные либо ключом общего доступа, либо симметричным ключом.
Токен, подписанный с общим ключом доступа, предоставляет доступ ко всей функциональности, связанной с разрешениями политики общего доступа.
Маркер безопасности имеет следующий формат:
SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}
Ниже приведены ожидаемые значения
Ценность | Описание |
---|---|
{signature} | Строка подписи HMAC-SHA256 формата {URL-encoded-resourceURI} + "\n" + expiry .
Важно: ключ декодируется из base64 и используется в качестве ключа для выполнения HMAC-SHA256 вычислений. |
{срок действия} | Строки в формате UTF8 для количества секунд от начала эпохи 00:00:00 UTC 1 января 1970 года. |
{URL-кодированный-resourceURI} | Кодировка URL-адреса нижнего регистра для URI ресурса. URI-префикс (по сегменту) конечных точек, к которым можно получить доступ с помощью этого токена, начиная с имени узла службы подготовки устройств Интернета вещей (без протокола). Например, mydps.azure-devices-provisioning.net . |
{policyName} | Имя политики общего доступа, к которой ссылается этот маркер. |
Примечание.
Префикс URI вычисляется сегментом, а не символом. Например, /a/b
является префиксом для /a/b/c
, но не для /a/bc
.
В следующем фрагменте кода Node.js показана функция с именем generateSasToken, которая вычисляет маркер из входных данных resourceUri, signingKey, policyName, expiresInMins
. В следующих разделах подробно описано, как инициализировать различные входные данные для различных вариантов использования маркеров.
var generateSasToken = function(resourceUri, signingKey, policyName, expiresInMins) {
resourceUri = encodeURIComponent(resourceUri);
// Set expiration in seconds
var expires = (Date.now() / 1000) + expiresInMins * 60;
expires = Math.ceil(expires);
var toSign = resourceUri + '\n' + expires;
// Use crypto
var hmac = crypto.createHmac('sha256', new Buffer(signingKey, 'base64'));
hmac.update(toSign);
var base64UriEncoded = encodeURIComponent(hmac.digest('base64'));
// Construct authorization string
var token = "SharedAccessSignature sr=" + resourceUri + "&sig="
+ base64UriEncoded + "&se=" + expires + "&skn="+ policyName;
return token;
};
В качестве сравнения эквивалентный код Python для создания маркера безопасности:
from base64 import b64encode, b64decode
from hashlib import sha256
from time import time
from urllib.parse import quote_plus, urlencode
from hmac import HMAC
def generate_sas_token(uri, key, policy_name, expiry=3600):
ttl = time() + expiry
sign_key = "%s\n%d" % ((quote_plus(uri)), int(ttl))
print sign_key
signature = b64encode(HMAC(b64decode(key), sign_key, sha256).digest())
rawtoken = {
'sr' : uri,
'sig': signature,
'se' : str(int(ttl)),
'skn' : policy_name
}
return 'SharedAccessSignature ' + urlencode(rawtoken)
Примечание.
Так как срок действия маркера проверяется на компьютерах службы подготовки устройств Интернета вещей, смещение часов компьютера, создающего маркер, должно быть минимальным.
Использование токенов безопасности из компонентов сервисов
Компоненты службы могут создавать только маркеры безопасности с помощью политик общего доступа, предоставляя соответствующие разрешения, как описано ранее.
Ниже приведены функции службы, предоставляемые на конечных точках:
Конечная точка | Функция |
---|---|
{your-service}.azure-devices-provisioning.net/enrollments |
Предоставляет операции по регистрации устройств с помощью службы предоставления конфигурации устройств. |
{your-service}.azure-devices-provisioning.net/enrollmentGroups |
Предоставляет возможности для управления группами регистрации устройств. |
{your-service}.azure-devices-provisioning.net/registrations/{id} |
Предоставляет операции для получения состояния регистрации устройств и управления ими. |
Например, служба, созданная с помощью предварительно созданной политики enrollmentread
общего доступа, создаст маркер со следующими параметрами:
- URI ресурса:
{mydps}.azure-devices-provisioning.net
, - ключ подписывания: один из ключей политики
enrollmentread
, - имя политики:
enrollmentread
, - любое время окончания срока действия.backn
var endpoint ="mydps.azure-devices-provisioning.net";
var policyName = 'enrollmentread';
var policyKey = '...';
var token = generateSasToken(endpoint, policyKey, policyName, 60);
Результатом, который предоставит возможность чтения всех записей о регистрации, будет:
SharedAccessSignature sr=mydps.azure-devices-provisioning.net&sig=JdyscqTpXdEJs49elIUCcohw2DlFDR3zfH5KqGJo4r4%3D&se=1456973447&skn=enrollmentread
Пакеты SDK и примеры
- Предварительный выпуск SDK Azure IoT для Java
- Пакеты SDK Для Microsoft Azure IoT для предварительной версии .NET
Справочные разделы:
В следующих справочных разделах содержатся дополнительные сведения об управлении доступом к службе предварительной настройки IoT устройств.
Разрешения службы подготовки устройств
В следующей таблице указаны разрешения, с помощью которых можно управлять доступом к службе подготовки устройств Интернета вещей.
Разрешение | Примечания. |
---|---|
ServiceConfig | Предоставляет доступ для изменения конфигураций службы. Это разрешение используется внутренними облачными службами. |
EnrollmentRead | Предоставляет доступ на чтение к регистрациям устройств и группам регистрации. Это разрешение используется внутренними облачными службами. |
EnrollmentWrite | Предоставляет доступ на запись к регистрациям устройств и группам регистрации. Это разрешение используется внутренними облачными службами. |
RegistrationStatusRead | Предоставляет доступ для чтения к состоянию регистрации устройства. Это разрешение используется внутренними облачными службами. |
RegistrationStatusWrite | Предоставляет доступ на удаление состояния регистрации устройства. Это разрешение используется внутренними облачными службами. |