Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

フラッター開発におけるシークレット情報取扱考察

294 views

Published on

Flutter Meetup Osaka #4 (2020/11/27) の
セッションスライドです。
https://flutter-jp.connpass.com/event/192795/

Published in: Technology
  • Login to see the comments

フラッター開発におけるシークレット情報取扱考察

  1. 1. フラッター開発での シークレット情報取扱考察 1 Flutter Meetup Osaka #4 robo
  2. 2. 自己紹介 名前 robo (兼高理恵) 好きなもの モバイル端末 おしごと アプリの設計から実装まで 所属 GDG Kyoto (staff) WTM Kyoto (staff) Flutter Osaka (staff) 2
  3. 3. はじめに お詫び この LT 内容は、 開発中の秘匿情報不在化についての考察です。 リポジトリに秘匿情報を保管させない手法案のため、 Flutter に関する技術的情報は、ほとんどありません。 秘匿化専用のサービスやツールもありますが、   ここでは、簡易に内製化できる範囲にとどめます。 3
  4. 4. 考察のゴール ● GitHub リポジトリに秘匿情報を commit しないで、 ● ビルド前に ビルド環境内に秘匿情報ファイルを復元する。 ● $ flutter run コマンド実行時に、復元した秘匿情報ファイルを 参照(ファイル置換やコピーも伴う)させてビルドする。 4
  5. 5. 5 当社が管理するAWS上の システムで使用している アクセスキーとシークレットが 不正に使用され 本環境に保存されているデータが 一時的にインターネットからアクセス可 能な状態になっておりました。 現在は… 秘匿情報が漏出すれば…
  6. 6. リポジトリに秘匿情報を保管させない アクセスキーやパスワードなどの秘匿情報の漏出は、 開発チームやクライアントの財産や信用を毀損します。 そのためにプライベートリポジトリにしたところで、 アカウントが乗っ取られれば、秘匿情報は丸見えです。 リポジトリに、秘匿情報を直接保管させないのが基本です。 6
  7. 7. リポジトリに秘匿情報を保管させない手法 CI/CD サービスでは、 ソースリポジトリに存在しない秘匿情報の復元キーを ビルド環境内だけに存在する、特殊な環境変数に設定して、 ビルド中に秘匿情報を復元 させる手法が一般化しています。 7
  8. 8. 8 シークレットファイル (certs など) の保存 – CircleCI Japanese Support Center https://support.circleci.com/hc/ja/articles/360006717953-%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%8 8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-certs-%E3%81%AA%E3%81%A9-%E3%81%AE%E4%BF%9D%E5%AD%98 環境変数の使用 - CircleCI https://circleci.com/docs/ja/2.0/env-vars/ 秘密と環境設定 | Bitrise DevCenter https://devcenter.bitrise.io/jp/builds/env-vars-secret-env-vars/ 公開アプリの機密インプット | Bitrise devcenter https://devcenter.bitrise.io/jp/builds/sensitive-input-field/ GitHub Actions のセキュリティ強化 - GitHub Docs https://docs.github.com/ja/free-pro-team@latest/actions/learn-github-actions/security-hardening-for-github-actions 暗号化されたシークレット - GitHub Docs https://docs.github.com/ja/free-pro-team@latest/actions/reference/encrypted-secrets
  9. 9. 秘匿情報を復元する基本的なパターン A. 環境変数で 秘匿ファイル の 復元データを取り扱う。 ビルド中の環境変数に、秘匿ファイルのエンコードデータを 設定して、元のファイルにデコード(復元)します。 B. 環境変数で 秘匿ファイル の 復号化キーを取り扱う。 ビルド中の環境変数に、秘匿ファイルを暗号化した際の パスワード等を設定して、リポジトリ内の暗号化済の 秘匿ファイルから、元のファイルを復号化(復元)します。 その他、特定の相手にだけ公開鍵を渡す方法もありますが、 今回の考察では扱いません。 9
  10. 10. 秘匿情報をエンコード&デコードするコマンド この考察では、 Aパターン (環境変数に復元データをもたせる) に Base64、 Bパターン (環境変数に復号キーをもたせる) に OpenSSL を 取り上げます。 両者は、mac OS と Linux なら標準でインストール済みか パッケージ管理ツールでインストールできます。 10
  11. 11. Base64 11
  12. 12. Base64 エンコード マルチバイト文字やバイナリデータを 64種類の英数字のみを用いて取り扱うエンコード方式 base64 コマンドを使うと、バイナリファイルも1行の英数文字列にできる。 12 Base64 - Wikipedia https://ja.wikipedia.org/wiki/Base64ize-limit-of-env-vars/ base64 コマンドは、 オプションも少なく 使用法も判りやすい。 コマンド例は、 次のページで紹介
  13. 13. 13 簡単な コマンド使用例 オプションなしで入力をエンコードして出力、 なら入力をデコードして出力 ⇒ ⇒ オプション で出力先をファイルに指定 ⇒ ⇒ オプション で入力元をファイルに指定 ⇒ 環境変数への入出力 (1行目と2行目の出力は同じ内容) ⇒ ⇒ ⇒
  14. 14. Aパターンで扱うファイルサイズ 環境変数の最大長は、 コマンドラインの最大長に制約されるそうです。 このため最大長は、コマンドプロセッサにより変化します。 Bitrise のドキュメントの中には、 設定で拡大できるが、標準では環境ごとに 20KB が最大 とありました。 数KBに制限したほうが安心と思われます。 14 Increasing the size limit of Env Vars | Bitrise DevCenter https://devcenter.bitrise.io/tips-and-tricks/increasing-the-size-limit-of-env-vars/
  15. 15. OpenSSL 15
  16. 16. OpenSSL OpenSSL (オープン・エスエスエル)は、オープンソースで開発・提供される SSLプロトコル・TLSプロトコルを処理するライブラリのソフトウェアです。 以下のような複数の暗号化アルゴリズムをサポートします。 (Wikipedia より) ● プロトコル SSL 3.0、TLS (1.0、1.1、1.2、1.3)、DTLS (1.0、1.2) ● ハッシュ関数方式 MD5、SHA-1、SHA-2、SHA-3、RIPEMD-160... ● 共通鍵暗号方式 AES、Blowfish、Camellia、ChaCha20、Poly1305、SEED... ● 公開鍵暗号方式 RSA、DSA、ディフィー・ヘルマン鍵共有、楕円曲線暗号... 16 OpenSSL - Wikipedia https://ja.wikipedia.org/wiki/OpenSSL
  17. 17. symmetric cipher routines - 共通鍵暗号方式 本考察では、秘匿情報ファイルの暗号化と復号化に 同じキー(パスワード)を使う、共通鍵暗号方式を採用しました。 17 OpenSSL man/enc -- html ページ意訳抜粋 ● openssl enc で 共通暗号鍵 のエンコードとデコードを行う。 ● 安全のために暗号化アルゴリズムには、AES CBC モードを勧める。 ● salt はエンコード時にデフォルトで適用される。(同じデータとパスワードでもエンコードは毎回異なる) ● オプション -e ⇒ エンコード、-d ⇒ デコード、-in ⇒ 入力ファイル、-out ⇒ 出力ファイル 、 -pass pass: ⇒ パスキー文字列、-base64 ⇒ 入出力を Base64でエンコード/デコード /docs/man1.1.1/man1/enc (enc command) https://docs.brew.sh/FAQ.html#how-do-i-update-my-local-packages
  18. 18. symmetric cipher routines - 共通鍵暗号方式 最新の OpenSSL では、 暗号化キーを強化するため iter と pbkdf2 オプションの追加を求められます。 18 OpenSSL 1.1.1b warning: Using -iter or -pbkdf2 would be better while decrypting a file encrypted using OpenSSL 1.1.0g https://unix.stackexchange.com/questions/507131/openssl-1-1-1b-warning-using-iter-or-pbkdf2-would-be-better-while-decrypting -iter と -pbkdf2 オプションについての質問回答ページ意訳抜粋 ● iter オプションは、ブルートフォースアタックを防ぐため デフォルトの暗号化回数を上書きします。 ● pkdf2 オプションは、 PBKDF2(パスワードベースの鍵導出関数2)アルゴリズムを使用することで、 疑似ランダム関数をソルト値とともに入力パスワードやパスフレーズに適用する プロセスを繰り返して、暗号化キーのキーストレッチングを行うようです。
  19. 19. OpenSSL 共通鍵暗号コマンド例 19 下記サンプルコマンドは、全て1行のコマンドです エンコード 秘匿情報ファイル デコード 復元秘匿情報ファイル パスワードを環境変数 から取得する場合 復元秘匿情報ファイル
  20. 20. macOS は、homebrew でインストール 20 FAQ — Homebrew Documentation # How do I update my local packages? https://docs.brew.sh/FAQ.html#how-do-i-update-my-local-packages 標準の は、 ⇒ ⇒ をインストール をアップデートする場合 パス を優先化 や にパスを追加しても可 homebrew は、 インストール済としています。 Homebrewのインストール https://qiita.com/zaburo/items/29fe23c1ceb6056109fd のバージョンを確認
  21. 21. 戦略 21
  22. 22. リポジトリに秘匿情報を置かない戦略 ● Base64エンコードファイル 配置ディレクトリ(非公開) ● OpenSSLエンコードファイル 配置ディレクトリ(公開) ● デコードファイル (復元した秘匿情報ファイル) 配置ディレクトリ(非公開) ● .gitignore に非公開ディレクトリを追加しておく。 ● エンコードと デコード およびビルド前秘匿情報復元は、 スクリプトで管理する。秘匿情報を公開ディレクトリに配置してしまうヒューマンエラー抑止 22
  23. 23. リポジトリ・ディレクトリ考察例 23 Flutter プロジェクトディレクトリ build_assists scritps encode_private encode_public decode_private .gitignore ● scripts 秘匿情報のエンコード /デコードおよび ビルド前に秘匿情報を復元するスクリプトを配置 ● encode_private Base64 でエンコードしたファイルを配置 ● encode_public OpenSSL でエンコード(暗号化)したファイルを配置 ● decode_private デコード(復号化)した復元秘匿ファイルを配置 ● .gitignore 非公開ディレクトリを指定
  24. 24. (macOS)Android Studio での注意事項 macOS の Android Studio のターミナルでは、 openssl コマンドが LibraSSL に置き換えられるようです。 このため .bashrc に OpenSSL へのパスを追加していても、 を実行して、 スクリプトでの暗号化や復号化で支障が発生しないよう、 OpenSSL へのパスを優先させてください。 24
  25. 25. ビルド前に、復元秘匿情報への操作が必要な場合 復元した秘匿情報ファイルは、 ファイルの配置先が決まっている場合等があります。 この場合は、適切な場所に配置(コピー)したりするための 作業スクリプトを作成して、ビルドの直前に実行するよう、 iOS では、Xcode プロジェクトの Run Script の修正、 Android では、app:build.gradle の修正を行います。 25
  26. 26. 26 iOS の場合は、Xcode プロジェクトを開いて、 Runner > TARGETS > Build Phase > Run Script で、実行させたい作業スクリプトを追加します。 この例では、replace_app_name_ios.sh が作業スクリプト名です。
  27. 27. 27 def replace_app_name() { exec { commandLine 'sh', '-c', '../../build_assists/scripts/replace_app_name_android.sh' } } project.afterEvaluate { replace_app_name() } Android の場合は、app:build.gradle を開いて、 project.afterEvaluate と 作業スクリプト実行関数を追加してください。 project.afterEvaluate は、プロジェクトの評価処理後に実行されます。 この例では、replace_app_name_android.sh が作業スクリプト名です。
  28. 28. (macOS)flutter run/build での注意事項 macOS の flutter run/build ビルド中の環境では、 openssl コマンドが LibraSSL に置き換えられるようです。 このためか作業スクリプト内で、openssl コマンドを使うと マルウェア警告がでるので秘匿情報の復元コマンドと分ける必要がありました。 28
  29. 29. 検証 29
  30. 30. リポジトリに秘匿情報を置かない考察の検証 これらの考察を踏まえて、 指定の環境変数に秘匿情報(パスワード)が設定されていれば、 $ flutter run 実行でアプリ名を変更する実験リポジトリを作りました。 30
  31. 31. こちらの内容については、 Flutter #2 Advent Calendar 2020 で           続きを行う予定です。 31 Flutter #2 Advent Calendar 2020 https://qiita.com/advent-calendar/2020/flutter-2
  32. 32. 32 ご清聴、 ありがとうございました。 情報修正があれば更新します 最新版スライドは こちらから

×