IoT Security 12 · デバイス ID とプロビジョニング

Chapter 12

デバイス ID とプロビジョニング

この章がなぜ必要なのか——「機器ごとに違う鍵」が最大の防御だから.

02 章で見たとおり、クラス 3(金銭目的の犯罪者)は規模を求める。 「1 台破ると全台破れる」構造があるときにだけ、攻撃は経済的に成立する。

機器ごとに違う鍵を使えば、その経済性が崩壊する。

だが実務では——「工場でどうやって鍵を入れるか」が、 組み込みセキュリティで最も難しい部分である。

この章で使う既出の用語(定義は各リンク先). セキュアブート(02 章 3 節)、ハッシュ(04 章 4 節)、CSR(06 章 7 節)、容易(06 章 1 節)、鍵ラッピング(06 章 4 節)、Secure(07 章 3 節)、TRNG(08 章 8 節)、必要(09 章 6 節)

1. 何を入れるのか

資産内容秘匿性
デバイス ID機器を一意に識別する番号公開してよい
デバイス秘密鍵機器固有の秘密鍵(ECC / RSA)最重要の秘密
デバイス証明書上の公開鍵に CA が署名したもの公開してよい
CA 証明書チェーン信頼の起点となる証明書公開してよい
ROTPK ハッシュセキュアブート用の公開鍵ハッシュ公開してよい(05 章)
HUK / 対称鍵鍵ラッピングの根最重要の秘密(06 章)
ライフサイクル状態開発/量産/運用(14 章)—

このうち「最重要の秘密」を、どうやって安全に入れるかが本章の主題である。

2. 3 つの方式

プロビジョニング方式を比較する

方式を選ぶと、秘密鍵がどこを通り、誰が知りうるかが表示される。

方式 A: 外部で生成して注入する

方式 A:外で鍵を作って注入するHSM / 鍵生成サーバ秘密鍵と証明書を生成する工場の書き込み装置機器に書き込む機器★ 秘密鍵が「機器の外」に一度存在する経路・工場・装置のすべてが保護対象になる
最も素直だが、鍵が外を通る。工場を信頼できるか、経路を保護できるかがそのまま安全性になる
長所短所
実装が単純秘密鍵が機器の外に存在する時間がある
証明書を事前に用意できる工場・委託先が鍵を知りうる
機器側に鍵生成能力が不要経路の保護が必要

「工場を信頼できるか」という問題が核心である.

製造を海外の EMS に委託する場合、 「秘密鍵の入ったファイルを渡す」ことになりかねない。

だから多くのベンダが、工場に平文の鍵を渡さずに済む仕組みを提供している(本章 4 節)。

方式 B: 機器の中で生成する(推奨)

方式 B:機器の中で鍵を作る(推奨)機器起動時/初回に、内部の TRNG で鍵ペアを生成するCACSR を検証して証明書を発行する機器証明書を保存して完成★ 秘密鍵は一度も機器の外に出ない工場が漏らすものが存在しない
「外に出ない鍵は漏れない」。TRNG の品質と、CSR を偽装されない仕組みが条件になる

機器は内部で鍵ペアを生成し、公開鍵に機器情報を添えた「証明書にしてください」という依頼書 ——CSR(Certificate Signing Request・証明書署名要求)——を出力する。 CA は CSR を検証して証明書を発行する。秘密鍵は最初から最後まで機器の中にある。

長所短所
秘密鍵が一度も外に出ない機器側に良質な TRNG が必要(08 章)
工場・委託先が鍵を知りようがないCSR を CA に送る仕組みが要る
オーバービルド対策になる(後述)工程が 2 段階になる

これが理想である。可能なら常にこちらを選ぶ。

ただし注意点がある。

最後の点が重要で、これは次節の「事前プロビジョニング済みチップ」で解決できる。

方式 C: 事前プロビジョニング済みチップを買う

