情報セキュリティ対策例の2回目として、今回は「システム開発におけるセキュリティ」と題して、Webサーバシステムに焦点をあて、その構築や、Webアプリケーションに関するプログラミングの脆弱性の問題、ならびにその運用上の注意点に付いて述べていく。
Webはメールと共にいまやネット社会の根幹を担っている。そして、最近のWebは「静的コンテンツ」だけでなく、ユーザ(クライアント)と双方向の情報交換を行う「動的コンテンツ」が大きな要素を占めつつある。こうしたことから、Webサービスの可能性が大きく拡がり、「何でもWebで実現」と云った風潮さえ見受けられる。しかし、セキュリティを考慮したWebアプリケーション開発手法は、未だ完全に確立しているとは云い難い。そのため、各開発者がその都度試行錯誤を繰り返しながら作成しているというのが実情ではないだろうか。そうして、こうしたことから、Webシステムに関する様々な情報セキュリティの問題が発生する。
ひとくちにWebサービスの脆弱性問題といっても、その範疇は極めて多岐に渡る。なので、対策にも「抜け」が無いように全てを網羅しなければならない。
Webサーバの脆弱性問題に対して実施すべき項目の一例を、以下の表にまとめてみた。
Webサーバ構築及び基本設定時に実施すべき項目
対策 |
概要 |
OS自体のセキュア化、サーバの要塞化 |
パッチの適用は勿論、OS自体にパケットフィルタリング機能を設定し、制御する。 |
不要な機能やサービス等をインストールや起動しない |
他のサーバ機能や使用しないコンポーネント等はインストールしない。また、不要なサービスは内部向けも起動しない。 |
バナーはできるだけ隠す |
詳細な情報は与えない(これは一部のワーム除けにもなる)。 |
ディレクトリ一覧機能は外す |
ディレクトリ一覧機能によるファイルの漏洩を防止する。 |
マニュアルは削除 |
ネット越しのマニュアル閲覧は不要。 |
デフォルトのアカウント、パスワードは削除 |
製品のデフォルトアカウント、テスト用のユーザは削除する。 |
ディレクトリのパーミッションに配慮 |
公開ディレクトリ、スクリプトファイルのディレクトリは必要最低限のパーミッション設定にする。 |
公開ディレクトリには、必要最低限のファイルのみを置く |
公開する必要のないファイルは置かない。 |
|
 |
 |
コンテンツ、作り込みCGI、ASP等作成時に実施すべき項目
対策 |
概要 |
ソースにコメントを記述しない |
攻撃者に余計なヒントは与えない。 |
詳細なエラー表示を出力しない |
攻撃者に余計なヒントは与えない。 |
クライアント側のスクリプトは回避される事に配慮 |
JavaScriptでの制限等は簡単に回避される為、サーバ側での再チェックは必須。 |
クライアントから送られた全ての項目を毎回チェック |
クライアントから送信されたデータは、「全項目」について、「毎回」チェックする。 |
XSS(クロスサイトスクリプティング)に配慮 |
ユーザの入力を出力する時は、必ずサニタイジング(タグ等の無効化)を行う。 |
コマンド挿入に配慮 |
ユーザ入力のチェックは勿論の事、危険な関数は使用しない。 |
SQLインジェクションに配慮 |
DB上でのチェックだけでなく、DBに渡す前にもチェックする。 |
バッファオーバフローに配慮 |
C/C++等でプログラムを作成する際にはバッファの境界は常にチェックする。 |
フォーマットストリングスに配慮 |
ユーザからの入力事項をprintf()等で展開する場合は、チェックしてから実行する。 |
セッション管理を実施 |
権限のない第三者によるページの閲覧、データの登録を防ぐ。 |
セッション、ユーザ情報ID等は乱数を使用 |
連番で割り振る等の、容易に推測可能なIDは使用しない。 |
Cookieは盗まれることを配慮 |
XSSやブラウザの脆弱性により、Cookieは漏洩する為、重要な情報は埋め込まない。 |
認証要求が必要な部分は全て実施 |
トップページだけでなく、全てのページで認証を要求する。 |
https化が必要なページは全て実施 |
フレーム等で暗号化ページと非暗号化ページを混在させない。 |
安易なパスワードを作成させない |
ユーザにパスワードを作成させる際には、文字数、文字種を制限し、複雑化させる。 |
稚拙な暗号は使ってはならない |
自前の「稚拙な」暗号等は、決して使ってならない。 |
自己証明書を発行しない |
成り済まし攻撃に対して無防備であり、「証明書」を発行する意味が無い。 |
自前のルート証明書を作成しない |
ブラウザに登録されている以外のルート証明書サーバを勝手に構築しない。 |
ブラウザのセキュリティレベルを下げさせない |
「スクリプトを実行しても安全だとマークされていないActive Xコントロールの初期化とスクリプトの実行」等を有効にさせる様な事はしない。 |
|
 |
 |
運用時に実施すべき項目
対策 |
概要 |
パッチは速やかに適用する |
セキュリティホールは日々発見・公表されているので、常に正確な情報に対応する。 |
ログは記録する |
成功もエラーも全て記録すること。但し、ディスク容量にも注意する。 |
リモート管理はできる限り行わない |
インターネット等からサーバを管理するのはリスク大。VPN、暗号化、鍵認証、接続元制限等は必須で実施する。 |
ルータ、F/W、DNSのセキュリティにも配慮 |
WebサービスはWebサーバ以外のネットワークセキュリティが確保されている上で行う。 |
緊急時のバックアップやリストア等も用意する |
公開サーバと同期を確保しているバックアップサーバ等も用意しておく。 |
インシデント対応手順を作成する |
万一のサービス停止やトラブル発生時の手順書を作成し、教育・訓練しておく。 |
セキュリティ監査の実施 |
適宜監査を実施し、セキュリティ状況の確認・改善を図る。 |
|
 |
 |
今回のまとめ
Webサービスは今後ますますその機能を充実させ、ネット社会にとって不可欠なものとなっていくであろう。従って、何か問題が生じた場合には、それを運営する組織は責任を問われ、信用を失うことにもなりかねない。つまり、セキュリティ上の欠陥からの不正侵入や情報の漏洩、データの破壊等が起これば、それが組織にとって致命的な打撃となり得るのである。
こうした事態を避けるためにも、システム開発におけるセキュリティ上の脅威及びリスクを全て洗い出し、把握する事が極めて重要となる。今回はWebサービスに絞って、各フェーズで実施すべき事項をまとめたが、これらを確実に実施していくには、人的な体制も必要である。また、専門的な知識を持つ第三者機関によるセキュリティ監査を実施することで、適切な「助言」が得られ、同時にセキュリティレベルを把握し、問題点を改善することもできる。
さまざまなシステムにおいて、セキュリティ対策は欠く事のできない事項になっており、各々で確実なセキュリティ対策を実施していただきたい。
参考ページ:
The Open Web Application Security Project
IPA ISEC セキュア・プログラミング講座
筆者略歴
太田 稔(オオタ ミノル)
株式会社 富士総合研究所
システム技術本部 生産技術部
ネットワークへの侵入技術の研究に携わり、ネットワークセキュリティ監査、教育、コンサル等、セキュリティ関連の仕事に従事。外部の情報セキュリティ講座の講師も務める。