Amazon Web Services ブログ
AWS IoT Core がフリートプロビジョニングでのプライベート認証局をサポート開始しました
はじめに
AWS IoT Core は AWS IoT Core フリートプロビジョニングにおけるセルフマネージドのクライアント証明書の署名方法の一般提供を開始しました。新しいセルフマネージドの証明書署名機能により、フリートプロビジョニング時に、外部の認証局 (CA) 、独自の公開鍵基盤 (PKI) 、もしくは AWS Private CA などの一般的な CA サービスを利用して、証明書署名要求 (CSR) に署名を行うことができます。この統合により、フリートプロビジョニングを行う際に X.509 クライアント証明書の属性をカスタマイズすることが可能となり、セキュリティが重視されるシナリオでは特に有効です。このブログでは、AWS マネジメントコンソールと AWS CLI を使用してどのようにセルフマネージドのクライアント証明書の署名を行うことができるか解説します。
フリートプロビジョニングでのセルフマネージドの証明書署名機能の利点
- クライアント証明書のカスタマイズの合理化: セルフマネージドのクライアント証明書署名機能により、フリートプロビジョニングにおいて任意の CA で直接クライアント証明書の署名を行うことができます。そのため、カスタムのソリューションを設定する必要がなく、導入にかかる時間を節約し、メンテナンスコストを削減することができます。
- セキュリティと柔軟性の強化: お客様のプライベート CA や他のパブリックに信頼されている CA を用いることでお客様のセキュリティ要件に柔軟に対応できるようになります。有効期間、署名アルゴリズム、発行者、エクステンションを選択することができるため、よりフレキシブルに証明書の管理を行うことができます。
- ファームウェアのアップデートは不要: 新しいセルフマネージドの証明書の署名を使用するためにファームウエアのアップデートは不要です。AWS マネジメントコンソール、もしくは AWS CLI 上からセルフマネージドのクライアント証明書署名方式を有効にすると、フリートプロビジョニングの CreateCertificateFromCsr MQTT API の証明書の署名の動作が更新されます。一方、AWS 管理のクライアント証明書署名方式を使用する場合、AWS IoT Core は自身の CA にてCSR に署名を行います。
AWS IoT Core フリートプロビジョニングの概要
AWS IoT Core のフリートプロビジョニング機能を使用すると、クライアントが AWS IoT Core に初めて接続するときに、クライアント証明書と秘密鍵を生成し、安全な形で配信することできます。特筆すべき点として、AWS IoT Core によって発行されたクライアント証明書だけでなく、CA 認証局によって署名されたクライアント証明書も利用することができます。この機能により、デバイスのセットアッププロセスが効率化され、カスタマイズの選択肢が増えます。
プロビジョニングには以下の2つの方法があります:
クレームによるプロビジョニング
製造時に、プロビジョニングだけを行う事が可能な、権限が制限されたプロビジョニングクレーム証明書と秘密鍵をデバイスに書き込んでおき、この証明書を AWS IoT Core に登録しておきます。これにより、サービス開始時にデバイスが通常のオペレーションで使用するためのクライアント証明書と交換することができます。
信頼できるユーザによるプロビジョニング
多くの場合、信頼されたユーザーによるプロビジョニングでは、エンドユーザーや管理者のような信頼されたユーザーが、モバイルアプリを使用して、デプロイされた場所でデバイスを設定するときに、デバイスが初めて AWS IoT Core に接続します。信頼されたユーザーによるプロビジョニングは、スマートホームデバイスなどの様に、デバイスをコンパニオンアプリで設定する必要がある場合によく使用されます。
この機能を有効にするワークフロー
前提条件
- ご自身のAWS アカウントにて certificate provider を作成するための権限が付与されていること
- Lambda 関数を作成、追加する権限が付与されていること
- PLambda 関数の変数を追加、更新する権限が付与されていること
セルフマネージドのクライアント証明書の署名を有効にするためには以下のステップが必要です
- 証明書に署名を行う AWS Lambda 関数を作成し、関数を実行するために AWS IoT の権限を付与します。
- セルフマネージドの証明書署名方法に切り替えます。それにより、アカウントレベルで AWS IoT certificate provider のリソースが作成され、certificate provider がAWS Lambda 関数の Amazon Resource Name (ARN) を使用します。
AWS IoT Core の certificate provider が作成されると以降は、そのアカウントでの証明書署名要求 (CSR) に署名を行うために呼び出させる fleet provisioning CreateCertificateFromCsr MQTT API は AWS Lambda 関数を使用するようになります。AWS IoT Core 自身のもつ CA でクライアント証明書が署名されるように戻すために、Amazon 管理の CA に切り替えることも可能で、その場合には certificate provider はアカウントから消去されます。
ソリューションの概要
AWS IoT Core フリートプロビジョニングでのセルフマネージドクライアント証明書署名のソリューションの概要を、アーキテクチャ図とともに、順を追って見ていきましょう。
以下のステップは、ユーザーがセルフマネージドクライアント証明書署名を作成し、切り替えを行った際の CreateCertificateFromCsr の動作を示します:
- デバイスが CreateCertificateFromCsr をリクエストする。
- AWS IoT Core certificate provider が存在しないので、AWS IoT Core は自身の CA にて CSR に署名を行い、クライアント証明書を発行する。
- ユーザーがクライアント証明書作成方法をセルフマネージドに切り替える。これにより、 certificate provider が作成される。
- デバイスが CreateCertificateFromCsr をリクエストする。
- AWS IoT Core はクライアント証明書に署名を行うために certificate provider の AWS Lambda 関数を呼び出す。
- ユーザーがクライアント証明書作成方法を AWS マネージドに切り替える。これにより、certificate provider が削除され、AWS マネージドクライアント証明書署名方式に移行する。
- デバイスが CreateCertificateFromCsr をリクエストする。
- クライアント証明書セルフサインメソッドが存在しないので、AWS IoT Core が CSR を署名する。
Figure 1.0: AWS IoT Core フリートプロビジョニングソリューションアーキテクチャ概要図
実装の手順
プライベート CA の作成
このブログではクライアント証明書のセルフ署名方式として AWS プライベート CA を証明書の署名に使用します。プライベート CA をどのように作成するかを示す手順についてはプライベート CA の作成をご参照ください。作成した CA の ARN を保存しておいてください。
AWS Lambda 関数の作成
セルフマネージドクライアント証明書作成方法に切り替える前に、CSR に署名を行うための AWS Lambda 関数を作成する必要があります。以下の関数は、プライベート CA と SHA256WITHRSA の署名アルゴリズムを使用して、入力された CSR に署名を行うため、AWS プライベート CA を呼び出します。戻されたクライアント証明書は1年間有効です。(要望に応じて有効期限を変更することも可能です。サンプルコードは 365 日の有効期限を設定しています。)
Step 1:
AWS Lambda コンソールから:
- 関数の作成を選択
- 一から作成」を選択
- 関数名を入力し、最新の Python のランタイムを選択、残りの項目はデフォルトのままにします。
- 「関数の作成」を選択
関数が作成されたら Step2 へ。
Step 2:
関数を選択して、以下のサンプルコードをエディターにコピーします。
import os
import time
import uuid
import boto3
def lambda_handler(event, context):
ca_arn = os.environ['CA_ARN']
csr = (event['certificateSigningRequest']).encode('utf-8')
acmpca = boto3.client('acm-pca')
cert_arn = acmpca.issue_certificate(
CertificateAuthorityArn=ca_arn,
Csr=csr,
Validity={"Type": "DAYS", "Value": 365},
SigningAlgorithm='SHA256WITHRSA',
IdempotencyToken=str(uuid.uuid4())
)['CertificateArn']
# Wait for certificate to be issued
time.sleep(1)
cert_pem = acmpca.get_certificate(
CertificateAuthorityArn=ca_arn,
CertificateArn=cert_arn
)['Certificate']
return {
'certificatePem': cert_pem
}
このコードは作成したプライベート CA の ARN を参照するので、ARN を関数の設定に登録することが必要です。関数の設定タブに移動し、左側のメニューバーから環境変数を選択します。CA_ARN をキーとして、作成したプライベート CAの ARN の値を値として登録します。
関数を実行するために AWS IoT のパーミッションを取得する
AWS Lambda 関数を作成した後、関数を実行するために AWS IoT のパーミッションを取得します。
Step 1:
- Lambda 関数を選択
- 設定のタブを開く
- アクセス権限を選択
- リソースベースのポリシーステートメントの箇所から
- 「アクセス権限を追加」を選択
- 「 AWS のサービス」を選択
- サービスのドロップダウンメニューから「AWS IoT」を選択
- ステートメント ID に一意なステートメント ID を入力
- 「ソース ARN」に certificate provider の ARN をペースト (以下のリージョン、アカウント ID 、certificate provider の名前を置き換えてください) “arn:aws:iot:REGION:ACCOUNT_ID:certificateprovider:CERTIFICATE_PROVIDER_NAME”
作成した AWS Lambda 関数をテスト
新しく作成した AWS Lambda 関数を選択し、「テスト」のタブにてテストイベントを作成することで、作成した AWS Lambda 関数をテストすることができます。テストイベントに以下のサンプル JSON データを挿入します。
{
"certificateSigningRequest": "-----BEGIN CERTIFICATE REQUEST-----\nMIICaTCCAVECAQAwJDEiMCAGA1UEAwwZQm9zdG9uQ2VydGlmaWNhdGVQcm92aWRl\ncjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALAlk4aEcoheqUPFOj17\ne8Qs9fhLXkNLhtmx/ePE6A0Tb6dFwWt+jwspITE96heBBQrMVCwVkI2C5tbtpx3a\n8+c5qlSZBGX7w9Tlz1Ik30rJQTeB/X7CIU068ld4b+xBNxQLJQw0eSmWCC8p+CD/\nkdxC8rGCkSia/Cd7Hp9pTdBL8nU1t+QDppv+c4dtYrRVDjPmRcwpv4dyvH5/R6aZ\nxJToKPlt3P6cpa5KEhWZvjVt7XvpbU4GMhP+ZeQL1bLFWZAJ+tAiz6qG5xr4X/2V\nWjmSQWsDnbSzWjdRtXJZZGucIR6Gif95G2E08/VJlRtBi3d3OnhdYbYBiNW4X5ck\nsqkCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQCTqiW6qZ1nLW1pNt35wFVTpvzR\nUUkAdNLugmdNZIhqi4VWi0YXfhTPszOdnTcDAaoBTvSvmqCZHfPnRnt65XsMcNQO\nY+M5f/b1n5t0kKbzdFLu+GlK2eB+J8VtQqfAKw3q5a6Q0nu+OUOhm2PepdMkRoxw\n9tUDLTHiG/8zySxUo552hNlBz0wDVb1hjrEgLDi56mQ7FJKICzpkQAq5pMcJQj6t\nozWYrxzszGDa+ZFQ7H4DY/xl4acf1rownncF7mqQgVcAjTXchJ/ETIghJAO8qU1+\nz7ASTlm8Ym8Qov9YiISzss9i2z/78tVksvL3idZ5L0W2m6pnkVuQe3wknBYw\n-----END CERTIFICATE REQUEST-----",
"clientId": "221a6d10-9c7f-42f1-9153-e52e6fc869c1",
"principalId": "f2a33ae79323012c5f5b4250de3952568f1d81b2aa5bad1301b23b0991ba0ef4"
}
データを挿入後、保存し、テストを実行します。
AWS IoT のコンソール上でセルフマネージド型のクライアント証明書署名方式を有効にする
AWS IoT のコンソール上から(以下のスクリーンショットをご参照ください)
- 「セキュリティ」を選択
- 「Certificate signing」を選択
- 「Edit signing method」を選択
- 「Certificate signing」を選択
Figure 1.1: フリートプロビジョニングでのセルフマネージド証明書署名
- 「Self-managed」を選択
- 証明書プロバイダーの設定で
- 証明書プロバイダー名に一意の名前を入力
- AWS Lambda 関数について、先ほど作成した Lambda 関数を選択
- 証明書プロバイダーの設定で
- 証明書プロバイダーを作成」を選択
Figure 1.2: セルフ署名による署名書の署名を有効にする
「確認」と入力し、「確認」をクリックします。
Figure 1.3: 証明書署名方法を確認
完了すると、証明書プロバイダーが「Self-managed」に変更されます。 (以下の figure 1.4 をご参照ください)
Figure 1.4: クライアント証明書詳細
セルフマネージドクライアント証明書署名の AWS Lambda 関数への入力
AWS IoT Core は、デバイスが CreateCertificateFromCsr MQTT API を呼び出すと、以下の JSON オブジェクトを AWS Lambda 関数に送信します。certificateSigningRequest の値は、デバイスが CreateCertificateFromCsr リクエストにて提供したCSR( Privacy-Enhanced Mail(PEM)形式)です。principalId は、CreateCertificateFromCsr リクエストの際に AWS IoT Core への接続に使用したプリンシパル(クライアント証明書)の ID となります。clientId は MQTT 接続の際に設定したクライアント ID となります。
{
"certificateSigningRequest": "string",
"principalId": "string",
"clientId": "string"
}
セルフマネージドクライアント証明書署名の AWS Lambda 関数からのレスポンス
AWS Lambda 関数は certificatePem の値を含むレスポンスを戻す必要があります。以下は成功した場合のレスポンスの例です。AWS IoT は戻り値 (certificatePem) をクライアント証明書を作成するために使用します。
{
"certificatePem": "string"
}
クライアント証明書の登録が成功した場合、CreateCertificateFromCsr は CreateCertificateFromCsr のレスポンスに含まれるのと同じ certificatePem を返します。詳細は、CreateCertificateFromCsr のレスポンスのペイロードの例をご参照ください。
重要な注意事項:
- AWS Lambda 関数が返すクライアント証明書は、証明書署名要求(CSR)と同じサブジェクト名と公開鍵を持つ必要があります。
- AWS Lambda 関数は、5秒以内に実行を終了する必要があります。
- AWS Lambda 関数は、セルフマネージドクライアント証明書署名を有効にした AWS アカウントおよびリージョンにある必要があります。
- AWS IoT サービスに対して、AWS Lambda 関数を実行する権限を付与する必要があります。サービス間での混乱した代理のセキュリティ問題を回避するために(リンク先のガイダンスに従って、混乱した代理問題を回避してください)、Lambda 関数の実行権限には sourceArn と sourceAccount を設定することを推奨します。詳細については、サービス間での混乱した代理問題の防止を参照してください。
AWS CLI を用いてセルフマネージド型のクライアント証明書の署名を有効にする
セルフマネージドクライアント証明書の署名を利用するには、アカウントレベルで AWS IoT Core の certificate provider を作成する必要があります。create-certificate-provider CLI コマンドを使って certificate provider を作成することができます。
aws iot create-certificate-provider \
--certificateProviderName my-certificate-provider \
--lambdaFunctionArn arn:aws:lambda:<your-region>:<your-account-id>:function:my-function \
--accountDefaultForOperations CreateCertificateFromCsr
このコマンドの出力例は以下のようになります:
{
"certificateProviderName": "my-certificate-provider",
"certificateProviderArn": "arn:aws:iot: <your-region>:<your-account-id>:my-certificate-provider"
}
AWS IoT Core の certificate provider の作成が成功すると、以下のようにアカウント内の provider のリストを取得することができます:
aws iot list-certificate-providers
このコマンドの出力例は以下のようになります:
{
"certificateProviders": [
{
"certificateProviderName": "my-certificate-provider",
"certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider"
}
]
}
注意:
AWS IoT Core の certificate provider を作成するとフリートプロビジョニング向けの CreateCertificateFromCsr の API の振る舞いは、全ての CreateCertificateFromCsr の呼び出しが CSR を署名するために certificate provider を起動するように変わります。これには certificate provider が作成されてから数分を要しますのでご注意ください。
まとめ
AWS IoT Core のフリートプロビジョニングでのセルフマネージドクライアント証明書署名機能により、フリートプロビジョニングを使用する際の証明書署名を、特定のニーズに応じてカスタマイズすることが可能となり、カスタムのインフラストラクチャを設定する必要がなくなります。この機能により、フリートプロビジョニングを使用する際に、よりフレキシブルでかつ制御性の高い形で組織固有のセキュリティの要件を満たすことが可能となります。
著者について
Syed Rehan は、ロンドンの Amazon Web Services(AWS)のシニア IoT サイバーセキュリティスペシャリストで、AWS IoT の組織で活動しています。AWS IoT、機械学習、サイバーセキュリティに関する出版物の著者として、彼はグローバルな役割に広範な専門知識をもたらし、Syed は、AWS IoT Core Identify & Access Management サービスの採用を促進するために、セキュリティスペシャリスト、開発者、セキュリティの意思決定者と協力して、グローバルな顧客にサービスを提供しています。サイバーセキュリティ、IoT、クラウド技術に関する深い知識を持ち、スタートアップから大企業まで幅広い顧客を支援し、AWS環境内で安全な IoT ソリューションの構築を可能にしています。 |
Victor Lesau は Amazon Web Services のシニアテクニカルプロダクトマネージャーです。AWS IoT Core Identity & Access Management の製品戦略、ロードマップ計画、ビジネス分析、顧客エンゲージメント、その他の製品管理分野を担当しています。 |
Diana Molodan は、AWS IoT Core のソフトウェア開発エンジニアです。豊富な経験を生かし、応用暗号、ID 管理、IoT、クラウドインフラストラクチャに関連する技術に注力しています。 |
この記事は Syed Rehan、Victor Lesau 、Diana Molodan によって投稿された AWS IoT Core now supports private certificate authorities with fleet provisioning を翻訳したものです。プロフェッショナルサービス本部 シニア IoT コンサルタントの小林が翻訳しました。