DX

大規模クラウド・Webホスティングサービスから学ぶ実践的なLinuxのセキュリティと仮想化技術〜Vol.4 WebサーバとWebホスティングシステムの基礎知識(1)

AMBL株式会社 Security LABの技術顧問をしている松本亮介と申します。SNSなどではまつもとりーという名前で活動しています。前回も簡単にご紹介しましたが、Security LABは2021年の10月に設立されたチームで、設立の経緯や活動については、「FinTech・金融業界のセキュリティ知識の普及とセキュリティ投資の適正化を目指すSecurity LABを設立」という記事や、「Security LAB設立の背景セキュリティには翻訳が必要だ!」でも紹介されていますので、改めてそちらもご覧いただけると幸いです。

さて本連載では、「大規模クラウドやWebホスティングサービスから学ぶ実践的なLinuxのセキュリティと仮想化技術」というタイトルで、Linuxのセキュリティやリソース制御、パフォーマンス、運用技術について解説していきます。

前回は連載の第3回として、クラウド・Webホスティング技術のセキュリティと運用技術の歴史的背景について述べました。今回は、関連するセキュリティとリソース分離、運用技術についての補足説明をした後に、WebサーバとWebホスティングシステムの基礎知識について解説します。

■セキュリティとリソース分離、運用技術の方針について

第3回で述べたWebサーバの高集積マルチテナント方式ですが、いくつかの観点から課題があります。ここでの高集積マルチテナント方式は、1台のサーバに数万以上のホストを収容するレベルを想定しています。その場合、収容ホスト数に依存して、リソース使用量の増加や設定変更に伴う再起動が極端に増加しないようにする必要があります。

さらに、Webホスティングサービスでは、サービス利用者が各ホストに自由に様々なWebコンテンツを配置可能です。そのため、各々のホストに対するアクセス数の予測は困難であったり、特定のホストに対する突発的なアクセスがサーバ全体に影響を与えることもあります。

これらの課題を解決するための方針を示します。まず、単一のサーバプロセス群で大量のホストを仮想的に処理する必要があります。単一のサーバプロセス群とは、サーバの実装によって数十から数百プロセス起動させておく状態を示します。所謂、Webサーバプロセスのmasterプロセスと複数存在するworkerプロセス群のことです。その状態で、収容ホストに依存してプロセス数を増やさないようなアーキテクチャをとるようにします。さらに、同一の設定のままWebサーバを複数台に増やし、データを共有ストレージ等でまとめることで、処理を司るWebサーバをスケールアウト型で負荷分散も可能になります。

その方針に基づいて、セキュリティとリソース分離、運用技術の各課題を解決していきます。まず、ホストのセキュリティをHTTPリクエスト単位で担保するようにします。なぜなら、収容ホスト数に応じてサーバプロセス数を増やさないことは、すなわち、各ホストに対するリクエストを単一のプロセス群で共有して処理しているためです。その際に、各HTTPリクエストは別のホストに対するリクエストの場合もあるため、それぞれがホスト間で干渉しないようにセキュリティを担保し、プロセスの機能を利用して性能を最大化する必要があります。

次に複数のホスト間で生じるリソース競合を低減する必要があります。これも、上述したとおり、プロセスをホスト間で共有する以上、ハードウェアリソースも同時に共有するため、非常に重要な取り組みになります。その上で、セキュリティやリソース管理をどれだけコストをかけずに実現するかという運用技術上の改善が必要になります。基盤技術でシステムを自動化することにより、システムの運用・保守コストを低減させることが、サービス利用者に継続的に価値を届けることに繋がっていきます。サービスを作って終わりではなく、作ったあとにシステムを安定化させつつ改善を続けることによって価値を届け続けることが非常に重要なのです。

■WebサーバとWebホスティングシステムの基礎知識

本章では、以下の4つの議題に分けて、WebサーバやWebホスティングシステムの基礎知識について述べます。

  1. クラウドサービスとホスティングサービス
  2. Webサーバの仮想化・隔離技術の分類
  3. Webサーバにおける動的コンテンツ
  4. 代表的なWebサーバのアーキテクチャ

今回は、1と2について解説します。

1. クラウドサービスとホスティングサービス

