Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Secure element for IoT device

1 786 vues

Publié le

2019/12/14 IoTSecJP

Publié dans : Technologie
  • Identifiez-vous pour voir les commentaires

Secure element for IoT device

  1. 1. セキュアエレメントと IoTデバイスセキュリティ 光安 健太郎
  2. 2. Agenda • 自己紹介 • 昨今の話のまとめときっかけ • IoTセキュリティの潮流 • セキュアエレメントについて ATECC608A Deep Dive • 結果 • 展望 • まとめ
  3. 3. 自己紹介 インフラの出身で、サイバートラストというLinuxと電子認証局のビジネスを している会社で働いています。 自宅でいろいろやってきました。 自宅外向けDNS AD構築(Samba4) Nextcloudサーバー運用 自宅Gluster分散ファイルシステム構築(infiniband) Jupyter notebook GPU 機械学習サーバー(nvidia Geforce RTX2070) Volumio Airplayサーバー https://www.slideshare.net/KentaroM itsuyasu1/ss-12042350
  4. 4. 昨今の話のまとめときっかけ IoTベンチャーでのいたましい事故 物を作るところから、自宅で趣味からセキュリティを検討しておこう。 そんな難しい話じゃないですよ。クライアント認証 はしてません。デバイス側のリソースが厳しいため、 サーバ証明書のフィンガープリントをハードコード してました(証明書チェーンは見ない)。サーバ証 明書はAWS ACMなんですけど、よりによって1年っ ていう短い設定かつ、自動更新(つづく)
  5. 5. IoTセキュリティの潮流 証明書、各クラウドベンダーの接続方法 代表的なAWS IoT,Azure IoTともにX509証明書による接続 クラウド側からデバイスの証明書と秘密鍵をダウンロードし、 デバイスに格納、接続時に使用する。 デバイス側は悪意のあるものに渡った時に秘密鍵を守れない。 それを守る方法として Hardware Root-of-Trustという仕組みで 秘密鍵を守ることが望ましい。 参考資料: IoT開発におけるセキュリティ設計の手引き 独立行政法人情報処理推進機構 https://www.ipa.go.jp/security/iot/iotguide.html 対応している仕組み: Arm Trustzoneとしてチップ内部に融合 セキュアエレメントとしての専用チップ
  6. 6. セキュアエレメント比較 ATECC608A SE050(C) Optiga Trust X メーカー Microchip NXP Infineon インターフェース I2C 暗号演算 楕円暗号(ECC) 楕円暗号(ECC)、RSA 楕円暗号(ECC) 楕円暗号 NIST P-256 ECC NIST (192 to 521 bit) Brainpool (160 to 512 bit) Twisted Edwards Ed25519 Montgomery Curve25519 Koblitz (192 to 256 bit) Barreto-Naehrig Curve 256 bit NIST P-256, P-384 RSA暗号 - up to 4096 bit - 共通鍵暗号 AES-128 AES 128, 192 and 256 bit and DES keys with single DES, 2K3DES and 3K3DES AES-128 ハッシュ SHA-256 SHA-224/256/384/512 SHA-256 記憶領域 1.1KB 50KB 10KB 価格(1個当たり) 87円 476円 244円 パッケージ 8pin SOIC,DFN 20pin QFN 10pin DFN 製品ファミリ 限定機能のみの ATECC108Aなど 限定機能のみのSE050(A)、SE050(B) 温度環境対応品 採用実績 Google Coral SoM,Arduino MKR Wifi Amazon Dash Button 2nd gen.(ATECC108A) ZYMBIT security module NervesKey for NervesHub Adafruit ATECC608 Breakout Coldcard Bitcoin hardware wallet etc. ー ー 対応規格 ー Security certification CC EAL6+ (HW+JCOP) JavaCard version 3.0.5 GlobalPlatform specification version GP 3.0 Security certification CC EAL6+
  7. 7. セキュアエレメントのセットアップ ■上からATECC608A,Optiga Trust X,SE050 それぞれ面実装パッケージのため、変換基盤へ はんだ付け。 基本は3.3VとGND、I2C SCL,SDAを接続させて 通信するが、 Optiga Trust XはRSTピンのGPIO制御、 SE050はPin15 VOUT をPin18 VCCへの接続が 必要。 ホストはESP32-DevKitC I2Cは100kHzでピン21,22へ接続 ■開発環境 VSCode+platformio ESP-IDF 3.30
  8. 8. セキュアエレメントのセットアップ ■デバイスの認識: まずESP32からI2CScanner(arduinoのサンプルプログラム)を実行し、 I2Cバス上にデバイスが見つけられるかテスト。 ATECC608A: Scanning... device found on I2C port 0 at address 0x60 ! done SE050: Scanning... device found on I2C port 0 at address 0x48 ! done Optiga Trust XはI2CScannerではデバイスが見つからない。 メーカーライブラリでパスするかどうかを確認する。 https://github.com/Infineon/arduino-optiga-trust-x/blob/master/examples/selfTest/selfTest.ino
  9. 9. セキュアエレメントの組み込み構成 ■セキュアエレメント共通で、RTOS環境はMbedTLSのECDH関数、ECDSA関数を セキュアエレメントが使用する関数に置き換える。 Linux環境はOpenSSLが持つ外部エンジンを使用するコマンドへ実装している。 ESP32,ARM Cortex-M セキュアエレメント MbedTLS 専用ライブラリ(C,Python) RTOS(FreeRTOS) OpenSSL ARM Cortex-A Linux I2C I2C タイマー タイマー MBEDTLS_ECDH_GEN_PUBLIC_ALT MBEDTLS_ECDSA_SIGN_ALT engine
  10. 10. ATECC608A Deep Dive ■ATECC608Aを使って、セキュアエレメントの基本機能とセキュリティ対策 シーンを検討する。 1、サーバー・クライアント認証、TLS通信暗号化 2、機密情報保存 3、AES暗号化 4、中間CAの秘密鍵秘匿
  11. 11. サーバー・クライアント認証、 TLS通信暗号化 ■セキュアエレメントの機能を使いデバイス秘密鍵を隠して、なりすましを防ぐ シーン
  12. 12. サーバー・クライアント認証、 TLS通信暗号化 VPSサーバー+ ドメイン取得 ngrok1.7を使い MQTTS、HTTPS トンネリング
  13. 13. サーバー・クライアント認証、 TLS通信暗号化 ■ホームIoTゲートウェイの作成 機能: • BME280による気温、湿度、気圧の測定 • 赤外線LEDによるリモートコントロール • ボタンによるプッシュ動作送信 • MQTTメッセージによるLED点灯 • Wifiプロビジョニングモード • OTA機能搭載 • デバイス証明書ローリング対応 仕様: • USB5V電源で動作 • MQTTSにてMosquittoへ接続
  14. 14. サーバー・クライアント認証、 TLS通信暗号化 ■Kicad5.1.2にて設計、elecrowへ発注 ATECC608A以外はほとんど秋月電子
  15. 15. 動作フローチャート MQTT イベントハンドラ GPIOボタン イベントハンドラ Wifi接続 Wifiプロビジョニング開始 ATECC608AへWifi SSID,Pass書き込み サーバー接続、 MQTTイベントハンドラ起動 再起動リモコン(RMT)BME280初期化 GPIOボタン が押された 自分のシリアル宛 のメッセージ サブスクライブ タスクフラグを確認 BME280 測定しパブリッシュ、 ウェイト ボタン押下をパブリッシュ LED点灯、消灯 エアコン操作 (RMTタスク生成) OTAフラグ キーローリングフラグ 証明書受領フラグ I2Cバス初期化 ATECC608A初期化 ATECC608AからWifi SSID,Pass読み取り GPIO初期化 GPIOボタンが押されているか MQTT停止→公開鍵生成→ MQTT再開とパブリッシュ MQTT停止→ATECC608A 証明書更新→MQTT再開 MQTT接続終了→OTAサーバーへ https接続、ファームダウンロード+ インストール 再起動 キーローリング 証明書受領 OTA # Espressif ESP32 Partition Table # Name Type SubType Offset Size nvs data nvs 0x9000 0x4000 otadata data ota 0xd000 0x2000 phy_init data phy 0xf000 0x1000 factory 0 00x10000 1M ota_0 0ota_0 0x110000 1M ota_1 0ota_1 0x210000 1M
  16. 16. 温度測定 以下2ついずれかのモジュールの搭載に対応。 1分ごとに計測データをMQTTにて送信
  17. 17. 赤外線リモコン ダイキンエアコンの赤外線リモコンを解析、 ESP-IDFのRMT関数で実装。
  18. 18. プロビジョニング シリアルコンソールを経由してpem(base64)の 公開鍵と証明書を交換。 -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQasdaghadJKNIWfEtPt61Y6O8NoQVhkrQhrracCRmGgb kinXThlKUkdB0i7uUakzcSIdonsgpdzagdPNIDW8SkGUmGz8jcDSJM2PsouJ9tA== -----END PUBLIC KEY----- -----BEGIN CERTIFICATE----- MIIBizCCATKgAwIBAgIQXttAp9UKPvc3FMEUZoYdrjAKBggqhkjOPQQDAjAuMREw DwYDVQQKDAhrbXdlYm5ldDEZMBcGA1UEAwwQa213ZWJuZXQgUm9vdCBDQTAeFw0x OTEwMTAyMTA4MzlaFw00NDEwMTAyMTA4MzlaMC4xETAPBgNVBAoMCGttd2VibmV0 OQIHOFEROLFKFJiiphpiwgeknvspdisbpdwnepIHPIEgwkEwYHKoZIzj0CAQYIKoZIzj0D AQcDQgAEtPt61Y6O8NoQVhkIIPDSUGpou998HHIDPGwEjolKUkdB0i7uUakzcJTUP4gB aJv+kwpghwpedkjwgpkjPKJPEHGIPEihp98887889ewwIHEWBBYEFNQOhdv0lGYauUlM NRYzPg8fVWdgMA8GyioigGipugPGERJhwGWRPihgWoewoZIzj0EAwIDRwAwRAIge3M2 ePvfCr/eCDah5c3XEC8Pto2q2WBNbSL5ZpNWH7ACIHnnFVqZ4Z6Rq3Rw76OLOzKV wXTxzegp/jDA+XDKExLA -----END CERTIFICATE-----
  19. 19. 証明書更新(キーローリング) ① ② ③ ATECC608A スロット内 秘密鍵 3つのスロットから順番に 公開鍵を取り出し、署名 して証明書を作成して 書き戻す
  20. 20. サーバー・クライアント認証、 TLS通信暗号化 Pythonで署名、 証明書作成 OTAファーム ウェア置き場 デバイス公開鍵 受領
  21. 21. サーバー・クライアント認証、 TLS通信暗号化 ■証明書の構造: tbsCertificate シリアル番号 証明書発行日、有効期限 公開鍵 CN コモンネーム など… signatureAlgorithm ecdsa-with-SHA256(一例) signatureValue 署名データ SHA256で ハッシュ化署名対象 CA 署名
  22. 22. サーバー・クライアント認証、 TLS通信暗号化 ATECC608が対応できる楕円曲線暗号を選択 secp256r1 別名 prime256v1 または NIST P-256(RFC4492) 256bitの秘密鍵と256bit(X)+256bit(Y)の公開鍵で構成される。 それぞれ、32バイト、64バイトとなる。 また、署名は256bit(r)+256bit(s)だが、ASN.1という形式で保存されており、 数バイトの変動がある。 ASN.1のヘッダー(オフセット計算)を付加して72~73ビット程度。
  23. 23. サーバー・クライアント認証、 TLS通信暗号化 ■デバイスの内部概要:合計約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と 同じ目的で使用できます。
  24. 24. サーバー・クライアント認証、 TLS通信暗号化 ■証明書の格納: 用意した証明書テンプレートに対して、 1、シリアル番号 2、公開鍵、署名 3、証明書発行日、有効期限 をデバイス内に保存する。 4、デバイス公開鍵は、アクセス禁止に設定された秘密鍵スロットから 計算して抽出 5、Subject/Auth Key IDは、それぞれの公開鍵から計算されて抽出
  25. 25. サーバー・クライアント認証、 TLS通信暗号化 ■TLS1.2通信のパケットキャプチャ ESP32:192.168.1.93 Mosquittoブローカー:192.168.1.84
  26. 26. サーバー・クライアント認証、 TLS通信暗号化 ■サーバーからの受信内容に署名して返送 ECDSA MBEDTLS_ECDSA_SIGN_ALT
  27. 27. サーバー・クライアント認証、 TLS通信暗号化 ■共通鍵の鍵交換による暗号化 ECDH計算 秘密鍵 公開鍵 デバイス側 公開鍵 秘密鍵 サーバー側 秘密鍵 公開鍵公開鍵 秘密鍵 共通鍵 共通鍵 鍵計算 鍵計算 プリマスターシークレ ットとして通信を暗号 化する共通鍵となる ATECC608が担当 MBEDTLS_ECDH_GEN_PUBLIC_ALT
  28. 28. サーバー・クライアント認証、 TLS通信暗号化 ■クライアント認証を有効にしたMosquittoへ接続し、Node-REDで視覚化
  29. 29. 機密情報保存 ■AESなど32バイト(256ビット)の鍵情報をセキュアエレメントに隠したい。 ホストマイコンからI2Cで鍵情報を送る際、ロジアナで読み取られないように I2C経路を暗号化したい。 機密情報 ㊙
  30. 30. 機密情報保存 ■atcab_write_encとatcab_read_encという関数を使用する。 メッセージ認証コード (MAC) 機密情報 ㊙ IO保護キー
  31. 31. 機密情報保存 ■まずIO保護キーをATECC608Aへ送り、専用スロットに保存し、共通の鍵とす る。使い捨てOK。 機密情報 ㊙ IO保護キー IO保護キー 読み出し禁止 スロット (書き込みはOK)
  32. 32. 機密情報保存 ■次にメッセージ認証コード(MAC)を作り、機密情報とXORを取り、IO保護キー と計算した結果をI2CでATECC608Aへ送り、復号してスロットに保存される。 メッセージ認証コードはATECC608A側で固有SNなどからSHA256で生成される。 読み出しはこの反対を行う。 メッセージ認証コード (MAC) 機密情報 ㊙ IO保護キー IO保護キー 読み出し禁止 スロット (書き込みはOK) メッセージ認証コード (MAC)
  33. 33. AES暗号化 ■デバイスが使用するWifi接続情報、個人情報等、鍵以外の 一般機密情報を安全に配置したい。 暗号の基本:暗号化したいデータを暗号化(Encrypt)して、復号するための 鍵を入手する。その鍵を使ってのみ復号できる。 Encrypt Decrypt Plain Text Cipher Text Plain Text
  34. 34. AES暗号化 ■今回、AES-GCMという暗号を使用する。 AESは共通鍵暗号で、ブロック暗号といわれるデータを128ビットのブロックで 暗号化するアルゴリズム。
  35. 35. AES暗号化 ■今回、AES-GCMという暗号を使用する。 GCMはブロック暗号の暗号利用モードの一つ。1ブロック128ビット(16バイト) より大きいデータを暗号化する際にどういう風にブロックを関連させるかを決定
  36. 36. IoTデバイス AES暗号化 ■鍵が簡単に見れてはまずいので、隠す必要がある。 デバイス内に鍵を置き、データはデバイス内、外に置けるが 解読できるのは暗号化したデバイスのみという状態を作る Cipher Text ノムラテック カギの収納BOX NEW キーストック ハンディ
  37. 37. AES暗号化 ■ATECC608の持つAES-GCM機能を使用する。 •AES-128: encrypt/decrypt, galois field multiply for GCM
  38. 38. 中間CAの秘密鍵秘匿 ■ESP32のデータを集約して処理するラズパイをゲートウェイとして 複数台のESP32のデバイス証明書を管理したい。 ラズパイ ルートCA機 ラズパイ 中間CA機 ESP32+ ATECC608A ルートCA証明書 ルートCA秘密鍵 中間CA証明書 中間CA秘密鍵 署名 署名 デバイス証明書 デバイス秘密鍵 ATECC608A内フラッシュ
  39. 39. 中間CAの秘密鍵秘匿 ■ラズパイ中間CA側にもATECC608Aを接続し、秘密鍵を隠す HSM(ハードウェアセキュリティモジュール)として使用する。 ラズパイ 中間CA機 ESP32+ ATECC608A 中間CA証明書 中間CA秘密鍵 CN、有効期限を 設定し署名 デバイス証明書 デバイス秘密鍵 ATECC608A内フラッシュATECC608A内フラッシュ デバイスから 公開鍵を送付 デバイス証明書として ESP32に返送
  40. 40. 中間CAの秘密鍵秘匿 ■ラズパイのI2Cへ、ATECC608Aを接続、pythonで証明書を作成する スクリプトへATECC608Aで署名するコマンドを割り込ませる。 Python:cryptography cryptography.hazmat.backends.default_backend() •公開鍵読み込み •署名用秘密鍵読み込み x509.CertificateBuilder() •シリアル番号、証明書発行日、有効期限 •CN コモンネーム •サブジェクトキーID •署名者ID •Etc… Signコマンド tbsCertificate シリアル番号 証明書発行日、有効期限 公開鍵 CN コモンネーム など… signatureAlgorithm ecdsa-with-SHA256(一例) signatureValue 署名データ 中間CA秘密鍵 ATECC608A内フラッシュ デバイス証明書 SHA256ハッシュを署名
  41. 41. 展望 ESP32のセキュアなブートローダー IoTセキュリティについて継続勉強中。 ブログやっているのでいろいろ教えてください。 https://kmitsu76.hatenablog.com/ https://qiita.com/kmitsu76 https://limitedresults.com/2019/11/pwn- the-esp32-forever-flash-encryption-and- sec-boot-keys-extraction/ Pwn the ESP32 Forever: Flash Encryption and Sec. Boot Keys Extraction
  42. 42. まとめ クラウド接続が増加してくるIoTデバイスでのセキュアエレメントの実装は 必要な技術要素となる可能性がある。 かなり大変だけどいったんやっておけば安心してデータをやり取りできる。 日本のスタートアップIoTを安全に!

×