HTTPサーバ設計
1.主な構成
(1) 構成概要図
(2) 主サーバ・仮想サーバ
Apacheでは1つのHTTPデーモン上に独立した複数のサイトを 構築することができます。 今回は1つのサイトのみ構築するため主サーバのみで運用します。
2.ウェブページ公開機能
(1) IPアドレス・リスニングポート
サーバのLANポートは1つのみのため、これに設定したIPアドレス 「192.168.0.11」でHTTPリクエスト受け付けます。 またブラウザから明示的にポート番号を指定することなく ページを公開できるよう配慮し、ポート番号は「80」を使用します。
| IPアドレス | ポート番号 |
|---|---|
| 192.168.0.11 | 80 |
(2) 公開ディレクトリ
公開するウェブページの保存場所は「/var/www/html」とします。 これはApacheのデフォルトの保存場所です。 配置するファイルのサイズは数十MB~数百MB程度であると 想定しているため個別のパーティションを割り当てませんが、 今後ファイル数が増加して1GBを超えるようであれば 再度検討します。
| 公開ディレクトリ |
|---|
| /var/www/html |
(3) ディレクトリインデックス
ディレクトリインデックスはURLでファイル名を指定しなかった場合に 表示するファイル名ですが、通常は「index.html」を表示するものとします。 以下、「index.htm」、「index.php」、「index.cgi」の優先順位で ファイルを検索し表示してます。 PHPファイルのページを表示したい場合には index.html、index.htmファイルを作成しなければindex.phpを表示することができます。
また、一時的にお知らせページなどを トップページとして挟み込みたい場合に備えて「welcome.htm」を 最優先に表示できるようにします。
| 優先度 | ディレクトリインデックス |
|---|---|
| 1 | welcome.htm |
| 2 | index.html |
| 3 | index.htm |
| 4 | index.php |
| 5 | index.cgi |
(4) 文字コード
Apacheの設定で文字コードを強制的に固定することができますが 文字コードが混在するページを表示することができるよう この機能は使用しません。 ブラウザに表示する際の文字コードはHTMLファイルのヘッダ部分に記述し、 ブラウザが判別して表示することとします。
(5) CGI実行
通常ウェブサイトのアクセスカウンタや掲示板などは Perl言語などのCGIで記述されていることが多いため CGIを実行できる環境とします。 CGIファイルをドキュメントルート以下のどのディレクトリ階層に 配置しても実行できるようにします。
(6) PHP実行
CGIと同様にPHPファイルもどのディレクトリ階層に 配置しても実行できるようにします。
(7) エラードキュメント
リクエストされたファイルが存在しない場合などに 事前に指定したエラーページをレスポンスとして返すことができますが この機能は使用しません。 エラーページはブラウザで準備されている標準画面が表示されるようにします。
3.セキュリティ対策
(1) HTTPレスポンスヘッダ・フッタ情報制限
Apacheからブラウザに返すレスポンスのヘッダやフッタに IPアドレスやApacheのバージョン、OS種別などが含まれていると、 その情報を元に内在しているバグを突き止められて 悪意ある攻撃の対象となる危険性があります。 そこでこれらサーバ情報は可能な限り情報量が最小となるよう設定します。
(2) HTTPメソッド制限
クライアントから送信されるHTTPメソッドで 必要となるものは限られています。 ページを要求する際に使用される「GET」、 フォームデータなどクライアントからデータを渡すときに使用される「POST」です。 「HEAD」は通常使用する機会は極めて少ないですが テストで使用することがあるため許可します。
その他メソッドはサーバ側の予期せぬ情報収集したりなど悪用されることがあるため 利用できないよう制限をかけます。
(3) リクエスト元制限
今回のネットワーク構成ではPCとサーバが同一セグメント内に存在しています。 そのためリクエスト元は常に「192.168.0.0/24」のセグメントからとなります。 その他のセグメントからリクエストを受け付けることは想定していないため 万一リクエストが発生した場合に備えて拒否する設定とします。
4.起動・停止
(1) 起動・停止方式
HTTPサービスはOS稼働時に常時利用可能とするために 起動停止をrcで制御します。 これによりOS起動時にrcからhttpdデーモンが自動で起動され、 OS停止時に自動で停止されます。
(2) ランレベル
Linuxはランレベル3で運用しますが、 その他ランレベルに切り換えた場合でもHTTPサービスが 利用できるように ネットワークサービスが利用できるランレベルでは httpdデーモンを起動することとします。
| ランレベル | 動作内容 | 設定 |
|---|---|---|
| 0 | システムの停止 | OFF |
| 1 | シングルユーザモード | OFF |
| 2 | NFSファイル共有のないマルチユーザモード(テキストベース) | ON |
| 3 | 完全マルチユーザモード(テキストベース) | ON |
| 4 | 通常、未使用 | ON |
| 5 | 完全マルチユーザモード(GUIベース) | ON |
| 6 | システムの再起動 | OFF |
5.ログ出力
Apacheが出力するログは「稼働ログ」と 「アクセスログ」の2種類に分け、それぞれ個別のファイルに出力します。
(1) 稼働ログ
Apache自体の動作を記録するログです。 問題発生時にApacheの動作を時系列で確認するために 正常メッセージも含めて出力します。 デバッグレベルのログを出力するとファイスサイズが巨大になり ディスク領域を圧迫することが懸念されるため出力しません。 デバッグレベルは障害発生後の再現テストなどで使用することも考えられますが、 その際は一時的に設定を変更することで出力することとします。
| # | ログレベル | 重要度 | 情報量 |
|---|---|---|---|
| 1 | emerg | 高い![]() 低い | 少ない![]() 多い |
| 2 | alert | ||
| 3 | crit | ||
| 4 | error | ||
| 5 | warn | ||
| 6 | notice | ||
| 7 | info | ||
| 8 | debug |
【ログ出力例】
[Fri Sep 22 10:05:24 2006] [notice] Digest: done
[Fri Sep 22 10:05:24 2006] [notice] Apache configured -- resuming normal operations
(2) アクセスログ
ユーザから受け付けたリクエストの内容を記録するログです。 1リクエスト1レコードで出力します。
| # | 項目 | 内容 |
|---|---|---|
| 1 | %h | リモートホスト |
| 2 | %l | リモートログ名 |
| 3 | %u | リモートユーザ |
| 4 | %t | 時刻 |
| 5 | %r | リクエストの最初の行 |
| 6 | %>s | 最後のステータス |
| 7 | %b | HTTP ヘッダ以外の送られたバイト数 |
| 8 | %{Referer}i | サーバに送られたリクエストのRefererヘッダの内容 |
| 9 | %{User-Agent}i | サーバに送られたリクエストのUser-Agentの内容 |
【ログ出力例】
192.168.0.101 - - [22/Sep/2006:10:04:53 +0900] "GET / HTTP/1.1" 403 5044 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Sleipnir/2.8.2"
