IoT Hub へのアクセスの制御Control access to IoT Hub

この記事では、Azure IoT Hub をセキュリティで保護するためのオプションについて説明します。This article describes the options for securing your IoT hub. IoT Hub では、"アクセス許可" を使用して、IoT Hub の各エンドポイントへのアクセス権を付与します。IoT Hub uses permissions to grant access to each IoT hub endpoint. 次のアクセス許可により、機能に応じて IoT Hub へのアクセスを制限します。Permissions limit the access to an IoT hub based on functionality.

この記事では、次の内容について説明します。This article introduces:

  • IoT Hub へのアクセス用にデバイスやバックエンド アプリに付与できるアクセス許可の種類。The different permissions that you can grant to a device or back-end app to access your IoT hub.
  • アクセス許可の確認に使用する認証プロセスとトークン。The authentication process and the tokens it uses to verify permissions.
  • 資格情報のスコープを指定して特定のリソースへのアクセスを制限する方法。How to scope credentials to limit access to specific resources.
  • X.509 証明書の IoT Hub サポート。IoT Hub support for X.509 certificates.
  • 既存のデバイス ID のレジストリまたは認証スキームを使用した、カスタムのデバイス認証メカニズム。Custom device authentication mechanisms that use existing device identity registries or authentication schemes.

注意

この記事で言及されている一部の機能 (cloud-to-device メッセージ、デバイス ツイン、デバイス管理など) は、IoT ハブの Standard レベルだけで使用することができます。Some of the features mentioned in this article, like cloud-to-device messaging, device twins, and device management, are only available in the standard tier of IoT hub. IoT Hub の Basic レベルおよび Standard レベルの詳細については、適切な IoT Hub レベルの選び方に関するページを参照してください。For more information about the basic and standard IoT Hub tiers, see How to choose the right IoT Hub tier.

IoT Hub のエンドポイントにアクセスするには、適切なアクセス許可が必要です。You must have appropriate permissions to access any of the IoT Hub endpoints. たとえば、IoT Hub に送信するすべてのメッセージと共に、デバイスにはセキュリティ資格情報が格納されているトークンを含める必要があります。For example, a device must include a token containing security credentials along with every message it sends to IoT Hub.

アクセス制御とアクセス許可Access control and permissions

次の方法でアクセス許可を付与できます。You can grant permissions in the following ways:

  • IoT Hub レベルの共有アクセス ポリシー: IoT hub-level shared access policies. 共有アクセス ポリシーにより、アクセス許可を自由に組み合わせて付与できます。Shared access policies can grant any combination of permissions. ポリシーは、Azure portal で、IoT Hub Resource REST API を使ってプログラムにより、または az iot hub policy CLI を使って、定義することができます。You can define policies in the Azure portal, programmatically by using the IoT Hub Resource REST APIs, or using the az iot hub policy CLI. 新しく作成された IoT Hub には、次の既定のポリシーがあります。A newly created IoT hub has the following default policies:

    共有アクセス ポリシーShared Access Policy アクセス許可Permissions
    iothubowneriothubowner すべてのアクセス許可All permission
    serviceservice ServiceConnect アクセス許可ServiceConnect permissions
    devicedevice DeviceConnect アクセス許可DeviceConnect permissions
    registryReadregistryRead RegistryRead アクセス許可RegistryRead permissions
    registryReadWriteregistryReadWrite RegistryRead および RegistryWrite アクセス許可RegistryRead and RegistryWrite permissions
  • デバイスごとのセキュリティ資格情報Per-Device Security Credentials. 各 IoT Hub には ID レジストリが含まれます。この ID レジストリ内の各デバイスでは、対応するデバイスのエンドポイントを対象として DeviceConnect アクセス許可を付与する、セキュリティ資格情報を構成できます。Each IoT Hub contains an identity registry For each device in this identity registry, you can configure security credentials that grant DeviceConnect permissions scoped to the corresponding device endpoints.

たとえば、標準的な IoT ソリューションの場合は次のようになります。For example, in a typical IoT solution:

  • デバイス管理コンポーネントでは registryReadWrite ポリシーを使用します。The device management component uses the registryReadWrite policy.
  • イベント プロセッサ コンポーネントでは service ポリシーを使用します。The event processor component uses the service policy.
  • ランタイム デバイス ビジネス ロジック コンポーネントでは service ポリシーを使用します。The run-time device business logic component uses the service policy.
  • 個々のデバイスは、IoT Hub の ID レジストリに格納されている資格情報を使用して接続します。Individual devices connect using credentials stored in the IoT hub's identity registry.

注意

詳細については、権限に関する項目をご覧ください。See permissions for detailed information.

AuthenticationAuthentication

Azure IoT Hub では、共有アクセス ポリシーと ID レジストリのセキュリティ資格情報に対してトークンを確認することにより、エンドポイントへのアクセスを許可します。Azure IoT Hub grants access to endpoints by verifying a token against the shared access policies and identity registry security credentials.

対称キーなどのセキュリティの資格情報がネットワーク上で送信されることはありません。Security credentials, such as symmetric keys, are never sent over the wire.

注意

Azure IoT Hub のリソース プロバイダーは、Azure Resource Manager のすべてのプロバイダーと同様、Azure のサブスクリプションによりセキュリティで保護されています。The Azure IoT Hub resource provider is secured through your Azure subscription, as are all providers in the Azure Resource Manager.