方式 C:プロビジョニング済みチップを買うシリコンベンダの工場チップ製造時に、耐タンパ環境で鍵と証明書を注入するチップを購入して基板に載せる自社の CAベンダの証明書を検証して、自社の証明書を発行(チェーンする)★ 自社に HSM も CA も工場の保護もなくても、機器固有鍵が手に入る小〜中規模の製品では、これが最も現実的な選択になることが多い
自社でプロビジョニング体制を作るのは高い。ベンダの「出生証明書」に相乗りできるなら、その方が安全で安い
ベンダの例サービス名
MicrochipTrust&GO(設定済み)/ TrustFLEX(一部カスタム)/ TrustCUSTOM(完全カスタム)
NXPEdgeLock SE050 のプリプロビジョニング品
InfineonOPTIGA Trust M の事前プロビジョニング
STSTSAFE-A のプロビジョニング済み品
各 MCU ベンダセキュアプロビジョニングサービス(品種・数量による)
長所短所
工場に鍵を渡す必要がまったくないチップ単価が上がる
最も安全(耐タンパ環境で生成される)ベンダのプロセスを信頼する必要がある
少量生産でも使えるカスタマイズの自由度が低い場合がある
認証取得済みのことが多い—

小〜中規模の製品には、これが最も現実的な解である.

自社で HSM を用意して、CA を運用して、工場の書き込み装置を保護して…… という体制を作るのは非常に高くつく。

「セキュアエレメントを 1 個載せて、プロビジョニング済み品を買う」なら、 BOM に数十〜数百円足すだけで済む。22 章で詳しく扱う。

3. 工場側の保護

方式 A を選ばざるを得ない場合、工場側の設計が重要になる。

対策内容
HSM で鍵を生成・保管する平文の鍵がファイルとして存在しない
書き込み装置と HSM をオンラインで結ぶ1 台書き込むたびに HSM から取得する
書き込み数のカウントHSM が発行数を数える → オーバービルドを検出できる
書き込み装置の認証正規の装置からの要求だけを受け付ける
書き込み後の検証正しく入ったか確認する(読み出せない場合はチャレンジ応答で)
監査ログいつ、どの装置が、何台分の鍵を要求したか

「発行数のカウント」が、オーバービルド対策の核心である.

契約が 10,000 台なら、HSM は 10,000 個しか鍵を発行しない。 委託先が 12,000 台作っても、2,000 台は鍵が入らず、クラウドに接続できない。

これは技術で商業リスクを制御する良い例である。

セキュアプロビジョニングの支援機能

各社が「工場に平文を渡さない」ための仕組みを持っている。

ベンダ機能内容
STSFI(Secure Firmware Install)暗号化したファームウェアを、HSM カード経由で書き込む。工場は平文を見られない
STSMI(Secure Module Install)サードパーティのモジュールを保護したまま組み込む
NXPsecure provisioning ツール群暗号化イメージ、Debug Authentication の鍵管理
Espressifesp_secure_cert / pre-provisioningESP モジュールの事前プロビジョニングサービス
Silicon LabsCustom Part Manufacturing Service (CPMS)ベンダ工場でカスタム設定・鍵注入
RenesasDevice Lifecycle Management + 鍵ラッピング平文鍵を渡さずにラップ済み鍵を注入

ST の SFI の考え方(代表例として):

SFI — 工場に平文を渡さずに書き込ませる開発元(自社)ファームウェアを暗号化 → 暗号化イメージ(.sfi)鍵を HSM カードに入れる★ HSM は「書き込める台数」を持つ.sfi と HSM カードを送る製造委託先(工場)書き込み装置に HSM カードを挿す装置 ⇄ MCU の ROM が HSM 経由で鍵を渡すMCU が自分で復号して書き込む★ 工場は平文のファームウェアも鍵も見られない書き込み装置のログにも平文は残らない★ HSM のカウンタが減る → 契約台数を超えて作れない「夜間に余分に作って横流し」を仕組みで防ぐST の SFI、NXP の SB2/SB3、Espressif の Flash Encryption など各社が同種の仕組みを持つ
委託先を「信頼する」のではなく「信頼しなくてよい形にする」。過剰生産の防止も同じ仕組みで実現できる

この仕組みの美点は「工場を信頼しなくてよい」ことである.

