Apacheのバーチャルホストを設定した時の直IP接続を拒否する方法

Apacheにバーチャルホストの設定をすると複数のドメインでの運用ができるようになります。ただユーザーがドメインではなくIPアドレスを直に指定してApacheにアクセスした場合、バーチャルホストの一番最初に記載されている設定が有効になります。

具体的な例で説明します。1台のWEBサーバーで www.example.com と www.hogehoge.com の2つのサイトを運営していたとします。このWEBサーバーのIPのアドレスが 192.168.1.28 だった場合、ユーザは以下のURLでアクセスができます。

http://www.example.com/index.html
http://www.hogehoge.com/index.html
http://192.168.1.28/index.html

このときのApacheのバーチャルホストの設定が以下であった場合、

<VirtualHost *:80>
  ServerName www.example.com
  :
</VirtualHost>

<VirtualHost *:80>
  ServerName www.hogehoge.com
  :
</VirtualHost>

「http://192.168.1.28/index.html」でアクセスしたリクエストには www.example.com のWEBページが表示されます(バーチャルホストの設定の先に書かれている方が有効になる)。もし www.example.com と www.hogehoge.com がまったく関係のないWEBページで、ユーザーが www.hogehoge.com を見たくてアクセスしたとしたら別のWEBページが表示されてびっくりするかもしれません。またバーチャルホストを設定して複数のWEBページを運営していることがユーザーに知られてしまいます。

ではどうするかと言うと、IPアドレスでアクセスしてきたユーザーには該当するページがないというエラーを表示させるようにします。そもそもIPアドレス直指定でアクセスするユーザーはほとんどいないと思いますが・・。

バーチャルホストの設定の最初に404へのリダイレクトの設定を追加します。以下のような感じです。

<VirtualHost *:80>
    ServerName dummy
    Redirect 404 /
</VirtualHost>

<VirtualHost *:80>
  ServerName www.example.com
  :
</VirtualHost>

<VirtualHost *:80>
  ServerName www.hogehoge.com
  :
</VirtualHost>

これでIPアドレスでアクセスしてきたユーザーにエラー画面を表示させることができます。

なお、このバーチャルホストの設定は ubuntu 18.04 LTS の Apache2(ver.2.4.29)で確認していますが、CentOS の httpd でも動作すると思います。

[広告]

= = = = = = = = = =
2021/3/7追記
2021/4/29加筆
= = = = = = = = = =
https(SSL通信)でも同じかと思い設定してみたのですが

<VirtualHost *:443>
    ServerName dummy
    Redirect 404 /
</VirtualHost>

こうすると今まで表示できていたページが表示できなくなりました。静的ページ(.html)は問題ないようですが動的ページ(.php、.cgi)が表示できません。エラーコード : SSL_ERROR_RX_RECORD_TOO_LONG らしいです。「SSL received a record that exceeded the maximum permissible length.」ともあります。

既存のページが表示されなくなってしまったので、この方法はSSL通信では使えそうにないです。他の解決法がないか調べてみたのですが良さそうなものは見つけられませんでした。

ここで終わるのも申し訳ないので(苦肉の策になりますが)専用のエラーページを設ける方法を書いておきます。

index.htmlというファイル名でエラーページを作成します(エラーページの記載は何でも良いです)。


<!DOCTYPE HTML>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<TITLE>Not Found</TITLE>
</HEAD>
<BODY>
不正なページアクセスです。
</BODY>
</HTML>

これを任意のディレクトリに格納します。今回は /var/www/html/dumy の配下にします。バーチャルホストの設定として以下を追記します。

<VirtualHost *:443>
    DocumentRoot /var/www/html/dumy
    ServerName (IPアドレス):443
</VirtualHost>

この443のバーチャルホスト設定はssl.confの一番下に追記してください。80のバーチャルホスト設定は一番上でしたが443は下です。

「https://IPアドレス」でサイトにアクセスしてみます。ブラウザによっては警告のページが表示されます。これはエラーページのサーバー証明書を用意していないからです。以下はFirefoxの例です。

詳細情報を表示すると SSL_ERROR_BAD_CERT_DOMAIN と記載されています。

これでユーザーがアクセスを諦めてくれれば良いですが無理やり続行(危険性を承知で続行)することも可能です。続行した場合は以下のエラーページが表示されます。

