スタートアップIoTデバイスの
セキュリティを考える
光安 健太郎
Agenda
• 自己紹介
• 昨今の話のまとめときっかけ
• IoTセキュリティの潮流
• How to implement it
• 結果
• 展望
• まとめ
自己紹介
インフラの出身で、サイバートラストというLinuxと電子認証局のビジネスを
している会社で働いています。
自宅でいろいろやってきました。
自宅外向けDNS
AD構築(Samba4)
Nextcloudサーバー運用
自宅Gluster分散ファイルシステム構築(infiniband)
Jupyter notebook GPU 機械学習サーバー(nvidia Geforce RTX2070)
Volumio Airplayサーバー
https://www.slideshare.net/KentaroM
itsuyasu1/ss-12042350
昨今の話のまとめときっかけ
IoTベンチャーでのいたましい事故
物を作るところから、自宅で趣味からセキュリティを検討しておこう。
そんな難しい話じゃないですよ。クライアント認証
はしてません。デバイス側のリソースが厳しいため、
サーバ証明書のフィンガープリントをハードコード
してました(証明書チェーンは見ない)。サーバ証
明書はAWS ACMなんですけど、よりによって1年っ
ていう短い設定かつ、自動更新(つづく)
IoTセキュリティの潮流
証明書、各クラウドベンダーの接続方法
代表的なAWS IoT,Azure IoTともにX509証明書による接続
クラウド側からデバイスの証明書と秘密鍵をダウンロードし、
デバイスに格納、接続時に使用する。
デバイス側は悪意のあるものに渡った時に秘密鍵を守れない。
それを守る方法として Hardware Root-of-Trustという仕組みで
秘密鍵を守ることが望ましい。
参考資料:
IoT開発におけるセキュリティ設計の手引き 独立行政法人情報処理推進機構
https://www.ipa.go.jp/security/iot/iotguide.html
対応している仕組み:
Arm Trustzoneとしてチップ内部に融合
セキュアエレメントとしての専用チップ
How to implement it
■セキュア機能を外部支援でやるのはそんなに難しいのか。
■どのくらい大変なのか。
How to implement it
■セキュアエレメント比較 1個で買う場合の金額
MAXQ1061 897円
https://www.maximintegrated.com/jp/products/microcontrollers/MAXQ1061.html
Infineon OPTIGA™ Trust X 250円くらい
https://www.infineon.com/cms/jp/product/security-smart-card-solutions/
optiga-embedded-security-solutions/optiga-trust/optiga-trust-x-sls-32aia/
NXP A71CH 350円くらい
https://www.nxp.com/jp/products/identification-security/authentication/
plug-and-trust-the-fast-easy-way-to-deploy-secure-iot-connections:A71CH
Microchip ATECC608 91円
https://www.microchip.com/wwwproducts/en/ATECC608A
How to implement it
■購入
Digi-keyにて発注
25個買うと割引!
SOIC⇒DIP変換のほうが高い!
索引 数量 品番 メーカー品番 商品概要 単価 金額
1 25A880AR-ND LCQT-SOIC8-8
SOCKET ADAPTER SOIC
TO 8DIP 279.28¥6,982
2 25
ATECC608A-
SSHDA-TCT-ND
ATECC608A-
SSHDA-T
IC AUTHENTICATION
CHIP 8SOIC 85.08¥2,127
小計 ¥9,109
How to implement it
■実装
BOMリスト:
ESP32-DevKitC 1個
ATECC608 1個
SOIC⇒DIP変換 1個
GY-BME280 1個
I2Cは100kHzで
I2C0をピン21,22(ATECC608)
I2C1をピン18,19(GY-BME280)へ接続
■開発環境
VSCode+platformio ESP-IDF 3.30
How to implement it
■全体イメージ
BME280で温度、湿度、気圧を測ってMQTTSで
パブリッシュする。
Node-REDで視覚化する。
ESP32-DevkitC
FreeRTOS
MQTTS
ATECC608
MbedTLS
CryptoauthlibESP-IDF
BME280
サーバー
証明書
デバイス
証明書
サーバー
証明書
クライアント
証明書
How to implement it
■証明書の構造:
tbsCertificate
シリアル番号
証明書発行日、有効期限
公開鍵
CN コモンネーム
など…
signatureAlgorithm
ecdsa-with-SHA256(一例)
signatureValue
署名データ
SHA256で
ハッシュ化署名対象
CA
署名
How to implement it
ATECC608が対応できる楕円曲線暗号を選択
secp256r1 別名 prime256v1 または NIST P-256(RFC4492)
256bitの秘密鍵と256bit(X)+256bit(Y)の公開鍵で構成される。
それぞれ、32バイト、64バイトとなる。
また、署名は256bit(r)+256bit(s)だが、ASN.1という形式で保存されており、
数バイトの変動がある。
ASN.1のヘッダー(オフセット計算)を付加して72~73ビット程度。
How to implement it
■デバイスの内部概要:合計約1.1KBのEEPROMメモリを持つ。
スロ
ット
ブロッ
ク
バイト ビット 名前 説明
0-7 2 36 288 Private or Secret Key Can also be used for data.
8 13 416 3328 Data 読み取りと書き込みは、他のすべてのスロットと同じ方
法で制限されるように設定できます。このスロットが鍵
として使用されている場合は、秘密鍵または秘密鍵の格
納に不要な残りのバイトは無視されます。
9-
14
3 72 576 Public Key,
Signature or
Certificate
このデバイスでサポートされている曲線の場合、これら
のスロットは、ECDSA公開鍵のX成分とY成分、または
ECDSA署名のR成分とS成分の両方を入れるのに十分な大
きさです。
15 3 72 576 Private Data,
Secret Key,
Signature, or
Certificate
これが128カウント制限使用機能(セクション限定使用
キー(スロット15のみ))をサポートする唯一のスロッ
トです。この機能が必要ない場合は、スロット9~14と
同じ目的で使用できます。
How to implement it
■Step by stepの検証
1、ESP-IDFへのcryptoauthlib(ATECC608のライブラリ)組み込みとコンパイル
2、証明書のチップへの書き込みと読み出し、検証
3、MbedTLS上への実装とTLS1.2ハンドシェイクの確認
4、MQTTの実装と疎通(サーバー側Mosquitto+Node-REDの準備)
How to implement it
■証明書の格納:
用意した証明書テンプレートに対して、
1、シリアル番号
2、公開鍵、署名
3、証明書発行日、有効期限
をデバイス内に保存する。
4、デバイス公開鍵は、アクセス禁止に設定された秘密鍵スロットから
計算して抽出
5、Subject/Auth Key IDは、それぞれの公開鍵から計算されて抽出
How to implement it
■MbedTLSの設定:
重要な設定
mbedtls_ssl_conf_authmode(&ssl->conf, MBEDTLS_SSL_VERIFY_REQUIRED);
MBEDTLS_SSL_VERIFY_REQUIREDにし、証明書のベリファイが必須の状態に
しておく。
How to implement it
■TLS1.2通信のパケットキャプチャ
ESP32:192.168.1.93 Mosquittoブローカー:192.168.1.84
How to implement it
■共通鍵の鍵交換による暗号化 ECDH計算
秘密鍵 公開鍵
デバイス側
公開鍵 秘密鍵
サーバー側
秘密鍵 公開鍵公開鍵 秘密鍵
共通鍵 共通鍵
鍵計算 鍵計算
プリマスターシークレ
ットとして通信を暗号
化する共通鍵となる
ATECC608が担当
結果
■クライアント認証を有効にしたMosquittoへ接続し、Node-REDで視覚化
結果
リソース使用状況:フラッシュ(platformio ESP-IDF環境デフォルト)
DATA: [= ] 11.4% (used 37508 bytes from 327680 bytes)
PROGRAM: [======= ] 69.4% (used 727774 bytes from 1048576 bytes)
リソース使用状況:ヒープ
起動時:
Free Heap Size 8bit = 201936
Free Heap Size 32bit = 263984
証明書ベリファイが終了し、HTTPS通信可能になった時点:
Free Heap Size 8bit = 138780
Free Heap Size 32bit = 200996
BME280初期化+MQTTS通信時:
Free Heap Size 8bit = 128692
Free Heap Size 32bit = 190868
展望
AWS IoT,AzureIoTへの接続。
ブログやっているのでいろいろ教えてください。
https://kmitsu76.hatenablog.com/
https://qiita.com/kmitsu76
まとめ
かなり大変だけどいったんやっておけば安心してデータをやり取りできる。
日本のスタートアップIoTを安全に!

IoTデバイスセキュリティ