SORACOM Technology Camp 2018 で関連するセッションに参加してから気になっていたものの触れていなかった SORACOM Krypton を触ってみました。公式のチュートリアルを参考に、 AWS IoT へのデバイス登録を試してみます。
SORACOM Krypton とは
詳細な説明は公式ページ(SORACOM Krypton とは)をご覧いただければと思いますが、すごく簡単に言うと、 IoT デバイスのクラウドサービスへの接続設定をセキュアに行うためのサービスです。
IoT デバイスをクラウドサービスへ接続するには認証情報が必要になりますが、デバイス上に認証情報を配置するには出荷時に組み込んでおくか、あとで個別にデバイス上に配置していく必要がありますが、いずれもかなり手間がかかりますし、配置する認証情報とデバイスの組み合わせを間違う可能性もあります。SORACOM Krypto を使用すると、 SORACOM Air のセルラー回線の情報を使った認証か、SIM の情報を使って SORACOM Endose での認証を行い、認証情報を自動的に発行してデバイスを登録することができますので、初期設定の手間をかなり減らすことができます。
AWS IoT ポリシー設定
まずは登録するデバイスに付与する権限を設定するため、 AWS IoT のポリシーを作成します。 AWS IoT Core の 安全性 -> ポリシー の画面から 作成
をクリックします。
ポリシーの作成フォームが表示されますので、任意の名前を設定します。アクションとしては、今回はとりあえず AWS IoT のフル権限を与えておくために、 iot:*
を設定します。リソース ARN も任意に設定し、効果は 許可
を選択して 作成
をクリックすると AWS IoT ポリシーが作成されます。
AWS ユーザ設定
次にデバイス登録時に証明書を発行する権限を持つ IAM ユーザを作成します。IAM のユーザーメニューで ユーザーを追加
をクリックします。
ユーザー名は任意に設定し、アクセスの種類は プログラムによるアクセス
を選択して 次のステップ: アクセス権限
をクリックします。
アクセス許可の設定として、 既存のポリシーを直接アタッチ
を選択し、「CreateKeysAndCertificate」ポリシーを付与します。
ポリシーを設定したら ユーザーの作成
をクリックしてユーザーを作成します。
ユーザーが作成されたら、あとで SORACOM 側の設定時に必要になるので、 csv ファイルで認証情報をダウンロードしておくか、アクセスキー ID とシークレットアクセスキーをメモしておきます。
ただ実際にこの権限だけで試してみると、あとで登録を実行しようとすると、下記のように権限が足りないと言うことでエラーになります。
$ curl -X POST -H 'content-type: application/json' https://krypton.soracom.io:8036/v1/provisioning/aws/iot/bootstrap {"code":"DIC0001","message":"Error occurred: User: arn:aws:iam::365361468908:user/krypton-aws-iot-provisioner is not authorized to perform: iot:CreateKeysAndCertificate on resource: * (Service: AWSIot; Status Code: 403; Error Code: Access DeniedException; Request ID: e5908284-05a0-11e9-a0d6-5f7d4bdeb37f)"}
なので今回はとりあえずインラインポリシーで「iot:CreateKeysAndCertificate」を追加しました。
最終的に下記二つのポリシーを設定しています。
SORACOM Krypton セットアップ
ここまでで AWS 側の設定は完了なので、続いて SORACOM User Console での設定を行います。
ユーザーアカウントのメニューから、 セキュリティ
をクリックします。
認証情報ストアメニューから 認証情報を登録
をクリックします。
登録フォームが表示されたら、認証情報 ID と概要に任意の内容を設定します。種別は AWS 認証情報を選択して、先ほど作成した IAM ユーザのアクセスキー ID とシークレットアクセスキーを設定して 登録
をクリックします。
次に Krypton を使用するための SIM のグループを作成します。 SIM グループの画面から 追加
をクリックします。
登録フォームが表示されたら任意のグループ名を設定して グループ作成
をクリックします。
グループが作成されたら、グループ設定の「SORACOM Krypton 設定」の項目の設定を ON にして、 +
をクリックして AWS IoT
を選択します。
設定フォームが表示されますので、 AWS リージョンには AWS IoT の設定を行ったリージョンを設定し、認証情報は先ほど SORACOM User Console から登録した認証情報を選択します。 Policy name は AWS IoT で登録したポリシー名を設定します。 Thing name pattern には Krypton 経由で AWS IoT のデバイスを登録するときのネーミングのパターンを指定します。 $imsi は実際の IMSI に置き換えられます。ホスト名はアカウント固有の AWS IoT エンドポイントです。ルート認証局証明書はブランクで問題ありません。以上の設定ができたら OK
をクリックします。
上記の設定内容については公式の下記ページの一番下にも説明があります。
グループの設定はここまでで完了なので、このグループに SIM を紐付けます。 SIM の管理画面で対象の SIM のチェックボックスにチェックを入れて、 操作
メニューから 所属グループ変更
を選択します。
変更フォームが表示されたら、先ほど作成したグループを選択して グループ変更
をクリックします。
Raspberry Pi から登録確認
ここまでで全ての設定は完了なので、実際の登録を行ってみたいと思います。今回は Rapberry Pi 3 Model B を USB ドングル + SORACOM Air でセルラー回線に接続し、 curl で Krypton の API にアクセスします。すると認証情報が作成され、下記のように JSON 形式でレスポンスを受け取ることができます。
$ curl -X POST -H 'content-type: application/json' https://krypton.soracom.io:8036/v1/provisioning/aws/iot/bootstrap | jq % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 4945 100 4945 0 0 658 0 0:00:07 0:00:07 --:--:-- 1216 { "region": "ap-northeast-1", "certificate": "-----BEGIN CERTIFICATE-----\nMIIDWTCCAkGgAwIBAgIUYrFCx+WJLTtlZNHykz2jt2B2y8swDQYJKoZIhvcNAQEL\nBQAwTTFLMEkGA1UECwxCQW1hem9uIFdlYiBTZXJ2aWNlcyBPPUFtYXpvbi5jb20g\nSW5jLiBMPVNlYXR0bGUgU1Q9V2FzaGluZ3RvbiBDPVVTMB4XDTE4MTIyMjA0Mzg0\nNFoXDTQ5MTIzMTIzNTk1OVowHjEcMBoGA1UEAwwTQVdTIElvVCBDZXJ0aWZpY2F0\nZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMiKSq8YxvnVHyTVRApZ\nundMbttTH9iP87NiwbKKQWPwFyRQGUIhaLxamIcjRV9FBwdj5F4eTBtGdKjSrjbG\nS0DlLoyL4rkNKRoVYpn8Rnr2Akt9LUmzf8ckQMZEhn04U5Ac8Q8YlkPvY+r4Lfb1\n〜〜〜中略〜〜〜-----END CERTIFICATE-----\n", "privateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAyIpKrxjG+dUfJNVEClm6d0xu21Mf2I/zs2LBsopBY/AXJFAZ\nQiFovFqYhyNFX0UHB2PkXh5MG0Z0qNKuNsZLQOUujIviuQ0pGhVimfxGevYCS30t\nSbN/xyRAxkSGfThTkBzxDxiWQ+9j6vgt9vXgQJfvwalMHBdb99NEtOiLuWVTl8jC\nDR/yKcIMe4DSIO18UZS1P4KI48WtwTMQN1DiZ1CYEHTEME+AWSggrl6edAox4wBD\nmcGFCOYF/sLZq/c4c/EKo8qW/G7NVZyFUDNbgAHe3X+eASR0Zk8uLUjU2LLSK6a8\ncQNTcVrmOYbN87buqxUxG750HGI+UEq80kdF4QIDAQABAoIBAQCKt4ZDqjrw0+gw\nHUlsc3bVUMyZ79zme2TSoCxmKNZkn84SM0nVgbCmIXDCgbZZ2TCsfv+XzxNMBqdp\n〜〜〜中略〜〜〜-----END RSA PRIVATE KEY-----\n", "rootCaCertificate": "-----BEGIN CERTIFICATE-----\r\nMIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB\r\nyjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\r\nExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\r\nU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\r\nZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\r\n〜〜〜中略〜〜〜-----END CERTIFICATE-----", "host": "XXXXXXXXXXXXXX-ats.iot.ap-northeast-1.amazonaws.com", "clientId": "KryptonDevice_XXXXXXXXXXXXXXX" }
AWS IoT のコンソールから確認すると、下記のようにデバイスが追加されていることがわかります。
何度 API にアクセスしても、同じ SIM からであればデバイス情報は重複して作成されることはありませんが、証明書はアクセスする度に追加で作成されてしまいますのでご注意ください。
まとめ
今回は Krypton の API を呼んで認証情報を登録するところまででしたが、実際はレスポンスとして受け取った認証情報をファイルに保存して、それ以降のアクセス時に使用する形になるかと思います。最初の設定さえ済ませてしまえば、それ以降は新しいデバイスを追加する際には API を呼ぶだけでクラウドサービスへの登録ができてしまうので、とても便利ですね。ただラズパイのようにLinuxベースでリソースが豊富なデバイスと違い、 M5Stack などリソースが限られているマイコンでは X.509 認証などが使えないケースもあるので、その際はまた違った対応が必要かと思います。