セキュリティ トークンを作成して使用する方法の詳細については、IoT Hub セキュリティ トークンに関するセクションを参照してください。For more information about how to construct and use security tokens, see IoT Hub security tokens.

プロトコルの詳細Protocol specifics

MQTT、AMQP、および HTTPS など、サポートされているプロトコルごとに、さまざまな方法でトークンが転送されます。Each supported protocol, such as MQTT, AMQP, and HTTPS, transports tokens in different ways.

MQTT を使用する場合、CONNECT パケットでは、ClientId、ユーザー名フィールドの {iothubhostname}/{deviceId}、およびパスワード フィールドの SAS トークンとして、deviceId が使用されます。When using MQTT, the CONNECT packet has the deviceId as the ClientId, {iothubhostname}/{deviceId} in the Username field, and a SAS token in the Password field. {iothubhostname} は IoT Hub の完全な CName とする必要があります (contoso.azure-devices.net など)。{iothubhostname} should be the full CName of the IoT hub (for example, contoso.azure-devices.net).

AMQP を使用する場合、IoT Hub では SASL PLAINAMQP Claims-Based-Security がサポートされます。When using AMQP, IoT Hub supports SASL PLAIN and AMQP Claims-Based-Security.

AMQP Claims-Based-Security の場合、標準でこれらのトークンの送信方法が指定されます。If you use AMQP claims-based-security, the standard specifies how to transmit these tokens.

SASL PLAIN では、 ユーザー名 を以下のように指定できます。For SASL PLAIN, the username can be:

  • {policyName}@sas.root.{iothubName} (IoT Hub レベルのトークンを使用する場合)。{policyName}@sas.root.{iothubName} if using IoT hub-level tokens.
  • {deviceId}@sas.{iothubname} (デバイスを対象とするトークンを使用する場合)。{deviceId}@sas.{iothubname} if using device-scoped tokens.

どちらの場合も、IoT Hub セキュリティ トークンに関するセクションで説明されているように、パスワード フィールドにトークンが含まれています。In both cases, the password field contains the token, as described in IoT Hub security tokens.

HTTPS では、 Authorization 要求ヘッダーに有効なトークンを含めることによって認証を実装します。HTTPS implements authentication by including a valid token in the Authorization request header.

Example

ユーザー名 (DeviceId では大文字と小文字が区別されます): iothubname.azure-devices.net/DeviceIdUsername (DeviceId is case-sensitive): iothubname.azure-devices.net/DeviceId

パスワード (デバイス エクスプローラー ツール、CLI 拡張コマンド az iot hub generate-sas-token、または Visual Studio Code 用の Azure IoT Tools を使用して SAS トークンを生成できます):Password (You can generate a SAS token with the device explorer tool, the CLI extension command az iot hub generate-sas-token, or the Azure IoT Tools for Visual Studio Code):

SharedAccessSignature sr=iothubname.azure-devices.net%2fdevices%2fDeviceId&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501

注意

Azure IoT SDK を使用すると、サービスに接続した時点で自動的にトークンが生成されます。The Azure IoT SDKs automatically generate tokens when connecting to the service. 場合によっては、Azure IoT SDK でサポートされないプロトコルや認証方法もあります。In some cases, the Azure IoT SDKs do not support all the protocols or all the authentication methods.

SASL PLAIN に関する特別な考慮事項Special considerations for SASL PLAIN

SASL PLAIN を AMQP で使用する場合、IoT Hub に接続するクライアントは、TCP 接続ごとにトークンを 1 つ使用できます。When using SASL PLAIN with AMQP, a client connecting to an IoT hub can use a single token for each TCP connection. トークンの有効期限が切れると、サービスから TCP 接続が切断され、再接続がトリガーされます。When the token expires, the TCP connection disconnects from the service and triggers a reconnection. この動作は、バックエンド アプリの場合は問題ありませんが、デバイス アプリの場合は、次の理由から有害である可能性があります。This behavior, while not problematic for a back-end app, is damaging for a device app for the following reasons:

  • ゲートウェイは、通常多くのデバイスの代理として接続しています。Gateways usually connect on behalf of many devices. SASL PLAIN を使用する場合、IoT Hub に接続するデバイスごとに、個別の TCP 接続を作成する必要があります。When using SASL PLAIN, they have to create a distinct TCP connection for each device connecting to an IoT hub. このシナリオにより、電源とネットワーク リソースの消費量が大幅に増大し、各デバイスの接続の待機時間が増加します。This scenario considerably increases the consumption of power and networking resources, and increases the latency of each device connection.

  • 各トークンの有効期限が切れた後に、再接続に使用するリソースの量が増加すると、リソースが限られたデバイスには悪影響が出ます。Resource-constrained devices are adversely affected by the increased use of resources to reconnect after each token expiration.

IoT Hub レベルの資格情報のスコープScope IoT hub-level credentials