委託先が悪意を持っていても、

信頼の必要な範囲(TCB)を、工場から HSM カードへ縮めている。

4. デバイス ID の設計

何を ID にするか

候補一意性問題
MCU の UID(工場書き込みの固有 ID)一意公開情報であり、偽装できる(秘密ではない)
MAC アドレス一意同上。しかも変更できる
自社で採番したシリアル番号一意同上
証明書のサブジェクト(公開鍵に紐づく)一意秘密鍵を持つことでしか主張できない ✓

決定的な点: ID は「秘密鍵を持っていること」で証明されなければならない.

「UID が一致したら本物」という認証は、まったく意味がない。 UID は誰でも読めて、誰でも名乗れる。

正しい構成:

これなら、秘密鍵を持たない者は ID を主張できない。

証明書チェーンの設計

証明書を発行・管理・失効させる体制の全体を PKI(Public Key Infrastructure・公開鍵基盤)と呼ぶ。 その階層をどう切るかが、ここでの設計になる。

PKI の階層 — どこをオフラインに置くかRoot CA自社の最上位 CA。オフラインの HSM に保管するIntermediate CA製品ライン別/年度別に分けるDevice Certificate機器ごと。有効期間は機器寿命に合わせて長めにするネットワークから切り離す漏れても、そのラインだけ失効中間 CA を分けておくと、事故のときに影響範囲を製品ライン単位に閉じ込められる
Root を守るために中間 CA を挟む。分け方は「事故が起きたとき、どの単位で失効させたいか」で決める
設計判断考慮点
有効期間機器寿命(10〜20 年)に合わせるか、短くして更新するか
中間 CA の分割製品ライン別・年度別に分けると、失効の影響範囲を限定できる
失効の方法CRL は組み込みには重い。OCSP stapling か、クラウド側の許可リストが現実的
鍵の更新長期運用では、途中で鍵を更新できる設計が望ましい

証明書の有効期間は難しい判断である.

実務的には、「長期の製造証明書(出生証明書)」と 「短期の運用証明書」を分ける構成がよく使われる。

2 種類の証明書を使い分ける製造証明書(20 年)工場で入れる。「この機器は正規品である」ことだけを示すこれで認証して運用証明書(1 年)クラウドが発行する。日常の通信に使う製造証明書を長くするのは、機器の寿命(10〜20 年)に合わせる必要があるから。一方で、日常的に使う証明書が 20 年有効だと、漏れたときに止められない。だから「長期の身分証」と「短期の入館証」に分ける
有効期間の要求が正反対なので、1 枚では両立しない。役割を分けるのが定石

これは AWS IoT の「Just-in-Time Provisioning / Registration」や Azure IoT の DPS(Device Provisioning Service)の考え方と同じである。

5. ゼロタッチプロビジョニング

「箱から出して電源を入れるだけで、安全にクラウドに繋がる」を実現する仕組み。

デバイスプロビジョニングサービス(DPS)の流れ機器DPS出荷時:製造証明書だけを持っている① 電源投入 → 接続。製造証明書で TLS クライアント認証② 証明書チェーンを検証する③ 正規品と確認 → テナント/Hub を決定④ 運用証明書または接続情報を発行⑤ 運用証明書で本番サービスに接続する工場では「どの顧客のどのテナントに繋ぐか」を知らなくてよい。出荷後に決まる
在庫を顧客ごとに作り分けなくて済むのが大きい。製造は 1 種類、割り当ては出荷後に行う
サービス名称
AWSIoT Core の Fleet Provisioning / Just-in-Time Registration (JITR)
AzureDevice Provisioning Service (DPS)
Google Cloud(IoT Core は終了。パートナーソリューションへ)
独自自社のプロビジョニング API

ユーザ体験とセキュリティが両立する良い例である.

「設定画面でパスワードを入力させる」より、 証明書ベースのゼロタッチのほうが安全で、しかも簡単である。

ETSI EN 303 645 の規定 12「導入・保守を容易にする」にも合致する。

6. 全台共通鍵の何が問題か

改めて明確にしておく。

全台共通鍵と機器固有鍵 — 被害の広がり方が違う全台共通鍵1 台を解析して鍵を得るすべての機器になりすませるすべての通信を復号できる全機器に偽ファームウェアを送れる攻撃者の投資:1 台分の解析コスト被害:出荷済み全台機器固有鍵1 台を解析して鍵を得るその 1 台になりすませるだけ攻撃者の投資:1 台あたり数万〜数百万円被害:1 台
機器固有鍵は「攻撃を防ぐ」のではなく「攻撃を割に合わなくする」。1 台ずつ壊す必要がある状態を作る

経済モデルが完全に変わる.

攻撃の期待利益を \(V\)(1 台あたりの価値)、攻撃コストを \(C\)、 出荷台数を \(N\) とすると——

方式攻撃者の損得
全台共通鍵利益 \(N \cdot V\) − コスト \(C\) → N が大きいほど儲かる
機器固有鍵利益 \(V\) − コスト \(C\) → 1 台の価値がコストを超えないと成立しない

これが、あらゆるセキュリティ対策の中で最も費用対効果が高い設計判断である。 ハードウェアを変えずに、プロビジョニングの設計だけで実現できる。

「共通鍵」がやむを得ない場合

用途なぜ共通になるか緩和策
ファームウェア署名の検証鍵全機器が同じファームウェアを検証する公開鍵なので漏れても問題ない(05 章)
OTA イメージの復号鍵全機器が同じイメージを復号する機器固有鍵でラップして配る/頻繁に更新する
製造時のブートストラップ初期状態では固有鍵がない使用後に無効化する。時間・回数を制限する

署名検証鍵が共通なのは問題ない、という点は重要である.

公開鍵は公開情報である。漏れても攻撃に使えない。 危険なのは「署名する側の秘密鍵」であり、これは工場にも機器にも置かない (CI/CD の HSM に置く)。

7. 鍵の更新と失効

状況対応
証明書の有効期限切れ運用証明書を定期更新する仕組みを組み込む
機器の秘密鍵が漏洩その機器の証明書を失効させる(クラウド側の拒否リスト)
署名用の秘密鍵が漏洩最悪の事態。ROTPK の切り替えが必要
アルゴリズムの陳腐化暗号アジリティ(04 章)。Updatable RoT で対応

ROTPK の切り替え

セキュアブートの検証鍵が漏れたら、どうするか。

手段内容
複数の ROTPK スロットOTP に複数の公開鍵ハッシュを持ち、失効ビットで切り替える
鍵失効カウンタ単調カウンタで、古い鍵での署名を拒否する
多くの MCU が対応ESP32 は 3 個の Secure Boot 鍵ダイジェスト、NXP も複数の SRK に対応

設計時に「鍵が漏れたらどうするか」を決めておくこと.

ROTPK スロットが 1 個しかない SoC を選ぶと、 署名鍵が漏れた時点で、出荷済み全台が回収対象になる。

複数スロットと失効機構があるかは、選定基準に入れるべきである。 20 章(Espressif)と 19 章(NXP)で具体的に見る。

8. この章のまとめ

ポイント内容
最大の防御機器ごとに違う鍵。攻撃の経済性が崩壊する
3 つの方式外部生成して注入/機器内で生成/事前プロビジョニング済みチップ
推奨機器内生成(CSR 方式) か 事前プロビジョニング済みチップ
工場の保護HSM を使う。発行数のカウントでオーバービルドを検出
ベンダ支援ST の SFI など。工場に平文を渡さない仕組みがある
デバイス ID秘密鍵を持つことでしか主張できない形にする。UID や MAC ではダメ
証明書設計長期の製造証明書 + 短期の運用証明書の 2 段構えが実用的
ゼロタッチ証明書ベースなら、安全で、しかもユーザが楽
共通でよい鍵署名検証の公開鍵は共通でよい(公開情報だから)
鍵の失効ROTPK の複数スロットと失効機構があるか、選定時に確認する

次章では、その鍵と証明書を使って行う—— セキュアな OTA 更新を扱う。