セキュアなソフトウェアの開発:OWASP Top 10 Proactive Controlsの実践方法
2020年11月5日
0 分で読めます昨年開催したDevSecConコミュニティの素晴らしいオープニングセッションを、最近ふと思い返しました。登壇者は、ほかでもないJim Manicoでした。
このセッションでJimは、OWASP Top 10 Proactive Controlsの一覧と、Webアプリケーションに取り入れる方法を解説しました。Manico自身がKaty Anton、Jim Birdとともに執筆したこのProactive Controlsのドキュメントは、Webセキュリティを学び始めたい開発者に向けて、セキュリティの概要や、さまざまなセキュリティリスクの層、それらから保護する方法を紹介しています。
興味をお持ちの方は、OWASP Top 10 Proactive Controlsを1つずつ見ていきましょう。
OWASP Top 10 Proactive Controls 2020
セキュリティ要件を定義する
セキュリティフレームワークとライブラリを活用する
データベースへのアクセスを保護する
データをエンコードしてエスケープする
すべての入力を検証する
デジタルアイデンティティを実装する
アクセス制御を徹底する
あらゆる場所でデータを保護する
セキュリティのログ記録と監視を実装する
すべてのエラーと例外を処理する
OWASP Proactive Control 1 — セキュリティ要件を定義する
セキュアな製品を構築するには、まず考慮すべきセキュリティ要件を定義します。ビジネス要件が製品の形を決めるのと同じように、セキュリティ要件を定義すれば、最初の段階からセキュリティを考慮できます。
OWASPの主要プロジェクトであるApplication Security Verification Standard(略称OWASP ASVS)には、セキュアなWebアプリケーションソフトウェアの構築に関する200を超える要件が定められています。
認証プロトコル、セッション管理、暗号化のセキュリティ基準などの要件が記載されています。特に重要なのは、開発の初期段階からセキュリティ要件を段階的に実装できるアプローチがASVSで示されている点です。