制限付きのリソース URI を持つトークンを作成することにより、IoT Hub レベルのセキュリティ ポリシーのスコープを指定できます。You can scope IoT hub-level security policies by creating tokens with a restricted resource URI. たとえば、デバイスからの D2C メッセージを送信するエンドポイントは /devices/{deviceId}/messages/eventsになります。For example, the endpoint to send device-to-cloud messages from a device is /devices/{deviceId}/messages/events. また、DeviceConnect アクセス許可を持つ IoT Hub レベルの共有アクセス ポリシーを使用して、resourceURI が /devices/{deviceId} であるトークンに署名することもできます。You can also use an IoT hub-level shared access policy with DeviceConnect permissions to sign a token whose resourceURI is /devices/{deviceId}. この方法により、デバイスの deviceId の代わりにメッセージを送信するためにのみ使用できるトークンが作成されます。This approach creates a token that is only usable to send messages on behalf of device deviceId.

これは Event Hubs の発行元ポリシーに似たメカニズムであり、カスタムの認証方法の実装を可能にします。This mechanism is similar to the Event Hubs publisher policy, and enables you to implement custom authentication methods.

セキュリティ トークンSecurity tokens

IoT Hub では、デバイスとサービスの認証にセキュリティ トークンを使用することにより、ネットワーク経由でのキーの送信を回避します。IoT Hub uses security tokens to authenticate devices and services to avoid sending keys on the wire. さらに、セキュリティ トークンには、有効期間とスコープの制限があります。Additionally, security tokens are limited in time validity and scope. Azure IoT SDK を使用すると、特別な構成を行うことなく自動でトークンを生成できます。Azure IoT SDKs automatically generate tokens without requiring any special configuration. 一部のシナリオでは、セキュリティ トークンを自分で生成して直接使用する必要があります。Some scenarios do require you to generate and use security tokens directly. これらのシナリオは、次のとおりです。Such scenarios include:

  • MQTT、AMQP、または HTTPS のサーフェスを直接使用する。The direct use of the MQTT, AMQP, or HTTPS surfaces.

  • トークンのサービス パターンを実装する (「カスタム デバイスの認証」で説明)。The implementation of the token service pattern, as explained in Custom device authentication.

IoT Hub では、X.509 証明書を使用して IoT Hub でデバイスの認証を行うこともできます。IoT Hub also allows devices to authenticate with IoT Hub using X.509 certificates.

セキュリティ トークンの構造Security token structure

セキュリティ トークンは、IoT Hub の特定の機能へのアクセスを期限付きでデバイスとサービスに許可するために使用します。You use security tokens to grant time-bounded access to devices and services to specific functionality in IoT Hub. IoT Hub に接続する承認を取得するには、デバイス とサービスが共有アクセスまたは対称キーのいずれかで署名されたセキュリティ トークンを送信する必要があります。To get authorization to connect to IoT Hub, devices and services must send security tokens signed with either a shared access or symmetric key. これらのキーは、ID レジストリにデバイス ID と共に格納されます。These keys are stored with a device identity in the identity registry.

共有アクセス キーで署名されたトークンでは、その共有アクセス ポリシーのアクセス許可に関連付けられたすべての機能へのアクセスが許可されます。A token signed with a shared access key grants access to all the functionality associated with the shared access policy permissions. デバイス ID の対称キーで署名されたトークンは、関連付けられたデバイス ID の DeviceConnect アクセス許可のみを付与します。A token signed with a device identity's symmetric key only grants the DeviceConnect permission for the associated device identity.

セキュリティ トークンには、次の形式があります。The security token has the following format:

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

考えられる値を次に示します。Here are the expected values:

Value 説明Description
{signature}{signature} HMAC-SHA256 署名文字列 (形式: {URL-encoded-resourceURI} + "\n" + expiry)。An HMAC-SHA256 signature string of the form: {URL-encoded-resourceURI} + "\n" + expiry. 重要: キーは base64 からデコードされ、HMAC-SHA256 計算を実行するためのキーとして使用されます。Important: The key is decoded from base64 and used as key to perform the HMAC-SHA256 computation.
{resourceURI}{resourceURI} IoT Hub のホスト名 (プロトコルなし) で始まる、このトークンを使用してアクセスできるエンドポイントの (セグメント単位の) URI プレフィックス。URI prefix (by segment) of the endpoints that can be accessed with this token, starting with host name of the IoT hub (no protocol). たとえば、myHub.azure-devices.net/devices/device1 のように指定します。For example, myHub.azure-devices.net/devices/device1
{expiry}{expiry} 1970 年 1 月 1 日の 00 時 00 分 00 秒 UTC からのエポック秒で表される UTF8 文字列。UTF8 strings for number of seconds since the epoch 00:00:00 UTC on 1 January 1970.
{URL-encoded-resourceURI}{URL-encoded-resourceURI} 小文字のリソース URI の小文字の URL エンコードLower case URL-encoding of the lower case resource URI
{policyName}{policyName} このトークンの参照先となる共有アクセス ポリシーの名前。The name of the shared access policy to which this token refers. トークンがデバイス レジストリ資格情報を参照する場合は存在しません。Absent if the token refers to device-registry credentials.

プレフィックスに関する注意事項: URI プレフィックスは、文字単位ではなくセグメント単位で計算されます。Note on prefix: The URI prefix is computed by segment and not by character. たとえば、/a/b/a/b/c のプレフィックスであり、/a/bc のプレフィックスではありません。For example /a/b is a prefix for /a/b/c but not for /a/bc.

次の Node.js スニペットは、resourceUri, signingKey, policyName, expiresInMins の入力からトークンを計算する generateSasToken という名前の関数を示しています。The following Node.js snippet shows a function called generateSasToken that computes the token from the inputs resourceUri, signingKey, policyName, expiresInMins. 以降のセクションでは、さまざまなトークンの使用例の各種入力を初期化する方法について詳しく説明します。The next sections detail how to initialize the different inputs for the different token use cases.

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;
    if (policyName) token += "&skn="+policyName;
    return token;
};

