1.8K Views
May 14, 24
スライド概要
YubiKeyとは、セキュリティキーの一種で、二要素認証を強化し、パスワードレス認証を可能にする製品です。FIDOという公開鍵ベースの認証に関する標準規格に対応しています。NFCでの接続、デバイス登録、デバイス認証という一連の実施内容をまとめました。
※2024年5月11日(土)に開催された会津大学公認の技術系サークルZli(ジライ)主催の「大LT 2024 春 in Aizu」でのLT資料です。
1997年の設立以来、動画配信を主軸に事業展開。コーポレートメッセージ「もっと素敵な伝え方を。」を掲げ、テクノロジーを通じて世の中のコミュニケーションをよりよくすることを目指しています。 自社で保有・運営する独自のコンテンツ配信ネットワーク(CDN=Content Delivery Network)を活用した動画配信に加え、長年のノウハウを活かした動画の企画・制作・運用やWebサイト制作、システム開発、動画広告による収益化支援まで総合的なサービスとソリューションを提供。取引実績はメディア、大手企業をはじめ年間1,200社・10,000案件以上です。手がける技術領域は、ネットワークの物理層からアプリケーション層にわたり、日本屈指の大規模配信や最先端案件の実績も多数あります。 エンジニア向けオウンドサイト「Voice」公開中! https://voice.stream.co.jp/
YubiKeyとNFCで おしゃべりしてみた 株式会社Jストリーム プラットフォーム本部 技術開発部テックリード 並木 優祐
自己紹介 並木 優祐 (Yusuke NAMIKI) プラットフォーム本部 技術開発部 テックリード ● 2022年春 会津大学 博士前期課程 修了 ● 現在はJ-Streamのバックエンドエンジニア ○ ● 共通開発基盤「J-Stream Cloud」を開発 2年で自宅インフラがさらに拡張されました (詳細は次ページ)
参考:自宅インフラ(去年) • • • • • • Intel NUC (i5-1135G7, 64GB RAM) x3 Raspberry Pi (いろいろ) x 4 Omron UPS (BN50T) Netgear GS324T (24 port + 2 SFP) Synology 220+ x2 (HA構成) その他 • • • • Mac mini (M1) 外付けHDD (4TB) x 4 WANは2回線 内部のネットワークは10以上? ごく一般的な構成です (当社比)
自宅インフラ(現在) • • • • • 去年の構成に加えて Planex 2.5G 8Port SW (FX2G-08EM) Raspberry Pi +2台 (+Kiosk端末用、+積みラズパイ) NASはNASとして使いたかったので (?) HA構成を解体 FS L2 SW (S3900-24T4S-R) x2 • • • • • 1G x 24, 10G (SFP+) x 4, 冗長電源 検証中、NetgearのSWと入れ替え予定 スタック構成、1台落ちても大丈夫 ラックが足りない… Minisforum MS-01 (SFP+ x2刺さるMiniPC) • 最近揃えた 光スターターセット (某B氏コメント もはやスターターじゃないだろ) 思ったより消費電力が… ま…まだ一般的な構成です… (当社比)
そんなインフラ構築して何してるの? 本題が始まる前に本題からそれていくスタイル • Proxmoxで仮想基盤を構築 • Proxmoxとは仮想マシンを構築・管理できるOSS • インフラ周りのサーバーやK8sクラスター、検証用のVMを立てる • なんだかんだで常時30台以上は起動 TODO いらないVMの整理
弊社の非公式マイクラサーバーも • 某B氏が本気を出しちゃったためなんかすごい構成に • プロキシ(Bungeecord)で複数拠点のサーバー(Spigot)を相互に接続 • プロキシは私と某B氏で立っているので、片方落ちても大丈夫! 並木 プロキシ main resource1 某B氏プ ロキシ resource2
拠点間の接続 • NGNの網内折り返し通信で複数拠点 (並木・某B氏) を接続 • 実はフレッツのIPv6は契約者同士なら直接通信可能 • しかもインターネットに出る必要がない • 折り返し通信だけならプロバイダー契約も不要 User The Internet Provider 折り返し通信 NTT フレッツ (NGN) User Provider User
BGPによる経路交換 • トンネルを張り、BGPで経路交換 • 自動的に経路情報を設定してくれる • • いい感じにルーティングしてくれる スムーズにネットワークを追加できる • 新しく拠点が増えても大丈夫 ・192.168.240.0/24 via 192.168.248.1 ・192.168.242.0/24 via 192.168.248.5 … 192.168.248.2/24 192.168.248.6/24 192.168.248.1/24 ・192.168.241.0/24 via 192.168.248.2 ・192.168.242.0/24 via 192.168.248.10 … 192.168.248.9/24 BGP 192.168.248.10/24 192.168.248.5/24 ・192.168.240.0/24 via 192.168.248.9 ・192.168.241.0/24 via 192.168.248.6 …
自宅ネットワーク(L3) • ネットワーク増やしまくった結果… • • 右の通りです これだけルーティングテーブルが 充実していると楽しい… ところで192.168.0.0/16って少ないよね?
ネットワーク図 某B氏へ
やっと本題 二要素認証は知っていますか?
二要素認証 • 「記憶」「所有」「特徴」から二つを組み合わせて認証を行うこと • 二つ以上の場合は多要素認証 • 例えば… • • • パスワード (記憶) とスマホの認証アプリ (所有) YubiKeyなどの認証デバイス (所有) とPINコード (記憶) パスキー (スマホの所有と生体認証による特徴) パスワード スマートフォン (認証アプリ) 生体認証 スマートフォン (パスキー) もちろん皆さん有効にしていますよね?(圧) 私ですか!? も、もちろんしていますよ…
では… FIDOは知っていますか?
FIDO(認証)とは • 公開鍵ベースの認証に関する標準規格 • • • • sshの公開鍵認証をwebサービスでも使えるようにするようなもの 今話題のパスキーなどもその一つ Fast IDentity Onlineの略 仕様は全て公開されているので誰でも読める • YubiKeyなどはFIDOに対応した認証デバイス • 内部に秘密鍵を持っており、FIDOの仕様に従い署名を行える YubiKey公式サイトより https://www.yubico.com/yubikey/?lang=ja
突然ですが YubiKeyとNFCで おしゃべりしてみましょう • ここからは突然自信がなくなります • • とりあえずやってみた…なので… 動けばよし! (要出典)
プロトコルとか • NFCのカードはAPDUという仕様に従って通信することができる • • ISO/IEC 7816-4で定義されている その中身はアプリケーションによって異なる • FIDOの認証時に使用するプロトコルはCTAPと呼ばれている • 認証に必要なAPIを定義している
プロトコルとか • CTAPのデータをAPDUで包むことでYubiKeyと通信する • APDUがTCPなら、CTAPはHTTPのようなもの • 今回は簡単なちょっと古い規格 (U2F) に従って通信していきます NFCカード FIDO アプリケーション APDU(NFC) CTAP(FIDO) クライアント
環境 • 認証デバイス:YubiKey 5 NFC • カードリーダ:Pasori RC-S380 • クライアント:MacBook Pro • 将来的には実質ラーメンタイマーになっている 自作キオスク端末で動かしたい • 使用言語:Python • ライブラリなど • • NFCPy:NFCの通信周りに対応 pyca/cryptography:公開鍵による署名の検証などで使用
まずは… YubiKeyに接続!
YubiKeyに接続する • NFCのカードとしてFIDOのAppletをSelectする • つまりカードでアプリケーションを開く感じ? • APDUのパラメータは • • • • CLA、INS、P1、P2がそれぞれ0x00, 0xa4, 0x04, 0x00 DATAは[0xa0, 0x00, 0x00, 0x06, 0x47, 0x2f, 0x00, 0x01]の8byte 詳しくは仕様書をチェック レスポンスは”U2F_V2”とステータスコード[0x90, 0x00]の2byte
続いて… デバイスの登録 (認証用の公開鍵を取得)
デバイスを登録する • WebサイトのURLをsha256したもの (AppID;32byte) と 乱数 (Challenge;32byte) をつけてデバイスに登録要求をする • • CLA、INS、P1、P2がそれぞれ0x00, 0x01(登録), 0x00, 0x00 DATAはChallenge + AppID • レスポンスはなんか色々返ってくる • • • • 公開鍵(これを認証時に使用する) KeyHandler(公開鍵に対応する秘密鍵を特定するためのID) Attestation証明書(デバイス自体の証明、大体は自己署名) 署名(0x00+AppID+Challenge+KeyHandler+公開鍵のsha256ハッシュ) • この署名はAttestation証明書に対応する秘密鍵で署名される • このレスポンス、かなり長くて3分割ぐらいになる • 末尾のステータスコードが[0x61,0xXX]の場合は続きがある
デバイスを登録する(公開鍵を取得) 登録 リクエスト レスポンス 処理
デバイスを登録する(公開鍵を取得) レスポンス のパース
デバイスを登録する(公開鍵を取得) レスポンス のパース (続き) 署名の検証
デバイスを登録する(公開鍵を取得)
登録できたら… デバイスで認証する (認証するための署名を取得)
デバイスで認証する(署名を取得) • YubiKeyと接続する(登録時と同じため省略) • 登録時と同じくAppIDとChallenge、加えて登録時に取得したKeyHandler を使用する • CLA、INS、P1、P2がそれぞれ0x00, 0x02(認証), 0x08(UP), 0x00 • • UP(User Presence): ユーザーが認証デバイスを操作するか(ボタンを押すなど) DATAはChallenge + AppID + len(KeyHandler) + KeyHandler • レスポンスとしてUserPresence、カウンター、署名が返却される • • • UserPresenceは1(ユーザーが操作した)、0(ユーザーの操作はない) カウンターは認証回数にかかわらず数字が飛ぶこともある • 減ることはないので古い数字が来たら無視する(リプレイ攻撃の可能性) • この署名は登録時に取得した公開鍵に対応する秘密鍵で署名される 署名(AppID+UserPresence+カウンター+Challenge)
デバイスで認証する(署名を取得) 認証 リクエスト
デバイスで認証する(署名を取得) レスポンスの パースなど
デバイスで認証する(署名を取得) 署名の検証
デバイスで認証する(署名を取得)
まとめ • スイッチの冗長化最高!(?) • SFP+と光最高!(??) • NGNでの折り返し通信とBGP最高!(???) • 二要素認証にはFIDOという規格がある • FIDO対応デバイスとNFCで通信する場合、 APDUとCTAPというプロトコルを使って通信する • あとはいい感じにデータを送受信すれば登録・認証できる! • こんなことせずに、ブラウザに任せましょう!!! ← (一番大事)
Reference • NFCへのアクセスまわり • • PaSoRiとnfcpyでNFCの中身を覗いてみる #Python - Qiita nfc.tag — nfcpy 1.0.4 documentation • FIDO認証機との通信まわり • CTAP2 お勉強メモ#7 - NFC • Attestation証明書について • FIDOテクニカルノート:アテステーションの真実 • 暗号周りのPythonライブラリドキュメント • pyca/cryptography • FIDOの仕様 • Download Authentication Specifications - FIDO Alliance • • • • FIDO U2F Architectural Overview 1.2 Proposed Standard FIDO U2F NFC Protocol 1.2 Proposed Standard FIDO U2F Raw Message Formats 1.2 Proposed Standard なぜかInternet ArchiveのURLのためPDFを落としてローカルで見るのがおすすめ