著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。
序章
Apache HTTP サーバーのデフォルトのインストールはすでに安全に使用できますが、いくつかの変更を加えることで、その構成を大幅に改善できます。 たとえば、Cookieとヘッダーの周囲に保護を設定することで、既存のセキュリティメカニズムを補完できるため、ユーザーのクライアントレベルで接続が改ざんされることはありません。 これを行うことにより、クロスサイトスクリプティング攻撃(XSSとも呼ばれます)などのいくつかの攻撃方法の可能性を劇的に減らすことができます。 クロスサイトリクエストフォージェリ、セッションハイジャック、サービス拒否攻撃など、他の種類の攻撃を防ぐこともできます。
このチュートリアルでは、サーバー上の公開される情報の量を減らすためのいくつかの推奨手順を実装します。 ディレクトリリストを確認し、インデックス作成を無効にして、リソースへのアクセスを確認します。 また、timeout
ディレクティブのデフォルト値を変更して、サービス拒否タイプの攻撃を軽減します。 さらに、TRACEメソッドを無効にして、セッションを元に戻したりハイジャックしたりできないようにします。 最後に、ヘッダーとCookieを保護します。
ほとんどの構成設定は、/usr/local/etc/apache24/httpd.conf
にあるApacheHTTPメイン構成ファイルに適用されます。
前提条件
このガイドを開始する前に、次のものが必要です。
-
FreeBSDの使用を開始する方法に関するこのチュートリアルに従ってセットアップされたFreeBSD12サーバー。
-
新しいFreeBSD12.0サーバーの推奨手順の記事のファイアウォールセクションの設定に従って設定されたファイアウォール。
-
FreeBSD 12.0 チュートリアルにApache、MySQL、およびPHP(FAMP)スタックをインストールする方法に従ってインストールされた完全なFAMPスタック。
-
チュートリアルFreeBSDでLet’sEncryptを使用してApacheを保護する方法に従ってインストールされたLet’sEncrypt証明書。
前提条件が整っていると、主要なCMSソフトウェアなど、PHPで記述されたものを使用してWebコンテンツを提供できるスタックを上に備えたFreeBSDシステムができます。 さらに、Let’sEncryptを使用して安全な接続を暗号化しました。
サーバー情報の削減
オペレーティングシステムバナーは、コンピュータ、サーバー、およびあらゆる種類のデバイスがネットワークに表示するために使用する方法です。 悪意のある攻撃者は、この情報を使用して、関連するシステムを悪用する可能性があります。 このセクションでは、このバナーによって公開される情報の量を減らします。
ディレクティブのセットは、この情報の表示方法を制御します。 この目的のために、ServerTokensディレクティブが重要です。 デフォルトでは、オペレーティングシステムとコンパイルされたモジュールに関するすべての詳細が、それに接続しているクライアントに表示されます。
ネットワークスキャン用のツールを使用して、変更を適用する前に、現在公開されている情報を確認します。 nmap
をインストールするには、次のコマンドを実行します。
- sudo pkg install nmap
サーバーのIPアドレスを取得するには、次のコマンドを実行できます。
- ifconfig vtnet0 | awk '/inet / {print $2}'
次のコマンドを使用して、Webサーバーの応答を確認できます。
- nmap -sV -p 80 your-server-ip
nmap
を呼び出してスキャンを行い(したがって-s
フラグ)、ポート80
(-p
フラグ)指定されたIPまたはドメイン。
次のようなWebサーバーに関する情報を受け取ります。
OutputStarting 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
エントリの後に配置します。 次のコマンドを実行して、ディレクティブを見つけます
- grep -n 'ServerName' /usr/local/etc/apache24/httpd.conf
vi
で検索できる行番号が見つかります。
Output226 #ServerName www.example.com:80
次のコマンドを実行します。
- sudo vi +226 /usr/local/etc/apache24/httpd.conf
次の強調表示された行を追加します。
. . .
#ServerName www.example.com:80
ServerTokens Prod
:wq
およびENTER
を使用してファイルを保存して終了します。
ServerTokens
ディレクティブをProd
に設定すると、これがApacheWebサーバーであることがのみ表示されます。
これを有効にするには、ApacheHTTPサーバーを再起動します。
- sudo apachectl restart
変更をテストするには、次のコマンドを実行します。
- nmap -sV -p 80 your-server-ip
次のような出力が表示されますが、ApacheWebサーバーに関する情報は最小限に抑えられています。
OutputStarting 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規則に準拠するために、+
記号を使用します。
次のコマンドを実行して、構成ファイルで編集する行を見つけます。
- grep -n 'Options Indexes FollowSymLinks' /usr/local/etc/apache24/httpd.conf
次のような出力が表示されます。
Output263 : Options Indexes FollowSymLinks
次のコマンドを実行して、編集する行に直接アクセスします。
- sudo vi +263 /usr/local/etc/apache24/httpd.conf
次に、構成に従って行を編集します。
. . .
#
Options -Indexes +FollowSymLinks
#
. . .
:wq
およびENTER
を使用してファイルを保存して終了します。
Apache HTTPを再起動して、次の変更を実装します。
- sudo apachectl restart
ブラウザのドメインに、403エラーとも呼ばれるアクセス禁止メッセージが表示されます。 これは、適用した変更によるものです。 -Indexes
をOptions
ディレクティブに配置すると、Apache HTTPの自動インデックス機能が無効になるため、データパス内にindex.html
ファイルがありません。
これを解決するには、Let’sEncrypt証明書の前提条件チュートリアルで有効にしたVirtualHost
内にindex.html
ファイルを配置します。 Apache HTTP内のデフォルトのブロックを使用し、仮想ホストで宣言したDocumentRoot
と同じフォルダーに配置します。
<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>
これを行うには、次のコマンドを使用します。
- 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
エントリがあります。
- 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
ディレクティブ値を設定します。 この行に直接アクセスするには、次のコマンドを実行します。
- sudo vi +10 /usr/local/etc/apache24/extra/httpd-default.conf
たとえば、次のように30
秒に変更します。
#
# 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サーバーを再起動します。
- sudo apachectl restart
DoS攻撃を部分的に軽減するために、Timeout
ディレクティブのデフォルト値を変更しました。
TRACEメソッドを無効にする
ハイパーテキストトランスポートプロトコルは、クライアントサーバーモデルに従って開発されたため、プロトコルには、サーバーとの間で情報を取得または配置するための要求メソッドがあります。 サーバーは、これらのメソッドのセットとそれらの間の相互作用を理解する必要があります。 このステップでは、必要最小限のメソッドを構成します。
無害と見なされていたTRACEメソッドを利用して、クロスサイトトレーシング攻撃を実行しました。 これらのタイプの攻撃により、悪意のある攻撃者はその方法でユーザーセッションを盗むことができます。 このメソッドは、サーバーがクライアントから最初に送信されたものと同じ要求を返すことにより、デバッグ目的で設計されました。 ブラウザのセッションからのCookieがサーバーに送信されるため、Cookieは再度返送されます。 ただし、これは悪意のある攻撃者によって傍受される可能性があります。悪意のある攻撃者は、ブラウザの接続を元のサーバーではなく、制御しているサイトにリダイレクトできます。
TRACEメソッドは誤用される可能性があるため、本番環境ではなくデバッグにのみ使用することをお勧めします。 このセクションでは、このメソッドを無効にします。
次のコマンドでhttpd.conf
ファイルを編集し、G
を押してファイルの最後に到達します。
- sudo vi /usr/local/etc/apache24/httpd.conf
ファイルの最後に次のエントリパスを追加します。
. . .
TraceEnable off
ApacheHTTPWebサーバーで使用するメソッドのみを指定することをお勧めします。 これは、悪意のある攻撃者の潜在的なエントリポイントを制限するのに役立ちます。
LimitExcept は、宣言されているメソッド以外のメソッドを許可しないため、この目的に役立ちます。 たとえば、次のような構成を確立できます。
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メソッドのみが構成で許可されます。
GET
メソッドはHTTPプロトコルの一部であり、データを取得するために使用されます。POST
メソッドもHTTPプロトコルの一部であり、サーバーにデータを送信するために使用されます。HEAD
メソッドはGET
に似ていますが、これには応答本体がありません。
次のコマンドを使用して、LimitExcept
ブロックをファイル内に配置します。
- sudo vi +272 /usr/local/etc/apache24/httpd.conf
この構成を設定するには、コンテンツが読み取られるDocumentRoot
ディレクティブエントリ、より具体的にはDirectory
エントリ内に次のブロックを配置します。
. . .
<LimitExcept GET POST HEAD>
deny from all
</LimitExcept>
. . .
変更を適用するには、ApacheHTTPを再起動します。
- sudo apachectl restart
新しいディレクティブAllowedMethodsは同様の機能を提供しますが、そのステータスはまだ実験段階です。
HTTPメソッドとは何か、それらの使用法、TRACEメソッドを利用した悪意のあるアクティビティからの保護、および使用するメソッドの宣言方法を確認しました。 次に、HTTPヘッダーとCookie専用の保護機能をさらに強化します。
ヘッダーとCookieの保護
このステップでは、ApacheHTTPWebサーバーにアクセスしたときにクライアントマシンが開くセッションを保護するための特定のディレクティブを設定します。 これにより、サーバーが不要なコンテンツをロードせず、暗号化がダウングレードされず、コンテンツスニッフィングが回避されます。
Headers は、requestsメソッドのコンポーネントです。 認証、サーバーとクライアント間の通信、キャッシュ、コンテンツネゴシエーションなどを調整するためのヘッダーがあります。
Cookieは、サーバーからブラウザに送信される情報の一部です。 これらのビットにより、サーバーはあるコンピューターから別のコンピューターへのクライアントブラウザーを認識できます。 また、サーバーがユーザーセッションを認識できるようにします。 たとえば、ログインしたユーザーのショッピングカート、支払い情報、履歴などを追跡できます。 HTTPはステートレスプロトコルであるため、Cookieはクライアントのウェブブラウザで使用および保持されます。つまり、接続が閉じられると、サーバーは1つのクライアントまたは別のクライアントから送信された要求を記憶しません。
ヘッダーとCookieは、WebブラウザクライアントとWebサーバー間の通信を提供するため、保護することが重要です。
headers
モジュールはデフォルトでアクティブになっています。 ロードされているかどうかを確認するには、次のコマンドを使用します。
- sudo apachectl -M | grep 'headers'
次の出力が表示されます。
Outputheaders_module (shared)
出力が表示されない場合は、モジュールがApacheのhttpd.conf
ファイル内でアクティブ化されているかどうかを確認してください。
- grep -n 'mod_headers' /usr/local/etc/apache24/httpd.conf
出力として、ヘッダーの特定のモジュールを参照するコメントされていない行が表示されます。
. . .
122 LoadModule headers_module libexec/apache24/mod_headers.so
. . .
mod_headers.so
行の先頭にあるハッシュタグが存在する場合はそれを削除して、ディレクティブをアクティブにします。
次のApacheHTTPディレクティブを利用することで、ヘッダーとCookieを悪意のあるアクティビティから保護し、クライアントとサーバーのリスクを軽減します。
次に、ヘッダーの保護を設定します。 これらすべてのヘッダー値を1つのブロックに配置します。 これらの値を必要に応じて適用することを選択できますが、すべてをお勧めします。
次のコマンドでhttpd.conf
ファイルを編集し、G
を押してファイルの最後に到達します。
- sudo vi /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>
-
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
:HTTP Strict Transport Security (HTSTS)は、Webサーバーとクライアント(主にブラウザー)がHTTPSのみを使用して通信を確立するためのメカニズムです。 これを実装することで、通信の間にあるサードパーティがビットにアクセスする可能性があるだけでなく、ビットを改ざんする可能性がある中間者攻撃を回避できます。 -
Header always edit Set-Cookie (.*) "$1; HttpOnly; Secure"
:ヘッダーのHttpOnly
およびSecure
フラグは、クロスサイトスクリプティング攻撃(XSSとも呼ばれる)を防ぐのに役立ちます。 攻撃者はCookieを悪用して、正当な訪問者を装って他人に見せかけたり(個人情報の盗難)、改ざんしたりする可能性があります。 -
Header set Referrer-Policy "strict-origin"
: Referrer-Policy ヘッダーは、ヘッダーフィールドにリファラー情報として含まれる情報を設定します。 -
Header set Content-Security-Policy "default-src 'self'; upgrade-insecure-requests;"
: Content-Security-Policyヘッダー(CSP)は、パラメーターで指定されていないコンテンツの読み込みを完全に防止します。これは、クロスサイトスクリプティング( XSS [X191X ])攻撃。 このヘッダーのポリシーを構成するための多くの可能なパラメーターがあります。 肝心なのは、同じサイトからコンテンツをロードし、HTTPオリジンを持つコンテンツをアップグレードするように構成することです。 -
Header set X-XSS-Protection "1; mode=block"
:これは、Content-Security-Policy
ヘッダーに対応していない古いブラウザーをサポートします。 ‘X-XSS-Protection’ ヘッダーは、クロスサイトスクリプティング攻撃に対する保護を提供します。 まれな古いバージョンのブラウザをサポートする必要がない限り、このヘッダーを設定する必要はありません。 -
Header set X-Frame-Options: "deny"
:これはクリックジャッキング攻撃を防ぎます。 ‘X-Frame-Options’ ヘッダーは、ページを<frame>
、<iframe>
、<embed>
、または<object>
。 このようにして、他のサイトのコンテンツを他のサイトに埋め込むことができず、クリックジャッキング攻撃を防ぐことができます。 ここでは、すべてのフレームレンダリングを拒否しているため、同じWebサイト内であっても、Webページを他の場所に埋め込むことはできません。 たとえば、特定のWebサイトとの広告またはコラボレーションであるために一部のページのレンダリングを承認する必要がある場合は、これをニーズに適合させることができます。 -
Header set X-Content-Type-Options "nosniff"
:‘X-Content-Type-Options’ヘッダーはMIMEタイプを制御するため、変更されたり従われたりすることはありません。 MIMEタイプはファイル形式の標準です。 これらは、テキスト、オーディオ、ビデオ、画像などで機能します。 このヘッダーは、悪意のある攻撃者がこれらのファイルをスニッフィングしてファイルタイプを変更しようとするコンテンツをブロックします。
次に、変更を有効にするためにApacheを再起動します。
- sudo apachectl restart
構成設定のセキュリティレベルを確認するには、セキュリティヘッダーのWebサイトにアクセスしてください。 このチュートリアルの手順に従うと、ドメインはAグレードを獲得します。
注: https://securityheaders.com/
にアクセスしてヘッダーを確認し、F
グレードを取得した場合、DocumentRoot
。 ヘッダーをチェックすると、A
またはF
とは異なるグレードが得られる場合は、各Header set
行をチェックして、ダウングレードの原因となった可能性のあるスペルミスを探します。
このステップでは、ヘッダーとCookieのセキュリティを向上させるために、最大7つの設定を使用しました。 これらは、クロスサイトスクリプティング、クリックジャッキング、およびその他の種類の攻撃を防ぐのに役立ちます。
結論
このチュートリアルでは、重要な機能の代替構成設定を設定することにより、情報の開示からセッションの保護まで、いくつかのセキュリティの側面について説明しました。
Apacheの強化に関するその他のリソースについては、他の参考資料をご覧ください。
- ApacheのHTTPセキュリティのヒント
- Mozillaのセキュリティガイドライン
- Center for Internet Security Audit Recommendations for Apache HTTP
Apache HTTPを保護するための追加ツールの場合:
-
mod_evasive
は、DoS攻撃を軽減するのに役立つ便利なツールです。 詳細については、Apacheチュートリアルのmod_evasiveを使用してDoSおよびDDoSから保護する方法を参照してください。 -
fail2ban
は、許可されていないユーザーからの繰り返しのログイン試行をブロックするのに役立つ侵入防止ソフトウェアです。 詳細については、Fail2BanチュートリアルでApacheサーバーを保護する方法を参照してください。 -
ModSecurity
はWebアプリケーションファイアウォール(またはWAF)であるため、SpyderLabsおよびコミュニティメンバーによって作成された事前定義されたルールに基づいて幅広い可能性を提供します。 これについて詳しくは、ApacheチュートリアルでModSecurityを設定する方法を参照してください。