比較として、セキュリティ トークンを生成する同等の Python コードを次に示します。As a comparison, the equivalent Python code to generate a security token is:

from base64 import b64encode, b64decode
from hashlib import sha256
from time import time
from urllib 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))
    }

    if policy_name is not None:
        rawtoken['skn'] = policy_name

    return 'SharedAccessSignature ' + urlencode(rawtoken)

セキュリティ トークンを生成する C# の機能を下に示します。The functionality in C# to generate a security token is:

using System;
using System.Globalization;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;

public static string generateSasToken(string resourceUri, string key, string policyName, int expiryInSeconds = 3600)
{
    TimeSpan fromEpochStart = DateTime.UtcNow - new DateTime(1970, 1, 1);
    string expiry = Convert.ToString((int)fromEpochStart.TotalSeconds + expiryInSeconds);

    string stringToSign = WebUtility.UrlEncode(resourceUri) + "\n" + expiry;

    HMACSHA256 hmac = new HMACSHA256(Convert.FromBase64String(key));
    string signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));

    string token = String.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}", WebUtility.UrlEncode(resourceUri), WebUtility.UrlEncode(signature), expiry);

    if (!String.IsNullOrEmpty(policyName))
    {
        token += "&skn=" + policyName;
    }

    return token;
}

注意

トークンの有効期間は IoT Hub コンピューターで検証されるため、トークンを生成するコンピューターのクロックのずれは最小限である必要があります。Since the time validity of the token is validated on IoT Hub machines, the drift on the clock of the machine that generates the token must be minimal.

デバイス アプリで SAS トークンを使用するUse SAS tokens in a device app

セキュリティ トークンを使用して IoT Hub で DeviceConnect アクセス許可を取得するには、ID レジストリの対称デバイス キーを使用する方法と、共有アクセス キーを使用する方法の 2 通りがあります。There are two ways to obtain DeviceConnect permissions with IoT Hub with security tokens: use a symmetric device key from the identity registry, or use a shared access key.

デバイスからアクセスできるすべての機能は、仕様により、/devices/{deviceId}というプレフィックスを持つエンドポイントで公開されることにご注意ください。Remember that all functionality accessible from devices is exposed by design on endpoints with prefix /devices/{deviceId}.

重要

IoT Hub が特定のデバイスを認証する唯一の方法では、デバイス ID 対称キーを使用します。The only way that IoT Hub authenticates a specific device is using the device identity symmetric key. デバイスの機能へのアクセスに共有アクセス ポリシーを使用する場合、ソリューションでは、セキュリティ トークンを発行するコンポーネントを、信頼できるサブコンポーネントと見なす必要があります。In cases when a shared access policy is used to access device functionality, the solution must consider the component issuing the security token as a trusted subcomponent.

デバイス向けのエンドポイントを次に示します (プロトコルは関係ありません)。The device-facing endpoints are (irrespective of the protocol):

エンドポイントEndpoint 機能Functionality
{iot hub host name}/devices/{deviceId}/messages/events デバイスからクラウドへのメッセージを送信します。Send device-to-cloud messages.
{iot hub host name}/devices/{deviceId}/messages/devicebound クラウドからデバイスへのメッセージを受信します。Receive cloud-to-device messages.

ID レジストリの対称キーを使用するUse a symmetric key in the identity registry

デバイス ID の対称キーを使用してトークンを生成すると、トークンの policyName (skn) 要素は省略されます。When using a device identity's symmetric key to generate a token, the policyName (skn) element of the token is omitted.

たとえば、すべてのデバイス機能にアクセスするために作成されるトークンには、次のパラメーターが必要です。For example, a token created to access all device functionality should have the following parameters:

  • リソース URI: {IoT hub name}.azure-devices.net/devices/{device id}resource URI: {IoT hub name}.azure-devices.net/devices/{device id},
  • 署名キー: {device id} ID の任意の対称キーsigning key: any symmetric key for the {device id} identity,
  • ポリシー名なしno policy name,
  • 任意の有効期間any expiration time.

上の Node.js 関数を使用した例を次に示します。An example using the preceding Node.js function would be:

var endpoint ="myhub.azure-devices.net/devices/device1";
var deviceKey ="...";

var token = generateSasToken(endpoint, deviceKey, null, 60);

結果は、次のように、device1 のすべての機能に対するアクセスが許可されます。The result, which grants access to all functionality for device1, would be:

SharedAccessSignature sr=myhub.azure-devices.net%2fdevices%2fdevice1&sig=13y8ejUk2z7PLmvtwR5RqlGBOVwiq7rQR3WZ5xZX3N4%3D&se=1456971697

注意

デバイス エクスプローラー ツール、CLI 拡張コマンド az iot hub generate-sas-token、または Visual Studio Code 用の Azure IoT Tools を使用して SAS トークンを生成できます。It's possible to generate a SAS token with the device explorer tool, the CLI extension command az iot hub generate-sas-token, or the Azure IoT Tools for Visual Studio Code.

共有アクセス ポリシーを使用するUse a shared access policy

