アカベコマイリ

HEAR NOTHING SEE NOTHING SAY NOTHING

さくらのVPS を改めて使いはじめる 4 - Apache をセットアップする

さくらのVPS(v3) 2GB プランへの環境構築メモ 4。今回は Apache をセットアップして HTTP サーバーを起ち上げる。

Apache のインストール

はじめに Apache がインストールされていることを確認する。

$ yum list installed | grep httpd

何も表示されないので改めてインストール。今回は yum から入れる。

$ sudo yum -y install httpd

バージョンを確認しておく。yum の場合、2.2 系になるようだ。

$ httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Feb 13 2012 22:31:42

現時点の Apache は 2.0、2.2、2.4 系がある。最新の 2.4 系では Nginx 的な非同期 I/O を実装していてリクエストを効率的に処理できるそうだ。2.4 の機能については以下のまとめが分かりやすい。

今回はインストールの簡単さを重視して yum を利用したが、いずれ 2.4 に移行するかもしれない。また Nginx によるリバースプロキシをフロントにして Apache をバックエンドで動かす構成も検討している。

いずれにせよ、いきなり VPS 上で作業するのではなくローカルの VMware Player + CentOS 環境で動作確認してから導入する予定である。

初期設定

Apache を yum でインストールすると自動的に apache というユーザーが作成される。今後も設定ファイルや Apache 上で稼働させるサービスなどで apache ユーザーを利用することになるので名前を覚えておこう。

$ cat /etc/passwd | grep apache
apache:x:48:48:Apache:/var/www:/sbin/nologin

設定をはじめる前に対象となるファイルのバックアップを取る。場所はユーザー HOME の backup ディレクトリにしておく。こうしておけば誤って削除や破損させたときの復元やデフォルト設定の確認などに便利。

$ cd
$ mkdir backup
$ sudo cp /etc/httpd/conf/httpd.conf ./backup

バックアップできたら編集を実行。vi で設定ファイルを開く。

$ sudo vi /etc/httpd/conf/httpd.conf

はじめから順にゆく。まずは ServerTokens の行まで移動してWeb サーバーにアクセスしたクライアントに返す情報を変更する。初期状態では ServerTokens OS、つまり OS 情報を表示するようになっている。この情報が詳細なほど攻撃者へサーバー構成のヒントを与えることになる。

Prod を指定すると HTTP のレスポンスヘッダには Server: Apache だけ返すようになるのでそうしておく。

#
# Don't give away too much information about all the subcomponents
# we are running.  Comment out this line if you don't mind remote sites
# finding out what major optional modules you are running
ServerTokens Prod

UserGroup を確認。どちらも apache になっているはず。そのままでよい。

#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
#  . On SCO (ODT 3) use "User nouser" and "Group nogroup".
#  . On HPUX you may not be able to use shared memory as nobody, and the
#    suggested workaround is to create a user www and use that user.
#  NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET)
#  when the value of (unsigned)Group is above 60000;
#  don't use Group #-1 on these systems!
#
User apache
Group apache

次は ServerAdminサーバー障害時の連絡先としてエラーページなどに表示される連絡先。メールアドレスや URL を指定する。デフォルトは root@localhost になっているので必要に応じて変更しておく。面倒ならそのままでもよい。

メールなら連絡先アドレスを指定。URL の場合は Apache の稼働サーバーとは別の場所にすること。障害の起きているサーバーが連絡先になっていても意味がない。

#
# ServerAdmin: Your address, where problems with the server should be
# e-mailed.  This address appears on some server-generated pages, such
# as error documents.  e.g. admin@your-domain.com
#
ServerAdmin root@localhost

DocumentRootWeb サーバーのルート ディレクトリ設定を確認。デフォルトのままにしておく。

# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html"

Optionsオプション設定をおこなう。

初期状態では Indexes が設定されている。そのためアクセスされたディレクトリ内に DirectoryIndex で設定されたファイル (index.htm と index.html) が見つからなければファイル一覧ページが自動生成される。

