ホワイトリストとブラックリストの議論はFirewallの利用が一般的になる過程で十分に議論され、90年代に議論され尽くした、と思っていました。しかし、解説の余地はまだまだあるようです。ネットワークFirewallによるセキュリティ対策を簡単に振り返り、セキュアコーディングの現状を考察したいと思います。
追記:このエントリはネットワークFirewallのポートフィルタリングについて議論しています。ホワイトリストで対策すべきはアプリケーション自体です。ネットワークFiewallはホワイトリスト型セキュリティで対策しますが、WAFなどのアプリケーションFirewallはブラックリスト方式で対策するのが現実的です。ホワイトリストの基本中の基本は”デフォルトで全て拒否する”であることに注意してください。全て拒否した上で、許可するモノ、を指定しないとホワイトリストになりません。
繰り返しになりますが定義から
- ホワイトリスト=許可リスト
- ブラックリスト=拒否リスト
セキュリティ対策の原則の一つに、攻撃可能な範囲の最小化、があります。この原則に従うにはリソースへのアクセス許可を最小化(ホワイトリストで可能な限り限定)します。
参考: Attack Surface Analysis Cheat Sheet
ネットワークFirewallによるセキュリティ対策
ネットワークFirewallが一般的になり始めたころはインバウンドのパケットフィルタリングに「ブラックリストでも十分効果がある。フィルタリングより脆弱なアプリケーションをアップデートするのが本筋である」のような意見も散見されました。
まさか、今現在このような意見を持つセキュリティ専門家はいないと思います。90年代は専門家と言われるような人でもこのような意見を持つ方もいました。
現在ではFirewallでインバウンドパケットホワイトリストを作成し、限定したパケットのみを許可する構成にする事に異論がある方はいないと思います。
参考: ソフトウェアは「入り口ノーガード設計」のままで良いのか?
少し遅れてアウトバウンドパケットのフィルタリングも当たり前になりました。インバウンドパケットのフィルタリングだけでは十分なセキュリティは確保できないので、アウトバウンドパケットのフィルタリングも必要である、と考えられました。そして、アウトバウンドパケットもホワイトリストを作成し、限定したパケットのみ通過させる構成が当たり前になりました。(少なくとも組織レベルのネットワークでは)
現在では、プロキシやステートフルフィルタリング、クライアントレベルでのネットワーク利用の制御などを行い、アウトバウンドパケットに対してホワイトリストを作成して制限するのは当たり前になっています。WindowsにFirewall機能が無かった頃に、ZoneAlarm(WindowsクライアントOS用ファイアーウォールの先駆け。ホワイトリスト方式のファイアーウォールを簡単に利用できた)をWindowsに必須のアプリケーションとして利用していた方も少なくないと思います。
Firewallにはゲートウェイ型、クライアント型の2種類がありますが、その両方ともにインバウンドとアウトバウンドパケットにホワイトリストを作成し、パケットをフィルタリングする事が当たり前になっています。
言葉を変えると、ネットワークセキュリティ対策として、入力(インバウンドパケット)と出力(アウトバウンドパケット)両方にホワイトリストと適用し、安全性を向上させる事はセキュリティ専門家でなくても当たり前になっていると言えます。
同じコンセプトの適用が遅れるシステム開発
一方、システム開発におけるセキュリティ対策はどうでしょうか?
「入力バリデーション」の概念だけはやっと当たり前になったのようですが、入力バリデーションを入力処理でやっていなかったり、2000年から国際セキュリティ標準に記載されている厳格な妥当性検証には程遠い不十分だったります。2010年代後半になっても「入力バリデーションはセキュリティ対策ではない」と非論理的な主張も少なくありません。
参考: セキュアコーディング原則、 ISO 27000の入力データ妥当性確認
出力のセキュリティ対策にも不十分なシステムが多数存在します。コーディングレベルでは入力検査は可能な限りホワイトリスト方式で限定的に検査する事が当たり前になりつつありますが、出力のセキュリティレベルを向上させるためにホワイトリスト方式で限定的(安全に)に出力するスタイルはまだまだ一般的とは言えないようです。
参考:出力対策の三原則
セキュリティに真剣に取り組む姿勢がある企業は、出力に対するホワイトリスト方式の導入は数年前から本格的に取り組んでいます。しかし、一般的になったか?というと、残念ながらどうもそうではないと言えるようです。
参考:
- 標準と基本概念から学ぶ正しいセキュリティの基礎知識
- 開発者は必修、SANS TOP 25の怪物的なセキュリティ対策
- エンジニア必須の概念 – 契約による設計と信頼境界線
- ”形式的検証”と”組み合わせ爆発”から学ぶ入力バリデーション (科学的/論理的なセキュリティとはこういう物を言います)
追記:GoogleがCSP(Content Security Policy)を大規模に調査したところ95%のサイトがCSPの定義を正しく使わず、本来CSPでXSSが防止できていないとしています。ホワイトリストの作り方を理解していない開発者は世界的にも多いようです。。ホワイトリスト方式が難しいサービスを運営しているサイトもありますが、ほとんどのWebサイトは静的なホワイトリスト方式ポリシーを利用できるはです。