共有アクセス ポリシーからトークンを作成するときは、skn フィールドをポリシーの名前に設定します。When you create a token from a shared access policy, set the skn field to the name of the policy. このポリシーは DeviceConnect アクセス許可を付与する必要があります。This policy must grant the DeviceConnect permission.

共有アクセス ポリシーを使用してデバイスの機能にアクセスするための 2 つの主なシナリオは次のとおりです。The two main scenarios for using shared access policies to access device functionality are:

共有アクセス ポリシーは任意のデバイスとして接続するためのアクセス権を付与する可能性があるため、セキュリティ トークンの作成時に適切なリソース URI を使用することが重要です。Since the shared access policy can potentially grant access to connect as any device, it is important to use the correct resource URI when creating security tokens. この設定は、トークン サービスに特に重要です。このサービスでは、リソース URI を使用して、トークンのスコープを特定のデバイスに限定する必要があります。This setting is especially important for token services, which have to scope the token to a specific device using the resource URI. これは、プロトコル ゲートウェイにはあまり関連がありません。このようなゲートウェイは、すべてのデバイスのトラフィックを既に仲介しているためです。This point is less relevant for protocol gateways as they are already mediating traffic for all devices.

たとえば、 device という事前作成済みの共有アクセス ポリシーを使用するトークン サービスの場合、次のパラメーターを持つトークンが作成されます。As an example, a token service using the pre-created shared access policy called device would create a token with the following parameters:

  • リソース URI: {IoT hub name}.azure-devices.net/devices/{device id}resource URI: {IoT hub name}.azure-devices.net/devices/{device id},
  • 署名キー: device ポリシーのいずれかのキーsigning key: one of the keys of the device policy,
  • ポリシー名: devicepolicy name: device,
  • 任意の有効期間any expiration time.

上の Node.js 関数を使用した例を次に示します。An example using the preceding Node.js function would be:

var endpoint ="myhub.azure-devices.net/devices/device1";
var policyName = 'device';
var policyKey = '...';

var token = generateSasToken(endpoint, policyKey, policyName, 60);

結果は、次のように、device1 のすべての機能に対するアクセスが許可されます。The result, which grants access to all functionality for device1, would be:

SharedAccessSignature sr=myhub.azure-devices.net%2fdevices%2fdevice1&sig=13y8ejUk2z7PLmvtwR5RqlGBOVwiq7rQR3WZ5xZX3N4%3D&se=1456971697&skn=device

リソース URI を myhub.azure-devices.net/devicesに設定するだけで、プロトコル ゲートウェイはすべてのデバイスに同じトークンを使用できます。A protocol gateway could use the same token for all devices simply setting the resource URI to myhub.azure-devices.net/devices.

サービス コンポーネントからセキュリティ トークンを使用するUse security tokens from service components

前述したように、サービス コンポーネントでは、適切なアクセス許可を付与する共有アクセス ポリシーを使用した場合にのみセキュリティ トークンを生成できます。Service components can only generate security tokens using shared access policies granting the appropriate permissions as explained previously.

エンドポイントで公開されるサービス機能を次に示します。Here are the service functions exposed on the endpoints:

エンドポイントEndpoint 機能Functionality
{iot hub host name}/devices デバイス ID を作成、更新、取得、削除します。Create, update, retrieve, and delete device identities.
{iot hub host name}/messages/events デバイスからクラウドへのメッセージを受信します。Receive device-to-cloud messages.
{iot hub host name}/servicebound/feedback クラウドからデバイスへのメッセージのフィードバックを受信します。Receive feedback for cloud-to-device messages.
{iot hub host name}/devicebound クラウドからデバイスへのメッセージを送信します。Send cloud-to-device messages.

たとえば、 registryRead という事前作成済みの共有アクセス ポリシーを使用してトークンを生成するサービスの場合、次のパラメーターを持つトークンが作成されます。As an example, a service generating using the pre-created shared access policy called registryRead would create a token with the following parameters:

  • リソース URI: {IoT hub name}.azure-devices.net/devicesresource URI: {IoT hub name}.azure-devices.net/devices,
  • 署名キー: registryRead ポリシーのいずれかのキーsigning key: one of the keys of the registryRead policy,
  • ポリシー名: registryReadpolicy name: registryRead,
  • 任意の有効期間any expiration time.
var endpoint ="myhub.azure-devices.net/devices";
var policyName = 'registryRead';
var policyKey = '...';

var token = generateSasToken(endpoint, policyKey, policyName, 60);

結果は次のようになります (すべてのデバイス ID の読み取りアクセスが許可されます)。The result, which would grant access to read all device identities, would be:

SharedAccessSignature sr=myhub.azure-devices.net%2fdevices&sig=JdyscqTpXdEJs49elIUCcohw2DlFDR3zfH5KqGJo4r4%3D&se=1456973447&skn=registryRead

サポートされている X.509 証明書Supported X.509 certificates

証明書拇印や証明書機関 (CA) を Azure IoT Hub にアップロードすることで、あらゆる X.509 証明書を使用し、IoT Hub のあるデバイスを認証できます。You can use any X.509 certificate to authenticate a device with IoT Hub by uploading either a certificate thumbprint or a certificate authority (CA) to Azure IoT Hub. 証明書拇印のみを利用する認証の場合、提示された拇印が設定されている拇印に一致することが確認されます。Authentication using certificate thumbprints only verifies that the presented thumbprint matches the configured thumbprint. 証明書機関を使用して認証する場合、証明書チェーンが検証されます。Authentication using certificate authority validates the certificate chain.

