O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

セキュアエレメントとIotデバイスセキュリティ2

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Carregando em…3
×

Confira estes a seguir

1 de 39 Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (20)

Semelhante a セキュアエレメントとIotデバイスセキュリティ2 (20)

Anúncio

Mais recentes (20)

セキュアエレメントとIotデバイスセキュリティ2

  1. 1. セキュアエレメントと IoTデバイスセキュリティ 2 光安 健太郎
  2. 2. Agenda • 自己紹介 • きっかけ • IoTセキュリティの潮流 • セキュアエレメントについて ATECC608B Deep Dive • Raspberry piでのATECC608B • セキュアで簡単なプロトタイプ環境 • 展望 • まとめ
  3. 3. 自己紹介 インフラの出身で、IT,セキュリティのビジネスをしている会社で働いています。 IoTLT, IoTSecJPのコミュニティへお邪魔しております。 CBAPⓇ(Certified Business Analysis Professional) 令和3年秋季 情報処理安全確保支援士試験 合格 自宅でいろいろやってきました。 自宅外向けDNS AD構築(Samba4) Nextcloudサーバー運用 自宅Gluster分散ファイルシステム構築(infiniband) 自宅YAMAHA RTX830運用 Jupyter notebook GPU 機械学習サーバー(nvidia Geforce RTX2070) Volumio Airplayサーバー 個人用ngrokサーバー構築 https://www.slideshare.net/KentaroM itsuyasu1/ss-12042350
  4. 4. きっかけ Arduino,Raspberry Pi,Jetson など、パワーのあるIoTデバイスがそろい、 活用の機会が増えてきています。 ワイヤレスネットワークの使えるデバイスとしてのESP32は半導体不足の中でも、 安定した供給が続いており、通信ができるデバイスとして人気が出ています。 データの通信でセキュリティを考慮できると、ちょっとしたコードで作った IoTデバイスを適用できる範囲、場所が広がります。
  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. セキュアエレメント比較 ATECC608B SE050(C) Optiga Trust M メーカー Microchip NXP Infineon インターフェース I2C(経路暗号化対応),SWI I2C(経路暗号化対応) 暗号演算 楕円暗号(ECC) 楕円暗号(ECC)、RSA 楕円暗号(ECC)、RSA 楕円暗号 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 ECC : NIST curves up to P-521, Brainpool r1 curve up to 512, RSA暗号 - up to 4096 bit up to 2048 共通鍵暗号 AES-128 AES 128, 192 and 256 bit and DES keys with single DES, 2K3DES and 3K3DES AES up to 256 ハッシュ SHA-256 SHA-224/256/384/512 HMAC up to SHA512 記憶領域 1.1KB 50KB 10KB 価格(1個当たり) 87円 476円 192円 パッケージ 8pin SOIC,DFN 20pin QFN 10pin DFN 製品ファミリ 限定機能のみの ATECC108Aなど 限定機能のみのSE050(A)、SE050(B) ソフトウェアカスタマイズができるSE051 Optiga Trust B, Optiga Trust X 採用実績 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. Atmark Techno Armadillo IoT G3,G4 Arduino Portenta H7 MIKROE PLUG&TRUST CLICK Adafruit Infineon Trust M Breakout Board MIKROE TRUST M CLICK 対応規格 ー Security certification CC EAL6+ (HW+JCOP) JavaCard version 3.0.5 GlobalPlatform specification version GP 3.0 Security certification CC EAL6+
  7. 7. セキュアエレメントのセットアップ ■上からATECC608B,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バス上にデバイスが見つけられるかテスト。 ATECC608B: 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. ATECC608B Deep Dive ■ATECC608BはTrust Platform という事前設定対応製品がある。 標準品はコンフィグをロックしないと使えないうえ、設定が難解。 ・事前設定済みで証明書が書 き込み済み。変更はできない。 ・最小発注数は10 ・AWS IoT,Azure IoT Hub, Google IoTなどのクラウド 接続対応 ・事前設定済みで証明書が書 き込み済み。変更可能。 ・最小発注数は2,000 ・個別認証局利用可能 ・セキュアブート、OTA認証、 ファームウェア確認、知的財 産保護、メッセージ暗号化、 IO保護などのユースケース利 用可能 ・さらなるカスタマイズが変 更可能。 ・最小発注数は4,000 ・工場出荷時の指定プロビ ジョニング対応 ・フルカスタマイズ可能
  11. 11. ATECC608B Deep Dive ■半導体不足の中、現状手に入りカスタマイズ幅の少ないTrust&Goを 確認していく。 過去Microchip Directで購入した際、オーダー後 購入履歴ページから発注分のTrust&Goの証明書が収まった JSONファイルをダウンロードできた M5Stackのオプションとして購入できる ATECC608B-TNGTLS
  12. 12. ATECC608B Deep Dive ■ATECC608B-TNGTLSを使って、セキュアエレメントの基本機能と セキュリティ対策シーンを検討する。 M5Stack + ATECC608B-TNGTLS 1、サーバー・クライアント認証、 TLS通信暗号化 2、AES暗号化 公式ドキュメントは以下リンクが正しい。 https://ww1.microchip.com/downloads/jp/DeviceDoc/40002112B_JP.pdf ATECC608シリーズ共通のライブラリ Cryptoauthlibを使用する。 https://github.com/MicrochipTech/cryptoauthlib Cryptoauthlibのドキュメント https://github.com/MicrochipTech/cryptoauthlib/blob/main/cryptoauthlib-manual.pdf
  13. 13. ATECC608B Deep Dive ■デバイスの内部概要:合計約1.1KBのEEPROMメモリを持つ。 コンフィグはロックされていて直ちに利用可能。 書き込み済み証明書の利用のため、ユーザーが自由に使える領域は スロット5とスロット8の36バイト、416バイトのみ。 これ以外にメモリ上に仮想鍵(Tempkey)を置いて利用可能 スロ ット ブロッ ク バイト ビット 名前 説明 0-7 2 36 288 Private or Secret Key スロット2~4が秘密鍵、スロット5がI/O保護鍵もしくは 一般利用として利用可能。ロック対応 8 13 416 3328 Data 平文読み書き可能なデータを置ける少し大きいゾーン。 一般利用可能でロックも可能 9- 15 3 72 576 Public Key, Signature or Certificate スロット9はAES鍵置き場、書き込めるが読み出し禁止
  14. 14. サーバー・クライアント認証、 TLS通信暗号化 ■セキュアエレメントの機能を使いデバイス秘密鍵を隠して、なりすましを防ぐ シーン
  15. 15. サーバー・クライアント認証、 TLS通信暗号化 ■ATECC608B-TNGTLSでAWS IoTへの接続を行う際はMulti-Account Registrationを使う。自前のCAを不要にし、手軽にセキュア接続を実現 ATECC608B- TNGTLS ATECC608B 従来は自前でCAを作成し、証明書定義を作成、ATECC608B へプロビジョニング、CAをRegistration Codeを使って AWS IoTへ登録するJITR(ジャストインタイム登録) CAはMicrochipを利用、事前に証明書リストをAWS IoTへ 登録しておき、証明書プロビジョニング済みである ATECC608B-TNGTLSが接続できるMulti-Account Registration
  16. 16. サーバー・クライアント認証、 TLS通信暗号化 ■書き込み済み証明書を抜き出したところ: フラッシュ容量が少ないので 1、サブジェクトCN:デバイスシリアル番号 2、CA公開鍵、署名:内部スロット保存 3、証明書発行日、有効期限:内部スロット保存 4、デバイス公開鍵は、アクセス禁止に設定された秘 密鍵スロットから計算して抽出 5、Subject/Auth Key IDは、それぞれの公開鍵から Hash計算されて抽出 これらを証明書テンプレートに入れて出力される コードは下記に配置 https://github.com/kmwebnet/ECC608-TNG-Scan
  17. 17. サーバー・クライアント認証、 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ビット程度。
  18. 18. サーバー・クライアント認証、 TLS通信暗号化 ■TLS1.2ハンドシェイク サーバーからの受信内容に署名して返送 ECDSA MBEDTLS_ECDSA_SIGN_ALT
  19. 19. サーバー・クライアント認証、 TLS通信暗号化 ■共通鍵の鍵交換による暗号化 ECDH計算 秘密鍵 公開鍵 デバイス側 公開鍵 秘密鍵 サーバー側 秘密鍵 公開鍵 公開鍵 秘密鍵 共通鍵 共通鍵 鍵計算 鍵計算 プリマスターシークレ ットとして通信を暗号 化する共通鍵となる ATECC608が担当 MBEDTLS_ECDH_GEN_PUBLIC_ALT
  20. 20. サーバー・クライアント認証、 TLS通信暗号化 ■I/O保護鍵の用途:ECDHのプリマスターシークレットの保護 クラウド インターネット プロセッサ I2C ATECC608B ECDH用の鍵生成リクエスト → Tempkey(0xFFFF)へ鍵ペア作成 ECDH用の鍵生成 ATECC608BのTempkey公開鍵受領 ← Tempkeyの公開鍵を返却 ATECC608BのTempkey公開鍵受領 ← ATECC608BのTempkey公開鍵をクラウドへ送信 クラウドの公開鍵送信 → クラウドの公開鍵受領 クラウドの秘密鍵とTempkeyの公開鍵でECDH計算 クラウドの公開鍵をATECC608Bへ転送 → Tempkeyの秘密鍵とECDH計算 プリマスターシークレット生成 プリマスターシークレット受領 ← プリマスターシークレット返却 共通鍵生成 共通鍵生成 暗号通信開始 ⇔ 暗号通信開始 atcab_ecdh_tempkey_ioenc (クラウドの公開鍵, プリマスターシークレットの戻り値, I/O保護鍵); ATECC608B-TNGTLS I2Cバスにロジアナを当てて覗き見られるのを防ぐ
  21. 21. サーバー・クライアント認証、 TLS通信暗号化 ■MQTTSでのAWS IoTへの接続が成功
  22. 22. AES暗号化 ■デバイスが使用するWifi接続情報、個人情報等、鍵以外の 一般機密情報を安全に配置したい。 暗号の基本:暗号化したいデータを暗号化(Encrypt)して、復号するための 鍵を入手する。その鍵を使ってのみ復号できる。 Encrypt Decrypt Plain Text Cipher Text Plain Text
  23. 23. AES暗号化 ■今回、AES-GCMという暗号を使用する。 AESは共通鍵暗号で、ブロック暗号といわれるデータを128ビットのブロックで 暗号化するアルゴリズム。
  24. 24. AES暗号化 ■今回、AES-GCMという暗号を使用する。 GCMはブロック暗号の暗号利用モードの一つ。1ブロック128ビット(16バイト) より大きいデータを暗号化する際にどういう風にブロックを関連させるかを決定
  25. 25. IoTデバイス AES暗号化 ■鍵が簡単に見れてはまずいので、隠す必要がある。 デバイス内に鍵を置き、データはデバイス内、外に置けるが 解読できるのは暗号化したデバイスのみという状態を作る Cipher Text ノムラテック カギの収納BOX NEW キーストック ハンディ
  26. 26. AES暗号化 ■ATECC608B-TNGTLSの持つAES-GCM機能を使用する。 •AES-128: encrypt/decrypt, galois field multiply for GCM https://github.com/kmwebnet/ECC608-TNG-AES-Test
  27. 27. 安全な場所 AES暗号化 ■使い方 ラズベリーパイでも確認できた。 https://github.com/kmwebnet/ECC608-TNG-AES-Test-raspi.git atcab_write_bytes_zone()で スロット9にAES鍵を書き込む 鍵は16バイト(AES-128)だが 32バイト書き込みしか許可されていないため、 atcab_random()で内部の NIST 800-90 A/B/C乱数生成器で32バイトを得て書き込む atcab_aes_gcm_init_rand()で atca_aes_gcm_ctx_t構造体を初期化し IV(初期ベクトル)を生成 atcab_aes_gcm_aad_update()で AAD(追加認証データ)を書き込み データが長い場合何回かに分けて書き込める atcab_aes_gcm_encrypt_update()で 暗号化したい平文を書き込みながら暗号文を得る 16バイトごとにしか書き込めないので 長いデータは何回かに分けて書き込む atcab_aes_gcm_encrypt_finish()で 書き込み終了しTagを生成する atcab_aes_gcm_init ()で atca_aes_gcm_ctx_t構造体を初期化し 復号したい暗号文のIV(初期ベクトル)を入力 atcab_aes_gcm_aad_update()で AAD(追加認証データ)を書き込み データが長い場合何回かに分けて書き込める atcab_aes_gcm_decrypt_update()で 復号したい暗号文を書き込みながら平文を得る 16バイトごとにしか書き込めないので 長いデータは何回かに分けて書き込む atcab_aes_gcm_decrypt_finish()で 書き込み終了し復号したい暗号文のTagを入力して AADを認証する 共通鍵生成 暗号化 復号 鍵を取り出しておけば デバイスとの暗号文やり取りに使える
  28. 28. AES暗号化 ■AESコマンド実行中にI2Cバスに平文が流れてしまうと安いロジアナでも簡単に 情報が抜き取れてしまう恐れがある → 暗号文も平文も確認できなかった I2Cバスにロジアナを割り込ませてデータを採取 採取データと暗号文、平文を照合したが一致なし
  29. 29. Linux 5.10.92-v7+ armv7l bullseye /** ¥brief default configuration for an ECCx08A device */ ATCAIfaceCfg cfg_ateccx08a_i2c_default = { .iface_type = ATCA_I2C_IFACE, .devtype = ATECC608, { #ifdef ATCA_ENABLE_DEPRECATED .atcai2c.slave_address = 0x6A, #else .atcai2c.address = 0x6A, #endif .atcai2c.bus = 1, #ifdef __linux__ .atcai2c.baud = 100000, #else .atcai2c.baud = 100000, #endif }, .wake_delay = 1500, .rx_retries = 20 }; Raspberry piでのATECC608B ■Raspberry piでは、以下URLに従ってインストールする。 https://github.com/MicrochipTech/cryptoauthlib/wiki/PKCS11-TNGTLS cryptoauth_testでデバイスをテストできる ソースの修正箇所 cryptoauthlib/lib/atca_cfgs.c
  30. 30. $ sudo vi /etc/apt/sources.list (deb-src行のコメントを取る) $ sudo apt update $ sudo apt-get build-dep libengine-pkcs11-openssl1.1 gnutls-bin libgcrypt-dev p11-kit $ git clone https://github.com/OpenSC/libp11.git $ cd libp11 $ ./bootstrap $ ./configure $ make $ sudo make install $ cd /var/lib/cryptoauthlib/ $ cp slot.conf.tmpl 0.conf $ vi 0.conf label = MCHP interface = i2c,0x6a,1 device = ATECC608A-TNGTLS $ sudo vi /usr/share/p11-kit/modules/cryptoauthlib.module module: /usr/lib/arm-linux-gnueabihf/libcryptoauth.so critical: yes trust-policy: yes managed: yes log-calls: no Raspberry piでのATECC608B ■証明書読み取り PKCS#11のセットアップ 証明書リストの表示 $ p11tool --list-tokens Token 1: URL: pkcs11:model=ATECC608A;manufacturer=Microchip%20Technology%20Inc;serial=2 3F9B2CA83313501;token=MCHP Label: MCHP Type: Hardware token, Trust module Flags: RNG, uPIN uninitialized Manufacturer: Microchip Technology Inc Model: ATECC608A Serial: 23F9B2CA83313501 Module: /usr/lib/arm-linux-gnueabihf/libcryptoauth.so $ p11tool --list-all-certs 'pkcs11:token=MCHP;type=cert' Object 0: URL: pkcs11:model=ATECC608A;manufacturer=Microchip%20Technology%20Inc;serial=2 3F9B2CA83313501;token=MCHP;object=device;type=cert Type: X.509 Certificate (EC/ECDSA-SECP256R1) Expires: Thu Dec 31 23:23:23 2037 Label: device ID: Object 1: URL: pkcs11:model=ATECC608A;manufacturer=Microchip%20Technology%20Inc;serial=2 3F9B2CA83313501;token=MCHP;object=signer;type=cert Type: X.509 Certificate (EC/ECDSA-SECP256R1) Expires: Thu Dec 31 23:23:23 2037 Label: signer Flags: CKA_CERTIFICATE_CATEGORY=CA; CKA_TRUSTED; ID:
  31. 31. $ p11tool --export-stapled 'pkcs11:token=MCHP;object=device;type=cert' | openssl x509 -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 51:df:6a:01:f9:17:ab:43:91:3c:42:08:b7:0a:ad:83 Signature Algorithm: ecdsa-with-SHA256 Issuer: O = Microchip Technology Inc, CN = Crypto Authentication Signer 2700 Validity Not Before: Mar 11 07:00:00 2020 GMT Not After : Mar 11 07:00:00 2048 GMT Subject: O = Microchip Technology Inc, CN = sn0123F9B2CA83313501 Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:41:82:3c:68:9c:43:b0:d3:a5:64:e6:c2:09:7d: cb:b9:f2:ce:81:6c:c3:cd:e2:56:0f:19:96:e4:d9: a3:b8:47:ae:f5:e9:49:07:6b:7b:14:99:8a:ee:72: d7:a1:01:7d:c3:fa:95:95:8d:c2:8c:43:a4:f4:04: 18:4d:14:e6:3b ASN1 OID: prime256v1 NIST CURVE: P-256 … Signature Algorithm: ecdsa-with-SHA256 30:46:02:21:00:f4:10:94:85:3d:31:af:ac:a2:cd:a1:42:e9: 0f:6b:c3:00:af:ee:8f:32:f2:c4:1c:c2:85:42:73:bc:ce:8b: 1b:02:21:00:a8:41:cb:4d:da:88:68:87:fc:ec:37:66:04:87: 2a:51:fd:f2:c4:01:41:e3:7b:01:f4:ed:7f:ce:48:47:8d:ce Raspberry piでのATECC608B ■証明書読み取り 証明書が読み取れた AWS IoTにて証明書登録、ポリシーをアタッチ後、メッセージ送信
  32. 32. セキュアで簡単なプロトタイプ環境 ■個人プロジェクトとしてセキュアで簡単なプロトタイピング環境を 構築したのでご紹介 Secure development from the prototype stage https://www.rainbowtype.com
  33. 33. セキュアで簡単なプロトタイプ環境 コンセプト: 今日のIoTプロジェクトでは、プロトタイピングと フィールド展開は密接に関連しています。 CI / CD開発サイクルのように、それらは何度も繰り 返されることによってより多くの価値を生み出します。 IoTの範囲はエッジデバイスからクラウドまで多岐に わたり、プロジェクトの途中でセキュリティ対策を組 み込むことはほとんど不可能かもしれません。 このプロジェクトは、プロトタイプの時点から開発者 がセキュリティ対策に必要とするシステムフットプリ ントを提供します。
  34. 34. セキュアで簡単なプロトタイプ環境 プロトタイプ段階から開発クライアント、サーバー、および デバイス全体を保護します このプロジェクトは、有名なESP32プラットフォームで次の機能を 有効にします。 デバイスの起動制御 セキュアブート、フラッシュ暗号化 ハードウェアルートオブトラストによるTLS通信暗号化 OTA機能 Wifi接続管理, SSIDとパスワードの暗号化保存 開発プラットフォームに関係なく、ファームウェアを安全に更新します 開発のスピードアップ 特定のサービスだけでなく、オープンに使用できます AWSおよびAzureへの安全なデバイス接続をサポートします
  35. 35. セキュアで簡単なプロトタイプ環境 セキュアOTA, ステータス 更新,Wi-fi接続支援 ファームウェアは セキュアブートと フラッシュ暗号化 通信はTLS接続 開発者は様々なツールを 利用可能 署名付き ファームウェアを アップロード server client bootloader 開発者のWindowsPC上の アプリケーション Electron+React 固定IPを持つパブリック クラウドに構築するサーバー Node.js ATECC608で保護された ESP32デバイス アーキテクチャ
  36. 36. セキュアで簡単なプロトタイプ環境 専用のエッジデバイスを開発 カメラ端子付きの開発ボードで ESP32-WROVER-Eを搭載 OV2640カメラモジュールを接続可能
  37. 37. セキュアで簡単なプロトタイプ環境 エッジデバイスがセキュアだと実現できる幅が広がる リモートシリアルコンソールのデモ Jetson Nanoへシリアル接続し安全にWebブラウザの 仮想ターミナルからログインし操作可能 https://www.youtube.com/watch?v=IgnIqqi7Inc 監視カメラのデモ 複数のカメラ映像をセキュアにWebブラウザへ表示 https://www.youtube.com/watch?v=V85D79XiV2E
  38. 38. 展望 rainbowtypeの使いやすさ向上 Raspberry pi、Jetson Nanoへ対応したセキュアなブートローダー作成 IoTセキュリティについて継続勉強中。 Qiitaもぜひチェックお願いします。 https://qiita.com/kmitsu76
  39. 39. まとめ クラウド接続が増加してくるIoTデバイスでのセキュアエレメントの実装は 必要な技術要素となる可能性がある。 かなり大変だけどいったんやっておけば安心してデータをやり取りできる。 IoTプロトタイピングを安全に!

×