FreeBSDでLAMPをセットアップする

 LAMPサーバのセットアップといえば、システム管理者によく回ってくる仕事だが、信頼性が高く安定したオペレーティングシステムとしてはLinux以外にもFreeBSDがある。つまり、LAMPのL(Linux)をF(FreeBSD)で置き換えても、高速で信頼性の高いWebサーバを構築できるわけだ。

 本稿では、FreeBSDがすでにインストールされているものとして話を進める。インストールが済んでいない場合は、FreeBSDの最新の安定稼働版をダウンロードしてインストーラを実行すればよい。インストール画面では、MINIMUMオプションの選択をお勧めする。そうすれば、最も基本的で必要なものだけを短時間でインストールできる。

 FreeBSDにアプリケーションをインストールするには、portsファイルを使う。portsファイルは、コンピュータ上でソフトウェアをコンパイルするためのソースコードをどこからダウンロードすればよいかが記されたプレーンテキストファイルである。このファイルで設定(特定のモジュールの追加/除外)を自由に変更することで、インストールするマシンの仕様にぴったり合ったソフトウェアが得られる。まずは、最新のportsファイルを用意する。これまで一度もportsファイルをインストールしたことがなければ「portsnap fetch extract」を、それ以外の場合は「portsnap fetch update」をシェルで実行する。これで最新のportsファイルがダウンロードされる。ダウンロードされたファイル名を示す一連のメッセージ表示が終了したら、次のステップに進むとしよう。

Apache

 続いて、WebサーバそのものであるApacheのコンパイルとインストールを、以下に示すコマンド列によって行う。適切なディレクトリに移り(最初のコマンド)、2番目のコマンドを実行すると設定画面が表示され、ここで設定の内容を変更できる。IPv6サポートやproxyモジュールを有効にしてもよいが、通常は標準設定のままでも問題はない。設定内容の確認を済ませると、Apacheのコンパイルとインストールが自動的に行われる。最後の3行は、オペレーティングシステムの起動時にApacheと必要なモジュールを自動で立ち上げるためのものだ。

cd /usr/ports/www/apache22/
make config install distclean
echo 'apache2_enable="YES"' >> /etc/rc.conf
echo 'apache2ssl_enable="YES"' >> /etc/rc.conf
echo 'accf_http_ready="YES"' >> /etc/rc.conf && kldload accf_http

 Apacheのインストールが無事に済んだら、サーバとしての設定を行う必要がある。まず、SSLサポートを有効にし、証明書ファイルと鍵ファイルを作成する。SSL鍵ファイルは、パスワードの変更と証明書の復元を行うための秘密ファイルである。SSL証明書ファイルは、訪問者側のWebブラウザに対して利用しているサーバが不正なものではないことを保証する証明書の役割を果たす。デフォルトでは、SSL証明書ファイルが「/usr/local/etc/apache22/server.crt」、SSL鍵ファイルが「/usr/local/etc/apache22/server.key」になっている。これらの設定は「/usr/local/etc/apache22/extra/httpd-ssl.conf」ファイル中でそれぞれ「SSLCertificateFile」と「SSLCertificateKeyFile」という文字列を検索することによって確認と変更ができる。Apacheのバージョン2以降では、メインの設定ファイルの内容が「/usr/local/etc/apache22/extra/」内のいくつかの追加ファイルに分割されている。この変更のおかげで、特定のオプションが見つけやすくなり、メイン設定ファイルのサイズも小さくなった。メイン設定ファイルで見つからないオプションについては、追加ファイルをあたればよい。

 続いて、適切なディレクトリに移って鍵ファイルを生成する。この鍵を使うことで、証明書署名要求(CSR:Certificate-Signing Request)を生成できる。これは、鍵の署名を認証局(CA:Certificate Authority)に依頼するためのものだ。VeriSignのような認証機関に依頼する以外に、自己署名を行うこともできる。専門の機関から署名を受けるには費用がかかるが、そうした証明書を持つWebサーバは訪問者側としても安心して利用できる。自己署名された証明書の場合は、そのサイトの訪問者のブラウザに警告が表示されるが、コストは一切かからない。以下に、SSL証明書に自己署名するためのコードを示す。