次の証明書に対応しています。Supported certificates include:

  • 既存の X.509 証明書An existing X.509 certificate. デバイスには、既に X.509 証明書が関連付けられている場合があります。A device may already have an X.509 certificate associated with it. デバイスはこの証明書を使用して IoT Hub で認証を受けることができます。The device can use this certificate to authenticate with IoT Hub. 拇印または CA 認証のいずれかで動作します。Works with either thumbprint or CA authentication.

  • 証明機関署名入りの X.509 証明書CA-signed X.509 certificate. デバイスを識別して IoT Hub で認証するには、証明機関 (CA) によって生成され署名された X.509 証明書を使用します。To identify a device and authenticate it with IoT Hub, you can use an X.509 certificate generated and signed by a Certification Authority (CA). 拇印または CA 認証のいずれかで動作します。Works with either thumbprint or CA authentication.

  • 自己生成および自己署名の X-509 証明書A self-generated and self-signed X-509 certificate. デバイスの製造業者または社内のデプロイ担当者はこれらの証明書を生成し、対応する秘密キー (および証明書) をデバイスに格納することができます。A device manufacturer or in-house deployer can generate these certificates and store the corresponding private key (and certificate) on the device. OpenSSLWindows SelfSignedCertificate ユーティリティなどのツールを使用することができます。You can use tools such as OpenSSL and Windows SelfSignedCertificate utility for this purpose. 拇印認証でのみ機能します。Only works with thumbprint authentication.

デバイスは X.509 証明書またはセキュリティ トークンのいずれかを使用できますが、両方一緒に使用することはできません。A device may either use an X.509 certificate or a security token for authentication, but not both.

証明書機関を使用する認証の詳細については、「X.509 CA 証明書を使用したデバイス認証」を参照してください。For more information about authentication using certificate authority, see Device Authentication using X.509 CA Certificates.

デバイスの X.509 証明書を登録するRegister an X.509 certificate for a device

C# 用 Azure IoT サービス SDK (バージョン 1.0.8 以上) では、認証に X.509 証明書を使用するデバイスの登録がサポートされています。The Azure IoT Service SDK for C# (version 1.0.8+) supports registering a device that uses an X.509 certificate for authentication. デバイスのインポート/エクスポートなどの他の API でも X.509 証明書がサポートされます。Other APIs such as import/export of devices also support X.509 certificates.

CLI 拡張コマンド az iot hub device-identity を使って、デバイスの X.509 証明書を構成することもできます。You can also use the CLI extension command az iot hub device-identity to configure X.509 certificates for devices.

C# のサポートC# Support

RegistryManager クラスでは、プログラムでデバイスを登録する方法が用意されています。The RegistryManager class provides a programmatic way to register a device. 具体的には、AddDeviceAsync メソッドと UpdateDeviceAsync メソッドを使用することで、IoT Hub の ID レジストリにデバイスを登録して更新できます。In particular, the AddDeviceAsync and UpdateDeviceAsync methods enable you to register and update a device in the IoT Hub identity registry. これら 2 つのメソッドは、入力として Device インスタンスを取ります。These two methods take a Device instance as input. Device クラスには Authentication プロパティが含まれています。これにより、プライマリとセカンダリの X.509 証明書拇印を指定することができます。The Device class includes an Authentication property that allows you to specify primary and secondary X.509 certificate thumbprints. 拇印は、X.509 証明書の SHA-256 ハッシュ (DER バイナリ エンコードを使用して格納) を表します。The thumbprint represents a SHA256 hash of the X.509 certificate (stored using binary DER encoding). プライマリ拇印、セカンダリ拇印、またはその両方を指定できます。You have the option of specifying a primary thumbprint or a secondary thumbprint or both. 証明書のロールオーバー シナリオを処理するために、プライマリ拇印とセカンダリ拇印がサポートされています。Primary and secondary thumbprints are supported to handle certificate rollover scenarios.

X.509 証明書拇印を使用してデバイスを登録するための C# コード スニペットの例を次に示します。Here is a sample C# code snippet to register a device using an X.509 certificate thumbprint:

var device = new Device(deviceId)
{
  Authentication = new AuthenticationMechanism()
  {
    X509Thumbprint = new X509Thumbprint()
    {
      PrimaryThumbprint = "B4172AB44C28F3B9E117648C6F7294978A00CDCBA34A46A1B8588B3F7D82C4F1"
    }
  }
};
RegistryManager registryManager = RegistryManager.CreateFromConnectionString(deviceGatewayConnectionString);
await registryManager.AddDeviceAsync(device);

ランタイム操作中に X.509 証明書を使用するUse an X.509 certificate during run-time operations

.NET 用 Azure IoT device SDK (バージョン 1.0.11+) では、X.509 証明書の使用がサポートされています。The Azure IoT device SDK for .NET (version 1.0.11+) supports the use of X.509 certificates.

C# のサポートC# Support