これはファイル構造をそのまま公開しているようなものでセキュリティ的によろしくない。よって**Indexes の前にハイフンを付けて無効化**する。FollowSymLinks はシンボリックリンク用の設定だが、こちらは利用するで残しておく。

# The Options directive is both complicated and important.  Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
Options -Indexes FollowSymLinks

ServerSignature。これはエラーページなどに出力されるサーバー情報。前に設定した ServerTokens と同様これもリスクになるため On から Off に変更して無効化する。

#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of:  On | Off | EMail
#
ServerSignature Off

ここまで編集したらファイルを保存して閉じる。そして以下のコマンドを実行して設定に問題がないことを確認する。

$ sudo apachectl configtest
Syntax OK

問題なし。無事に設定できたようだ。

不要モジュールの無効化

Apache が読み込むモジュールのうち不要なものを無効化する。この対応はメモリ節約とセキュリティ向上に繋がる。vi で設定ファイルを開く。

$ sudo vi /etc/httpd/conf/httpd.conf

LoadModule がずらっと並んでいるところまで移動。

#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so

... 以下、略。

これらから不要なものを無効にしてゆく。行頭に # を入れることで設定がコメント アウトされて無効化される。例えば以下のように書く。

#LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_alias_module modules/mod_authn_alias.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
#LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule authz_default_module modules/mod_authz_default.so
#LoadModule ldap_module modules/mod_ldap.so
#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
#LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
#LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule info_module modules/mod_info.so
LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
#LoadModule actions_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule substitute_module modules/mod_substitute.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule cache_module modules/mod_cache.so
LoadModule suexec_module modules/mod_suexec.so
#LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule version_module modules/mod_version.so

各モジュールの役割と私が設定した内容を表にまとめておく。

設定欄は有効なら○、無効にしたものは×。機能自体が不要か、より望ましい代替 (基本認証に対するダイジェスト認証など) があるものを無効と判断した。説明文は Apache のドキュメントを引用、または参考にして書いている。

モジュール 設定 説明
mod_auth_basic × 基本認証用
mod_auth_digest ダイジェスト認証用
mod_authn_file テキストファイル ( htpasswd/htdigest ) を用いたユーザ認証
mod_authn_alias × 拡張認証プロパイダに別名を与えて管理しやすくする
mod_authn_anon × 匿名ユーザーのアクセスを許可
mod_authn_dbm × DBM ファイルを用いたユーザ認証
mod_authn_default × 他の認証モジュールを用いない場合、全ての認証を拒否する
mod_authz_host ホスト ( 名前もしくは IP アドレス ) に基づいたグループ承認
mod_authz_user ユーザー名に基づいた承認
mod_authz_owner × ファイルの所有者に基づいた承認
mod_authz_groupfile × プレーンテキストファイルを用いたグループ承認
mod_authz_dbm × DBM ファイルを用いたグループ承認
mod_authz_default × 他の認証モジュール ( authz 系 ) を用いない場合、全ての認証を拒否する
mod_ldap × 他の LDAP 認証モジュールに接続プーリングとキャッシュ機能を提供する
mod_authnz_ldap × LDAP 認証用
mod_include SSI ( Server Side Includes ) を有効にする
mod_log_config サーバへのリクエストのロギング
mod_logio × リクエスト毎に入力バイト数と出力バイト数をロギング
mod_env CGI スクリプト及び SSI ページに渡される環境変数を変更する機能を提供
mod_ext_filter × レスポンスのボディをクライアントに送る前に外部プログラムで処理する
mod_mime_magic × ファイルの内容から MIME を判断する
mod_expires ユーザ指定に基づいた Expires と Cache-Control HTTP ヘッダの生成
mod_deflate クライアントへ送られる前にコンテンツを圧縮する
mod_headers HTTP リクエストのヘッダと応答のヘッダのカスタマイズ
mod_usertrack × Cookieによるユーザの追跡
mod_setenvif リクエストの特徴に基づいた環境変数の設定を可能にする
mod_mime ファイルの拡張子から MIME を判断する
mod_dav 分散オーサリングとバージョン管理 (WebDAV) 機能
mod_status サーバの活動状況と性能に関する情報を提供する
mod_autoindex Unix の ls コマンドや Win32 の dir シェルコマンドに似た ディレクトリインデックスを生成する
mod_info サーバの設定の包括的な概観を提供する
mod_dav_fs mod_dav のためのファイルシステムプロバイダ
mod_vhost_alias × サブドメインを簡単に作成できるようになる
mod_negotiation コンテントネゴシエーション 機能を提供
mod_dir 「最後のスラッシュ」のリダイレクトと、ディレクトリのインデックスファイルを扱う機能を提供
mod_actions × メディアタイプやリクエストメソッドに応じて CGI スクリプトを実行する機能を提供
mod_speling × URL の大文字・小文字を区別しない
mod_userdir × ユーザ専用のディレクトリを提供
mod_alias Alias や Redirect を有効にする
mod_substitute レスポンスボディの書き換え機能を提供
mod_rewrite URL の書き換え機能を提供
mod_proxy HTTP/1.1 プロキシ/ゲートウェイサーバ
mod_proxy_balancer 負荷分散のための mod_proxy 拡張
mod_proxy_ftp × mod_proxy のための FTP サポートモジュール
mod_proxy_http mod_proxy のための HTTP サポートモジュール
mod_proxy_ajp mod_proxy で AJP をサポートするためのモジュール
mod_proxy_connect CONNECT リクエストを扱う mod_proxy 用の拡張
mod_cache × URI をキーにしたコンテンツのキャッシュ
mod_suexec 指定されたユーザとグループで CGI スクリプトを実行する
mod_disk_cache × URI をキーにしたコンテンツキャッシュストレージ管理
mod_cgi CGI スクリプトの実行
mod_version バージョン依存の設定

