360 likes | 427 Views
セキュアかつ高性能な ウェブサーバの設計と実装. 電気通信大学 情報工学科 原 大輔 中山 泰一. 概要. 共有型ホスティングサービス向けのウェブサーバシステムを提案 数百~数千サイト/サーバ 組み込みインタプリタは高速なのに、 mod_ruby, mod_perl サーバ内部のセキュリティのためにホスティングでは使えない!. ホスティングで組み込みインタプリタが使えるように!. 発表の流れ. 背景 設計 実装 評価 デモ 関連研究 まとめ. 背景. ウェブサイトを公開する人の増加 Weblog, Wiki, CMS
E N D
セキュアかつ高性能なウェブサーバの設計と実装セキュアかつ高性能なウェブサーバの設計と実装 電気通信大学 情報工学科 原 大輔 中山 泰一 第47回プロシン@箱根
概要 • 共有型ホスティングサービス向けのウェブサーバシステムを提案 • 数百~数千サイト/サーバ • 組み込みインタプリタは高速なのに、 • mod_ruby, mod_perl • サーバ内部のセキュリティのためにホスティングでは使えない! ホスティングで組み込みインタプリタが使えるように!
発表の流れ • 背景 • 設計 • 実装 • 評価 • デモ • 関連研究 • まとめ
背景 • ウェブサイトを公開する人の増加 • Weblog, Wiki, CMS • 共有型ホスティングサービスに人気集中 • 1台のサーバを数百~数千サイト規模で共有 風呂トイレ共同
背景 既存のウェブサーバの問題 • サーバ組み込みのモジュールとして提供されるプログラム(組み込みモジュール)をセキュアに利用できない • サーバプロセスが同一のユーザ権限(※)で動作することに起因 (※)ウェブサーバ専用ユーザ:www, apache, www-data などの名前が使われている
背景 既存のウェブサーバの問題(続き) • 組み込みインタプリタ (mod_ruby, mod_perl, …) • サーバプロセスにインタプリタを内包することにより、動的コンテンツを高速配信 • サーバを共有する別のユーザからファイルを盗視・改ざんされる危険性 ・・・サーバ内部のセキュリティ • “other”に許可が必要 (owner/group/other)
背景 サーバ内部のセキュリティ Aさんのサイト Bさんのサイト ID、パスワード 認証 認証コンテンツ Cさんのサイト Browser Server 認証を掛け、コンテンツの閲覧を制限できる ⇒ ウェブにも機密データが沢山!
背景 サーバ内部のセキュリティ(続き) Aさんのサイト Bさんのサイト • ファイルパーミッション • 公開ファイル: • rw-/---/r-- (604) • データファイル: • rw-/---/rw- (606) 認証コンテンツ Cさんのサイト しかし、 不正閲覧 Server サーバ内部からは認証なしにコンテンツを閲覧可能 (cp, rm)
背景 サーバ内部のセキュリティ(続き) ならば、POSIX ACLを用いて、 ウェブサーバ専用ユーザ (www) だけに許可を与える Aさんのサイト Bさんのサイト • ファイルパーミッション • 公開ファイル: • rw-/---/--- (600) • +www に読み取り許可 • データファイル: • rw-/---/--- (600) • +www に書き込み許可 認証コンテンツ Cさんのサイト 不正閲覧 Server CGI CGI も www の権限で動作
背景 サーバ内部のセキュリティ(続き) さらに、suEXEC を 用いて、CGI を各サイト 所有者の権限で実行 Aさんのサイト Bさんのサイト 認証コンテンツ Cさんのサイト 不正閲覧 Server PHP スクリプト 組み込みインタプリタも www の権限で動作
背景 Harache (文献[13][14]) • サーバプロセスをサイトごとに異なるユーザ権限で実行 root root ② ① userA ③ GET /~userA/ root ④ • A さんのサイトにリクエスト • userA にユーザ権限変更 • リクエスト処理 • レスポンスを返す Browser
背景 Harache (続き) • 組み込みモジュールをセキュアに利用できないという問題を解決 • 全てのコンテンツ(静的・CGI・組み込みスクリプト)のファイルパーミッションが所有者のみで OK • 組み込みインタプリタによる高速化を十分活用できていない • セッション毎にサーバプロセスを終了(= CGI) 一度ユーザ権限を変更したサーバプロセスが 別のサイトの処理を行なえない
目的 • セキュアかつ高性能なウェブサーバシステム、 の実現 • 共有型ホスティングサービスのような大規模環境を対象
設計 • セキュア:サーバ内の高セキュリティ → サーバプロセスをパーティション毎に異なる ユーザ権限で実行(=Harache) • 高性能:動的コンテンツの高速配信 → 組み込みインタプリタによる高速化に対応 ※パーティション・・・ウェブオブジェクトの分割単位 サイト、コンテンツ、QUERY_STRING など 異なるユーザ権限で動作するサーバプロセスを プールして再利用(≠Harache)
Wiki Wiki Wiki Weblog 設計 パーティション:サイト Website A Website B Website C サーバプロセスをサイト毎に 異なるユーザ権限で実行 Weblog サイト毎に計算資源使用量取得 ・利用制限が容易に可能 Weblog CMS CMS Web Server OS
設計 パーティション:コンテンツ Website A Website B Website C Wiki Wiki Wiki サーバプロセスをコンテンツ毎に 異なるユーザ権限で実行 Weblog Weblog Weblog CMS CMS Web Server OS
設計 アーキテクチャ • リバースプロキシ型ネットワーク • dispatcher × 1 • worker × 沢山 • パーティション(サイト、コンテンツなど)毎にウェブサーバ (worker) を割り当て、それぞれ異なるユーザ権限で実行 • サーバ内の高セキュリティを実現 • SELinux などのセキュア OS との親和性が高い • worker をリクエストに応じて動的に起動・終了 • 問題:パーティション数分の worker がメモリを圧迫 • 目標:高性能・パーティション数に対する高スケーラビリティ
設計 パーティション数に対する高スケーラビリティ • メモリ使用量が性能に大きな影響を及ぼす(文献[13]) • いかにスラッシングを防ぐかが重要! • なるべくスワッピングを起こさないようにして、性能低下を防ぐ
設計 Content Access Scheduler • ウェブサーバレベルでのスケジューラ • worker プロセスの生成と終了を司る • 目標 • 高性能&高スケーラビリティ • 方針 • スワッピングを低頻度に抑える • 手段 • スワッピングが発生したと判断すると、最近リクエストされていない worker を停止する
実装 • OS: Linux OS • dispatcher • リバースプロキシサーバ • Apache 2.0.55 + mod_hisap • worker • Apache 2.0.55×1000 • ウェブサーバならなんでもOK • hisapd • Content Access Scheduler • worker の動的起動・終了
UNIX Domain socket GET / HTTP/1.1 Host: www.C.net A C C A C A C 動作概略 HTTP worker Cを起動するよう要請 worker Cが アクティブか判断 Browser worker A へのリクエストがない hisapd dispatcher www root レスポンス www root 準備完了 リバース プロキシ worker A を 終了 worker C を起動 … B B リクエスト処理 B Server workers
実装 Content Access Scheduler のスケジューリング・アルゴリズム • worker killer 開始条件 • スワップイン&アウトが発生していること • メモリ使用量が99 % を越えていること • 終了する worker の選択条件 • 起動していること • Worker Request Log の最近10000 アクセスに記録されていないこと • 擬似 LRU
評価 • 基礎性能評価実験 • スケーラビリティ評価実験 • サーバ当たりのパーティション数に対するスケーラビリティ
評価 基礎性能評価実験 • 対象コンテンツ • phpinfo() を実行する PHP スクリプト • 比較対象 • 通常の Apache • suEXEC を有効にした Apache • ベンチマーク • httperf
ベースとして用いた Apache と比較して、平均28.0 %、最大56.5 %の性能低下(リバースプロキシ分) • suEXEC と比較して、平均10.2倍、最大14.3倍の性能
評価 スケーラビリティ評価実験 • 対象コンテンツ • phpinfo() を実行する PHP スクリプト • 比較対象 • 1 vs 1 • パーティション毎にウェブサーバを用意 • ベンチマーク • Apache benchmark
1 vs 1 はパーティション数600でメモリ不足に陥り、 OS がハングアップ • 本システムはパーティション数増加による性能低下が小さい ⇒ スケーラビリティが高い
1 vs 1 はパーティション数に比例してメモリ使用量増加し、スラッシングが発生 • 本システムは Content Access Scheduler が働き、スラッシングを防止
デモ • ユーザ権限確認 • 秘密の Wiki データ改ざん実験 • 比較対象:通常の Apache+mod_ruby
関連研究 • サンドボックス・VM • サーバソフトや OS を他と隔離して実行 • サンドボックス:jail • VM:Xen, VMware • サイト毎にサンドボックス/VM を割り当てればサーバ内の高セキュリティを達成 • サイト数に対するスケーラビリティが極めて低い
関連研究(続き) • PHP セーフモード • スクリプトにより操作できるファイルの制限 • 変更できる環境変数の制限 • 特定の関数・クラスの無効化 • サーバ内の高セキュリティを達成 • 他の組み込みインタプリタでは実現されておらず、標準的でない • 使いにくい
関連研究(続き) • Apache perchild MPM • サイト毎に異なるユーザ/グループ権限でウェブサーバを実行 • 仕様上はサーバ内部の高セキュリティを達成 • サーバ起動時に各サイト専用のサーバプロセスを固定数ずつ生成する必要があり、スケーラビリティが低い • 実験段階のまま開発終了
まとめ • 共有型ホスティングサービス向けのウェブサーバシステムを提案 • セキュアかつ高性能 • 現在、電通大情報工学科・情報工学実験においてセキュリティを評価中 • 今後、Content Access Scheduler を改良し、性能・スケーラビリティの向上を目指す予定 • http://www.hi-sap.net/
謝辞 • 本研究は、一部、独立行政法人情報処理推進機構(IPA) 「未踏ソフトウェア創造事業」の支援による • 貴重な御助言を下さった並木美太郎 PM に感謝致します
おしまい ご清聴、ありがとうございました