|
.NETエンタープライズWebアプリケーション 開発技術大全 ― エンタープライズWebアプリ開発に必要な知識と設計セオリー ― |
|
|
.NETエンタープライズWebアプリケーション 開発技術大全 Vol.4 セキュアアプリケーション設計編 本記事は、日経BPソフトプレス/マイクロソフトプレスが発行している書籍『.NETエンタープライズWebアプリケーション開発技術大全 Vol.4 セキュアアプリケーション設計編』より、同社の許可を得てその内容を転載したものです。 同書はマイクロソフトのコンサルタントが執筆した.NETシステム設計/構築のための技術解説書で、全5巻で構成されています。本シリーズでは、.NETで大規模Webアプリケーションを構築する際に必要となるセオリーやパターンが網羅されています。単なる技術解説にとどまらず、設計/実装の具体的な指針が示されているところが本書の特長です。 第4巻の内容は2つのパートから構成されており、第1部ではWebアプリケーションにおけるセキュリティ機構の設計/実装手法、第2部では大規模開発における開発環境の構築について解説しています。 本記事の内容は、第1部の「第1章 Webアプリケーションのセキュリティデザイン基礎」からの転載です。セキュアなWebシステムを実現するには、考慮すべきポイントが多岐に渡ります。システムの規模が大きくなると、それはさらに複雑さを増します。本章では、セキュリティについて検討すべき項目を明確にします。ご覧いただくと分かるように、豊富な図を用いた解説も本シリーズの特長です。 なお、書籍の詳細については本記事の最後に表記しています。 |
ご注意:本記事は、前挙の書籍の内容を改訂することなく、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。 |
現在、インターネットシステムはもちろん、イントラネットシステムにおいても、各種の脅威に対するセキュリティ対策は欠かせないものになっている。本シリーズが取り扱っているような「Webシステム」は日々ワームやクラッカーの脅威にさらされ続けており、正しい理解と体系的なセキュリティ対策の実施を欠かすことはできない。
本シリーズでは、すでに第1巻「.NET Framework導入編」で概論を、第2巻「ASP.NET基礎編」でコーディングセキュリティを取り扱ってきている。本書では、引き続きユーザアプリケーション内部における主なセキュリティ制御となる、「正しい人のみが、許可された操作のみを行うことができる」ようにするための設計方法とその実装方法について解説を行う。
この分野は奥が深く、量もかさむものであるため、本書ではまず真っ先に覚えて頂きたい、「大多数のWebアプリケーションで利用できる」ような典型的な設計パターンに絞った解説を行う。ASP.NETベースのほとんどのWebアプリケーションは本書の解説のみで事足りると思われるが、さらに踏み込んだ学習をしたい場合には、patterns & practicesの以下の2つのガイドラインを参照して頂きたい。
・セキュリティ保護されたASP.NETアプリケーションの構築 | |||
・ http://www.microsoft.com/japan/msdn/net/security/secnetlpMSDN.asp(原文は" Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication, http://msdn.microsoft.com/library/en-us/dnnetsec/html/secnetlpMSDN.asp) | |||
・Improving Web Application Security: Threats and Countermeasures | |||
・http://msdn.microsoft.com/library/en-us/dnnetsec/html/ThreatCounter.asp |
Webアプリケーションのセキュリティデザイン基礎
本書第1部では、アプリケーションアーキテクトが検討すべきWebアプリケーションのセキュリティデザインの方法に関する解説を行う。しかしこれを理解するためには、まず基礎概念として以下のような事項を知っておく必要がある。
-
Webシステムのセキュリティの全体像において、本書が取り扱う部分はどこなのか?
-
「認証」と「許可制御」の違いは何か?
-
ロール、およびロールベースセキュリティとは何か?
-
Webアプリケーションのセキュリティデザイン上、最も重要なポイントはどこか?
-
リソースアクセスストラテジとは何か?
本書で取り扱う「セキュアWebアプリケーションデザイン」は、第2巻で取り扱った「セキュアコーディング」とは異なり、単発で何らかの作業方法を覚えればそれで終わりという類のものではない。このため本章では、まずその基礎概念について解説を行う。
1.1 Webシステムのセキュリティの基本概念
最初に、第1巻や第2巻で解説したセキュリティの基本概念を軽く復習しつつ、本書の解説範囲を再度明確化する。
1.1.1 Webシステムのセキュリティの考え方(復習)
セキュアシステム構築のための実際の作業は、ベースラインセキュリティの確保と、個別脆弱性への対策、の2つに大別される。本シリーズ第1巻「.NET Framework導入編」では、これらの作業をシステム開発のライフサイクルにうまく取り入れることが重要であることを解説した。
このうち、ベースセキュリティの確保に関しては、各種のベストプラクティスを参照しながら実施することが重要であり、マイクロソフト製品を利用する場合には、patterns & practicesと呼ばれる各種のガイドライン類を利用するとよいことも解説した。図1-1と表1-1にその全体像を示す。
図1-1 セキュアWebシステム構築のための取り組みの例 |
分類
|
検討要素
|
|
運用 | 固有 | 設備管理、ユーザ管理、etc... |
一般 | パフォーマンス監視、アクセスログ解析、etc... | |
アプリケーション | コーディング | CSS、SQL 挿入、Canonicalization、バッファオーバフロー、etc... |
デザイン | 認証、許可制御、安全な通信、監査、ロール設計、CAS 設計、ストレージ設計、データ保管設計、etc... | |
インフラ | ランタイム設定 | web.config/machine.config 設定、ACL 設定、IIS ロックダウン設定、GPO、仮想ディレクトリ管理、証明書管理、サービス設定、etc... |
NW/ モジュール設計 | セキュリティパッチ運用(SUS/SMS)、FW、リバースプロキシ構成、IMS、etc... | |
表1-1 セキュアWebシステム構築における具体的な検討項目(一部) |
運用やシステムインフラに関してもセキュリティを考慮した設計が欠かせないことは言うまでもないが、本シリーズでは、この中のアプリケーション設計・実装にフォーカスを当てた解説を行っている※1。
※1 なおセキュリティアップデートの取り扱い方に関しては、基本的にはシステムインフラ検討の中で考える必要があるが、本シリーズ第2巻「ASP.NET基礎編」の「第3部 セキュアプログラミング」の中でも簡単に解説しているので、参考にして頂きたい。 |
1.1.2 アプリケーションセキュリティ設計・実装に関する役割分担の方法
さて、一言で「アプリケーション設計・実装に関するセキュリティ」といってもその中身は広いが、実際にアプリケーション設計・実装に関わるメンバは大きく3つに分けられる※2(図1-2)。
- ドメインエキスパート(業務SE)
- アプリケーションアーキテクト
- デベロッパー(プログラマ)
※2 ここでの分類は比較的粗いものであり、大規模な開発現場では、より細かな役割分担が行われていることが多いだろう。また、言葉の定義・意味も場合によって変化するが、ここでは「業務設計」→「設計思想としてのアーキテクチャの検討」→「個々のプログラミングによる実装」という一連の作業をそれぞれ担っているメンバのことを指していると考えて頂きたい。 |
図1-2 アプリケーション設計・実装の流れ |
各メンバは、ユーザアプリケーションのセキュリティに関して、主に以下のような内容を検討することになる。
A. ドメインエキスパート
ドメインエキスパートは、業務セキュリティ上、業務として「誰」に「どんなこと」を行わせてよいのかを検討する必要がある。
例えば、経費精算を行うシステムでは、経費精算の申請処理はユーザ全員が実施できるかもしれないが、各申請の承認処理はマネージャのみが行える、といった制約があるはずである(図1-3)。
図1-3 業務的なセキュリティ制御 |
ドメインエキスパートは、基本的にウィルスやワームといった、ネットワークインフラやOS、ミドルウェアの脆弱性を狙った攻撃に対する対策、すなわちセキュリティアップデートの適用方法やアンチウィルスソフトの導入などは考えない。業務分析の一環として、業務の観点から、「誰」が「どんなこと」を行ってよいのかを定めるのがドメインエキスパートの役割である。
B. アプリケーションアーキテクト
これに対して、ドメインエキスパートによる検討結果をいかに「効率よく」「上手に」制御するのかを考えるのが、アプリケーションアーキテクトの役割である。
詳細は後述するが、アプリケーションアーキテクトがWebアプリケーションのセキュア化に関して考えるべき主なポイントは以下の4つである。
・ ユーザの認証方法 | |
・ ユーザのパスワードをどのように確認するのか? | |
・ アプリケーション内部における許可制御方法 | |
・ ユーザがある作業を「行ってよいのか否か」をどのように確認するのか? | |
・ 通信チャネルの暗号化方法 | |
・ いかにしてネットワーク上のリスク(盗聴・改ざん・なりすまし)を防ぐのか? | |
・ リソースアクセスストラテジの決定 | |
・ どのようにして他のリソース(データベースやファイル)にアクセスするのか? |
上記のポイントの中には、セキュリティアップデートの管理やアンチウィルスソフトの導入といった要素が含まれていないことに注意して頂きたい。セキュリティアップデートやアンチウィルスソフトについて検討するのは、もっぱらインフラアーキテクトの役割である。これに対して、主にユーザアプリケーションの内部において業務的なセキュリティ制御を的確かつ効率的に実施する手段を検討するのが、アプリケーションアーキテクトの役割である。
C. デベロッパー
デベロッパーは、アプリケーションアーキテクトが定めた全体のアプリケーションセキュリティデザインに則って、個々の業務を作り込んでいく。もちろんこの作業では、細部のコーディングのミスによって脆弱性が発生しないように注意する必要がある。具体的には、以下の2つに注意をして実装作業を行う。
-
アプリケーションアーキテクトが定めた、業務的なセキュリティ制御方法に則った実装を行う
-
セキュアプログラミングを実践し※3、コーディングミスによって発生する既知の脆弱性を導入しないようにする
※3 典型的なものとしては、SQL挿入やクロスサイトスクリプティングを防止するためのデータチェックあるいはデータの無害化などが挙げられる。詳細は本シリーズ第2巻「ASP.NET基礎編」の「第3部 セキュアプログラミング」を参照のこと。 |
1.1.3 本書のスコープとゴール
以上の話をまとめると、図1-1におけるアプリケーション設計・実装の項目は、さらに図1-4のように細分化できることが分かる。
図1-4 アプリケーション設計・実装作業における役割分担の方法 |
このうち、ドメインエキスパートの行う作業(ロール設計)は、対象業務との結びつきが強い。このため、本書ではその一般的な注意点を解説するに留める。また、セキュアプログラミングに関しては本シリーズ第2巻「ASP.NET基礎編」の「第3部 セキュアプログラミング」にて詳細な解説を行っているので、そちらを参照して頂きたい。本書では、アプリケーションアーキテクトが行うべき、効率的なロール制御方法の検討、すなわち業務的なセキュリティの効率的な実施方法について解説を行う。
さてその具体的な手順を解説する前に、業務セキュリティ制御における重要な基礎概念について、以下の順で解説する。
- 認証(Authentication)と許可制御(Authorization)
- ロール
- リソースアクセスストラテジ
INDEX | ||
.NETエンタープライズWebアプリケーション 開発技術大全 | ||
Webアプリケーションのセキュリティデザイン基礎 | ||
1.Webアプリケーションのセキュリティデザイン基礎 | ||
2.認証(Authentication)と許可制御(Authorization) | ||
3.ロールベースセキュリティ(RBS)/リソースアクセスストラテジ | ||
4.Webサーバにおけるセキュリティデザインの構成要素 | ||
「.NETエンタープライズWebアプリケーション開発技術大全」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|