暗号通貨の鍵を安全に管理するアーキテクチャを作ってみようとしている話

 暗号通貨の鍵を安全に管理するアーキテクチャを作ってみようとしている話

https://gitpitch.com/cryptofort-sh/cryptofort-presentations
2018/04/20 blockchain-es #1 で発表したスライドです。
GitPitchで作ってPDF化したら想定外にフォントがおかしくなったので、直せたら直してアップし直します。

8a43d544df4886ea5ef714e78f3420a7?s=128

Hideyuki Takeuchi

April 20, 2018
Tweet

Transcript

  1. 暗号通貨の鍵を安全に管理する アーキテクチャを 作ってみようとしている話 たけうちさんは縮退しました̀ 2018/04/20 blockchain-es #1 Navigate : Space

    / Arrow Keys | - Menu | - Fullscreen | - Overview | - Blackout | - Speaker | - Help M F O B S ?  1 / 29
  2. 自己紹介 [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  2 / 29

  3. たけうちさんは縮退しました̀ @chimerast 株式会社ユーザベース 社内ニート (チート系異世界転生志望) ジョブタイプ: 全方位型エンジニア 好きな言語: 今をときめくJava [

    GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  3 / 29
  4. 暗号通貨・ブロックチェーンに 対するスタンス 暗号通貨: あってもいいんじゃないか派 ブロックチェーン: 使い道ないんじゃないか派 (暗号通貨のインフラとしてはOK) [ GitPitch @

    github/cryptofort-sh/cryptofort-presentations ]  4 / 29
  5. 今日の話 [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  5 / 29

  6. プレゼンの趣旨 暗号通貨やブロックチェーン、DAppsを 活用したシステムで忘れがちな 暗号鍵の守り方についての意見交換をしたい オープンソースとしてシステムおよび アーキテクチャを共有して揉んでみたい [ GitPitch @ github/cryptofort-sh/cryptofort-presentations

    ]  6 / 29
  7. 暗号通貨・ブロックチェーン関連の システムの課題 暗号鍵が漏れるとサービスが死ぬ 暗号鍵を触れる権限を持っている人が死ぬ システムに組み込んだ暗号鍵の守り方の知見が あまり共有されていない [ GitPitch @ github/cryptofort-sh/cryptofort-presentations

    ]  7 / 29
  8. 必要とされているもの 外部からの攻撃を受けても暗号鍵にアクセスしづらいインフラ 特定の個人を信頼しなくてもサービスを稼働させることのできる仕組み このアーキテクチャなら問題ないという安心感が欲しい [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ] 

    8 / 29
  9. 作ろうとしているもの [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  9 / 29

  10. CRYPTOFORT (整備中) (整備中) ステータス: コンセプト検証 言語: TypeScript その他: Terraform(?), Packer

    開発体制: 1人, 勉強会駆動開発 ライセンス: Apache License 2.0 https://cryptofort.sh/ https://github.com/cryptofort-sh/ [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  10 / 29
  11. CRYPTOFORT が提供するもの 暗号通貨サービスのための暗号鍵を扱う仕組み 可能な限り多くの通貨への対応 インターフェースを定義し、 各通貨のモジュールを容易に追加できるように 全ての通貨を同じインターフェースで送金可能に 現状は、通貨毎に違うので非常につらい [ GitPitch

    @ github/cryptofort-sh/cryptofort-presentations ]  11 / 29
  12. CRYPTOFORT の想定利用シーン 暗号通貨取引所・販売所 スマートコントラクトを叩くサービス 鍵が漏れたらスマコン叩き放題 /(^o^)\ナンテコッタイ [ GitPitch @ github/cryptofort-sh/cryptofort-presentations

    ]  12 / 29
  13. なぜ TYPESCRIPT か? ほとんどの暗号通貨がNode.jsのライブラリを用意している (Node.jsのライブラリしかないものも多い) インターフェースを定義・共有するのに型宣言が欲しい [ GitPitch @ github/cryptofort-sh/cryptofort-presentations

    ]  13 / 29
  14. なぜオープンソースか? こんなサービスの本質ではない、つらくて危ない実装部分は、 みんなで共有しながら作った方がいい 使ってもらって安心して使える暗号通貨系の サービスが増えて欲しい マネタイズしたければコンサルフィーをもらえばいい [ GitPitch @ github/cryptofort-sh/cryptofort-presentations

    ]  14 / 29
  15. CRYPTOFORT プロジェクト (妄想) CRYPTOFORT-COMMANDER(仮) 送金やスマートコントラクトの実行を 安全に行う仕組み・インフラ定義 CRYPTOFORT-KEYMANAGER(仮) 複数人に権限分散して鍵管理をするための仕組み (≠ マルチシグ)

    [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  15 / 29
  16. CRYPTOFORT-COMMANDER (仮) [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  16 /

    29
  17. どう安全に送金・実行するか? ほとんどの暗号通貨の送金やスマートコントラクトの実行は 複数のフェーズに分割できる 1. 送金や実行命令を出す 2. 命令に署名する 3. 署名した命令をブロードキャストする [

    GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  17 / 29
  18. どう安全に送金・実行するか? ほとんどの暗号通貨の送金やスマートコントラクトの実行は 複数のフェーズに分割できる 1. 送金や実行命令を出す 2. 命令に署名する (← 暗号鍵が必要なのはここだけ) 3.

    署名した命令をブロードキャストする 署名にインターネット接続は必要ない [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  18 / 29
  19. 署名 (ETHEREUM) const EthereumTx = require('ethereumjs-tx') const tx = new

    EthereumTx({ nonce: nonce, gasPrice: 5e+9, // 5gwei gasLimit: 31500, to: toAddress, value: value }) tx.sign(privateKey) const serializedTx = '0x' + tx.serialize().toString('hex') console.log(serializedTx) [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  19 / 29
  20. ブロードキャスト (ETHEREUM) const Web3 = require('web3') const web3 = new

    Web3(new Web3.providers.HttpProvider(server)) web3.eth.sendRawTransaction(serializedTx, (err, hash) => { if (!err) { console.log(hash) } else { console.log(err) } }) [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  20 / 29
  21. 簡易システム図 隔離されたネットワーク(赤い部分)については アウトバンド接続も制限する [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  21

    / 29
  22. キューの中身 (仮) 送金キュー ブロードキャストキュー interface TransferRequest { currencyType: string; //

    通貨タイプ receiveAddress: string; // 受け取りアドレス amount: bigint; // 送金量 } interface BroadcastRequest { currencyType: string; // 通貨タイプ transaction: string; // トランザクション } [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  22 / 29
  23. より高い安全を確保するために 署名サーバは起動したらOSに外からは誰も入れないように全ての口を閉じる 都度 Packer で AMI を作成 SSHだけでなく、可能ならシリアルコンソールの口も 署名時にルールによる検証や人による承認を実装する口をつくる 署名サーバがRDBに確認を行い不正な送金先でないことを確認

    一定額以上の送金を一度停止し、人による承認を入れるロジックを入れると か ただ色々と要検討 [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  23 / 29
  24. CRYPTOFORT-KEYMANAGER (仮) [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  24 /

    29
  25. 暗号鍵にまつわるいろいろな問題 社長だけが鍵にアクセスする権限を持っているとか絶対ダメ 複数人で持った方が社長が狙われる可能性が減る マルチシグはWebサービスだとあまり使いどころがない 複数人で持ち合って承認みたいなのだと意味があるけど、 システムに組み込んじゃうとあまり意味が無い 鍵のパスワードを持っている人が会社辞めたらどうするの スマコンのowner変更とかつらい場合もある [ GitPitch

    @ github/cryptofort-sh/cryptofort-presentations ]  25 / 29
  26. あるべき暗号鍵管理の姿 複数人のパスワードもしくは物理トークン(ICカード等)がそろわないと暗号鍵を 有効化できないようにする 暗号鍵を有効化するのに可能な人数・組み合わせを管理したい あまり親しくない人同士が複数そろわないと開かない方が良い 取締役は2人いれば開けたいけど、平社員は4人いてほしい 人が辞めたときに無効化をできるようにする [ GitPitch @

    github/cryptofort-sh/cryptofort-presentations ]  26 / 29
  27. 作ろうとしているもの パスワードの組み合わせ運用を簡単にできるようなツール 複数人のパスワードを組み合わせて連結し暗号鍵をさらに暗号化する (鍵の多段運用のスライドを作っていたが途中まで作っていたが、 なぜそうしようと至ったかよくわからなくなったので削除しました) CloudHSM等の鍵を安全に管理するクラウドサービスも組み入れたい 生成時にクリーンな環境で生成する仕組みを組み入れたい [ GitPitch @

    github/cryptofort-sh/cryptofort-presentations ]  27 / 29
  28. まとめ [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  28 / 29

  29. 暗号通貨やブロックチェーンやDAppsとかは 鍵の管理を考えるととっても大変 cryptofort 妄想を実現するためにがんばりたい 複数通貨への対応がつらいので誰か手伝って 暗号通貨とかブロックチェーンとかどうでもいいから 「暗号技術入門 第3版 秘密の国のアリス |

    結城 浩」 をまず読むんだ! "Recommendation for Key Management" NIST SP 800-57 Part 1, Part 2, Part 3とかも読みたい [ GitPitch @ github/cryptofort-sh/cryptofort-presentations ]  29 / 29