Apacheで特定のサーバーからのクロスオリジンリクエストを拒否する方法

クロスオリジンリクエスト(CORS)は、異なるドメイン間でリソースを共有するための仕組みです。多くのWebアプリケーションでは、外部サーバーとのデータ通信が必要となりますが、セキュリティ上の理由からブラウザは通常、異なるオリジン(プロトコル、ホスト、ポートが異なる場合)へのリクエストを制限します。これを回避するためには、サーバー側で適切なCORS設定が必要です。

しかし、すべてのオリジンからのリクエストを許可すると、悪意のある攻撃を受ける可能性が高まります。そのため、特定のオリジンからのリクエストのみを許可し、不正なオリジンからのアクセスをブロックすることが重要です。

本記事では、Apacheを使用して特定のサーバーやIPアドレスからのクロスオリジンリクエストを拒否する方法について、具体的な設定例を交えて詳しく解説します。これにより、安全で信頼性の高いWeb環境を構築できるようになります。

目次

クロスオリジンリクエストとは何か


クロスオリジンリクエスト(CORS:Cross-Origin Resource Sharing)は、異なるオリジン間でリソースを共有するための仕組みです。ここで「オリジン」とは、プロトコル(http/https)、ホスト名(ドメイン)、ポート番号の組み合わせを指します。

通常、Webブラウザはセキュリティ上の理由から「同一オリジンポリシー」と呼ばれる制限を設けており、異なるオリジンへのリクエストをブロックします。たとえば、https://example.com でホストされるサイトが、https://api.anotherdomain.com にリクエストを送信する場合が該当します。

なぜCORSが必要なのか


多くのWebアプリケーションは、外部のAPIやリソースを活用して動作します。これには以下のようなケースが含まれます。

  • 外部の認証サービスを利用する場合
  • クラウドストレージから画像や動画を読み込む場合
  • 別のドメインで動作するAPIからデータを取得する場合

CORSはこのような異なるオリジン間の通信を安全に行うための手段として設計されました。リソースを提供するサーバー側で特定のオリジンからのアクセスを許可する設定を行うことで、リクエストが正常に処理されるようになります。

クロスオリジンリクエストの具体例


たとえば、以下のようなJavaScriptコードがhttps://frontend.example.comで実行されるとします。

