Empowered by expect

希望は体力

SSVCのDecision Tableを雑に実装してみる~Twine編~

DecisionRules編からの続編です。

概要

タイトルの通りです。Twineにインポートできるhtmlファイルを置いておきます。そのまま開いて実行もできます。
https://github.com/w4yh/SSVC-decision-tree
ファイル: HarloweとSugarCubeの2種類のスタイルで作ってみました。
SSVC_Supplier_Decision_Table_Harlowe_0.0.2.html
SSVC_Supplier_Decision_Table_SugarCube_0.0.2.html

完成品

最初にデモ代わりにSugarCube版のスクリーンショットを載せておきます。
ここでは Exploitation=Active, Automatable=yes, Value Density=concentrated, Technical Impact=Total, Safety Impact=Catastrophic を選択しています。

Twineスタート画面
Twine Exploitation選択画面
Twine Automatable選択画面
Twine Value Density選択画面
Twine Technical Impact選択画面
Twine Safety Impact選択画面
Twine選択終了画面
Twine判定結果画面

経緯

前回はSSVCの判定をDecisionRulesで作成してみました。
一覧が見えるので分かりやすい、APIも備えているのでcURLなどCLIからも実行できるなどの利点がありました。一方でツールチップで説明文を表示するなどの機能を実装していないので、実際に使用するシーンでは別途リンクURLなどの情報が必要でした。

今回はTwineを使ってリンクURLや説明文も表示しながら実装してみました。

Twine

公式サイト

Twineはオープンソースのノベルゲーム作成ツールです。
私は以前からTwineで業務フローを書くという間違った使い方をしています。フローチャートやBPMNだけだと通じる相手を選んでしまうケースがあるんですよね..ドメインサーバー証明書の購入といった事務寄りの方やサービスデスクの方などが関わる業務の説明で使ってウケたので愛用しています。

GitHub上に公開した冒頭のhtmlファイルを開くとこんな感じです。

Twineサンプル(Harlowe)

え、色が見にくいですか?cssを編集してください。別のテーマ(SugarCube)ではこうなります。

Twineサンプル(SugarCube)

ちょっと見やすくなりましたかね。Twine2ではデフォルトスタイルは一つ目の方(Harlowe)です。Harloweの方がノベルゲームっぽい雰囲気は出る気がしますが、お好みで選択 && css編集で色の変更 をしてください。

設計

DecisionRules編では"行を最下部に複製"を駆使して一覧にしました。今回は質問は5問しか無いですが一覧フルメッシュで作ると樹形図のようになり、枝分かれ先に同じ質問を何度も書くことになります。
そこで今回は各質問の回答をを変数に記憶しておき、最後に回答ごとの画面に遷移して判定結果を表示するという仕組みにしました。

Twine画面遷移一覧

最後をif文にするか迷いましたが、判定結果を「ここはimmediateにしたい」といったカスタマイズを行う場合に長いif文よりは扱い易いかと思いこの方法にしました。SSVCの資料に合わせて左から右に縦長で配置する方が良かったかもしれません。

インポートと実行

Twine公式サイトからダウンロードしてTwineをPCにインストールしてください。

実行すると初期メニュー画面になります。右側メニューから [Import From File] を選択します。

Twine初期メニュー画面

ファイル選択画面になるので、GitHubからダウンロードしたhtmlファイルを指定します。

インポートファイル選択画面

ファイル編集画面になります。

Twineでファイルを開いた画面

右下の [▶Play] を押すとデフォルトブラウザで開いて実際にプレイできます。

Twineの書き方の細かい説明は省略しますが、今回のファイルの流れだけ説明します。
設計のところでも述べましたが、各質問の答えを変数 $ans1 ~ $ans5 に記録しています。最後に連結して5桁の数字を $ans として生成し、該当の番号の選択肢(11111など)へジャンプして判定結果を表示しています。
最初のページに資料へのリンクを記載しています。独自の前提質問を追加する場合にはStartページから [0.始めましょう] の間に新しい画面(TwineではPassageと呼びます)挟むといいでしょう。Passageへのリンクは [[Passageの名前]] で表します。例えば「Javaは無いので対象外」のように「該当のパッケージがCMDB内に存在するか」といった質問を最初に加えるケースが想定されます。

振り返り

Twineで作るとディシジョンテーブル感は薄れるかもしれないですね。
しかしWiki上でパンくずリストを見ながら選択肢を大量に作るよりも扱い易いかと思います。本来ノベルゲーム用ツールなのでエンジニア向けツールというわけでもなくとっつきやすいかと思います。

5つめの質問である "Safety Impact" の判定がかなり肝な印象です。被害に関することなので、CVSSアタックベクターの中にはそのまま当てはまる項目は無いような気がします。どちらかというとISMSなどで組織毎システム毎に行ったリスク評価みたいなものがベースになるのかなと思います。リスク評価メンドクサイですが、やっぱりやらないといけませんね。。