5年間のOSS活動で学んだ

エコシステムの広がりと

多様な関わり方

Nu Con mini '21 in Spring ONLINE

Yuichi Watanabe at Nulab Inc.

自己紹介

me := Profile{
  Name:    "Yuichi Watanabe",
  Org:     "Nulab Inc.",
  Product: "Backlog",
  Job:     "SRE/Backend",
  Twitter: "https://twitter.com/vvvatanabe",
  GitHub:  "https://github.com/vvatanabe",
  Lives:   "Fukuoka",
}

アジェンダ

  • zxcvbn4jとはなにか

  • OSSとして公開するまでの経緯

  • 組織の枠を超えたメンテナンス

  • 使用事例

  • なぜメンテナンスを継続できたのか

  • エコシステムとして紡がれるOSSの価値

  • まとめ

zxcvbn4jとはなにか

import com.nulabinc.zxcvbn.Strength;
import com.nulabinc.zxcvbn.Zxcvbn;


Zxcvbn zxcvbn = new Zxcvbn();
Strength strength = zxcvbn.measure(“This is password”);
int score = strength.getScore();

簡単な使い方

APIとして提供している測定用のメソッドにパスワードを渡すと、そのパスワードの強度を5つのアルゴリズムを使って複雑性を計算し強度を示すオブジェクトを返す。
Strengthオブジェクトには、強度を示すスコアの他にパスワードの特徴を加味してよりセキュアなパスワードにするための、具体的なフィードバック情報が含まれる。

パスワード強度を測るJavaライブラリ

  • zxcvbn4jはDropbox社のOSSであるzxcvbnをJavaへ移植したもの

  • zxcvbnのモチベーションや構成するアルゴリズム

  • zxcvbnの仕組み自体が広く認知されている

