SORACOM Kryptonのありがたみを感じてみる

IoTデバイスを動かすために避けては通れない道、認証。
「デバイスごとに固有」の認証情報を、いかに「セキュアに」生成し、埋め込むか、IoTに携わるエンジニアは常に頭を悩ませてきました。

そんな中、[SORACOM Conference “Discovery” 2018](https://discovery2018.soracom.jp/)にて、[SORACOM Krypton](https://soracom.jp/services/krypton/)なるサービスが発表されました。
Kryptonによって、未だかつてないほど簡単にデバイスの認証情報を得ることができ、デバイスの数が多い場合に特に力を発揮します。
本記事では、AWS IoT Coreの証明書をデバイスに埋め込む作業に焦点を当て、Kryptonのありがたみを感じてみます。

## Kryptonざっくり説明
一番スタンダードであろう、SORACOM Air のセルラー回線を使用したAWS IoT Coreの証明書取得の流れです。
<img width="793" alt="11DEBE939C4509EB7303431FA7FCF257.png" src="https://qiita-image-store.s3.amazonaws.com/0/39565/fc0c5ac2-0571-0312-5ec5-65c54bad6b14.png">


ほかにもいろいろパターンがあるので、詳細は[公式のドキュメント](https://soracom.jp/services/krypton/)を参照してください。

## AWSが提示している認証情報取得パターン
2018/03/27のAWS Black Belt Online Seminar : [AWS IoT におけるデバイス管理](https://www.slideshare.net/AmazonWebServicesJapan/20180327-aws-black-belt-online-seminar-aws-iot)を見てみると、[4つのパターン](https://image.slidesharecdn.com/20180327blackbeltdevicemanagement-180328095254/95/20180327-aws-black-belt-online-seminar-aws-iot-15-638.jpg?cb=1522294331)を提示しています。

### 1.AWS IoT Coreによる証明書発行
AWS IoT Coreのデバイス用証明書発行機能を使って証明書をあらかじめたくさん発行しておき、デバイス製造時に個別に証明書を埋め込むやり方です。
生産ラインが個別のデータ埋め込みに対応している必要があります。

事前に証明書を発行するので、証明書の発行権限の管理だったり、デバイス増産時の追加発行フローなども決めねばなりません。
また、証明書の名前がランダムな文字列なので、どの証明書がどのデバイスに入っているかを管理するのもちょっと大変です。

### 2.持ち込みCAによる証明書発行
1.の証明書の発行方法を自前認証局による発行にしたものです。

自前認証局を用意しなければなりませんが、証明書の期限のコントロールができます。

### 3.Just in time registration
AWS IoT Coreに用意されている機能です。
自前認証局をあらかじめAWS IoT Coreに登録しておくと、その認証局で発行された未登録の証明書でのアクセスが来た場合に特定のtopicにメッセージをPublishしてくれるというものです。
このメッセージをSubscribeし、証明書を登録すれば、1.や2.のようにあらかじめデバイスとAWS IoT Coreを紐づけておく必要がなくなります。

ただし、自前認証局の用意が必要ですし、メッセージをSubscribeして証明書を登録する機構もLambdaなどを使って自前で構築しなければなりません。([サンプルのLambdaコードはあります](https://github.com/aws-samples/aws-iot-examples/blob/master/justInTimeRegistration/deviceActivation.js))

### 4.Bootstrapping
デバイスの初回起動時に特定のAPIを叩くなどして証明書を取得するパターンです。
もちろんそのAPIは自前で用意する必要があります。
また、誰でもそのAPIを呼べてしまったら困るので、APIを呼び出す権限をデバイスに持たせて…？と無限ループっぽくなります。
資料にも、「生産現場とCloudでどうしても連携が難しい場合の手段」とあるので、あまりオススメではないのでしょう。

### 1.から4.まで見てきましたが
どれもちょっと手間がかかるような印象です。。

AWSの立場からすると、正規デバイスからのアクセスと攻撃者からのアクセスの見分けがつかないので、デバイス側に何かしら証明してもらうものを入れてもらう必要があります。
なのでどうしてもスッキリした形にできないんだと思います。

## Kryptonを使うとどうなるか
Kryptonは、上述の「4.Bootstrapping」の方法をベースに、SORACOMの強みを活かしてうまいことやっています。
SORACOMのAir SIMはそれぞれ個別の情報を持っているため、SIMを挿しているだけで正規のデバイスであることを証明することができます。
そのため、デバイス自体に識別情報を持たせなくても堂々とAWS IoT Coreに証明書の発行を依頼できるわけです。

ということで、実際にやってみました！

[公式による手順解説](https://dev.soracom.io/jp/start/krypton_awsiot/)に沿って試しました。これが十分詳しいので、いくつか補足しながら。

### AWS IoTポリシーを作成する
AWS IoT Coreでポリシーを作成します。
公式の解説どおり。

### 証明書を生成する権限を持つ AWS IAM 資格情報を作成する
Kryptonに渡すやつです。
こちらも公式の解説どおり。

### SORACOM Krypton を設定する
SORACOMのコンソールでもろもろ設定します。

Kryptonの設定で少し捕捉。
##### Thing name pattern 
APIを呼ぶときにThing Nameを指定できるけど、指定しない場合にここの生成パターンが使われるらしい。
パターンってどうやって指定するの？と思ったら、ここに書いてました。
https://dev.soracom.io/jp/docs/group_configuration/
`$imsi`の部分をIMSIで置き換えてくれます。

##### ルート認証局証明書
入力不要。持ち込みCA使う場合に使う？

### APIを呼んでみる
ドキュメントではサンプルプロジェクトを使ってデバイスへの接続を行なっていますが、サンプルプロジェクトはバイナリでAPIを呼んでいるようなので、純粋にAPIを呼んでみました。

Kryptonを設定したグループ所属のSIMを挿したデバイスでAPIを呼んであげれば証明書を取得できます。
必要なデータはすべてSORACOMコンソールで設定しているので、パラメータは不要です。
```
$ curl -X POST https://krypton.soracom.io:8036/v1/provisioning/aws/iot/bootstrap
```

<img width="1440" alt="4E8789959442C1FD1BC85A6BBD2DCDBC.png" src="https://qiita-image-store.s3.amazonaws.com/0/39565/a1696cb9-c6ff-7f9c-a07b-c181860ca724.png">


ちゃんとThingもできてました！
<img width="975" alt="31B5E99AE7C361E463637EDB77F3F634.png" src="https://qiita-image-store.s3.amazonaws.com/0/39565/b18b529b-5152-769d-fab9-9d964415f65c.png">

## おわりに
Kryptonを使うことで、面倒なことを一切せずにAWS IoT Coreの証明書をデバイスに取り込むことができました。
今回は1台で行いましたが、台数が増えてもこの便利さは変わりません。ありがたいですね。

Kryptonは、SORACOMの強みを活かした素晴らしいサービスであると同時に、
大規模IoTプロジェクトがこのサービスが求められるほど増えてきたことが窺えて、IoT市場の成長を感じます。
まだAWS IoT Core, Amazon Cognito, SORACOM Inventoryのみの対応ですが、これからさらに多くのサービスに対応していくのではないかと思われます。
今後の展開に期待です。