第1回 松本勉強会 2012 05 11 - 公開版
DESCRIPTION
自分のこれまでの研究成果とmod_process_securityについての復習。TRANSCRIPT
Webサービスの高度化に耐えうる 基盤設計に関する研究(前半)
第1回 松本勉強会 5月11日
京都大学 情報学研究科
松本 亮介 @matsumotory
今日の発表
1. これまでの研究成果
– 2011年12月(FSとして発表)
– 2012年03月(京大として発表)
2. 3月の発表内容を説明
– mod_process_security
適宜、質問・指摘・アドバイス下さい!
1. これまでの研究成果
研究の背景
• Webサービスを介したシステムが普及 –ホスティングサービス(レンタルサーバ)
• 低価格化
• 高機能
– Webサービスの高度化(Twitter、Facebook等) • Webアプリケーションで情報の共有
• HTTPを介したプログラムの実行(Web API)
– インシデントも増加 • Webサーバの高負荷
• アプリケーションの脆弱性からWebサーバの権限奪取
Webサービスの高度化に耐えうる基盤が必要
研究概要
• Webサーバと関連するOSのアーキテクチャを研究
– セキュリティ • Webアプリケーションの脆弱性の被害を最小限にする
– Webサーバ上の任意アクセス制御
– 大規模(高集積) • 物理サーバにどれだけユーザ領域を積み込めるか
– プロセス数やfork()に注目
– パフォーマンス • アクセス集中時もパフォーマンス劣化を少なくする
– ソケットI/OやファイルI/Oに注目(C10k問題)
– 運用性 • 大規模Webサーバを効率良く運用する手法
– リソース割当のチューニング
• Webサーバに簡単に機能追加する手法 – mod_luaやmod_mruby
今日の発表
次回の発表
Goodにしたい
これまでの研究成果(去年の12月)
ストレージ ロードバランサ
クライアント
Webサーバ群
顧客領域追加でサービス即時反映
顧客領域 の追加
細やかな高負荷原因の調査と柔軟なリソース制限手法
1サーバで2,000仮想ホスト (単一のサーバプロセス方式)
1. 高集積 他の顧客領域やシステム領域を覗き見できないアクセス制御手法
2. セキュア
Ⅱ. リソース不足時 Ⅲ. 新規契約時 Ⅰ. 高負荷時
3. 高い運用性
大規模共有型Webバーチャルホスティング基盤の設計[1]
7
[1] 松本亮介, 川原将司, 松岡輝夫, 汎用性の高い大規模共有型Webバーチャルホスティング基盤のセキュリティと運用技術の改善, インターネットと運用技術シンポジウム2011論文集, 2011,31-38 (2011-11-24). ※1 特許出願中.
サーバ追加で 即時リソース増強 効率良く負荷分散
これまでの研究成果(今年の3月)
• セキュリティとパフォーマンス向上 – 12月のシステムはパフォーマンスを重視していない – 高速かつ安全にWebサービスのプログラムを処理する設計
• 前提は高集積
• スレッド単位で権限分離を行うアーキテクチャを提案※1 ─ Webサーバ上の動的コンテンツを高速に処理可能
─ スレッドを利用することで性能劣化を少なくかつセキュアに動作
─ これまではプロセス単位で権限を分離
─ 複数あるアクセス制御手法を統一的に扱うアーキテクチャ
川原さんに謝辞しています
※1 • IEEE/IPSJ International Symposium on Applications and the Internet SAINT2012 で発表予定 • IA/IOT/SITE/ISMS合同研究会で発表済み 8
2. 3月の発表内容
Webサーバ上の動的コンテンツの扱い
CGI実行方式は性能が低い – 高速に動作するDSO実行方式を使いたい
– DSO実行方式とは?
Server Process
CGI Process
Program
Server Process
Program
CGI実行方式 DSO実行方式
インタプリタを組み込んでおく
ボトルネック
マルチテナント環境でもDSO実行方式を使って高速に処理したい
動的コンテンツに関する問題
従来のアクセス制御手法は不完全 – 従来のDSO実行方式のためのアクセス制御の問題
• プロセスの中で疑似的に権限を分離するアーキテクチャ
• 不完全な仕様(性能劣化が大きい・セキュリティが弱い等)
– CGI実行方式のためのアクセス制御の特徴 • プロセス単位で権限を分離するアーキテクチャ
• アクセス制御とは関係なくCGI実行方式そのものの性能が低い
– 実行方式毎にアクセス制御が存在していて煩雑 • 設定も複雑で開発者の敷居が高い
マルチテナント環境で動的コンテンツを扱うには・・・ – CGI実行方式を使わざるを得ない
– DSOを使うためには個別にデーモンやOSを起動して分離 ⇒ オーバースペックでリソース効率が悪い
execve()
子サーバプロセス (owner : apache)
CGI用 プロセス (owner : root)
index.php (owner: user1)
fork() execve() suexec-program
CGI用 プロセス (owner : user1)
setuid(), setgid()
terminate process
親サーバプロセス (owner : root)
ボトルネック
CGI実行方式 suEXECアーキテクチャ
execve()
親サーバプロセス (owner : root)
子サーバプロセス (owner : apache)
Set capability
index.php (owner: user1)
Set cap(Linux capability)
子サーバプロセス (owner : user1) Set capability
setuid(), setgid()
setuid(), setgid() terminate process
×
DSO実行方式 mod_ruid2アーキテクチャ
ボトルネック
Unset cap
Index.php経由で権限変更が可能 ×
提案するアクセス制御アーキテクチャ - mod_process_security -
• スレッドを利用してボトルネックを低減
–制御用スレッド単位で権限分離するアーキテクチャ
• 動的コンテンツのリクエスト時にスレッド生成
• プロセスの生成・破棄は不要
• スレッドの生成・破棄により処理効率が上昇
–実行方式で区別しない統一的アーキテクチャ
• CGIやDSOに個別のソフトウェアを組み込む必要無し
– Apacheモジュールで簡単に組み込み・設定可能
• 開発者が扱いやすい仕様
execve()
子サーバプロセス (owner : apache)
制御用スレッド (owner : apache)
index.php (owner: user1)
Create thread, set cap
制御用スレッド (owner : user1)
setuid・setgid, unset cap
destroy thread
親サーバプロセス (owner : root)
CGI実行方式 mod_process_security
CGI用プロセス (owner : user1)
terminate process
CGIの仕様
execve()
子サーバプロセス (owner : apache)
制御用スレッド (owner : apache)
index.php (owner: user1)
Create thread, set cap
制御用スレッド (owner : user1)
setuid・setgid, unset cap
destroy thread
親サーバプロセス (owner : root)
FCGI実行方式 mod_process_security
FCGI用プロセス (owner : user1)
FCGIの仕様
再利用
子サーバプロセス (owner : apache)
制御用スレッド (owner : apache)
Create thread, set cap
制御用スレッド (owner : user1)
setuid・setgid, unset cap
destroy thread
親サーバプロセス (owner : root)
DSO実行方式 mod_process_security
phpを直接実行
index.php (owner: user1)
DSOの仕様
実験
クライアント
CPU Intel Core2Duo E8400 3.00GHz
Memory 4GB
NIC Realtek RTL8111/8168B 1Gbps
OS CentOS 5.6
Webサーバ
CPU Intel Xeon X5355 2.66GHz
Memory 8GB
NIC Broadcom BCM5708 1Gbps
OS CentOS 5.6
Middle Ware Apache 2.2
• 1秒間に処理可能なレスポンス数を計測(response/sec) • クライアントからWebサーバに対して1秒間に複数リクエストを生成
• リクエスト数を変動させて、スループットが低下するか評価 • アクセス制御の適応有無でスループットに差がでるか評価
• phpinfo()を表示するプログラム(54KB)ベンチマークソフト(httperf 0.9.0)
導入方法
$ sudo cp mod_process_security.so /etc/httpd/modules/.
$ cat /etc/httpd/conf.d/ps.conf LoadModule process_security_module modules/mod_process_security.so
PSExtensions .php .cgi .py .pl .rb
# 静的コンテンツも動的コンテンツも適応したい場合は以下 # PSExAll On
$ sudo /etc/init.d/httpd restart
スループット比較
0
500
1000
1500
2000
2500
3000
Re
spo
nse
s/se
c
Requests/sec
DSO(mod_process_security) DSO(アクセス制御無し)
DSO(mod_ruid2) CGI(アクセス制御無し)
CGI(suEXEC) CGI(mod_process_security)
DSO(mod_process_security)はDSO(アクセス制御無し)と比較してスループット劣化は微小
DSO(mod_ruid2)は全てのRequestに対して、5前後のResponse/secでありスループット劣化が大きい
CGIのアクセス制御のスループット劣化は微小
CGI実行方式 (次スライドで拡大)
DSO実行方式
CGIに関するスループット比較
100
120
140
160
180
200
100 200 300 400 500 600 700 800 900 1000
Re
spo
nse
s/se
c
Requests/sec
CGI(アクセス制御無し) CGI(suexec) CGI(mod_process_security)
アクセス制御無し、mod_process_secuiry、suEXECの順に性能が高い。
考察 • mod_process_security採用によるスループット劣化は少ない
– アクセス制御を組み込まない場合と比較 • CGI実行方式の場合はsuEXECよりもスループット劣化が少ない
• DSO実行方式の場合はmod_ruid2よりもスループット劣化が少ない
実行方式 アクセス制御手法 アクセス制御無しと比較したスループット低下率(平均)
CGI suEXEC 2.13%
mod_process_security 1.48%
DSO mod_ruid2やmod_suid2 99.9%
mod_process_security 0.19%
ご清聴ありがとうございました