ラズパイで作る自宅WEBサーバ構築
第4回 Apache WEBサーバ 設定 2019.11.02
Apache 2.4 WEBサーバをインストールします。
YouTube 動画でポイントを説明しています。上記画像をクリックすると再生できます。
ここでは、ドメイン名を example.jp として説明します。
◇Apache 2.4 のインストール
利用できるパッケージのバージョンを確認します
$ apt-cache show apache2
Package: apache2
Architecture: arm64
Version: 2.4.29-1ubuntu4.6
Apache をインストールします
$ sudo apt-get install apache2
バージョンを確認します
$ apache2 -v
Server version: Apache/2.4.29 (Ubuntu)
Server built: 2019-04-03T13:22:37
◇サーバー情報の隠匿
$ sudo vi /etc/apache2/conf-enabled/security.conf
ServerTokens Prod ← レスポンスヘッダ内のサーバ情報を隠匿する
ServerSignature Off ← エラーメッセージ内のサーバ情報を隠匿する
◇ファイル名省略時のアクセスファイル指定
$ sudo vi /etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
DirectoryIndex index.html index.php
</IfModule>
http://example.jp/ にアクセスした際に、http://example.jp/index.html が、index.html がなければ、index.php が呼び出されます。
◇エンコード指定
$ sudo vi /etc/apache2/conf-enabled/charset.conf
AddDefaultCharset UTF-8
◇MIME設定の追加
PHP言語を使うために、MIME設定に追加します。
$ sudo vi /etc/apache2/mods-enabled/mime.conf
AddType application/x-httpd-php .php
◇mod_rewrite の設定
例をあげて説明すると
http://example.jp/12345
というURLにアクセスした際に Apache で
http://example.jp/index.php?id=12345
などのようにURL変換する機能です。これは便利です。
mod_rewriteが利用可能となっているかを確認します。
$ cat /etc/apache2/mods-available/rewrite.load
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
rewrite 機能を有効化します。
$ sudo a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
systemctl restart apache2
$ sudo service apache2 restart
◇ドキュメントルート・ログファイル等の設定
$ sudo vi /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
ServerAdmin webmaster@example.jp
DocumentRoot /home/example/www-root
ServerName example.jp
ServerAlias www.example.jp
ErrorLog ${APACHE_LOG_DIR}/error.log
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
TransferLog "|/usr/bin/rotatelogs /var/log/apache2/access_log.%Y%m%d 86400"
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^/([0-9)]+)$ /index.php?id=$1 [L]
</IfModule>
</VirtualHost>
Apache の初期設定ではドキュメント・ルートは /var/www/ ですが、利便性に欠けます。
上記ではドキュメントルートを任意フォルダ(/home/example/www-root)に変更して利用する設定例です。
これに合わせて、下記のようなフォルダを設定しておきます。
$ mkdir /home/example
$ mkdir /home/example/logs
$ mkdir /home/example/program
$ mkdir /home/example/scripts
$ mkdir /home/example/www-root
$ mkdir /home/example/www-root/images
$ chmod -R 755 /home/example
$ chmod -R 777 /home/example/logs
$ chmod 755 /home/example/scripts/*.sh
$ chmod 644 /home/example/www-root/.htaccess
$ chown ubuntu.ubuntu -R /home/example
作成するフォルダは用途に応じて検討してください。
logs:データベースの定期的なダンプ用に使用しています。
program:外部から直接アクセスできない領域にドキュメントファイル本体を保存しています。
scripts:データベースダンプ用のスクリプトファイルを保存しています。crontab で定期的に実行されます。
◇ドキュメント・ルートの権限設定
$ sudo vi /etc/apache2/apache2.conf
<Directory /home/example/www-root/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
※Apache 2.4系 では 2.2系とアクセス許可設定が変更になっています。
Order allow,deny
Allow from all
↓
Require all granted
設定を確認して、Apache WEBサーバを再起動します。
$ sudo /usr/sbin/apachectl configtest
Syntax OK
$ sudo /etc/init.d/apache2 restart
◇非武装領域と武装領域
非武装領域には、ブラウザから直接アクセス可能なファイルを配置し、武装領域には機密性の高いファイルを配置します。
具体的な例を挙げて説明します。
まず、ブラウザから直接アクセス可能なドキュメントルートに、index.php を配置します。
$ vi /home/example/www-root/index.php
<?php
require_once('/home/example/program/shadow.php');
?>
index.php は、http://example.jp/index.php のようにURL指定が可能です。
shadow.php は、index.php から間接的に呼びだされます。
次に、ブラウザから直接アクセスできない領域(武装領域)に、shadow.php を配置します。
$ vi /home/example/program/shadow.php
<?php
$db_user = 'db_user';
$db_passwd = 'db_passwd';
$page = $_REQUEST['page'];
switch ($page) {
case 'shopping':
require_once('/home/example/program/shopping.php'); break;
case 'map':
require_once('/home/example/program/map.php'); break;
case 'company':
require_once('/home/example/program/company.php'); break;
}
?>
ドキュメント・ルートは、/home/example/www-root なので、
/home/example/program/shadow.php はブラウザからURL指定をすることができません。
※相対パス指定もできません。
ここで、shadow.php を非武装領域であるドキュメント・ルートに配置して、index.php から呼び出す形にしたとします。
$ vi /home/example/www-root/index.php
<?php
require_once('shadow.php');
?>
もし、Apache の設定ファイル mime.conf で、
AddType application/x-httpd-php .php
の指定をしていなかったらどうなるでしょう?
index.php のソースコードがそのままテキストとして表示されてしまいます。
index.php 中の require_once は単なる文字列として扱われるので、shadow.php が呼び出されて、テキストとして表示されることはありませんが、shadow.php の存在は暴露されてしまいます。
ブラウザから
http://example.jp/shadow.php
で、呼び出されると、shadow.php のソースコードも表示され、パスワードが丸見えになってしまいます。
データベースシステムのポートを外部に開放していたとしたら、とても怖いですね!
武装領域に配置していれば、ファイル名はわかってもアクセスすることはできません。
サイト公開時にこのような設定ミスをするとは思えませんが、非武装領域には最低限のコードのみを記述して、プログラム本体は極力、武装領域に配置するようにしましょう。
mime がきちんと設定されていた場合でも、ブラウザからとは別の方法で不正なアクセスをされると、非武装領域にあるプログラムファイルは、そのままの形で取得されてしまうこともあります。静的なホームページを作るのであれば、問題ないと思いますが、動的なページを作る際にはとても危険です。
一昔前に、顧客情報のエクセルファイルをこの非武装領域に置いていて、顧客情報がだだ漏れしてしまったという事件もありました。
◇.htaccess 設定の注意点
PHPを例にとります。公開サーバーでは、プログラムにエラーがあった場合のエラー表示はオフにしておきましょう。
コーディングミスをした場合、行番号とソースコードの一部が表示されてしまいます。
$ sudo vi /home/example/www-root/.htaccess
....
php_flag display_errors Off
....
試しに php_flag display_errors On にしてみます。
【index.php】
<?php
$db_user = 'db_user';
$db_passwd = 'db_passwd: ← 閉じの'(カンマ)を忘れてしまった
?>
Parse error: syntax error, unexpected ''db_passwd;' (T_ENCAPSED_AND_WHITESPACE) in index.php on line 3
パスワードが丸見えです。
次に武装領域にあるファイルを間接呼出しする形に書き換えてみましょう。
【index.php】
<?php
require_once('/home/example/program/shadow.php');
?>
【shadow.php】
<?php
$db_user = 'db_user';
$db_passwd = 'db_passwd: ← 閉じの'(カンマ)を忘れてしまった
?>
Parse error: syntax error, unexpected ''db_passwd;' (T_ENCAPSED_AND_WHITESPACE) in /home/example/program/shadow.php on line 3
武装領域にあるファイルでも、パスワードは丸見えになります。
通常、ドキュメント・ルートにある .htaccess の エラー表示フラグを On にして運用することは考えられませんが、
公開サーバーの中にテスト用サブディレクトリーを作り、このサブディレクトリーに .htaccess を再配置して、エラー表示フラグをOnに再定義して検証されているWEB制作会社もあるようです。サブディレクトリ名を推測されないように工夫はしているようですが、お奨めできません。プログラムの検証は非公開サーバーで実施すべきだと思います。
◇Apache WEBサーバ のテスト
以上、リスク管理についてお話しましたが、DNS設定はまだですので、ドメイン名でのアクセスはできません。
テストにはローカルIPアドレスでのWEBアクセスになります。
$ vi /home/example/www-root/index.html
<html><body>Hello!</body></html>
ブラウザから
http://192.168.11.21/index.html
「Hello!」と表示されます。
◇不要ファイルの削除
$ sudo rm -rf /var/www
これで、Apache WEBサーバ の設定は終了です。
http:// ~ の設定方法を説明しましたが、 https:// ~ の設定方法についてはそのうち番外編で解説します。
次回は PHP の設定を行います。
|