fetch('https://api.backend.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));


このコードは、https://api.backend.com からデータを取得しようとします。しかし、バックエンド側でCORSが許可されていなければ、ブラウザは以下のようなエラーを表示し、リクエストをブロックします。

Access to fetch at 'https://api.backend.com/data' from origin 'https://frontend.example.com' has been blocked by CORS policy.

この問題を回避するために、サーバー側で適切なCORS設定を行う必要があります。

ApacheでのCORS制御の重要性


Apacheでのクロスオリジンリクエスト(CORS)制御は、Webアプリケーションのセキュリティ強化データ保護に不可欠です。CORS設定を適切に行わない場合、意図しない外部サイトからのアクセスを許可してしまい、データの漏洩や不正アクセスのリスクが高まります。

なぜCORS制御が必要なのか


デフォルトでは、ブラウザは同一オリジンポリシーに従い、異なるオリジンからのリソースへのリクエストをブロックします。しかし、APIや外部サービスを活用するWebアプリケーションでは、オリジンが異なるリソースへのアクセスが必要となるケースが多く存在します。
そのため、必要なオリジンからのリクエストを許可しつつ、不正なオリジンからのリクエストを拒否する細かなアクセス制御が求められます。

CORS制御を行わない場合のリスク


CORSを適切に設定しない場合、以下のようなセキュリティリスクが発生する可能性があります。

  • データの不正利用:外部の悪意あるサイトがAPIにリクエストを送り、機密情報を取得する可能性があります。
  • CSRF攻撃:他のサイトがユーザーのブラウザを通じて不正な操作を実行するリスクが高まります。
  • 不正リソース利用:制限のないCORS設定により、リソースが過剰に消費され、サービスのパフォーマンス低下や障害の原因となる可能性があります。

ApacheでのCORS制御の利点


ApacheでCORSを制御することで、以下の利点が得られます。

  • 細かなアクセス制御:特定のオリジンやIPアドレスからのアクセスを許可・拒否できます。
  • セキュリティ強化:不正なリクエストをブロックし、アプリケーションの安全性を確保します。
  • 柔軟な設定:必要に応じてオリジンやメソッドを制限したり、特定のエンドポイントだけに適用するなど、柔軟に設定可能です。

次のセクションでは、ApacheでCORSを設定する具体的な方法について、コード例を交えて解説します。

基本的なCORS設定方法


Apacheでクロスオリジンリクエスト(CORS)を設定するには、.htaccessファイルまたは仮想ホスト設定ファイルを編集します。基本的には、特定のオリジンを許可するためにHeaderディレクティブを使用します。以下では、ApacheでCORSを設定する手順を具体的に解説します。

.htaccessでのCORS設定


最も簡単な方法は、.htaccessファイルを使って設定することです。Apacheがインストールされているサーバーの対象ディレクトリに.htaccessファイルを配置し、以下のコードを記述します。

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "*"
</IfModule>

この設定は、すべてのオリジンからのリクエストを許可します。*はワイルドカードであり、どのドメインからのリクエストも受け付ける状態になります。

特定のオリジンのみ許可する方法


セキュリティを強化するためには、特定のオリジンだけを許可する設定が望ましいです。

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "https://example.com"
</IfModule>

この場合、https://example.com からのリクエストのみを許可します。他のオリジンからのリクエストはブロックされます。

特定のメソッドを許可する


オリジンだけでなく、特定のHTTPメソッドを制限することも可能です。

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "https://example.com"
  Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
</IfModule>

この設定では、GETPOSTOPTIONSメソッドのみが許可されます。その他のメソッド(PUTDELETEなど)は拒否されます。

複数のヘッダーを許可する


APIを利用する際に、リクエストヘッダーをカスタマイズする必要がある場合は、以下のように設定します。

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "https://example.com"
  Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
  Header set Access-Control-Allow-Headers "Authorization, Content-Type"
</IfModule>

この設定では、AuthorizationContent-Typeといったカスタムヘッダーを持つリクエストが許可されます。

プリフライトリクエストへの対応


CORSでは、ブラウザがサーバーに送信する「プリフライトリクエスト(OPTIONSリクエスト)」が重要になります。このリクエストを処理するためには、OPTIONSメソッドを適切に許可する必要があります。

<IfModule mod_headers.c>
  Header always set Access-Control-Allow-Origin "https://example.com"
  Header always set Access-Control-Allow-Methods "GET, POST, OPTIONS"
  Header always set Access-Control-Allow-Headers "Authorization, Content-Type"
</IfModule>

alwaysを使うことで、OPTIONSリクエストに対しても確実にヘッダーが返されるようになります。

次のセクションでは、特定のドメインやIPからのリクエストを拒否する方法について解説します。

特定のドメインからのリクエストを許可する設定


Apacheでクロスオリジンリクエスト(CORS)を設定する際、特定のドメインからのリクエストだけを許可することで、セキュリティを強化できます。これにより、不特定多数のサイトからのアクセスを防ぎ、信頼できるドメインのみを対象とすることが可能です。

.htaccessで特定のオリジンを許可


以下は、特定のオリジン https://trusted-domain.com だけを許可する例です。

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "https://trusted-domain.com"
</IfModule>

これにより、https://trusted-domain.com からのリクエストのみが許可されます。それ以外のドメインからのリクエストは拒否されます。

複数のドメインを許可する


複数のドメインからのリクエストを許可する場合は、SetEnvIfを使用して設定します。

<IfModule mod_headers.c>
  SetEnvIf Origin "https://trusted-domain.com$" ORIGIN_OK=1
  SetEnvIf Origin "https://another-trusted.com$" ORIGIN_OK=1
  Header set Access-Control-Allow-Origin "%{HTTP_ORIGIN}e" env=ORIGIN_OK
</IfModule>

この設定では、https://trusted-domain.com および https://another-trusted.com からのリクエストを許可します。%{HTTP_ORIGIN}eを使うことで、リクエストのOriginヘッダーが許可リストに含まれている場合のみ許可されます。

特定のサブドメインを許可する


サブドメインを含めて許可する場合は、正規表現を使用します。

<IfModule mod_headers.c>
  SetEnvIf Origin "^https://(.*).example.com$" ORIGIN_OK=1
  Header set Access-Control-Allow-Origin "%{HTTP_ORIGIN}e" env=ORIGIN_OK
</IfModule>

この例では、example.comの任意のサブドメインからのリクエストを許可します。

特定のメソッドとヘッダーの許可


特定のドメインだけでなく、使用できるHTTPメソッドやヘッダーを制限することもできます。

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "https://trusted-domain.com"
  Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
  Header set Access-Control-Allow-Headers "Authorization, Content-Type"
</IfModule>

これにより、許可されたドメインからのGETPOSTOPTIONSメソッドが受け付けられ、AuthorizationおよびContent-Typeヘッダーの使用が可能になります。

次のセクションでは、特定のドメインやIPからのリクエストを拒否する方法について解説します。

特定のドメインからのリクエストを拒否する設定


Apacheでは、特定のオリジンやドメインからのクロスオリジンリクエスト(CORS)を拒否する設定も可能です。これにより、悪意のあるサイトや不要なオリジンからのアクセスを制限し、アプリケーションのセキュリティを強化できます。

.htaccessで特定のドメインを拒否


以下は、https://untrusted-domain.comからのリクエストを拒否する例です。

<IfModule mod_headers.c>
  SetEnvIf Origin "https://untrusted-domain.com$" ORIGIN_BLOCK=1
  Header set Access-Control-Allow-Origin "null" env=ORIGIN_BLOCK
</IfModule>

この設定では、https://untrusted-domain.comからのリクエストはnullオリジンとして処理され、クロスオリジンリクエストが拒否されます。

複数のドメインを拒否する


複数のオリジンを拒否する場合は、SetEnvIfを活用して複数の条件を設定します。

<IfModule mod_headers.c>
  SetEnvIf Origin "https://untrusted-domain.com$" ORIGIN_BLOCK=1
  SetEnvIf Origin "https://malicious.com$" ORIGIN_BLOCK=1
  Header set Access-Control-Allow-Origin "null" env=ORIGIN_BLOCK
</IfModule>

この設定で、https://untrusted-domain.com および https://malicious.comからのリクエストはすべて拒否されます。

特定のパターンに一致するドメインを拒否


ワイルドカードや正規表現を使用して、特定のパターンに一致するドメインを拒否できます。たとえば、すべてのサブドメインからのリクエストを拒否する場合は以下のように設定します。

<IfModule mod_headers.c>
  SetEnvIf Origin "^https://.*\.untrusted.com$" ORIGIN_BLOCK=1
  Header set Access-Control-Allow-Origin "null" env=ORIGIN_BLOCK
</IfModule>

これにより、https://sub1.untrusted.comhttps://api.untrusted.comなど、untrusted.comのサブドメイン全体がブロックされます。

特定のIPアドレスを拒否する


IPアドレスを使用してクロスオリジンリクエストを拒否することも可能です。

<IfModule mod_headers.c>
  Require all granted
  Require not ip 192.168.1.100
</IfModule>

この設定では、192.168.1.100からのアクセスを拒否し、それ以外のIPからのアクセスを許可します。

OPTIONSリクエストで拒否を強制


プリフライトリクエスト(OPTIONS)の段階で拒否することで、ブラウザがリクエストをブロックするように設定できます。

<IfModule mod_headers.c>
  SetEnvIf Origin "https://untrusted-domain.com$" ORIGIN_BLOCK=1
  <Limit OPTIONS>
    Header set Access-Control-Allow-Origin "null" env=ORIGIN_BLOCK
  </Limit>
</IfModule>

これにより、プリフライトリクエスト自体が失敗し、リクエストが受け付けられなくなります。

次のセクションでは、IPアドレスをベースにしたCORS制御について解説します。

IPアドレスベースでのCORS制御


Apacheでは、特定のIPアドレスに基づいてクロスオリジンリクエスト(CORS)を制御することが可能です。これにより、特定のネットワークやクライアントからのアクセスのみを許可・拒否し、セキュリティを一層強化できます。

特定のIPアドレスからのリクエストを許可する


特定のIPアドレスからのリクエストのみを許可し、その他のIPからのアクセスをブロックする方法を紹介します。

<IfModule mod_headers.c>
  Require ip 192.168.1.100
  Require ip 203.0.113.0/24
</IfModule>

この設定では、192.168.1.100203.0.113.0のサブネットからのアクセスのみを許可します。その他のIPアドレスからのリクエストは拒否されます。

特定のIPアドレスからのリクエストを拒否する


特定のIPアドレスを拒否し、それ以外のIPを許可する場合の設定例です。

<IfModule mod_headers.c>
  Require all granted
  Require not ip 192.168.1.200
  Require not ip 198.51.100.0/24
</IfModule>

この設定では、192.168.1.200および198.51.100.0/24からのアクセスを拒否します。それ以外のIPアドレスからのアクセスは許可されます。

CORSとIP制御を組み合わせた設定


IPアドレスとCORS設定を組み合わせることで、特定のオリジンかつ特定のIPアドレスからのリクエストのみを許可する方法です。

<IfModule mod_headers.c>
  SetEnvIf Origin "https://trusted-site.com$" ALLOW_CORS
  Require ip 192.168.1.100
  Header set Access-Control-Allow-Origin "https://trusted-site.com" env=ALLOW_CORS
</IfModule>

この設定では、https://trusted-site.comからのリクエストであり、かつ192.168.1.100のIPアドレスからのアクセスのみを許可します。

特定のディレクトリやAPIエンドポイントに対するIP制御


ディレクトリ単位でIPアドレスを制御する例です。

<Location "/api/v1/private">
  Require ip 203.0.113.5
  Header set Access-Control-Allow-Origin "https://secure-app.com"
</Location>

この例では、/api/v1/privateエンドポイントに対して203.0.113.5からのアクセスのみ許可されます。

IP制御の検証方法


設定が正しく反映されているか確認するには、以下のコマンドでApacheの設定をテストします。

apachectl configtest

エラーが表示されない場合は、設定が正しく適用されています。

次のセクションでは、CORS設定の検証方法について解説します。

設定の検証方法


ApacheでCORSの設定を行った後は、適切に動作しているか検証することが重要です。不適切な設定はリソースのブロックやセキュリティの脆弱性につながる可能性があります。このセクションでは、ブラウザやコマンドラインを使った検証方法を解説します。

1. ブラウザのデベロッパーツールを使用した検証

ChromeやFirefoxを使った確認方法

  1. Webページを開き、F12キーまたは右クリック > 検証をクリックします。
  2. 「ネットワーク」タブを開き、リクエストを再度送信します。
  3. 特定のリクエストを選択し、「ヘッダー」セクションを確認します。

CORS設定が正しい場合:

  • Access-Control-Allow-Originが期待するオリジンに設定されている
  • Access-Control-Allow-Methodsに必要なHTTPメソッドが記載されている

設定に問題がある場合、次のようなエラーが表示されます。

Access to fetch at 'https://api.example.com' from origin 'https://frontend.example.com' 
has been blocked by CORS policy.

2. cURLコマンドでの検証


コマンドラインから直接CORS設定を確認するには、cURLコマンドを使用します。

curl -I -H "Origin: https://trusted-site.com" https://api.example.com

このコマンドは、https://trusted-site.comをオリジンとして設定し、https://api.example.comにリクエストを送信します。
CORSが正しく設定されていれば、次のようなレスポンスが返されます。

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://trusted-site.com
Access-Control-Allow-Methods: GET, POST, OPTIONS

エラーが発生する場合は、ヘッダーが返らず、以下のように拒否されます。

HTTP/1.1 403 Forbidden

3. プリフライトリクエストの確認


プリフライトリクエスト(OPTIONSメソッド)の挙動も確認する必要があります。

curl -X OPTIONS -H "Origin: https://trusted-site.com" https://api.example.com

プリフライトリクエストが成功した場合、以下のようなレスポンスが返ります。

HTTP/1.1 200 OK
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Authorization, Content-Type

拒否される場合は、403エラーが返ります。

4. Apacheのログを確認


CORS関連のエラーはApacheのログにも記録されます。エラーログを確認することで、設定ミスを特定できます。

tail -f /var/log/apache2/error.log

リクエストがブロックされた場合、以下のような記録が残ります。

AH01630: client denied by server configuration

5. Apacheの設定テスト


設定変更後は必ずApacheの設定をテストしてからリロードします。

apachectl configtest

エラーがなければ、設定を反映させます。

systemctl reload apache2

次のセクションでは、記事のまとめを行います。

まとめ


本記事では、Apacheを使用して特定のサーバーやIPアドレスからのクロスオリジンリクエスト(CORS)を許可・拒否する方法について詳しく解説しました。

CORSはWebアプリケーションのセキュリティを強化し、不正なリクエストやデータ漏洩を防ぐ重要な仕組みです。Apacheでは、.htaccessや仮想ホスト設定を利用して特定のドメインを許可または拒否したり、IPアドレス単位でのアクセス制御を柔軟に設定できます。

また、設定後はブラウザのデベロッパーツールcURLコマンドを使い、リクエストの挙動を確認して適切に動作しているかを検証することが不可欠です。

適切なCORS制御を行うことで、安全で信頼性の高いWebアプリケーションを構築し、外部からの攻撃を未然に防ぐことができます。

コメント

コメントする

目次