なお左上の赤枠ですが、ここにはファビコンが表示されます。エラーページ用のファビコンも用意したほうが良いでしょう。

Linuxのリポジトリとパッケージ管理コマンドについて

RedHat系のLinuxと、Debian系のLinuxのリポジトリ管理について書いてみようと思います。前回の記事の続きです。

まずリポジトリとは、Linuxが必要なアプリケーションを見つけ出せるようにインターネット上のどこのサーバーにアプリケーションが格納されているかを記載したファイルのことです。アプリケーションと言っても通常はパッケージとしてまとめられていて、パッケージをダウンロード、および、インストールする形になります。Linux標準のリポジトリでも不自由ない場合もありますが、最新のものを使いたかったりだとか、何か特別な機能を持つアプリを入れてみたいだとかの場合に、そのアプリが格納されているサーバーの情報をリポジトリに追加する必要があります。Linuxはリポジトリの情報を元にアプリのパッケージをダウンロードしてきます。

RedHat系(Fedora、RHEL、CentOS)ではリポジトリへの追加は「/etc/yum.repos.d」配下に「~.repo」というファイルを作成して配置します。「.repo」ファイルに記載する内容は最低限で以下となります。

[リポジトリID]
name=リポジトリ名
baseurl=パッケージを格納しているサーバーの場所

リポジトリIDはyumコマンドの実行時の「--enablerepo」、「--disablerepo」のオプションで指定します。enablerepoはリポジトリを使用する、disablerepoはリポジトリを使用しない、という意味合いです。

Debian系(Debian、ubuntu等)では「/etc/apt/sources.list」ファイルにサーバーの情報を追記するか「/etc/apt/sources.list.d」配下に「.list」ファイルを新規作成して配置するかになります。記載する内容は以下です。

deb パッケージを格納しているサーバーの場所
deb-src ソースファイルを格納しているサーバーの場所

[2019/12/27 追加・修正]
RedHat系、Debian系とも第三者のパッケージを追加することになるのでGPG公開鍵を登録して置く必要があるとのこと。そうしないとパッケージをダウンロードしたときに警告が出るみたいです。なので、以下のコマンドを先に実行しておく必要があるようです。

まずRedHat系の場合です。

GPG公開鍵を登録するコマンド
# rpm --import /etc/pki/rpm-gpg/GPG公開鍵ファイル名

登録してあるGPG公開鍵を確認するコマンド
# rpm -qai gpg-pubkey*

RedHat系ではこのコマンドを使った記憶がほとんどないのだけど、/etc/pki/rpm-gpg 配下を見てみるとGPG公開鍵ファイルが配置されていて、おそらくyumでリポジトリを追加したときに自動でGPG公開鍵の登録も行われていたのじゃないのかな?と思う。。

次にDebian系の場合です。

GPG公開鍵を登録するコマンド
# wget -q GPG公開鍵が配置されているサーバーの場所
# apt-key add ダウンロードしたGPG公開鍵ファイル名

登録してあるGPG公開鍵を確認するコマンド
# apt-key list

ubuntuにWEBサーバーのnginxをインストールする際は手動でGPG公開鍵の登録が必要みたいです。

最後に、RedHat系とDebian系のパッケージ管理コマンドの対比を載せておきます。

操作 RedHat系 Debian系
インストール yum install 〜 apt install 〜
アンインストール yum remove 〜 apt remove 〜
パッケージリストの更新 apt update
アップデート yum update apt upgrade
パッケージの検索 yum search 〜 apt search 〜
パッケージの情報表示 yum info 〜 apt show 〜
インストール済みパッケージの表示 yum list installed dpkg -l
アップデート可能なパッケージの表示 yum list updates
不要パッケージの削除 apt autoremove
インストーラーパッケージの削除 apt clean

「パッケージリストの更新」だけれど、Debian系ではOSの内部でパッケージに関わる情報のリストを持っていてその更新を行っている模様。なのでDebian系の場合はインストールやアップデートを行う場合は「apt update」を事前に行ったほうが良さそうです。

また「インストール済みパッケージの表示」について、Debian系では「apt list --installed」というのも使えます。ただパイプを使ってgrepと組み合わせると以下のようなワーニングが出るのでご注意を(結果が出力されないわけではない)。「dpkg -l」はパイプを使ってもワーニングは出ません。

$ apt list --installed | grep php
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.