クラウドサービスとは、クラウドコンピューティングとサービスという意味を融合した概念になります。クラウドコンピューティングとは、ネットワークやサーバといったコンピュータリソースのプールから、必要な時に必要な量だけオンデマンドに利用可能とするコンピューティングモデルです。そこから派生して、クラウドサービスとは、クラウドコンピューティングを各種サービスとして提供するサービスモデルです。

クラウドサービスの代表的な分類としては以下が挙げられます。ただし、今ではBaaSをはじめ、様々なas a Serviceが出てきているので、かつて分類として挙げられたものを紹介しています。

  • SaaS
    • ソフトウェアサービスの提供(Google Appsなど)
  • PaaS
    • システム開発手段やプラットフォーム機能を提供(Herokuなど)
  • IaaS
    • OSやミドルウェアを含めたインフラ機能の提供(AWS EC2など)

Webホスティングサービスは、各ホストの管理者のドメインに対して、HTTPサーバ機能を提供するサービスです。Webホスティングサービスは、日本国内ではレンタルサーバと呼ばれることもあります。基本的には複数のホストでサーバのリソースを共有するコンピューティングモデルを採用しています。これまでのレンタルサーバは、クラウドサービスのようにオンデマンドにリソースを提供するようなことはできていませんでしたが、最近はレンタルサーバの様々な形が開発され、一部オンデマンドでリソースを提供する機能も提供されてきています。例えば、GMOペパボのマネージドクラウドサービスもその一つの形と言えるでしょう。
また、ここでのホストとは、Webホスティングサービスにおいて、ドメイン名(FQDN)によって識別され、対応するコンテンツを配信する機能を指します。

2. Webサーバの仮想化・隔離技術の分類

クラウドサービスやWebホスティングサービスにおけるホストの隔離手法は大きく分けて以下の4つに分類できます。

  1. XenやVMware等の仮想マシンでホストを分ける方法
  2. FreeBSD jailやLXC、OpenVZ等のコンテナ型仮想化のようにファイルシステムや名前空間を操作するシステムコールによってOS上に複数の仮想的な隔離環境を用意しホストを分ける方法
  3. IPアドレスやポート単位でWebコンテンツが配置された複数のホストを分離し各ホストに個別のプロセスを用意して起動させる手法
  4. 単一のサーバプロセス群で複数のホストを仮想ホスト方式により扱う手法

この分類に基づいて、どういう状況で各種隔離手法を採用するかについて述べます。サーバの運用面やセキュリティを重視した場合は、ホスト単位で(1)VMモデル、(2)コンテナモデル、(3)単純プロセスモデルで分離を検討します。(1)から順に隔離レベルが高く、必要なハードウェアリソースも高いため、コストや用途に合わせて決定します。例えば(2)の隔離手法をchroo()で構成する場合は以下のような構成イメージとなります。

ここで、(2)の隔離手法についてもう少し言及します。コンテナ型の仮想化は、技術的にはchroo()やunshare()などのプロセスを隔離するOSの要素技術で構成されたモデルです。unshare()はIPC、net、mount、pid、userなどの名前空間を隔離します。また、chroot()はrootディレクトリを変更します。その他にも、OSから提供されているプロセスの隔離のための要素技術を組み合わせてプロセスを隔離します。

コンテナ型の仮想化は、仮想マシンによる隔離と比較して、カーネルを共有するという観点では隔離度は低くなるのですが、その分必要なリソース使用量が少なく、収容サーバ単位での収容効率は高くなります。また、chroot環境にファイルベースで充実したライブラリ環境を構築したり、それらをイメージ化して使い回すような手法も採用できます。また、ホスト単位で不必要なコマンドやライブラリを配置しないといったような制御もできます。

次に、例えば複数のJavaServletやRuby on Rails、Djangoのようなアプリケーションサーバを単に起動させる場合、かつてはホスト単位で個別のアプリケーションサーバプロセスを起動させ、単純にプロセスを分離するモデル(3)を採用していました。一方で、上述したように、昨今ではコンテナ型の隔離と組み合わせて、コンテナ環境の中でアプリケーションサーバを起動する方式が取られるようになっています。かつて、Steinらによる手法※では、(3)の手法をベースとして、異なるユーザ権限でプロセスを起動する手法が提案されていますが、複数のサーバへスケールあるとすることが困難である課題も挙げられます。

※ L. Stein, “SBOX, put CGI scripts in a box,” USENIX Annual Technical Conference, General Track, pp.145–155, June 1999.