・zxcvbn-python (Python)
・zxcvbn-cpp (C/C++/Python/JS)
・zxcvbn-c (C/C++)
・zxcvbn-rs (Rust)
・zxcvbn-go (Go)
・zxcvbn4j (Java)
・nbvcxz (Java)
・zxcvbn-ruby (Ruby)
・zxcvbn-js (Ruby [via ExecJS])
・zxcvbn-ios (Objective-C)
・zxcvbn-cs (C#/.NET)
・szxcvbn (Scala)
・zxcvbn-php (PHP)
・zxcvbn-api (REST)
・ocaml-zxcvbn (OCaml)
・angular-zxcvbn (AngularJS)

dropbox/zxcvbnのポーティング

zxcvbn4jとはなにか

ポーティング一覧 ※READMEから抜粋

アジェンダ

  • zxcvbn4jとはなにか

  • OSSとして公開するまでの経緯

  • 組織の枠を超えたメンテナンス

  • 使用事例

  • なぜメンテナンスを継続できたのか

  • エコシステムとして紡がれるOSSの価値

  • まとめ

OSSとして公開するまでの経緯

  • きっかけは5年前ヌーラボアカウントチームにジョインした時の最初のタスク

  • 類推されにくいより強度の高いパスワードの設定を促すため

  • パスワード強度メーターを設置することに

> このUIの要素は、MSR(Microsoft Research)の論文によると類推されづらいパスワードを促してサービスの安全性を高めることに効果的だということが証明されています。お客様自身の大事な情報を守る上でとても重要なパスワード。ヌーラボアカウントでも、類推されにくいより強度の高い設定を促すためにパスワード強度メーターを設置しました。

Refs: https://nulab.com/ja/blog/nulab/password-strength/

脆弱なパスワードへ警鐘を鳴らす

OSSとして公開するまでの経緯

  • 他社のWebサービスはどのような基準で測定を行っているのか?

  • その基準は各サービスによって異なりほとんどがブラックボックスな状態

  • あるサービスで強いと測定されたものが他では弱いと測定されることも

  • ブラックボックス化された指標によってユーザーを混乱させたくない

  • オープンな仕様やライブラリを求めた我々はdropbox/zxcvbnにたどり着く

ブラックボックスではなくオープンな技術を求めて

OSSとして公開するまでの経緯

  • 当時のヌーラボアカウント認証基盤はJava+Spring

  • サーバーサイドで測定用APIを提供したかった

  • しかしzxcvbnはあくまでJavaScriptのライブラリ

Javaからどのように使用する?

  • JavaでJavaScriptを実行するエンジンを検討

    • エンジンはJava8のNashorn

  • パフォーマンスに大きな課題があり断念

    • zxcvbnの初回ロードに数分かかる

    • ライブラリ内の大きな辞書のロードが原因

Nashornという選択肢

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
engine.put("pwd",password.toString());
Map<String, Object> strength = engine.eval("zxcvbn(pwd);

OSSとして公開するまでの経緯

  • Nashornの件はIssueとして上がっていた

Javaからzxcvbnを使う需要

  • zxcvbnはCoffeeScriptで書かれておりソースコードを覗くとそこそこ複雑

  • 大きな辞書を抜いた行数を見るとテストコードも含め2000行程

  • 複数の辞書からコードを自動生成するPythonのスクリプトも同梱されていた

    • その仕組み自体は複雑ではない

CoffeeScriptからJavaへ

アイコンの親和性は高く見えなくもない

OSSとして公開するまでの経緯

  • CoffeeScriptの型の無いオブジェクトをデバッグしながらJavaの型に起こす作業
  • Androidでも使えるようにJava8の新しい構文は使わない ※2015年当時
  • 複雑なパスワードの文字列評価の互換性をどう担保するのか
    • zxcvbn自体にユニットテストがしっかり書かれていたことに救われる

CoffeeScriptの受難とJava7縛り

ヌーラボアカウントへパスワード測定機能として無事リリース

  • ヌーラボアカウントへパスワード測定機能として無事リリース

  • BacklogのGitで管理していたリポジトリをGitHubへ引っ越し、Mavenで公開

  • 公開後は「zxcvbn for Java. #123」でJavaへポーティングしたことをお知らせ

  • zxcvbn for Java. #123」はクローズされ、zxcvbnのREADMEに追記される

宣伝

  • ヌーラボアカウントではセキュリティ強化の取り組みを継続して実施

  • 脆弱なパスワードの作成に対してより注意喚起を強化

    • ​​zxcvbn4jでパスワードの複雑性を判断

    • haveibeenpwnedのAPIを使って他サービスで漏洩したかどうか検知

アジェンダ

  • zxcvbn4jとはなにか

  • OSSとして公開するまでの経緯

  • 組織の枠を超えたメンテナンス

  • 使用事例

  • なぜメンテナンスを継続できたのか

  • エコシステムとして紡がれるOSSの価値

  • まとめ

組織の枠を超えたメンテナンス

  • 公開して1ヶ月くらい経つと国外の方から記念すべき最初のプルリクエスト

  • 公開したソフトウェアに国外からの反応があるのは初めての経験だった

    • プログラミングを通して世界と繋がった気がして小躍り ʕ◔ϖ◔ʔ

タイポの修正が最初のプルリク

  • 最初のプルリクエストの後すぐに同じ方からプルリクエスト

  • 内容はフィードバックメッセージのローカライズ

    • 当初zxcvbn4jがサポートするフィードバックメッセージは英語のみ

    • ヌーラボ社内でもメッセージをローカライズできる仕組みを検討していた矢先

  • これによりヌーラボアカウントでも言語設定に応じてメッセージを変更可能に

  • なぜここまでコントリビュートしてくれたのか?

組織の枠を超えたメンテナンス

最初のプルリクはほんの挨拶代わり

組織の枠を超えたメンテナンス

背中で教わった足りないモノをプルリクする熱意

  • zxcvbn4jはzxcvbnのポーティング

  • オリジンとの互換性を保ちたい

  • zxcvbnに改修が入ると差分をアップデート必要がある

    • CoffeeScriptを見て差分をJavaの実装へ落とし込む

  • 大きな粒度で差分を見ると変更に圧倒されてしまう

    • コミット単位で少しづつ移植

    • コミットが整理されていると歴史を追いやすい

    • 業務タスクの粒度が大きすぎる時に小さく分解して地道に消化する手法と同じ

組織の枠を超えたメンテナンス

オリジンへの追従

  • 互換性を保つ取り組みも有志のコントリビュートに助けらた

  • 中を覗いてみると... 





    おお!Nashorn Nashornじゃないか! 久しぶりじゃないか、元気にしてたか?

  • なんとポーティングする前に検証した結果見送ったNashornが帰ってきた

  • zxcvbnのJSをNashornで実行してzxcvbn4jの結果と比較する自動テストだった

組織の枠を超えたメンテナンス

帰ってきたきたNashorn

※ NashornはJDK 11で非推奨、15で廃止されている。現在GraalJSへの移行をを検討中

アジェンダ

  • zxcvbn4jとはなにか

  • OSSとして公開するまでの経緯

  • 組織の枠を超えたメンテナンス

  • 使用事例

  • なぜメンテナンスを継続できたのか

  • エコシステムとして紡がれるOSSの価値

  • まとめ

使用事例

  • Webセキュリティ学習用のアプリケーション「OWASP Web Goat」で導入される

    • セキュリティの第一線であるOWASPが提供しているJava製のOSS

  • Webセキュリティに対するリテラシーを高める活動に間接的に貢献

    • メンテナンスを継続するやる気にも繋がった

OWASP Web Goatのセキュリティコンテンツ

使用事例

※ Central Statistics on oss.sonatype.org 調べ

月間18万ダウンロード

その他にも様々な製品で

アジェンダ

  • zxcvbn4jとはなにか

  • OSSとして公開するまでの経緯

  • 組織の枠を超えたメンテナンス

  • 使用事例

  • なぜメンテナンスを継続できたのか

  • エコシステムとして紡がれるOSSの価値

  • まとめ

なぜメンテナンスを継続できたのか

  • 業務に関連するソフトウェアであれば自分の裁量で業務中にコントリビュートできる

  • ただし明文化されていないため判断しにくさもある

    • OSSポリシーの策定など明文化されたルールを運用することで改善していきたい

ヌーラボのOSS活動への理解

経営層のバックグラウンド

  • ヌーラボの役員には社長のmasaをはじめOSS活動の経験者がいる
    • OSSの文化を組織のトップが大事にしている

      • 組織としてOSS活動が理解される大きな要因になっている

  • これ迄に起票されたIssueを全て自分だけで対応したわけではなく

  • ヌーラボには比較的もJavaが得意な開発者が多い

    • 気兼ねなく相談できる雰囲気に救われた

  • ヌーラボ内には他にもOSSとして公開しているモノが複数ある

    • 同僚達の活動は良い刺激にもなる

心強い同僚達のサポートとそれぞれのOSS活動

なぜメンテナンスを継続できたのか

# OAuth 2.0 サーバーサイドのScala実装

nulab/scala-oauth2-provider maintained by tsuyoshizawa

# GoogleスプレッドシートによるBacklog課題一括登録

nulab/backlog-bulk-issue-registration-gas maintained by shomatan

# Backlogへのデータ移行ツール
nulab/BacklogMigration-Jira maintained by shomatan
nulab/BacklogMigration-Redmine maintained by yuichi0301

# 各サービスのAPIクライアント

nulab/backlog4j maintained by Backlog Developers
nulab/backlog-js maintained by mmktomato
nulab/go-typetalk maintained by Typetalk Developers

アジェンダ

  • zxcvbn4jとはなにか

  • OSSとして公開するまでの経緯

  • 組織の枠を超えたメンテナンス

  • 使用事例

  • なぜメンテナンスを継続できたのか

  • エコシステムとして紡がれるOSSの価値

  • まとめ

エコシステムとして紡がれるOSSの価値

  • OSSとして共有することで生まれるフィードバックループ
  • ソフトウェアの改善が組織という枠を超える

共有して共に作る価値

伝播する仕組みと思想

  • 様々な言語へ移植され価値を享受できる範囲が拡大する
  • 移植されたライブラリ自体もエコシステムが形成される

アジェンダ

  • zxcvbn4jとはなにか

  • OSSとして公開するまでの経緯

  • 組織の枠を超えたメンテナンス

  • 使用事例

  • なぜメンテナンスを継続できたのか

  • エコシステムとして紡がれるOSSの価値

  • まとめ

まとめ

  • オリジンのzxcvbnは間違いなく偉大なソフトウェアのひとつ

    • コミュニティに愛され、数多くの言語に移植され独自のエコシステムを広げてきた

オリジンへのリスペクト

  • 5年間のメンテ活動を通して偉大なソフトウェアの価値を繋ぐハブの一つにはなれた?

  • そのハブを継続できているのも間違いなく有志のコントリビュートのおかげ

  • 世界に一石投じるようなソフトウェアを生みだすのはほんの一握り

  • OSSとの関わり方はそれだけではない

    • 1つのIssueの報告、1行のコード修正

    • 小さな共創関係を築くことは大きな価値を形作る大切なピースになる

何者でもなくともOSSのハブにはなれる

NuCon> git commit -m "ご静聴ありがとうございましたʕ◔ϖ◔ʔ"

5年間のOSS活動で学んだエコシステムの広がりと多用な関わり方

By Yuichi Watanabe

5年間のOSS活動で学んだエコシステムの広がりと多用な関わり方

  • 1,225