フリートプロビジョニングを使用したデバイス証明書がないデバイスのプロビジョニング - AWS IoT Core

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

フリートプロビジョニングを使用したデバイス証明書がないデバイスのプロビジョニング

AWS IoT フリートプロビジョニングを使用することで、AWS IoT は、初めて AWS IoT に接続するときにデバイス証明書とプライベートキーを生成し、デバイスに安全に配信できます。AWS IoT は、Amazon ルート認証局(CA)によって署名されたクライアント証明書を提供します。

フリートプロビジョニングを使用するには、次の 2 つの方法があります。

クレームによるプロビジョニング

デバイスは、プロビジョニングクレーム証明書とプライベートキー(特別な目的の認証情報)が埋め込まれた状態で製造できます。これらの証明書が AWS IoT に登録されている場合、サービスはそれらを、デバイスが通常のオペレーションで使用できる一意のデバイス証明書と交換できます。このプロセスには、以下のステップが含まれます。

デバイスを配送する前に
  1. CreateProvisioningTemplate を呼び出して、プロビジョニングテンプレートを作成します。この API はテンプレート ARN を返します。詳細については、「デバイスプロビジョニング MQTT API」を参照してください

    また、AWS IoT コンソールからフリートプロビジョニングテンプレートを作成することもできます。

    1. ナビゲーションペインで、[Connect] (接続)、[Fleet provisioning templates] (フリートプロビジョニングテンプレート) の順に選択します。

    2. [Create template] (テンプレートの作成) を選択し、プロンプトに従います。

  2. プロビジョニングクレーム証明書として使用する証明書および関連付けられたプライベートキーを作成します。

  3. これらの証明書を AWS IoT に登録し、証明書の使用を制限する IoT ポリシーを関連付けます。次の IoT ポリシーの例では、このポリシーに関連付けられた証明書の使用をプロビジョニングデバイスに制限しています。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["iot:Connect"], "Resource": "*" }, { "Effect": "Allow", "Action": ["iot:Publish","iot:Receive"], "Resource": [ "arn:aws:iot:aws-region:aws-account-id:topic/$aws/certificates/create/*", "arn:aws:iot:aws-region:aws-account-id:topic/$aws/provisioning-templates/templateName/provision/*" ] }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": [ "arn:aws:iot:aws-region:aws-account-id:topicfilter/$aws/certificates/create/*", "arn:aws:iot:aws-region:aws-account-id:topicfilter/$aws/provisioning-templates/templateName/provision/*" ] } ] }
  4. デバイスのプロビジョニング時に、アカウント内のモノや証明書などの IoT リソースを作成または更新するアクセス許可を AWS IoT サービスに付与します。これを行うには、AWSIoTThingsRegistration サービスプリンシパルを信頼する IAM ロール (プロビジョニングロールと呼ばれる) に AWS IoT 管理ポリシーをアタッチします。

  5. プロビジョニングクレーム証明書が安全に埋め込まれたデバイスを製造します。

これで、デバイスを設置して使用する場所に配送する準備ができました。

重要

プロビジョニングクレームプライベートキーは、デバイス上を含め、常に保護する必要があります。AWS IoT CloudWatch メトリクスとログを使用して、誤用の兆候を監視することをお勧めします。誤用を検出した場合は、プロビジョニングクレーム証明書を無効にして、デバイスのプロビジョニングに使用できないようにします。

デバイスを使用できるように初期化するには
  1. デバイスは AWS IoT Device SDK、Mobile SDK、および AWS IoT Device Client に対して、AWS IoT を使用して接続し、デバイスにインストールされているプロビジョニングクレーム証明書を使用して認証されます。

    注記

    セキュリティ上の理由から、CreateCertificateFromCsr および CreateKeysAndCertificate によって返される certificateOwnershipToken は 1 時間後に有効期限切れになります。certificateOwnershipToken が有効期限切れになる前に、RegisterThing を呼び出す必要があります。CreateCertificateFromCsr または CreateKeysAndCertificate によって作成された証明書がトークンの有効期限が切れるまでにアクティベートされず、ポリシーまたはモノにアタッチされない場合、証明書は削除されます。トークンの有効期限が切れた場合、デバイスは CreateCertificateFromCsr または CreateKeysAndCertificate を呼び出して新しい証明書を生成します。

  2. デバイスは、以下のオプションのいずれかを使用して、永続的な証明書とプライベートキーを取得します。デバイスは、AWS IoT での今後のすべての認証にその証明書とキーを使用します。

    1. CreateKeysAndCertificate を呼び出して、AWS 認証局により新しい証明書とプライベートキーを作成します。

      または

    2. CreateCertificateFromCsr を呼び出して、プライベートキーを安全に保つ証明書署名リクエストから証明書を生成します。

  3. デバイスから RegisterThing を呼び出してデバイスを AWS IoT に登録し、クラウドリソースを作成します。

    フリートプロビジョニングサービスでは、プロビジョニングテンプレートを使用して、IoT のモノなどのクラウドリソースを定義および作成します。このテンプレートでは、モノが属する属性とグループを指定できます。新しいモノを追加するには、モノのグループが存在している必要があります。

  4. デバイスに永続的な証明書を保存した後、デバイスはプロビジョニングクレーム証明書を使用して開始したセッションから切断し、永続的な証明書を使用して再接続する必要があります。

これで、デバイスは AWS IoT と正常に通信する準備ができました。

信頼できるユーザーによるプロビジョニング

多くの場合、エンドユーザーやインストール技術者などの信頼されたユーザーがモバイルアプリを使用してデプロイされた場所にデバイスを設定するときに、デバイスは AWS IoT に初めて接続します。

重要

この手順を実行するには、信頼されたユーザーのアクセスとアクセス許可を管理する必要があります。そのための 1 つの方法は、信頼されたユーザーに対して、これらのユーザーを認証し、この手順の実行に必要な AWS IoT 機能および API オペレーションへのアクセスを許可するアカウントを提供して維持することです。

デバイスを配送する前に
  1. CreateProvisioningTemplate を呼び出してプロビジョニングテンプレートを作成し、その templateArn および templateName を返します。

  2. 信頼されたユーザーがプロビジョニングプロセスを開始するために使用する IAM ロールを作成します。プロビジョニングテンプレートでは、そのユーザーだけがデバイスをプロビジョニングできます。以下に例を示します。

    { "Effect": "Allow", "Action": [ "iot:CreateProvisioningClaim" ], "Resource": [ "arn:aws:iot:aws-region:aws-account-id:provisioningtemplate/templateName" ] }
  3. デバイスのプロビジョニング時に、アカウント内のモノや証明書などの IoT リソースを作成または更新するアクセス許可を AWS IoT サービスに付与します。これを行うには、AWS IoT サービスプリンシパルを信頼する IAM ロール(プロビジョニングロールと呼ばれる)に AWSIoTThingsRegistration 管理ポリシーをアタッチします。

  4. 信頼されたユーザーを識別する手段を提供します。例えば、これらのユーザーを認証し、デバイスの登録に必要な AWS API オペレーションとのやり取りを許可できるアカウントを提供します。

デバイスを使用できるように初期化するには
  1. 信頼されたユーザーは、プロビジョニングモバイルアプリまたはウェブサービスにサインインします。

  2. モバイルアプリケーションまたはウェブアプリケーションは、IAM ロールを使用し、CreateProvisioningClaim を呼び出して、AWS IoT から一時的なプロビジョニングクレーム証明書を取得します。

    注記

    セキュリティ上の理由から、CreateProvisioningClaim から返される一時的なプロビジョニングクレーム証明書は 5 分後に有効期限切れになります。以下の手順では、一時的なプロビジョニングクレーム証明書の有効期限が切れる前に、有効な証明書を正常に返す必要があります。一時的なプロビジョニングクレーム証明書はアカウントの証明書のリストには表示されません。

  3. モバイルアプリまたはウェブアプリケーションは、Wi-Fi 認証情報などの必要な設定情報と共に、一時的なプロビジョニングクレーム証明書をデバイスに提供します。

  4. デバイスは、一時的なプロビジョニングクレーム証明書と AWS IoT を使用して AWS IoT Device SDK、Mobile SDK、および AWS IoT Device Client に接続します。

  5. デバイスは、一時的なプロビジョニングクレーム証明書で AWS IoT に接続してから 5 分以内に、これらのオプションのいずれかを使用して永続的な証明書とプライベートキーを取得します。デバイスは、AWS IoT での今後のすべての認証にその証明書とキーを使用します。

    1. CreateKeysAndCertificate を呼び出して、AWS 認証局により新しい証明書とプライベートキーを作成します。

      または

    2. CreateCertificateFromCsr を呼び出して、プライベートキーを安全に保つ証明書署名リクエストから証明書を生成します。

    注記

    CreateKeysAndCertificate または CreateCertificateFromCsr は、一時的なプロビジョニングクレーム証明書を使用して AWS IoT に接続してから 5 分以内に有効な証明書を返す必要があることを覚えておいてください。

  6. デバイスは RegisterThing を呼び出してデバイスを AWS IoT に登録し、クラウドリソースを作成します。

    フリートプロビジョニングサービスでは、プロビジョニングテンプレートを使用して、IoT のモノなどのクラウドリソースを定義および作成します。このテンプレートでは、モノが属する属性とグループを指定できます。新しいモノを追加するには、モノのグループが存在している必要があります。

  7. 永続的な証明書をデバイスに保存した後、デバイスは一時的なプロビジョニングクレーム証明書を使用して開始したセッションから切断し、永続的な証明書を使用して再接続する必要があります。

これで、デバイスは AWS IoT と正常に通信する準備ができました。

AWS CLI での事前プロビジョニングフックの使用

次の手順では、事前プロビジョニングフックを使用してプロビジョニングテンプレートを作成します。ここで使用されている Lambda 関数の例は変更可能です。

事前プロビジョニングフックを作成してプロビジョニングテンプレートに適用するには
  1. 定義された入力と出力を持つ Lambda 関数を作成します。Lambda 関数は高度にカスタマイズ可能であり、allowProvisioning および parameterOverrides は事前プロビジョニングフックを作成するために必要です。Lambda 関数の作成の詳細については、「AWS コマンドラインインターフェイスで AWS Lambda を使用する」を参照してください。

    Lambda 関数出力の例を次に示します。

    { "allowProvisioning": True, "parameterOverrides": { "incomingKey0": "incomingValue0", "incomingKey1": "incomingValue1" } }
  2. AWS IoT はリソースベースのポリシーを使用して Lambda を呼び出すため、Lambda 関数を呼び出すための AWS IoT アクセス許可を与える必要があります。

    重要

    Lambda アクションにアタッチされたポリシーのグローバル条件コンテキストキーに source-arn または source-account を必ず含め、アクセス許可の操作を防止します。詳細については、「サービス間での不分別な代理処理の防止」を参照してください。

    以下は、add-permission を使用して Lambda に IoT アクセス許可を付与する例です。

    aws lambda add-permission \ --function-name myLambdaFunction \ --statement-id iot-permission \ --action lambda:InvokeFunction \ --principal iot.amazonaws.com
  3. create-provisioning-template または update-provisioning-template コマンドを使用して、テンプレートに事前プロビジョニングフックを追加します。

    次の CLI 例では、create-provisioning-template を使用して、事前プロビジョニングフックを持つプロビジョニングテンプレートを作成します。

    aws iot create-provisioning-template \ --template-name myTemplate \ --provisioning-role-arn arn:aws:iam:us-east-1:1234564789012:role/myRole \ --template-body file://template.json \ --pre-provisioning-hook file://hooks.json

    このコマンドの出力は以下のようになります。

    { "templateArn": "arn:aws:iot:us-east-1:1234564789012:provisioningtemplate/myTemplate", "defaultVersionId": 1, "templateName": myTemplate }

    また、パラメータをすべてコマンドラインパラメータ値として入力する代わりに、ファイルからロードして、時間を節約することもできます。詳細については、「ファイルから AWS CLI パラメータをロードする」を参照してください。次に、拡張された JSON 形式の template パラメータを示します。

    { "Parameters" : { "DeviceLocation": { "Type": "String" } }, "Mappings": { "LocationTable": { "Seattle": { "LocationUrl": "https://example.aws" } } }, "Resources" : { "thing" : { "Type" : "AWS::IoT::Thing", "Properties" : { "AttributePayload" : { "version" : "v1", "serialNumber" : "serialNumber" }, "ThingName" : {"Fn::Join":["",["ThingPrefix_",{"Ref":"SerialNumber"}]]}, "ThingTypeName" : {"Fn::Join":["",["ThingTypePrefix_",{"Ref":"SerialNumber"}]]}, "ThingGroups" : ["widgets", "WA"], "BillingGroup": "BillingGroup" }, "OverrideSettings" : { "AttributePayload" : "MERGE", "ThingTypeName" : "REPLACE", "ThingGroups" : "DO_NOTHING" } }, "certificate" : { "Type" : "AWS::IoT::Certificate", "Properties" : { "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"}, "Status" : "Active" } }, "policy" : { "Type" : "AWS::IoT::Policy", "Properties" : { "PolicyDocument" : { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action":["iot:Publish"], "Resource": ["arn:aws:iot:us-east-1:504350838278:topic/foo/bar"] }] } } } }, "DeviceConfiguration": { "FallbackUrl": "https://www.example.com/test-site", "LocationUrl": { "Fn::FindInMap": ["LocationTable",{"Ref": "DeviceLocation"}, "LocationUrl"]} } }

    次に、拡張された JSON 形式の pre-provisioning-hook パラメータを示します。

    { "targetArn" : "arn:aws:lambda:us-east-1:765219403047:function:pre_provisioning_test", "payloadVersion" : "2020-04-01" }