DeviceAuthenticationWithX509Certifcate クラスでは、X.509 証明書を使用した DeviceClient インスタンスの作成がサポートされます。The class DeviceAuthenticationWithX509Certificate supports the creation of DeviceClient instances using an X.509 certificate. X.509 証明書は、秘密キーを含む PFX (PKCS #12) 形式になっている必要があります。The X.509 certificate must be in the PFX (also called PKCS #12) format that includes the private key.

コード スニペットのサンプルを次に示します。Here is a sample code snippet:

var authMethod = new DeviceAuthenticationWithX509Certificate("<device id>", x509Certificate);

var deviceClient = DeviceClient.Create("<IotHub DNS HostName>", authMethod);

カスタム デバイスおよびモジュールの認証Custom device and module authentication

IoT Hub の ID レジストリを使用して、デバイス/モジュールごとのセキュリティ資格情報とアクセス制御をトークンにより構成できます。You can use the IoT Hub identity registry to configure per-device/module security credentials and access control using tokens. IoT ソリューションにすでにカスタム ID レジストリや認証スキームがある場合、トークン サービスを作成してこのインフラストラクチャを IoT Hub と統合することを検討してください。If an IoT solution already has a custom identity registry and/or authentication scheme, consider creating a token service to integrate this infrastructure with IoT Hub. この方法により、ソリューションで他の IoT 機能を使用できます。In this way, you can use other IoT features in your solution.

トークン サービスはカスタム クラウド サービスの 1 つです。A token service is a custom cloud service. このサービスは、DeviceConnect または ModuleConnect アクセス許可が指定された IoT Hub 共有アクセス ポリシーを使用して、デバイスを対象とするトークンまたはモジュールを対象とするトークンを作成します。It uses an IoT Hub shared access policy with DeviceConnect or ModuleConnect permissions to create device-scoped or module-scoped tokens. これらのトークンにより、デバイスとモジュールは IoT Hub に接続できるようになります。These tokens enable a device and module to connect to your IoT hub.

Steps of the token service pattern

トークン サービス パターンの主な手順を次に示します。Here are the main steps of the token service pattern:

  1. IoT Hub 共有アクセス ポリシーを作成し、IoT Hub に対する DeviceConnect または ModuleConnect アクセス許可を指定します。Create an IoT Hub shared access policy with DeviceConnect or ModuleConnect permissions for your IoT hub. このポリシーは、Azure portal またはプログラムで作成できます。You can create this policy in the Azure portal or programmatically. トークン サービスは、このポリシーを使用して、作成されるトークンに署名します。The token service uses this policy to sign the tokens it creates.

  2. IoT Hub にアクセスする必要があるデバイス/モジュールは、トークン サービスに署名付きトークンを要求します。When a device/module needs to access your IoT hub, it requests a signed token from your token service. デバイスは、カスタム ID レジストリ/認証スキームで認証し、トークン サービスがトークンの作成に使用するデバイス/モジュール ID を特定できます。The device can authenticate with your custom identity registry/authentication scheme to determine the device/module identity that the token service uses to create the token.

  3. トークン サービスは、トークンを返します。The token service returns a token. トークンは、/devices/{deviceId} または /devices/{deviceId}/module/{moduleId}resourceURI として使用して作成され、deviceId は認証対象のデバイスになり、moduleId は認証対象のモジュールになります。The token is created by using /devices/{deviceId} or /devices/{deviceId}/module/{moduleId} as resourceURI, with deviceId as the device being authenticated or moduleId as the module being authenticated. トークン サービスは、共有アクセス ポリシーを使用してトークンを作成します。The token service uses the shared access policy to construct the token.

  4. デバイス/モジュールは、IoT Hub で直接トークンを使用します。The device/module uses the token directly with the IoT hub.

注意

.NET クラス SharedAccessSignatureBuilder または Java クラス IotHubServiceSasToken を使用して、トークン サービスでトークンを作成できます。You can use the .NET class SharedAccessSignatureBuilder or the Java class IotHubServiceSasToken to create a token in your token service.

トークン サービスは、必要に応じて、トークンの有効期限を設定できます。The token service can set the token expiration as desired. トークンの期限が切れた時点で、IoT Hub はデバイス/モジュールの接続を切断します。When the token expires, the IoT hub severs the device/module connection. その後、デバイス/モジュールは新しいトークンをトークン サービスに要求する必要があります。Then, the device/module must request a new token from the token service. 有効期限までの期間が短いと、デバイス/モジュールとトークン サービスの両方で負荷が増加します。A short expiry time increases the load on both the device/module and the token service.

デバイス/モジュールをハブに接続するには、デバイス/モジュールが接続にキーではなくトークンを使用している場合でも、引き続き IoT Hub の ID レジストリにデバイス/モジュールを追加する必要があります。For a device/module to connect to your hub, you must still add it to the IoT Hub identity registry — even though it is using a token and not a key to connect. そのため、ID レジストリでデバイス/モジュール ID を有効または無効にすることで、引き続きデバイスごと/モジュールごとのアクセス制御を行うことができます。Therefore, you can continue to use per-device/per-module access control by enabling or disabling device/module identities in the identity registry. この方法は、有効期限までの期間が長い場合にトークンを使用するリスクを軽減します。This approach mitigates the risks of using tokens with long expiry times.

カスタム ゲートウェイとの比較Comparison with a custom gateway

IoT Hub でカスタム ID レジストリ/認証スキームを実装する場合は、トークン サービス パターンをお勧めします。The token service pattern is the recommended way to implement a custom identity registry/authentication scheme with IoT Hub. このパターンにより、IoT Hub がほとんどのソリューション トラフィックを処理できるためです。This pattern is recommended because IoT Hub continues to handle most of the solution traffic. ただし、カスタム認証スキームがプロトコルとそのように組み合わさっている場合、すべてのトラフィックを処理するにはカスタム ゲートウェイが必要になる場合があります。However, if the custom authentication scheme is so intertwined with the protocol, you may require a custom gateway to process all the traffic. このようなシナリオの例として、トランスポート層セキュリティ (TLS) と事前共有キー (PSK) の使用があります。An example of such a scenario is using Transport Layer Security (TLS) and pre-shared keys (PSKs). 詳細については、プロトコル ゲートウェイに関する記事をご覧ください。For more information, see the protocol gateway article.

参照トピック:Reference topics:

以下の参照トピックは、IoT Hub へのアクセスの制御に関する詳細情報を提供しています。The following reference topics provide you with more information about controlling access to your IoT hub.

IoT Hub のアクセス許可IoT Hub permissions

次の表は、IoT hub へのアクセス制御に使用できるアクセス許可の一覧です。The following table lists the permissions you can use to control access to your IoT hub.

アクセス許可Permission メモNotes
RegistryReadRegistryRead ID レジストリへの読み取りアクセスを許可します。Grants read access to the identity registry. 詳細については、「Identity registry」(ID レジストリ) を参照してください。For more information, see Identity registry.
このアクセス許可はバックエンドのクラウド サービスによって使用されます。This permission is used by back-end cloud services.
RegistryReadWriteRegistryReadWrite ID レジストリへの読み取りと書き込みアクセスを許可します。Grants read and write access to the identity registry. 詳細については、「Identity registry」(ID レジストリ) を参照してください。For more information, see Identity registry.
このアクセス許可はバックエンドのクラウド サービスによって使用されます。This permission is used by back-end cloud services.
ServiceConnectServiceConnect クラウド サービス向けの通信エンドポイントと監視エンドポイントへのアクセスを許可します。Grants access to cloud service-facing communication and monitoring endpoints.
デバイスからクラウドへのメッセージの受信、クラウドからデバイスへのメッセージの送信、対応する配信確認メッセージの取得のアクセス許可を付与します。Grants permission to receive device-to-cloud messages, send cloud-to-device messages, and retrieve the corresponding delivery acknowledgments.
ファイル アップロードの配信確認メッセージの取得のアクセス許可を付与します。Grants permission to retrieve delivery acknowledgements for file uploads.
タグおよび必要なプロパティを更新するためのツインへのアクセス、報告されるプロパティの取得、クエリの実行のアクセス許可を付与します。Grants permission to access twins to update tags and desired properties, retrieve reported properties, and run queries.
このアクセス許可はバックエンドのクラウド サービスによって使用されます。This permission is used by back-end cloud services.
DeviceConnectDeviceConnect デバイス向けのエンドポイントへのアクセスを許可します。Grants access to device-facing endpoints.
デバイスからクラウドへのメッセージの送信、クラウドからデバイスへのメッセージの受信のアクセス許可を付与します。Grants permission to send device-to-cloud messages and receive cloud-to-device messages.
デバイスからのファイル アップロードの実行のアクセス許可を付与します。Grants permission to perform file upload from a device.
デバイス ツインの必要なプロパティ通知の受信と、デバイス ツインの報告されるプロパティの更新のアクセス許可を付与します。Grants permission to receive device twin desired property notifications and update device twin reported properties.
ファイル アップロードの実行のアクセス許可を付与します。Grants permission to perform file uploads.
このアクセス許可はデバイスによって使用されます。This permission is used by devices.

参考資料Additional reference material

IoT Hub 開発者ガイド内の他の参照トピックは次のとおりです。Other reference topics in the IoT Hub developer guide include:

  • IoT Hub エンドポイント: 各 IoT Hub でランタイムと管理の操作のために公開される、さまざまなエンドポイントについて説明します。IoT Hub endpoints describes the various endpoints that each IoT hub exposes for run-time and management operations.

  • スロットルとクォータ: IoT Hub サービスに適用されるクォータとスロットルの動作について説明します。Throttling and quotas describes the quotas and throttling behaviors that apply to the IoT Hub service.

  • Azure IoT device SDK とサービス SDK: IoT Hub とやりとりするデバイスとサービス アプリの両方を開発する際に使用できるさまざまな言語の SDK を紹介します。Azure IoT device and service SDKs lists the various language SDKs you can use when you develop both device and service apps that interact with IoT Hub.

  • IoT Hub のクエリ言語: IoT Hub からデバイス ツインとジョブに関する情報を取得する際に使用できるクエリ言語について説明します。IoT Hub query language describes the query language you can use to retrieve information from IoT Hub about your device twins and jobs.

  • IoT Hub の MQTT サポート: IoT Hub での MQTT プロトコルのサポートについて詳しく説明します。IoT Hub MQTT support provides more information about IoT Hub support for the MQTT protocol.

次の手順Next steps

IoT Hub へのアクセス制御の方法を理解できたら、次の IoT Hub 開発者ガイドのトピックもご覧ください。Now that you have learned how to control access IoT Hub, you may be interested in the following IoT Hub developer guide topics:

この記事で説明した概念を試す場合は、次の IoT Hub のチュートリアルをご覧ください。If you would like to try out some of the concepts described in this article, see the following IoT Hub tutorials: