Upgrade to Pro — share decks privately, control downloads, hide ads and more …

セキュアエレメントとWireGuard

 セキュアエレメントとWireGuard

オープンソースカンファレンス2023 Spring Online ライトニングトーク

Kentaro Mitsuyasu

March 11, 2023
Tweet

More Decks by Kentaro Mitsuyasu

Other Decks in Technology

Transcript

  1. WireGuardの構造 Linux カーネル ネットワーク インターフェース eth0 wlan0 wireguard カーネルモジュール Linux

    ユーザー空間 wireguard-tools rtnetlink カーネル⇔ネットワークインターフェース通信 netlink カーネル⇔ユーザー空間通信 インターフェース設定 鍵ペア転送 デバイス作成、通信 Go⾔語など、多数実装あり カーネル空間でなくユーザー空間で 動作する実装もあり WireGuardとは
  2. ②DH計算 Noise Protocol Frameworkとは︖ 静的秘密鍵 静的公開鍵 公開 公開 ⼀時公開鍵 ⼀時秘密鍵

    ハンドシェイク通信 静的公開鍵 公開 あらかじめ 渡しておく 静的公開鍵 公開 相⼿の 静的公開鍵 (事前に⼊⼿) 公開 相⼿の 静的公開鍵 (事前に⼊⼿) 公開 ⼀時秘密鍵 ③DH計算 相⼿の 静的公開鍵 (事前に⼊⼿) 公開 静的秘密鍵 ④DH計算 静的秘密鍵 公開 ⼀時秘密鍵 静的秘密鍵 ⼀時公開鍵 公開 ⼀時公開鍵 ①DH計算 ⼀時秘密鍵 公開 ⼀時公開鍵 WireGuardとは
  3. 課題提起︓静的秘密鍵の置き場所 これをセキュアエレメントで守れないか [Interface] PrivateKey = FA2qtPQO3XsjOSR06Sx9Eg/rR8pw2B5cSgdOXKpa8Gs= Address = 10.0.0.112/32 [Peer]

    PublicKey = ty5vAuknCTspoVquXgHt1AR8sm05Jblrkv1bfGKfMBw= Endpoint = XXX.XXX.XXX.XXX:51820 AllowedIPs = 10.0.0.0/24 PersistentKeepalive = 25 静的秘密鍵 相⼿の 静的公開鍵 (事前に⼊⼿) 公開 WireGuardとは
  4. 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+ セキュアエレメントについて
  5. ▪Raspberry Pi 3b+ bullseye 環境を⽤意 NXP SE050 C1をI2C接続。 (市販品ではMIKROE Plug&Trust

    clickが利⽤可能) $ sudo raspi-configでI2Cを有効 $ i2cdetect –y 1 コマンドで0x48 (SE050のアドレス)認識を確認 セキュアエレメントについて
  6. セキュアエレメントについて ▪NXP社 SE050 セキュアエレメントへのアクセス例 NXPのPlug&Trustミドルウェア内にある、 CLIツールを利⽤してアクセスを試みる。 鍵情報はすべて8桁の16進数オブジェクトID付きで 保存される。 保存されている証明書へIDを指定してアクセスを⾏えた。 $

    ssscli connect se05x t1oi2c /dev/i2c-1:0x48 $ ssscli get bin 0xF0000101 ./device_cert.der Getting Certificate from KeyID = 0xF0000101 sss :INFO :atr (Len=35) 00 A0 34 20 41 54 50 4F sss :WARN :Communication channel is Plain. sss :WARN :!!!Not recommended for production use.!!! Retrieved Certificate from KeyID = 0xF0000101
  7. ▪セキュアエレメントを組み込むイメージ WireGuardのセキュリティ強化 ②DH計算 静的秘密鍵 静的公開鍵 公開 公開 ⼀時公開鍵 ⼀時秘密鍵 ハンドシェイク通信

    静的公開鍵 公開 あらかじめ 渡しておく 静的公開鍵 公開 相⼿の 静的公開鍵 (事前に⼊⼿) 公開 相⼿の 静的公開鍵 (事前に⼊⼿) 公開 ⼀時秘密鍵 ③DH計算 相⼿の 静的公開鍵 (事前に⼊⼿) 公開 静的秘密鍵 ④DH計算 静的秘密鍵 公開 ⼀時秘密鍵 静的秘密鍵 ⼀時公開鍵 公開 ⼀時公開鍵 ①DH計算 ⼀時秘密鍵 公開 ⼀時公開鍵 静的秘密鍵は セキュアエレメント内から 出ない
  8. WireGuardのセキュリティ強化 ▪wireguard-tools $ wg genkey 0x10000009 CQAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= $ wg genkey

    0x10000009 | wg pubkey Yh3rhVp7LfvPC4YWjB7L8mJO2hk2VXMh9sZ9B6tLm2c= 0x10000009をBase64にした数値に なり、秘密鍵を隠せた。 SE050のオブジェクトID 0x10000009の公開鍵を出⼒。 これを相⼿側のwireguardへ登録。
  9. WireGuardのセキュリティ強化 ▪wireguard $ sudo cat /etc/wireguard/wg0.conf [Interface] PrivateKey = CQAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=

    Address = 10.0.0.110/32 [Peer] PublicKey = XXXXX= Endpoint = XXX.XXX.XXX.XXX:XXXXX AllowedIPs = 10.0.0.0/24 PersistentKeepalive = 25 0x10000009をBase64にした数値を 秘密鍵として登録 相⼿側の公開鍵を登録
  10. WireGuardのセキュリティ強化 ▪キーローテーションを試す。 サーバー側で︓ $ sudo wg set wg0 peer "9oGFAiGUSMIzg2gzwwEBasjfKxkULebTwzOEjn7K4Rk="

    allowed- ips 10.0.0.111/32 これを実⾏したところで接続が切れる。 $ sudo wg set wg0 peer "ChgKBqwSnkov+rcC2KKUQKMgPH9pfrnWXzLpMzfKpg4=" remove IPは現在のIP 現在接続しているピアの公開鍵
  11. WireGuardのセキュリティ強化 ▪キーローテーションを試す。 クライアント側で︓ $ sudo wg-quick down /etc/wireguard/wg0.conf $ sudo

    vi /etc/wireguard/wg0.confで以下を変更 ``` [Interface] PrivateKey = BgAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= Address = 10.0.0.111/32 ``` $ sudo wg-quick up /etc/wireguard/wg0.conf IPは現在のIP 新しい0x10000006の鍵を指定
  12. 考慮事項 ▪SE050の書き込み回数上限。 An exception in case the EC Montgomery curve

    25519 is used: each shared secret generation will cause additional NVM write operations as well to store the external public key that is used in the shared secret generation. SE050でECDH計算をするたびに内部フラッシュ書き込みが発⽣するようだ。 実測︓5分で4回実⾏ データシートによると書き込み許容回数は 最悪で、2000万回、平均で1億回 とのこと。 1分に1回ECDH計算する想定だと、最悪でも38年。