cd /usr/local/etc/apache22/
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
chmod 0400 server.key server.crt

 これで鍵ファイルと証明書ファイルの生成が適切なパーミッションとディレクトリの下で行われる。とはいえ、設定の必要な箇所がいくつかある。まず「/usr/local/etc/apache22/httpd.conf」ファイルでは、「ServerAdmin」を検索してサーバ管理者の電子メールアドレスを正しく設定する。また、Webドキュメントの置かれている場所を示す「DocumentRoot」には、サーバ上の「/srv/www/01」を指定する。さらに、各ユーザの個人的なWebコンテンツを非公開にするために、「Include etc/apache22/extra/httpd-userdir.conf」の行をコメントアウトしておく。最後に「Include etc/apache22/extra/httpd-ssl.conf」の行を有効にしてSSLのサポートをオンにする。続いて「/usr/local/etc/apache22/extra/httpd-default.conf」ファイルでは「ServerSignature」を無効にしてサーバによる不必要な情報の表示を防ぐ。また「/usr/local/etc/apache22/extra/httpd-info.conf」ファイルでも、「server-status」と「server-info」の各セクションをコメントアウトしておく。セキュリティ担当者としては、Webサーバに関する情報はできるだけ隠しておくほうが好都合だからだ。

 また、「usr/local/etc/apache22/extra/httpd-vhosts.conf」ファイルには、このサーバへのすべてのSSL接続用のディレクトリを設定しておく。なお、この例ではサーバ名が「lawrencium」になっているが、この部分は適宜変更すること。

NameVirtualHost *:443
<VirtualHost *:443>
ServerName lawrencium
ServerAlias lawrencium.ipc.net
DocumentRoot /srv/www/02/
<Directory /src/www/02/>
Order allow,deny
Allow from all
</Directory>
SSLEngine On
SSLCertificateFile /usr/local/etc/apache22/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/etc/apache22/ssl.key/server.key
AllowOverride None
Order Deny, Allow
</VirtualHost>

 これで、80番ポートへのすべての接続と、443番ポートへのすべての接続に対してディレクトリが1つずつ(「/srv/www/01」と「/srv/www/02」)用意される。

PHP

 この時点で、Webサーバは静的コンテンツを公開できる状態になっている。しかし、ほとんどのWebサイトには、フォーラムやチャット、ギャラリーなど、PHPによる動的コンテンツが含まれている。

 PHPのインストールは簡単ですぐに終わる。PHP本体のパッケージとPHPエクステンションのコンパイルとインストールを行うが、次のようにしてPHP v5のインストール時に忘れずにApacheモジュールもコンパイルする。

cd /usr/ports/lang/php5
make config install distclean
cd /usr/ports/lang/php5-extensions
make config install distclean

 ApacheでPHPサイトを扱うには、PHPファイルの処理方法を指定する必要がある。具体的には、「/usr/local/etc/apache2/httpd.conf」ファイルの「LoadModule」行のすぐ後ろに次のエントリを追加する。

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

 また次のように、ディレクトリインデックス(DirectoryIndex)に「index.php」を追加しておく。

<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.htm
</IfModule>

 PHPには、大半の用途でセキュアといえる推奨設定内容を記載したファイルが用意されているので、これを利用する。ただし「allow_url_fopen」(リモートFTP/HTTPサイトのファイルをローカルファイルと同じように操作できるようにする)は、使い方を誤ると問題になるので無効にしておく。

cp /usr/local/etc/php-ini-recommended /usr/local/etc/php.ini

MySQL

 これでPHPのインストールと設定も終わった。だが、大半のPHPアプリケーションはデータベースも利用する。安定したオープンソースのデータベースシステムMySQLなら、無料で使える。

 次のようにして、SSLサポートを有効にしてMySQLのコンパイルとインストールを行い、オペレーティングシステム起動時にMySQLサーバが自動で立ち上がるように「/etc/rc.conf」にエントリを追加しておく。

cd /usr/ports/databases/mysql51-server
make install WITH_OPENSSL=yes
make distclean
echo 'mysql_enable="YES"' >> /etc/rc.conf

 また、rootパスワード(以下の例では「p3Df1IsT」)も設定する。ただし、シェル上でパスワードを設定すると(利用するシェルに応じて「~/.bash_history」や「~/.histfile」に)履歴が残るため、セキュリティ上の理由からシェルのコマンド履歴を消去しておく(特にrootアカウントを共有している場合)。

