FreeBSD12.0でApacheHTTPを強化するための推奨手順
序章
Apache HTTP サーバーのデフォルトのインストールはすでに安全に使用できますが、いくつかの変更を加えることで、その構成を大幅に改善できます。 たとえば、Cookieとヘッダーの周囲に保護を設定することで、既存のセキュリティメカニズムを補完できるため、ユーザーのクライアントレベルで接続が改ざんされることはありません。 これを行うことにより、クロスサイトスクリプティング攻撃(XSSとも呼ばれます)などのいくつかの攻撃方法の可能性を劇的に減らすことができます。 クロスサイトリクエストフォージェリ、セッションハイジャック、サービス拒否攻撃など、他の種類の攻撃を防ぐこともできます。
このチュートリアルでは、サーバー上の公開される情報の量を減らすためのいくつかの推奨手順を実装します。 ディレクトリリストを確認し、インデックス作成を無効にして、リソースへのアクセスを確認します。 また、のデフォルト値を変更します timeout
サービス拒否タイプの攻撃を軽減するためのディレクティブ。 さらに、TRACEメソッドを無効にして、セッションを元に戻したりハイジャックしたりできないようにします。 最後に、ヘッダーとCookieを保護します。
ほとんどの構成設定は、次の場所にあるApacheHTTPメイン構成ファイルに適用されます。 /usr/local/etc/apache24/httpd.conf
.
Note: As of July 1, 2022, DigitalOcean no longer supports the creation of new FreeBSD Droplets through the Control Panel or API. However, you can still spin up FreeBSD Droplets using a custom image. Learn how to import a custom image to DigitalOcean by following our product documentation.
前提条件
このガイドを開始する前に、次のものが必要です。
-
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
フラグ)、バージョンを表示します( -V
フラグ)ポート上 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
.
との引数 +
および/または -
混在させることはできません。ApacheHTTPでは構文が不適切であると見なされ、起動時に拒否される可能性があります。
ステートメントを追加する Options -Indexes
データパス内にコンテンツを設定します /usr/local/www/apache24/data
次の場合に自動的にインデックスを作成しない(リストされたを読み取る) .html
ファイルが存在せず、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
.
これらの変更を実装するには、ApacheHTTPを再起動します。
- sudo apachectl restart
ブラウザのドメインに、403エラーとも呼ばれるアクセス禁止メッセージが表示されます。 これは、適用した変更によるものです。 配置 -Indexes
に Options
ディレクティブはApacheHTTPの自動インデックス機能を無効にしているため、 index.html
データパス内のファイル。
これを解決するには、 index.html
内部のファイル VirtualHost
Let’sEncrypt証明書の前提条件チュートリアルで有効にしました。 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)を実行する可能性があります。 これらの悪意のある接続のフラッドが発生すると、サーバーはつまずき、飽和状態になり、応答しなくなる可能性があります。
値を変更するには、 Timeout
のエントリ httpd-default.conf
ファイル:
- 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
のデフォルト値を変更しました Timeout
DoS攻撃を部分的に軽減するためのディレクティブ。
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メソッドのみが構成で許可されます。
- The
GET
メソッドはHTTPプロトコルの一部であり、データを取得するために使用されます。 - The
POST
メソッドもHTTPプロトコルの一部であり、サーバーにデータを送信するために使用されます。 - The
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サーバー間の通信を提供するため、保護することが重要です。
The 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 )攻撃を防ぐのに役立ちます。 このヘッダーのポリシーを構成するための多くの可能なパラメーターがあります。 肝心なのは、同じサイトからコンテンツをロードし、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
ないのでグレードかもしれません index.html
中 DocumentRoot
ステップ2の最後に指示されたようにあなたのサイトの。 ヘッダーをチェックすると、 A
または F
、それぞれを確認してください Header set
ダウングレードの原因となった可能性のあるスペルミスを探している行。
このステップでは、ヘッダーとCookieのセキュリティを向上させるために、最大7つの設定を使用しました。 これらは、クロスサイトスクリプティング、クリックジャッキング、およびその他の種類の攻撃を防ぐのに役立ちます。
結論
このチュートリアルでは、重要な機能の代替構成設定を設定することにより、情報の開示からセッションの保護まで、いくつかのセキュリティの側面について説明しました。
Apacheの強化に関するその他のリソースについては、他の参考資料をご覧ください。
- ApacheのHTTPセキュリティのヒント
- Mozillaのセキュリティガイドライン
- Center for Internet SecurityApacheHTTPの監査に関する推奨事項
Apache HTTPを保護するための追加ツールの場合:
-
mod_evasive
DoS攻撃を軽減するのに役立つ便利なツールです。 詳細については、Apacheチュートリアルのmod_evasiveを使用してDoSおよびDDoSから保護する方法を参照してください。 -
fail2ban
は、許可されていないユーザーからの繰り返しのログイン試行をブロックするのに役立つ侵入防止ソフトウェアです。 詳細については、Fail2BanチュートリアルでApacheサーバーを保護する方法を参照してください。 -
ModSecurity
はWebアプリケーションファイアウォール(またはWAF)であるため、SpyderLabsおよびコミュニティメンバーによって作成された事前定義されたルールに基づいて幅広い可能性を提供します。 これについて詳しくは、ApacheチュートリアルでModSecurityを設定する方法を参照してください。