出典:GitHub
OWASP Proactive Control 2 — セキュリティフレームワークとライブラリを活用する
セキュアなソフトウェアの構築に役立つツールには、どのようなものがあるでしょうか?
インジェクション攻撃への対策から、認証、安全な暗号化API、機密データの保存まで、必要な対策は多岐にわたります。こうした課題に対処するには、セキュリティ向けに設計されたライブラリを使用しましょう。
オープンソースライブラリの使用状況を追跡し、バージョン、ライセンス、OWASPのTop 10脆弱性などの脆弱性を一覧で管理しましょう。OWASP Dependency-CheckやSnykなどのツールが役立ちます。
OWASP Proactive Control 3 — データベースへのアクセスを保護する
状態管理とデータの永続化が必要になるにつれ、データベースは高機能なWebアプリケーションを構築するうえで重要な要素となることがよくあります。
データベースのセキュリティには、次のような幅広い領域が含まれます。
パラメータバインディングなどの手法を使い、SQLインジェクションから保護すること。また、最近発生したSequelize ORMのnpmライブラリにSQLインジェクションの脆弱性が見つかった事例のように、使用しているORMやSQLライブラリの脆弱性を監視することも非常に重要です。
データベースの認証と全体的な設定を、安全かつ強固にすること。
データベースとクライアント間の通信を保護すること。
SQLインジェクション攻撃や、そのセキュリティリスクについて詳しく知りたい方は、Jimがbobby-tables.comで紹介しているヒントをご覧ください。
OWASP Proactive Control 4 — データをエンコードしてエスケープする
データの出所を常に把握できるとは限らないため、データは常に信頼できないものとして扱いましょう。
クロスサイトスクリプティング(XSS)の脆弱性は、データがシステム内を通過し、JavaScriptなどの悪意あるコードがブラウザー上で実行されてブラウザーを侵害する例として分かりやすいものです。
エスケープが必要な例としては、OS(オペレーティングシステム)のコマンドインジェクションもあります。ユーザー入力に由来するシステムコマンドをコンポーネントが実行することで、悪意あるコマンドが実行されるリスクが生じます。
データベースから取得したデータもエスケープすべきでしょうか?セキュアな開発者なら、必ずエスケープします。データベース内の文字列が汚染されているかどうかを追跡してタグ付けするのは現実的ではありません。その代わりに、ブラウザーなどのプレゼンテーション層で適切な制御を行い、渡されるデータをすべてエスケープします。
例外的に注意が必要なのは、データベースの入力からWebページのDOM要素を1つ以上構築する場合です。これは危険を伴うため、設計やリスクを軽減するための制御について慎重に検討する必要があります。
データのサニタイズに役立つライブラリをいくつか紹介します。
JavaScript向けのDOMPurify
なお、OWASP ESAPIプロジェクトは積極的なメンテナンスが行われていないため、ほかのソリューションを検討することをおすすめします。
最後に、コマンドインジェクションの仕組み、リスク、予防方法についての記事も執筆しました。ぜひあわせてご覧ください。
OWASP Proactive Control 5 — すべての入力を検証する
TypeScriptなどの型システムを活用して、コード内で受け渡される変数が期待どおりの有効な値であることを確認するのと同様に、受け取った入力が想定やデータモデルに合致するかどうかも検証しましょう。
基本的なガイドライン:
検証はデータのエスケープの代わりにはなりません。両者は置き換え可能なセキュリティ対策ではないため、検証だけに頼らないでください。
入力データを検証する際は、すべての種類の入力にサイズ制限を設けるよう努めましょう。
OWASP Proactive Control 6 — デジタルアイデンティティを実装する
ユーザーの身元をどのように確認するのでしょうか?認証、本人確認、セッション管理などのセキュリティ制御を使って確認します。
こうした仕組みは、ユーザー登録やパスワード、認証手段を自社で管理する方法もあります。一方、Auth0のようなサービスを利用し、クラウドのサーバーレスアーキテクチャのメリットを活用する方法もあります。
幅広いテーマですが、デジタルアイデンティティのレイヤーが安全に処理されているか確認する必要がある場合は、デジタルアイデンティティのガイドラインであるNIST 800-63-3Bを参照してください。NISTのドキュメントは、パスワードセキュリティへの対処方法を定める際に役立ちます。
OWASP Proactive Control 7 — アクセス制御を徹底する
アクセス制御の要件は、アプリケーションのさまざまなレイヤーに関わる可能性があります。たとえば、マルチテナント型SaaSアプリケーションでデータベースからデータを取得する場合、異なるユーザーにデータが誤って公開されないようにする必要があります。また、Webアプリケーションが提供するAPIを誰が呼び出せるのかという点も考慮が必要です。
Jimのアドバイスの1つは、コード内でロールに基づいてデータアクセスを制御しないことです。これはアクセス制御ポリシーをコードに直接書き込むことにつながります。たとえば、if (user.role === 'admin')のようなチェックです。その代わりに、権限に基づくアクセス制御のようなケイパビリティベースのアプローチを使えば、実際のポリシーをコードに固定せずに済みます。例として、if (user.canDelete(blogPostId)のように記述できます。
OWASP Proactive Control 8 — あらゆる場所でデータを保護する
Snykアプリでは、ユーザーのデータと自社のデータを扱うため、セキュリティとプライバシーに最大限配慮し、必要なあらゆる場所でアプリケーションを保護することが不可欠です。
データを扱う際は、次の対応を検討してください。
適切に設定されたHTTPSを使用して通信中のデータを保護し、TLS 1.3などの最新のセキュリティプロトコルと強力な暗号スイートを採用しましょう。
HTTP Strict Transport Security(HSTS)など、ブラウザーのセキュリティ機能を活用する安全なHTTPヘッダーを使用しましょう。また、データを信頼できるものとして扱うために、Content Security Policy(CSP)を設定しましょう。
暗号処理を行う際は、広く知られたライブラリを必ず使用し、独自の実装は避けましょう。
OWASP Proactive Control 9 — セキュリティのログ記録と監視を実装する
アプリケーション開発者は、ビジネスフローの不具合や例外の原因をデバッグ・追跡するためにログを記録することに慣れています。これに加えて、侵害やその他のセキュリティ問題を後から追跡できる監査証跡を作成するために、セキュリティに重点を置いたログも記録しておきましょう。
セキュリティログについて、いくつか提案します。
入力検証に失敗したすべての記録
認証イベント全般(正しいパスワードと誤ったパスワード、ログイン、セッション関連データなど)
権限昇格の試みなど、アクセス制御に失敗したすべての記録
OWASP Proactive Control 10 — すべてのエラーと例外を処理する
Webアプリケーションのエラーや例外を適切に処理することは、アプリケーションの健全性を保つだけでなく、機密データの漏えいを防ぐことにもつながります。
次のガイドラインに従いましょう。
例外は一元的に管理する。
未処理の動作を確実に検出し、全体で標準化された方法を使って適切に処理する。
収集するデータに、スタックトレースや暗号関連のエラーコードなどの機密情報が含まれないようにする。
DevSecConコミュニティに参加する
DevSecConコミュニティに参加して、ウェビナーやオンラインのSnyk User Communityを通じて、セキュリティについて学び、セキュアなコードを書く方法を身につけましょう。
CTFを始めよう
オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。


