Управление доступом к службе подготовки устройств Центр Интернета вещей Azure (DPS) с помощью подписанных URL-адресов и маркеров безопасности

В этой статье описываются доступные варианты защиты службы подготовки устройств Центр Интернета вещей Azure (DPS). Служба подготовки использует проверку подлинности и разрешения для предоставления доступа к каждой конечной точке. Разрешения позволяют процессу проверки подлинности ограничить доступ к экземпляру службы на основе функциональных возможностей.

В этой статье рассматривается следующее:

  • Процесс проверки подлинности и маркеры, которые служба подготовки использует для проверки разрешений как для ИНТЕРФЕЙСов 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} 

Ожидаемые значения:

Стоимость Description
{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данных , keypolicy_nameexpiry для отдельной регистрации с помощью типа проверки подлинности симметричного ключа.


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 устройств. Сведения о настройке регистрации и создании сертификата устройства см. в следующих статьях.

После настройки регистрации и выдачи сертификата устройства в следующем примере показано, как выполнить проверку подлинности в 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 служба подготовки устройств предоставляет доступ к конечным точкам путем проверки маркера в политиках общего доступа. Учетные данные безопасности, например симметричные ключи, никогда не отправляются по сети.

Контроль доступа и разрешений

Предоставить разрешения можно следующими способами:

  • Политики авторизации общего доступа. Политики общего доступа могут предоставлять любое сочетание разрешений. Политики можно задавать на портале 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 автоматически создают токены при подключении к службе.

Маркеры безопасности Центра Интернета вещей

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

Структура маркера безопасности

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

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

Маркер безопасности имеет следующий формат:

SharedAccessSignature sig={signature}&se={expiry}&skn={policyName}&sr={URL-encoded-resourceURI}

Ниже приведены ожидаемые значения

Стоимость Description
{signature} Строка подписи HMAC-SHA256 формата {URL-encoded-resourceURI} + "\n" + expiry. Важно: ключ декодируется из base64 и используется в качестве ключа для вычисления HMAC-SHA256.
{expiry} Строки в формате UTF8, отображающие количество секунд с начала эры 00:00:00 (в формате UTC) 1 января 1970 г.
{URL-encoded-resourceURI} Строчное URL-кодирование строчного URL ресурса. Начинающийся с имени узла службы подготовки устройств Интернета вещей (без протокола) префикс 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;
  • окончания срока действия time.backn.

Create a shared access policy for your Device Provisioning Service instance in the portal

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 и примеры

Справочные материалы

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

Разрешения службы подготовки устройств

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

Разрешение Примечания.
ServiceConfig Предоставляет доступ для изменения конфигурации службы.
Это разрешение используется серверными облачными службами.
EnrollmentRead Предоставляет доступ на чтение к регистрации устройств и группам регистрации.
Это разрешение используется серверными облачными службами.
EnrollmentWrite Предоставляет доступ на запись к регистрации устройств и группам регистрации.
Это разрешение используется серверными облачными службами.
RegistrationStatusRead Предоставляет доступ на чтение к состоянию регистрации устройства.
Это разрешение используется серверными облачными службами.
RegistrationStatusWrite Предоставляет удаленный доступ к состоянию регистрации устройства.
Это разрешение используется серверными облачными службами.