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のテストページが表示される。
最後にサーバー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もいっしょに起動される。