ChocoMemo

学んだことをメモがわりにアップしていきます!

さくらVPS初期設定 10 - Apacheのセットアップ


Apacheのインストール

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

$ yum list installed | grep httpd

インストールされていなければ、何も表示されないのでyumからインストールする。

$ sudo yum -y install httpd

Apacheのバージョンを確認しておく。

$ httpd -v
Server version: Apache/2.2.15 (Unix)
Server built: Aug 13 2013 17:29:28

現時点のApacheは2.0、2.2、24系がある。最新の2.4系ではNginx的な非同期I/Oを実装しており、リクエストを効率的に処理できるそうだ。参考サイトにいろいろ書かれていたが、今はよくわからないので今回はインストールの簡単さを重視してyumを利用する。時間があるときに詳しく調べようと思う。

初期設定

Apacheをyumでインストールした場合、自動的にapacheというユーザーが作成される。

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

今後、設定ファイルやApache上で稼働させるサービスなどで、このユーザーを利用することになるので、名前を覚えておく。

設定をはじめる前に、対象となるファイルのバックアップを取る。設定ファイルがあるディリクトーに日付を付けてコピーしておく。こうしておけば、誤って削除や破損させたときの復元や、デフォルト設定の確認などに便利である。httpd.confはroot権限が必要なところにあるので、rootになるかsudoで実行する。

$ cd /etc/httpd/conf
$ sudo cp httpd.conf ./httpd.conf_YYYYMMDD_default

バックアップできたら編集に入る。viで設定ファイルの40行目を開く。

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

はじめから順にゆく。まずは44行目まで移動し、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

242行目。ユーザーとグループの設定を確認しておく。どちらもapacheになっているはずなので、そのままでよい。eseを押してコマンドモードに戻り「242G」と押すと242行目に移動できる。

#
# 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

次は262行目。サーバー障害時の連絡先としてエラーページなどに表示される連絡先。メールアドレスや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

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

# 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"

331行目。オプション設定をおこなう。

初期状態では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

536行目。これはエラーページなどに出力されるサーバー情報になる。前に設定した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の設定をしていない場合はrootになってから実行する。

$ sudo apachectl configtest
Syntax OK

上記が表示されていれば、問題なく無事に設定されている。

不要モジュールの無効化

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

viで設定ファイルを開く。

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

150行目に移動すると、モジュールがずらっと並んでいる。

#
# 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

各モジュールの役割について参考サイトに記載されている。後で役割について調べて記載する。 編集が完了したら、ファイルを保存し、設定の妥当性をチェックする。

$ sudo apachectl configtest
Syntax OK

OKが表示されているので問題なし。

起動とサービス登録

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

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

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

Apach 2 Test Page
Apach 2 Test Page

最後にサーバー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もいっしょに起動される。

参考サイト:さくらのVPS を改めて使いはじめる 4 – Apache をセットアップする