Apache アクセス制限の設定 (IPアドレス, ホスト名)

CentOS 8, 7 の場合 (Apache 2.4系)

Apacheの設定ファイルや.htaccessにRequireディレクティブを記述することで、IPアドレスやホスト名によるアクセス制限を行うことができます。

  • 全ホストからのアクセス許可
Require all granted
  • 全ホストからのアクセス拒否
Require all denied
  • ローカルからのアクセスのみ許可
Require local
  • 特定のIPアドレスからのアクセスのみ許可
Require ip 192.0.2.13
Require ip 198.51.100.29 198.51.100.41 198.51.100.42
  • 特定のIPアドレス帯からのアクセスのみ許可

ネットワークマスクの表記は255.255.255.0のような表記でも、/24のようなCIDR表記でも記述できます。

Require ip 192.0.2.0/255.255.255.0
Require ip 198.51.100.0/255.255.255.0 203.0.113.0/255.255.255.0
Require ip 192.0.2.0/24
Require ip 198.51.100.0/24 203.0.113.0/24

また、192198.51203.0.113のようにIPアドレスを部分的に記述することでIPアドレス帯を指定することもできます。

Require ip 192
Require ip 198.51 203.0.113
  • 特定のホストからのアクセスのみ許可

アクセス元のIPアドレスをDNSで逆引きした時のホスト名でアクセス制限をすることができます。フルホスト名での完全一致だけではなく、サブドメインやドメイン名での部分一致を指定することもできます。

Require host example.org
Require host host1.example.com host2.example.com

Apache LTSVフォーマットでのログ出力設定

Apacheにおいて、tab区切りでラベル付けされたLTSVフォーマットでログ出力をする設定。

公式サイト: Labeled Tab-separated Values

ApacheがLTSVフォーマットで出力できるように設定ファイルhttpd.confLogFormatに登録する。ここではcombinedltsvの両方のフォーマットでログを保存することにする。

フォーマットの内容はカスタマイズできるものなので決まった書式はないが、ここでは公式サイトに例として書かれているものを採用している。

マルチドメインで運用している場合は、vhostでホスト名が出てくれるだけでもありがたい

vi /etc/httpd/conf/httpd.conf
--------------------------------------
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
LogFormat "time:%t\tforwardedfor:%{X-Forwarded-For}i\thost:%h\treq:%r\tstatus:%>s\tsize:%b\treferer:%{Referer}i\tua:%{User-Agent}i\treqtime_microsec:%D\tcache:%{X-Cache}o\truntime:%{X-Runtime}o\tvhost:%{Host}i" ltsv
--------------------------------------

サーバ全体のログの出力についてはhttpd.confに記述する。デフォルトではログの出力がcombined形式になっているので先ほど追加したltsvも追加しておく。

LTSVだけで出力したい場合はcombinedの行をコメントアウトすればよい。

vi /etc/httpd/conf/httpd.conf
--------------------------------------
CustomLog logs/access_log combined
CustomLog logs/access_log.ltsv ltsv
--------------------------------------

バーチャルドメイン毎の設定についてはVirtualHostディレクティブの中に記述する。

<VirtualHost *:80>
DocumentRoot /var/www/example.com/htdocs
ServerName www.example.com
CustomLog logs/www.example.com.access_log combined
CustomLog logs/www.example.com.access_log.ltsv ltsv
</VirtualHost>

設定の記述が合っているか確認してからApacheを再起動する。

# apachectl -t
Syntax OK
# apachectl graceful

LTSVフォーマットのログは/var/log/httpd/access_log.ltsv/var/log/httpd/www.example.com.access_log.ltsvに出力されるようになる。再起動した時点で空のログファイルで生成されるのでlsコマンドで存在しているか確認しておく。ここでは、実際にはll(つまりls -l)を使用している。

# ll /var/log/httpd/access_log.ltsv
-rw-r--r-- 1 root root 0 Jul  7 21:20 /var/log/httpd/access_log.ltsv

念のため、実際にブラウザでアクセスしたときに本当にログがリアルタイムに出力されているかtail -fコマンドを利用して確認しておくとよいだろう。

tail -f /var/log/httpd/access_log.ltsv
--------------------------------------
ログの出力をリアルタイムで確認、Ctrl+Cで終了
--------------------------------------

