開発者ドキュメント

FreeBSD12.0でApacheHTTPを強化するための推奨手順

著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。

序章

Apache HTTP サーバーのデフォルトのインストールはすでに安全に使用できますが、いくつかの変更を加えることで、その構成を大幅に改善できます。 たとえば、Cookieとヘッダーの周囲に保護を設定することで、既存のセキュリティメカニズムを補完できるため、ユーザーのクライアントレベルで接続が改ざんされることはありません。 これを行うことにより、クロスサイトスクリプティング攻撃(XSSとも呼ばれます)などのいくつかの攻撃方法の可能性を劇的に減らすことができます。 クロスサイトリクエストフォージェリ、セッションハイジャック、サービス拒否攻撃など、他の種類の攻撃を防ぐこともできます。

このチュートリアルでは、サーバー上の公開される情報の量を減らすためのいくつかの推奨手順を実装します。 ディレクトリリストを確認し、インデックス作成を無効にして、リソースへのアクセスを確認します。 また、timeoutディレクティブのデフォルト値を変更して、サービス拒否タイプの攻撃を軽減します。 さらに、TRACEメソッドを無効にして、セッションを元に戻したりハイジャックしたりできないようにします。 最後に、ヘッダーとCookieを保護します。

ほとんどの構成設定は、/usr/local/etc/apache24/httpd.confにあるApacheHTTPメイン構成ファイルに適用されます。

前提条件

このガイドを開始する前に、次のものが必要です。

前提条件が整っていると、主要なCMSソフトウェアなど、PHPで記述されたものを使用してWebコンテンツを提供できるスタックを上に備えたFreeBSDシステムができます。 さらに、Let’sEncryptを使用して安全な接続を暗号化しました。

サーバー情報の削減

オペレーティングシステムバナーは、コンピュータ、サーバー、およびあらゆる種類のデバイスがネットワークに表示するために使用する方法です。 悪意のある攻撃者は、この情報を使用して、関連するシステムを悪用する可能性があります。 このセクションでは、このバナーによって公開される情報の量を減らします。

ディレクティブのセットは、この情報の表示方法を制御します。 この目的のために、ServerTokensディレクティブが重要です。 デフォルトでは、オペレーティングシステムとコンパイルされたモジュールに関するすべての詳細が、それに接続しているクライアントに表示されます。

ネットワークスキャン用のツールを使用して、変更を適用する前に、現在公開されている情報を確認します。 nmapをインストールするには、次のコマンドを実行します。

  1. sudo pkg install nmap

サーバーのIPアドレスを取得するには、次のコマンドを実行できます。

  1. ifconfig vtnet0 | awk '/inet / {print $2}'

次のコマンドを使用して、Webサーバーの応答を確認できます。

  1. nmap -sV -p 80 your-server-ip

nmapを呼び出してスキャンを行い(したがって-sフラグ)、ポート80-pフラグ)指定されたIPまたはドメイン。

次のようなWebサーバーに関する情報を受け取ります。