/usr/local/etc/rc.d/mysql-server start
mysqladmin -u root password p3Df1IsT
mysql -u root -p
rm /root/.history

 MySQLにログインしたら、そのコマンドプロンプトから以下のコマンド列を実行することで、すべての匿名アカウントを削除する。4番目のコマンドはパスワードのないユーザの一覧を表示するもので、それぞれについてパスワードを設定するかそのユーザを削除するかを選択できる。最後のコマンドでは、デフォルトのrootアカウントの名前を「mmu002」に変更している。rootアカウントを変更しておくと、何者かにrootパスワードを狙われた場合に都合がよい。というのも、クラッキングは「root」というユーザ名とデフォルトのパスワードや辞書に載っているような単語のパスワードの組み合わせを使って仕掛けられることが多いからだ。この場合は、デフォルトのrootアカウントが存在しないため、クラッキングはずっと困難になる。また、アカウント名には推測しづらいものを用いる。

use mysql
DELETE FROM user WHERE user="";
FLUSH PRIVILEGES;
SELECT * FROM user WHERE Password="";
UPDATE user SET user='mmu002' WHERE user='root';

 FreeBSDのデフォルトの状態ではMySQL設定ファイルが用意されていないので、以下のように「/etc/my.cnf」ファイルを自分で作成してデフォルトのポートを29912番に変更する必要がある。ここでは、127.0.0.1(ローカルホスト)からの接続のみを受け入れるようにする。最後の行は、ユーザが実際に読み書きでアクセスするデータベースだけを表示するもので、このオプションを指定しないと、MySQLによってすべてのデータベースが全ユーザに表示される。

[client]
port=29912
[mysqld]
port=29912
bind-address=127.0.0.1
skip-name-resolve
safe-show-database

 タイトルに沿った解説は以上だが、LAMPに関する記事でphpMyAdminに触れないわけにはいかないだろう。

phpMyAdmin

 phpMyAdminは、データベース管理者の仕事をかなり楽にしてくれる。使用頻度はかなり高く、ほとんど標準になっている。利用するにはインストールとリンク設定が必要だ。以下のコマンドにより、「http://localhost/phpMyAdmin」でphpMyAdminにアクセスできるように設定を行い(つまり、インストールしたphpMyAdminディレクトリをwwwrootのディレクトリにリンク)、設定スケルトンをデフォルト設定として利用して、秘密のパスフレーズ(パスワードの暗号化に使用)、rootユーザ、rootパスワードをMySQLオプションに対応させて設定する。

cd /usr/ports/databases/phpmyadmin
make config install distclean
ln -s /usr/local/www/phpMyAdmin /usr/local/www/apache22/data
cd /usr/local/www/phpMyAdmin && cp config.sample.inc.php
config.inc.php
vim config.inc.php
$cfg['blowfish_secret'] = 'kJ76Fgeak98h6thjd6';
$cfg['Servers'][$i]['controluser'] = 'root';
$cfg['Servers'][$i]['controlpass'] = 'p3Df1IsT';

 以上で、多機能FreeBSDサーバのインストール、設定、セキュア化が完了し、いつでも利用できる状態になっている。なお、サーバの管理にあたっては、いくつか注意すべき点がある。1つは、サーバを最新の状態に保つことだ。FreeBSDには、カーネルやユーザ空間、そしてそこにインストールされているすべてのアプリケーションを最新かつセキュアな状態に保つ優れたツール群が用意されている。サーバの古さはセキュリティ上のリスクとなる。もう1つは、設定を変更したり、アプリケーションを再構成したり、あるいは単にFreeBSDの特定のコマンドやファイルについて把握したりする場合には設定ファイルとmanページを参照する、ということだ。

 ここで設定したサーバを使えば、静的Webコンテンツだけでなく、フォーラムやチャット、画像ギャラリーといった動的コンテンツも安全に公開できるほか、Webホスティングで中心的な役割を果たすことの多いデータベースの設定にもphpMyAdminが利用できる。

Martin Münchはノルウェーのトロムソ大学(University of Tromsø)でコンピュータサイエンスを学んでいる。

Linux.com 原文