高集積にホストを収容したい場合には、(4)のように単一のサーバプロセス群で複数のホストを仮想的に処理する構成をとります。この構成は、Webサーバの仮想ホスト方式とよばれるマルチテナントアーキテクチャで、Apache httpdではVirtualHostという設定で表現されます。以下にアーキテクチャを簡易的に表した図を示します。

ここで、高集積マルチテナントアーキテクチャとは、仮想ホスト方式によるマルチテナントアーキテクチャを採用し、単一のCPU24スレッド、メモリ32GB程度のWebサーバに、万のオーダーでホストを収容できる程度のアーキテクチャと定義します。

仮想ホスト方式は高集積にホストを収容できる一方で、メリット・デメリットが明確にあります。まず、メリットとしては、WebサーバへのHTTPアクセスのヘッダ情報に従って、ホスト名に対応したドキュメントルートを動的に解析して起動しているプロセスを再利用しながらリクエストを返すため、仮想ホスト数に応じて起動すべきプロセス数が依存せず、収容効率が非常に高くなります。さらに、共有ストレージなどでデータやドキュメントルートを共有可能で、前段のWebサーバにデータや設定が固定されない設定が可能であり、データと処理の負荷分散が容易に実現できます。

一方で、Webサーバプロセスを共有して処理する方式であるため、例えばPHPやCGIなどの動的コンテンツを実行する際に、リソース競合問題 やセキュリティの担保、高集積時の性能や運用技術の問題が出てきます。

最後に、高集積にホストを収容する際のWebサーバのホスト隔離手法や分類について以下のようにまとめます。

  • 仮想マシンレベルの分離(1)
    • 高集積にホストを収容するには不向き・セキュリティ重視の場合
  • プロセスレベルの分離(2)(3)
    • ホスト数に依存してプロセス数が増加するため高集積には不向き
  • 単一のサーバプロセス群で複数のホストを仮想的に分離(4)
    • ホスト数に依存しないため高集積に適している
    • 特定のホストのリソース専有がサーバプロセスのリソースを専有する

■まとめ

本連載の第4回は、Linuxのセキュリティや仮想化技術、それらに関する運用技術やリソース管理、パフォーマンスを学ぶための題材となる、クラウド・ホスティングサービスに関するWebサーバやWebホスティングサービスの基礎知識についてご説明しました。

今後連載で取り上げる内容は以下の通りです。今回は1と2の内容について言及しました。


連載を通じてLinuxの要素技術やセキュリティを学ぶとともに、ご不明な点があればお気軽にTwitterの @matsumotory にご連絡頂いて、関連する技術や知見の意見交換ができれば幸いです。

次回は、「2.WebサーバとWebホスティングシステムの基礎知識」について引き続き解説していきます。
このエントリで興味を持っていただいた方は、ぜひ次回以降もご覧いただけると幸いです。

▼以前の連載記事
大規模クラウド・Webホスティングサービスから学ぶ実践的なLinuxのセキュリティと仮想化技術〜Vol.3 クラウド・Webホスティング技術のセキュリティと運用技術の歴史的背景

大規模クラウド・Webホスティングサービスから学ぶ実践的なLinuxのセキュリティと仮想化技術 Vol2. 本連載の流れと筆者の専門領域の紹介

大規模クラウド・Webホスティングサービスから学ぶ実践的なLinuxのセキュリティと仮想化技術 Vol.1本連載のミッションとビジョン


あなたも、AMBLで一緒に働きませんか?

AMBLは事業拡大に伴い、一緒に働く仲間を通年で募集しています。
データサイエンティスト、Webアプリケーションエンジニア、AWSエンジニア、ITコンサルタント、サービス運用エンジニアなどさまざまな職種とポジションで、自分の色を出してくださる方をお待ちしています。ご興味のある方は、採用サイトもご覧ください。

●AMBL採用ページ
新卒メンバーインタビュー 
-中途メンバーインタビュー 
-プロジェクトストーリー (プロジェクトでの実績/苦労エピソード)

●募集ページ
プリセールス/ エンジニア/ クリエイター/ データサイエンティスト /営業・コンサルタント /コーポレート /サービス企画 /教育担当

ABOUT ME
honey
COLORS編集長の宮坂ハニー(トイプードル2歳)です。 趣味は日向ぼっこ、好きな食べ物はプリン。 現在、海と山の二拠点生活を実現できないか模索中。