さくらVPS上でLAMP環境を構築した際の覚書です。
すでに、VPS上でUbuntu Server 18.04がインストールされた直後、という条件で設定をしていきます。

今回は、Apache2.4のインストールと、関連する部分の設定をします。

apache logo

ゴール

  • Apache2.4を使用する
  • 各種セキュリティ設定を実施する
  • デフォルトのサイトでSSLを使用(https)
  • 80番ポートへのアクセス(http)は、全てhttpsへリダイレクトする
  • 証明書は、デフォルトでインストールされている証明書(自己認証証明書)を仮に使用する

Apacheのインストール

Ubuntuのパッケージからインストールします。

セキュリティの設定

ApacheとOSのバージョン情報を隠蔽する

Apacheと、OSのバージョン情報が外部からは見えないようにします。

IndexesとFollowSymLinksオプションを無効に

インストール直後は有効になっている、IndexesFollowSymlinksの2つのオプションを無効にします。

Indexesオプションは、有効なページがなかった場合に、そのディレクトリのファイルやディレクトリの一覧を表示するので、全体でOffにし、FollowSymLinksは、個別のロケーションで有効にします。

mod_securityを利用する

https://www.linode.com/docs/web-servers/apache-tips-and-tricks/configure-modsecurity-on-apache/
オープンソースのウェブアプリケーションファイアウォール (WAF) である、mod_securityをインストールします。

デフォルトのルールセットを、GitHubから取得する

  • 既存のディレクトリの名前を変更する

  • 新しいルールセットをGitHubからクローン

  • サンプルのコンフィグファイルをコピー

  • これらのコンフィグを有効にするために、/etc/apache2/mods-enabled/security2.confに、次の項目を追加する

  • Apacheを再起動させる

テスト

/etc/apache2/sites-enabled/000-default.confを編集して、次の<IfModule security2_module>...</IfModule>を追加する。

  • Apacheを再起動させる

  • curlのインストール

  • curlで次のように実行し、レスポンスに403が返ってくるか確認。

また、/var/log/apache2/errors.logに次のようなログが残っていることを確認する。

再度、curlで次のように実行し、同じく403が返ってくるのを確認。

また、/var/log/apache2/errors.logには次のように記録されます。

一通りテストができたら、000-default.conf<IfModule security2_module>...</IfModule>は、削除しておいてください。

mod_evasiveを利用する

mod_evasiveは、Apacheのモジュールで、DDoS/DoS攻撃やブルートフォース攻撃を回避するための機能を提供しています。また、そういった攻撃を検知した場合、メールやsyslogで報告されます。

mod_evasiveのインストール

途中、Postfix Configurationの画面が出てきたときは、[No configuration]を選択。

  • 動作を確認

  • /etc/apache2/mods-available/evasive.confを編集し、コメントを解除します。

  • ログを保存するディレクトリを作成

  • Apacheを再起動する

各項目の説明

DOSHashTableSize
ハッシュテーブルのサイズ。大きければパフォーマンスがアップする代わりに、メモリ消費が多くなります。
DOSPageCount
PageIntervalの間に、同じページやURIにリクエストした回数の閾値。閾値を超えると、クライアントのIPアドレスがブロックリストに追加されます。
DOSSiteCount
SiteIntervalの間に、同じリスナーの同じクライアントによるリクエストの総数の閾値です。閾値を超えると、クライアントのIPアドレスがブロックリストに追加されます。
DOSPageInterval
ページカウントの閾値のための間隔。デフォルトは1秒
DOSSiteInterval
サイトカウントの閾値のための間隔。デフォルトは1秒
DOSBlockingPeriod
ブロックされたクライアントが接続をブロックされる期間(秒)。ブロックされている間は、403を返します。ブロック中に再度リクエストするとタイマーはさらに、指定された秒数にリセットされます。
DOSSystemCommand
IPアドレスがブラックリストに登録される度に、ここで指定されたコマンドを実行します。
DOSEmailNotify
IPアドレスがブラックリストに登録される度に、指定されたメールアドレスにメールを送信します。
DOSLogDir
ログの保存先。デフォルトは/tmp
DOSWhitelist
信頼されているクライアントのIPアドレス。

テスト

ネットで調べたとおりにテストを実行してみます。
テストには、test.plを使用します。

ところが、このように期待した結果が出ません。
本来は、HTTP/1.1 200 OKが何行か表示された後に、HTTP/1.1 403 Forbiddenが連続して表示されるのですが、この場合は400 Bad Requestとなっています。

以下のようにするとテストできます(https://qiita.com/crazyhacks/items/2cfc36be38846d1406cf)。

最初に数回は、ステータス200番を返していたものが、途中から403番に変わっています。

次に、ブロックした際に作成されたログファイルを確認します。

このようにdos-IPアドレスという形で残っています。
念の為、localhostからのアクセスは拒否しないように、/etc/apache2/mods-available/evasive.conf

を追加しておきます。

TRACE リクエストの無効化

Cross-Site Tracing(XST) 対策のためにTRACEメソッドを無効にします。

  • TraceEnableOffか確認する(デフォルトでOffのはずです)。

  • Apacheを再起動させる
  • TRACEが無効になっているのを確認

HTTPの場合は、curl -v -X TRACE [URL]

HTTPSの場合は、curl --insecure -v -X TRACE [URL]

Method Not Allowedと出ていればOK

クリックジャッキング対策

  • mod_headersを有効にする。

  • /etc/apache2/conf-available/security.confHeader set X-Frame-Options:の値を"sameorigins"にする(コメントを解除する)。

apache2 を再起動

SSLを有効に

httpの通信をSSL/TLSで暗号化された経路でのみ受け付けるようにします。

モジュールを有効に

mod_rewirte

mod_ssl

httpへのリクエストをhttpsにリダイレクト

80番ポートへのhttpリクエストをすべて、443番にリダイレクトします。
/etc/apache2/sites-available/000-default.confに、次のように変更する。

ここでは、RewriteEngine Onでmod_rewriteモジュールを有効にしてURLの書き換えをできるようにしています。

意味は:
RewriteCond %{HTTPS} offで「コネクションがSSL/TLSを利用していない場合」に次の行に処理を渡します。
次の行、RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]では、すべてのリクエスト(^(.*)$)を、R=301、要するにリダイレクトし、リダイレクト先を元のリクエストURLのhttpの部分をhttpsに書き換えたURLにして、Lで処理を終了、と読みます。

証明書とキーの指定

/etc/apache2/sites-available/default-ssl.confの次の項目に、証明書とキーのファイルを指定します。

ここでは、インストール時に付属してくる自己認証の証明書とキーを使用していますが、本番サイトでは、正式な認証局から取得した証明書とキーを使用します。

サイトを有効化

000-default.confと、default-ssl.confを有効にする。(000-default.confはすでに有効になっているはず)

apacheを再起動します。

リダイレクトをテスト

curl -I http://localhost/として確認。

HTTP/1.1 301 Moved Permanetlyと表示されていればOK。

実際にリダイレクト出来たかどうかを確認する場合は、curl -IL --insecure http://localhostとします。

で、まずhttpによるアクセスで、301 Moved Permanetryでリダイレクトされ、その次に200 OK と出ています。

自己認証局の証明書等を使用している場合、curlはエラーを吐いて止まるので、--insecureオプションを付けて下さい

ファイアウォールの設定

ポートの80/tcp443/tcpを開放します。

最後に、実際のURLに接続してApache2 Ubuntu Default Pageが表示されるか確認します。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です