このままでは、ログのローテーションの対象に*access_log.ltsvが含まれないので/etc/logrotate.d/httpd/var/log/httpd/*ltsvがローテーション対象に含まれるよう設定を追加する。

vi /etc/logrotate.d/httpd
--------------------------------------
/var/log/httpd/*log /var/log/httpd/*ltsv{
missingok
notifempty
省略
}
--------------------------------------

PHPの最新版をソースからインストール

標準パッケージの場合は/etc/httpdが設定ファイル設置場所ですが、
ソースからインストールした場合は/usr/local/apache2/が設定ファイルの設置場所になります。
configureのオプションはそれぞれの環境、要望に応じて変更してください。

yum -y install gcc libxml2-devel gcc-c++ zlib-devel
cd /usr/local/src
wget http://www.ring.gr.jp/archives/net/apache/httpd/httpd-2.2.9.tar.gz
tar zxvf httpd-2.2.9.tar.gz
cd httpd-2.2.9
./configure --with-suexec-docroot=/var/www/
make
make install
ln -s /usr/local/apache2/bin/apachectl /usr/sbin/apachectl
wget http://jp2.php.net/distributions/php-5.2.5.tar.gz
tar zxvf php-5.2.5.tar.gz
cd php-5.2.5
./configure --with-apxs2=/usr/local/apache2/bin/apxs --enable-mbstring --enable-mbstr-enc-trans --enable-mbregex --enable-cli --with-pear --with-db --with-mysql=/usr --without-sqlite --without-pdo-sqlite --with-zlib --with-libxml-dir=/usr --with-libdir=lib64
make
make install

Apache 文字化け対策 AddDefaultCharset

CentOSのyumでインストールしたApacheでは、レスポンスに追加されるメディアタイプの文字セットパラメータがUTF-8に設定されているため、metaタグでUTF-8以外のcharsetを記述していても、ブラウザで無視されてWebアプリケーションやHMTLが文字化けします。

文字化けが起こる原因は、AddDefaultCharsetディレクティブにUTF-8が設定されていることなので、httpd.confに記述されているAddDefaultCharsetの設定自体をコメントアウトします。

vi /etc/httpd/conf/httpd.conf
---------------------------
#AddDefaultCharset UTF-8
---------------------------

AddDefaultCharset自体のデフォルト値はOffのため、コメントアウトすることでOffを設定したことと同じになります。
Offにしたことを明示したい場合は、次の様に記述すると良いでしょう。

AddDefaultCharset Off

文字化けの原因

実際にこの設定で何が変わるのかを見ていきましょう。AddDefaultCharsetの設定をUTF-8、Offにした場合のレスポンスヘッダにおけるContent-Typeの変化を示します。

UTF-8と設定した場合

$ curl -I  192.168.5.10
HTTP/1.1 200 OK
Date: Mon, 17 Mar 20XX 11:34:27 GMT
Server: Apache
Last-Modified: Mon, 17 Mar 20XX 07:42:00 GMT
Accept-Ranges: bytes
Content-Length: 125
Connection: close
Content-Type: text/html; charset=UTF-8  <= charsetが必ず表示される

Offと設定するかコメントアウトした場合

$ curl -I  192.168.5.10
HTTP/1.1 200 OK
Date: Mon, 17 Mar 20XX 11:34:41 GMT
Server: Apache
Last-Modified: Mon, 17 Mar 20XX 07:42:00 GMT
Accept-Ranges: bytes
Content-Length: 125
Connection: close
Content-Type: text/html  <= charsetが表示されない

レスポンスヘッダのContent-Typeの文字コードがUTF-8となっていると、HTMLのmetaタグに設定されている文字コードがブラウザによって無視されるため、文字コードのミスマッチがあると文字化けが起こることになります。

ドキュメント: Apache AddDefaultCharset ディレクティブ

できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応 (できるPROシリーズ)
できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応 (できるPROシリーズ)
辻 秀典 渡辺 高志 鈴木 幸敏 できるシリーズ編集部

Apacheのバージョン確認方法

CentOSサーバにインストールされているapacheのバージョンをコマンドラインで確認する方法を説明します。

httpd, apachectl コマンド

httpdコマンドもしくはapachectlコマンドの-vオプションで確認できます。

# httpd -v
Server version: Apache/2.4.37 (centos)
Server built:   Jun  8 2020 20:14:33
# apachectl -v
Server version: Apache/2.4.37 (centos)
Server built:   Jun  8 2020 20:14:33

rpm, yumコマンド

CentOSサーバではapacheはhttpdパッケージとしてインストールされます。

rpmコマンド、yumコマンドにhttpdパッケージを指定する事でもapacheのバージョンを確認できます。

# rpm -q httpd
httpd-2.4.37-21.module_el8.2.0+382+15b0afa8.x86_64

yumコマンドについてはapacheがインストールされていなくても実行できます。yumコマンドでインストールできるapacheのバージョンを事前に確認できます。

# yum info httpd
Last metadata expiration check: 0:48:50 ago on Sun Jul  5 12:26:23 2020.
Installed Packages
Name         : httpd
Version      : 2.4.37
Release      : 21.module_el8.2.0+382+15b0afa8
Architecture : x86_64
Size         : 4.9 M
Source       : httpd-2.4.37-21.module_el8.2.0+382+15b0afa8.src.rpm
Repository   : @System
From repo    : AppStream
Summary      : Apache HTTP Server
URL          : https://httpd.apache.org/
License      : ASL 2.0
Description  : The Apache HTTP Server is a powerful, efficient, and extensible
             : web server.
できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応 (できるPROシリーズ)
できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応 (できるPROシリーズ)
辻 秀典 渡辺 高志 鈴木 幸敏 できるシリーズ編集部