Output
Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-22 00:30 CET Nmap scan report for 206.189.123.232 Host is up (0.054s latency). PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.41 ((FreeBSD) OpenSSL/1.1.1d-freebsd Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 7.59 seconds

この出力は、オペレーティングシステム、Apache HTTPバージョン、OpenSSLなどの情報が表示されていることを示しています。 これは、攻撃者がサーバーに関する情報を入手し、サーバーで実行されているソフトウェアの脆弱性など、悪用する適切なツールを選択するのに役立ちます。

ServerTokensディレクティブはデフォルトで構成されていないため、メイン構成ファイルに配置します。 この構成がないため、Apache HTTPは、ドキュメントに記載されているようにサーバーに関する完全な情報を表示します。 サーバーと構成に関して公開される情報を制限するには、メイン構成ファイル内にServerTokensディレクティブを配置します。

このディレクティブは、構成ファイルのServerNameエントリの後に配置します。 次のコマンドを実行して、ディレクティブを見つけます

  1. grep -n 'ServerName' /usr/local/etc/apache24/httpd.conf

viで検索できる行番号が見つかります。

Output
226 #ServerName www.example.com:80

次のコマンドを実行します。

  1. sudo vi +226 /usr/local/etc/apache24/httpd.conf

次の強調表示された行を追加します。

/usr/local/etc/apache24/httpd.conf
. . .
#ServerName www.example.com:80
ServerTokens Prod

:wqおよびENTERを使用してファイルを保存して終了します。

ServerTokensディレクティブをProdに設定すると、これがApacheWebサーバーであることがのみ表示されます。

これを有効にするには、ApacheHTTPサーバーを再起動します。

  1. sudo apachectl restart

変更をテストするには、次のコマンドを実行します。

  1. nmap -sV -p 80 your-server-ip

次のような出力が表示されますが、ApacheWebサーバーに関する情報は最小限に抑えられています。

Output
Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-22 00:58 CET Nmap scan report for WPressBSD (206.189.123.232) Host is up (0.056s latency). PORT STATE SERVICE VERSION 80/tcp open http Apache httpd Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 7.59 seconds

変更前にサーバーが発表していた情報を確認し、これを最小限に抑えました。 これにより、サーバーに関する手がかりを外部のアクターに提供することが少なくなります。 次のステップでは、Webサーバーのディレクトリリストを管理します。

ディレクトリリストの管理

この手順では、ディレクトリリストが正しく構成されていることを確認します。これにより、システムの適切な部分が意図したとおりに公開され、残りの部分は保護されます。

注:引数が宣言されるとアクティブになりますが、+は、実際に有効になっていることを視覚的に補強できます。 マイナス記号-が配置されると、引数は拒否されます(例:Options -Indexes)。

+および/または-の引数を混在させることはできません。これは、Apache HTTPでは不正な構文と見なされ、起動時に拒否される可能性があります。

ステートメントOptions -Indexesを追加すると、.htmlファイルが存在しない場合、データパス/usr/local/www/apache24/data内のコンテンツが自動的にインデックス付けされないように設定されます(読み取りリスト)。 、およびURLがこのディレクトリをマップするかどうかは表示されません。 これは、Let’sEncrypt証明書の前提条件チュートリアルで使用されているような仮想ホスト構成を使用する場合にも当てはまります。

Options ディレクティブは、-Indexes引数と+FollowSymLinksディレクティブを使用して設定します。これにより、シンボリックリンクをたどることができます。 ApacheのHTTP規則に準拠するために、+記号を使用します。

次のコマンドを実行して、構成ファイルで編集する行を見つけます。

  1. grep -n 'Options Indexes FollowSymLinks' /usr/local/etc/apache24/httpd.conf

次のような出力が表示されます。

Output
263 : Options Indexes FollowSymLinks

次のコマンドを実行して、編集する行に直接アクセスします。

  1. sudo vi +263 /usr/local/etc/apache24/httpd.conf

次に、構成に従って行を編集します。

/usr/local/etc/apache24/httpd.conf
. . .
#
Options -Indexes +FollowSymLinks

#
. . .

:wqおよびENTERを使用してファイルを保存して終了します。

Apache HTTPを再起動して、次の変更を実装します。

  1. sudo apachectl restart

ブラウザのドメインに、403エラーとも呼ばれるアクセス禁止メッセージが表示されます。 これは、適用した変更によるものです。 -IndexesOptionsディレクティブに配置すると、Apache HTTPの自動インデックス機能が無効になるため、データパス内にindex.htmlファイルがありません。

これを解決するには、Let’sEncrypt証明書の前提条件チュートリアルで有効にしたVirtualHost内にindex.htmlファイルを配置します。 Apache HTTP内のデフォルトのブロックを使用し、仮想ホストで宣言したDocumentRootと同じフォルダーに配置します。

/usr/local/etc/apache24/extra/httpd-vhosts.conf
<VirtualHost *:80>
    ServerAdmin your_email@your_domain.com
    DocumentRoot "/usr/local/www/apache24/data/your_domain.com"
    ServerName your_domain.com
    ServerAlias www.your_domain.com
    ErrorLog "/var/log/your_domain.com-error_log"
    CustomLog "/var/log/your_domain.com-access_log" common
</VirtualHost>

これを行うには、次のコマンドを使用します。

  1. sudo cp /usr/local/www/apache24/data/index.html /usr/local/www/apache24/data/your_domain.com/index.html

これで、ドメインにアクセスすると動作します!メッセージが表示されます。

このセクションでは、Indexesディレクティブに制限を設定して、意図したもの以外のコンテンツを自動的に参加させて表示しないようにしました。 これで、データパス内にindex.htmlファイルがない場合、ApacheHTTPはコンテンツのインデックスを自動的に作成しません。 次のステップでは、情報を曖昧にするだけでなく、さまざまなディレクティブをカスタマイズします。

タイムアウトディレクティブ値の削減

Timeoutディレクティブは、ApacheHTTPが接続要求に失敗する前に新しい入力/出力を待機する時間の制限を設定します。 この障害は、パケットがサーバーに到着しない、データがクライアントによって受信されたことが確認されないなど、さまざまな状況が原因で発生する可能性があります。

デフォルトでは、タイムアウトは60秒に設定されています。 インターネットサービスが遅い環境では、このデフォルト値が賢明かもしれませんが、特にサーバーがより高速なインターネットサービスでユーザーのターゲットをカバーしている場合、1分はかなり長い時間です。 さらに、サーバーが接続を閉じていない時間を悪用して、サービス拒否攻撃(DoS)を実行する可能性があります。 これらの悪意のある接続のフラッドが発生すると、サーバーはつまずき、飽和状態になり、応答しなくなる可能性があります。

値を変更するには、httpd-default.confファイルにTimeoutエントリがあります。

  1. grep -n 'Timeout' /usr/local/etc/apache24/extra/httpd-default.conf

次のような出力が表示されます。

Output
8 # Timeout: The number of seconds before receives and sends time out. 10 Timeout 60 26 # KeepAliveTimeout: Number of seconds to wait for the next request from the 29 KeepAliveTimeout 5 89 RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

出力行の10は、Timeoutディレクティブ値を設定します。 この行に直接アクセスするには、次のコマンドを実行します。

  1. sudo vi +10 /usr/local/etc/apache24/extra/httpd-default.conf

たとえば、次のように30秒に変更します。

/usr/local/etc/apache24/extra/httpd-default.conf
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 30

:wqおよびENTERを使用してファイルを保存して終了します。

Timeoutディレクティブの値は、これらのイベントが正当で成功した接続を可能にするのに十分な長さであるが、望ましくない接続の試行を防ぐのに十分短い時間範囲のバランスをとる必要があります。

注:サービス拒否攻撃は、サーバーのリソースを非常に効果的に枯渇させる可能性があります。 補完的で非常に有能な対策は、スレッド化されたMPMを使用して、ApacheHTTPが接続とプロセスを処理する方法から最高のパフォーマンスを引き出すことです。 このチュートリアルFreeBSD12.0でMPMイベントとPHP-FPMを使用してApacheHTTPを設定する方法では、この機能を有効にする手順があります。

この変更を有効にするには、ApacheHTTPサーバーを再起動します。

  1. sudo apachectl restart

DoS攻撃を部分的に軽減するために、Timeoutディレクティブのデフォルト値を変更しました。

TRACEメソッドを無効にする

ハイパーテキストトランスポートプロトコルは、クライアントサーバーモデルに従って開発されたため、プロトコルには、サーバーとの間で情報を取得または配置するための要求メソッドがあります。 サーバーは、これらのメソッドのセットとそれらの間の相互作用を理解する必要があります。 このステップでは、必要最小限のメソッドを構成します。

無害と見なされていたTRACEメソッドを利用して、クロスサイトトレーシング攻撃を実行しました。 これらのタイプの攻撃により、悪意のある攻撃者はその方法でユーザーセッションを盗むことができます。 このメソッドは、サーバーがクライアントから最初に送信されたものと同じ要求を返すことにより、デバッグ目的で設計されました。 ブラウザのセッションからのCookieがサーバーに送信されるため、Cookieは再度返送されます。 ただし、これは悪意のある攻撃者によって傍受される可能性があります。悪意のある攻撃者は、ブラウザの接続を元のサーバーではなく、制御しているサイトにリダイレクトできます。

TRACEメソッドは誤用される可能性があるため、本番環境ではなくデバッグにのみ使用することをお勧めします。 このセクションでは、このメソッドを無効にします。

次のコマンドでhttpd.confファイルを編集し、Gを押してファイルの最後に到達します。

  1. sudo vi /usr/local/etc/apache24/httpd.conf

ファイルの最後に次のエントリパスを追加します。

/usr/local/etc/apache24/httpd.conf
. . .
TraceEnable off

ApacheHTTPWebサーバーで使用するメソッドのみを指定することをお勧めします。 これは、悪意のある攻撃者の潜在的なエントリポイントを制限するのに役立ちます。

LimitExcept は、宣言されているメソッド以外のメソッドを許可しないため、この目的に役立ちます。 たとえば、次のような構成を確立できます。

/usr/local/etc/apache24/httpd.conf
DocumentRoot "/usr/local/www/apache24/data"
<Directory "/usr/local/www/apache24/data">
    Options -Indexes +FollowSymLinks -Includes
    AllowOverride none
     <LimitExcept GET POST HEAD>
       deny from all
    </LimitExcept>
    Require all granted
</Directory>

LimitExceptディレクティブ内で宣言されているように、GET、POST、およびHEADメソッドのみが構成で許可されます。

次のコマンドを使用して、LimitExceptブロックをファイル内に配置します。

  1. sudo vi +272 /usr/local/etc/apache24/httpd.conf

この構成を設定するには、コンテンツが読み取られるDocumentRootディレクティブエントリ、より具体的にはDirectoryエントリ内に次のブロックを配置します。

/usr/local/etc/apache24/httpd.conf
. . .
<LimitExcept GET POST HEAD>
   deny from all
</LimitExcept>
. . .

変更を適用するには、ApacheHTTPを再起動します。

  1. sudo apachectl restart

新しいディレクティブAllowedMethodsは同様の機能を提供しますが、そのステータスはまだ実験段階です。

HTTPメソッドとは何か、それらの使用法、TRACEメソッドを利用した悪意のあるアクティビティからの保護、および使用するメソッドの宣言方法を確認しました。 次に、HTTPヘッダーとCookie専用の保護機能をさらに強化します。

ヘッダーとCookieの保護

このステップでは、ApacheHTTPWebサーバーにアクセスしたときにクライアントマシンが開くセッションを保護するための特定のディレクティブを設定します。 これにより、サーバーが不要なコンテンツをロードせず、暗号化がダウングレードされず、コンテンツスニッフィングが回避されます。

Headers は、requestsメソッドのコンポーネントです。 認証、サーバーとクライアント間の通信、キャッシュ、コンテンツネゴシエーションなどを調整するためのヘッダーがあります。

Cookieは、サーバーからブラウザに送信される情報の一部です。 これらのビットにより、サーバーはあるコンピューターから別のコンピューターへのクライアントブラウザーを認識できます。 また、サーバーがユーザーセッションを認識できるようにします。 たとえば、ログインしたユーザーのショッピングカート、支払い情報、履歴などを追跡できます。 HTTPはステートレスプロトコルであるため、Cookieはクライアントのウェブブラウザで使用および保持されます。つまり、接続が閉じられると、サーバーは1つのクライアントまたは別のクライアントから送信された要求を記憶しません。

ヘッダーとCookieは、WebブラウザクライアントとWebサーバー間の通信を提供するため、保護することが重要です。

headersモジュールはデフォルトでアクティブになっています。 ロードされているかどうかを確認するには、次のコマンドを使用します。

  1. sudo apachectl -M | grep 'headers'

次の出力が表示されます。

Output
headers_module (shared)

出力が表示されない場合は、モジュールがApacheのhttpd.confファイル内でアクティブ化されているかどうかを確認してください。

  1. grep -n 'mod_headers' /usr/local/etc/apache24/httpd.conf

出力として、ヘッダーの特定のモジュールを参照するコメントされていない行が表示されます。

/usr/local/etc/apache24/httpd.conf
. . .
122  LoadModule headers_module libexec/apache24/mod_headers.so
. . .

mod_headers.so行の先頭にあるハッシュタグが存在する場合はそれを削除して、ディレクティブをアクティブにします。

次のApacheHTTPディレクティブを利用することで、ヘッダーとCookieを悪意のあるアクティビティから保護し、クライアントとサーバーのリスクを軽減します。

次に、ヘッダーの保護を設定します。 これらすべてのヘッダー値を1つのブロックに配置します。 これらの値を必要に応じて適用することを選択できますが、すべてをお勧めします。

次のコマンドでhttpd.confファイルを編集し、Gを押してファイルの最後に到達します。

  1. sudo vi /usr/local/etc/apache24/httpd.conf

ファイルの最後に次のブロックを配置します。

/usr/local/etc/apache24/httpd.conf
. . .
<IfModule mod_headers.c>
  # Add security and privacy related headers
  Header set Content-Security-Policy "default-src 'self'; upgrade-insecure-requests;"
  Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
  Header always edit Set-Cookie (.*) "$1; HttpOnly; Secure"
  Header set X-Content-Type-Options "nosniff"
  Header set X-XSS-Protection "1; mode=block"
  Header set Referrer-Policy "strict-origin"
  Header set X-Frame-Options: "deny"
  SetEnv modHeadersAvailable true
</IfModule>

次に、変更を有効にするためにApacheを再起動します。

  1. sudo apachectl restart

構成設定のセキュリティレベルを確認するには、セキュリティヘッダーのWebサイトにアクセスしてください。 このチュートリアルの手順に従うと、ドメインはAグレードを獲得します。

注: https://securityheaders.com/にアクセスしてヘッダーを確認し、Fグレードを取得した場合、DocumentRoot。 ヘッダーをチェックすると、AまたはFとは異なるグレードが得られる場合は、各Header set行をチェックして、ダウングレードの原因となった可能性のあるスペルミスを探します。

このステップでは、ヘッダーとCookieのセキュリティを向上させるために、最大7つの設定を使用しました。 これらは、クロスサイトスクリプティング、クリックジャッキング、およびその他の種類の攻撃を防ぐのに役立ちます。

結論

このチュートリアルでは、重要な機能の代替構成設定を設定することにより、情報の開示からセッションの保護まで、いくつかのセキュリティの側面について説明しました。

Apacheの強化に関するその他のリソースについては、他の参考資料をご覧ください。

Apache HTTPを保護するための追加ツールの場合:

モバイルバージョンを終了