編集が完了したらファイルを保存して設定を検証。

$ sudo apachectl configtest
Syntax OK

問題なし。ばっちり。

起動とサービス登録

ひととおり設定が終わったので Apache を起動する。httpd という名のサービスとして登録されているため service コマンドにそれを指定、start オプションをつけて実行する。

$ sudo service httpd start
httpd を起動中:                                            [  OK  ]

起動できたら Web ブラウザでアクセスしてみる。http:// の後にサーバーの IP アドレスかドメインを指定したものが URL となる。これをブラウザのアドレスバーに入力して開く。すると Apache のテストページが表示されるはず。

Apache のテストページ

最後にサーバー OS が起動されたとき Apache のサービスが自動起動されるようにしておく。以下のコマンドで現在の設定を調べる。

$ chkconfig --list httpd
httpd           0:off   1:off   2:off   3:off   4:off   5:off   6:off

すべての設定が off になっている。つまり無効ということなので自動起動を有効化。chkconfig コマンドに Apache のサービス名 httpd を指定、オプション on つきで実行する。

$ sudo chkconfig httpd on

再び設定を確認するといくつかの項目が on になっているはず。

$ chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

各項目の数値はランレベルと呼ばれるシステムの動作モードを示している。それぞれの意味は以下のようになる。

モード 内容
0 シャットダウン ( システム停止中 )
1 シングル ユーザー モード ( root のみ )
2 マルチ ユーザー モード ( ネットワークなし )
3 マルチ ユーザー モード ( テキスト )
4 未使用
5 マルチ ユーザー モード ( グラフィカル )
6 システム再起動

さくらのVPS 上の CentOS なら 3 以上が起動状態になる。ランレベルは runlevel コマンドで確認できる。実行してみると 3 になっていることがわかる。

$ runlevel
N 3

先ほど設定した Apache の場合、ランレベル 2 ~ 5 が on になっていたので 2 = マルチ ユーザー モード (ネットワークなし) 以上のランレベルで起動される。つまり OS を再起動すれば Apache もいっしょに起動される。

…今回はここまで。次回は MySQL のインストールと設定をおこなう予定。

Copyright © 2009 - 2023 akabeko.me All Rights Reserved.