第 4 章 提案手法のツール化と実験
4.4 機能評価 (3) セキュリティテストカバレッジの計測
トテストが1295、機能テストが1207、統合テストが128であった。この段階で 未定義なコマンドは552個である。
Foremanはアクセス制御リストをデータベースで管理する。テストの際に使用
するアクセス制御リストはRails の fixtures 18 の形で用意される。したがって、
このfixtures 定義からアクセス制御リストを抽出できるようにした。抽出したア
クセス制御リストとテストとの関係を表4.12に示す。テストケースは次の4つに 分類して表に示す。
T 成功テスト(Positive test) F 失敗テスト(Negative test) B TとFの両方
x 未分類
これらはテストコードのAssert文から判定する。この段階での、アセット(制御フ ローのController state、ACLのObjectに相当)のテストカバレッジは39.29%、 ロール(ACLのSubjectに相当)のテストカバレッジは90.91%であった。
Foremanで用いられているセキュリティに関係するコマンド(SINK)の一覧と、
そのテストカバレッジを表4.13に示す。列はそれぞれ、コマンド名、コマンドの タイプ、コマンド抽象化ライブラリ、コード中の利用箇所の数、カバレッジとの 対応、SCとRCでの集計、対応するテストケース、を示す。RCは9つ検出され た。SympleCovのカバレッジ集計はViewのテンプレートはサポートしないため、
View内のSINKはカバレッジが不明である。この段階でのSINKカバレッジはユ ニットテストのSCカバレッジが66.67%、機能テストのSCカバレッジ88.89%、 高リスクのRCカバレッジが 該当なし、中リスクのRCカバレッジが57.32%、低 リスクのRCカバレッジが5.85%となった。
4.4.3 カバレッジの確認とツールと実装の修正 (Phase 2)
未定義なコマンドをアプリケーションのコマンド抽象化ライブラリに登録する。
その際に、セキュリティコマンドについては定義(SC,RCの分類、セキュリティ 機能の分類)を行う。その結果、168のテストケースがセキュリティコマンドに関 するものとして検知された。
アセットのテストについて、実装コード、テストケース、ポリシー定義を再確認 した。その結果、4つのアセットが、ポリシー上の名前と、実装の名前に一致し ない(Aliasされている)事がわかった。このような、Alias機能に対応するよう にツールの機能を拡張することで、アセットのテストカバレッジは75.00%に向 上した。
18テスト実行時に用いるデータベースの初期値のセット
SINKについては、13のForemanが提供するセキュリティコマンド(SC)をコ マンド抽象化ライブラリに追加することで、SCのカバレッジが向上した。この段 階でSINKカバレッジは、ユニットテストのSCカバレッジが81.82%、機能テス トのSCカバレッジ95.45%と向上し、高リスクのRCカバレッジが 該当なし、中 リスクのRCカバレッジが 57.32%、低リスクのRCカバレッジが 5.85%と変化 した。RCについては、Viewのコードに存在する物が多く、これらについてはテ ストカバレッジが計測できない。CSRF対策については、テストコードは存在す るが、テストでCSRF特有のコマンドを使用しないため、検知できない。そこで、
テストケースの記述から対応を推測できるように、キーワードでの検査機能を追 加した。テストケース名にCSRFのCWEエントリである“CWE-352”を記載す ることで、そのテストケースがCSRFのテストであることを認識する。
4.4.4 テストケース追加によるカバレッジの向上 (Phase 3)
アクセス制御に関して、8つのテストケースを追加した。また、コード上では削 除されたが、テストケースのアクセス制御定義に残っていた不要なアセットを削 除した。その結果、アクセス制御に関するテストカバレッジは100%となった。
SINKに関しては、フレームワークのSCについて3つのユニットテストを追加 したが、カバレッジの変更はない。
表 4.12: Foremanのアクセス制御リストとテストカバレッジ (→:phase2,
⇒:phase3)
Asset Manager Default Anonymous Viewer View Create Edit Destroy CRUD View Edit
(class) cov user user host host host host host comp. res. part. table
architectures [x] [T] CRUD R [F] [B] R
authenticators [→x] CRUD R [→F] [→B] R
environments [x] CRUD R [x] [x] R
external_variables [→x] CRUD R [→x] [→x] R
domains [x] CRUD R [F] [B] R
globals [→x] CRUD R [→F] [→B] R
hostgroups [x] [B] CRUD [T] R [T] R
hosts [x] [B] CRUD [T] R [T] R [T] R [⇒B] C [B] U [B] D [B] CRUD
media [→x] CRUD R [→F] [→B] R
models [→x] CRUD R [→F] [→B] R
operatingsystems [→x] CRUD R [→F] [→B] R
ptables [x] CRUD R [F] [B] R [x] CRUD
puppetclasses [→x] CRUD R [→F] [→B] R
usergroups [→x] CRUD [→F] [→B] R
users [x] [B] CRUD [F] [B] R
settings [⇒x] [⇒x] A A A
dashboard [⇒x] [⇒T] A A A
statistics [→x] R R [→T] R
reports [x] RD R [T] R
facts [→x] R R [→T] R
audit_logs [→x] R [→T] R
locations [⇒x] [⇒T] CRUD R
organizations [⇒x] [⇒T] CRUD R
classes [⇒x] [⇒T] U
realms [x] CRUD R [F] [B] R
tasks [⇒x] [⇒B] R
compute_resources [x] [x] CRUD
→templates [x] [x] →CRUD
Coverage (phase 1)[%] 39.29 16.00 10.50 50.00 40.00 100.0 0.00 100.0 100.0 100.0 100.0 100.0 Coverage (phase 2)[%] 75.00 16.00 10.50 50.00 80.00 100.0 0.00 100.0 100.0 100.0 100.0 100.0 Coverage (phase 3)[%] 100.0 36.00 10.50 100.0 80.00 100.0 100.0 100.0 100.0 100.0 100.0 100.0
4.4.5 まとめ
以上、ForemanでのRailroadMapの使用環境を整える作業を4つのフェーズ に分割し、その作業の中で変化するメトリックスを記録した。このメトリックス の変化を図4.11に示す。セキュリティ機能に関するアクセス制御とSCのSINK については、Foremanのテストケースは高いテストカバレッジを持つことがわか る。また、表4.12や表4.13 のような形式でのカバレッジ情報の一覧表示は、セ キュリティの現状の把握と改善に有効である。一方、RCについては十分と言えな いが、これはRCがViewのテンプレートコードに多く存在する事が理由の一つで ある。
0 10 20 30 40 50 60
0 1 2 3
count
CALib unknown.
temp.
defined
0 100 200 300 400 500 600
0 1 2 3
Model (transitions) unknown.
temp.
defined
0 20 40 60 80 100
0 1 2 3
coverege [%]
Asset AAFunc.
0 20 40 60 80 100
0 1 2 3
Role ARFunc.
0 20 40 60 80 100
0 1 2 3
coverege [%]
Phase Sink/SC
SCUnit SCFunc
0 20 40 60 80 100
0 1 2 3
Phase Sink/RC
RCFuncmid RCFunclow
図 4.11: メトリックス駆動によるセキュリティ保証
表 4.13: Foreman の SINK コマンドとテストカバレッジ (→:phase2,
⇒:phase3)
Command type CALib num. of sink SimpleCov SC cov. RC cov. (score) Test case
SC RC CF DF all M C V S skip all U F I U F I (4-3) (2-1) all U F I
protect_from_forgery X - - - rails 2 0 2 0 0 0 6 2 2 2 1/1 1/1 1/1 0→2 0 0→2 0
escapeHTML X - - - ruby 4 0 4 0 0 0 234 0 221 13 1/1 1/1 1/1 0⇒1 0⇒1 0 0
html_escape X - - X rails 1 0 1 0 0 0 12 0 12 0 0/1 1/1 0/1 0⇒1 0⇒1 0 0
h X - - X rails 39 0 0 39 0 0 NA NA NA NA 0/1 0/1 0/1 0⇒1 0⇒1 0 0
before_filter X - - - rails 197 0 197 0 0 0 1886 232 1146 508 1/1 1/1 1/1 0 0 0 0
skip_before_filter X - - - rails 11 0 11 0 0 0 36 12 12 12 1/1 1/1 1/1 0 0 0 0
validates X - - - rails 165 165 0 0 0 0 22687 12249 9618 820 1/1 1/1 1/1 2 2 0 0
before_save X - - - rails 18 18 0 0 0 0 1887 1316 547 24 1/1 1/1 1/1 0 0 0 0
attr_accessible X - - - rails 21 21 0 0 0 0 63 21 21 21 1/1 1/1 1/1 0 0 0 0
find - X - - rails 66 4 62 0 0 0 1039 478 548 13 33/63 0/0 (115) 22 32 61
where - X - - rails 17 9 8 0 0 0 22046 10170 11667 209 23/26 0/0 (39) 24 5 0
send_file - X - - rails 1 0 1 0 0 0 EX EX EX EX 0/1 0/0 0 0 0 0
constantize - X - - rails 2 0 2 0 0 0 360 0 154 206 1/1 0/0 0 0 0 0
redirect_to - X X - rails 34 0 34 0 0 0 379 0 313 66 0/1 11/31 1 1 0 0
raw - X - X rails 21 0 0 21 0 0 NA NA NA NA 0/0 0/21 0 0 0 0
html_safe - X - X rails 8 0 0 8 0 0 NA NA NA NA 0/0 0/6 0 0 0 0
link_to - X X - rails 94 0 0 94 0 0 NA NA NA NA 0/0 0/94 0 0 0 0
content_tag - X - - rails 36 0 0 36 0 0 NA NA NA NA 0/0 0/36 0 0 0 0
→authenticate →X - - - app 12 9 2 0 1 0 1201 18 1134 49 0/1 1/1 1/1 →7 →7 0 0
→require_login →X - - - app 7 0 4 0 1 2 32 4 24 4 1/1 1/1 1/1 →4 0 →4 0
→authenticated? →X - - - app 2 0 2 0 0 0 98 0 14 84 1/1 1/1 1/1 →4 0 →4 0
→is_admin? →X - - - app 2 0 1 0 1 0 18 1 16 1 0/1 1/1 1/1 0 0 0 0
→require_admin →X - - - app 8 0 8 0 0 0 24 8 8 8 1/1 1/1 1/1 0 0 0 0
→authorize →X - - - app 12 0 8 0 0 4 27 9 9 9 1/1 1/1 1/1 →2 →2 0 0
→authorized →X - - - app 15 1 13 0 1 0 1547 37 1327 183 1/1 1/1 1/1 →6 →4 →2 0
→require_ssl →X - - - app 2 0 2 0 0 0 6 2 2 2 1/1 1/1 1/1 0 0 0 0
→encrypts →X - - - app 2 2 0 0 0 0 6 2 2 2 1/1 1/1 1/1 0 0 0 0
→encrypt_setters →X - - - app 2 2 0 0 0 0 6 2 2 2 1/1 1/1 1/1 0 0 0 0
→encrypt_field →X - - - app 1 1 0 0 0 0 3 1 1 1 1/1 1/1 1/1 →3 →3 0 0
→encrypts? →X - - - app 1 1 0 0 0 0 3 1 1 1 1/1 1/1 1/1 →1 →1 0 0
→parse →X - - - app 4 3 1 0 0 0 27 12 15 0 1/1 1/1 0/1 →7 →7 0 0
SC:security command, RC:Risky, CF:Control flow, DF: Data flow M:Model, C:Controller, V:View, S: support/helper/library, skip(disabled) U:Unit, F:Functional, I:Integration