Nginx は IP アクセスを禁止し、ドメイン名アクセスのみを許可します。Nginx のアンチリーチ設定
1. Nginx は IP アクセスを禁止し、ドメイン名アクセスのみを許可します
1.1 背景と目的
これを使用すると、多くの悪意のある IP 攻撃に遭遇する可能性があるため、今回は Nginx を使用して IP アクセスを禁止します。今日は、他人が未登録のドメイン名を自分のサーバーIPに解決してサーバーがネットワークから切断されるのを防ぐために、Nginx上でIP経由でのサーバーへのアクセスをドメイン名のみで禁止する設定をしてみます。
1.2 設定方法
次に、Nginx のデフォルトの仮想ホストを見てみましょう。これは、ユーザーが IP または未設定のドメイン名を介してアクセスしたときに有効になります (たとえば、誰かが自分のドメイン名をあなたの IP にポイントした場合など)。設定内にserver
次の行を追加します。
listen 80 default;
次のデフォルト パラメータは、これがデフォルトの仮想ホストであることを示します。
Nginx は IP アクセスを禁止します この設定は非常に便利です。
たとえば、誰かが IP または未知のドメイン名を介してあなたの Web サイトにアクセスし、有効なコンテンツの表示を禁止したい場合、その人に 500 または 403 を返すことができます。現在、中国の多くのコンピューター室では、Web サイトの所有者が空のコンピューター室を閉じる必要があります。ホスト ヘッダーを使用して、未登録のドメイン名がそれらを指すことを防ぎます。次のように設定できます。
nginx.conf ファイルを次のように変更します。
server {
listen 80 default;
return 403;
}
IPアクセスやドメイン名指定以外のアクセスを受信した場合に403エラーが返されます。
次のジャンプ設定を行うだけで、これらのトラフィックを収集して独自の Web サイトにインポートすることもできます。
server {
listen 80 default;
rewrite ^(.*) http://www.youdomain.com permanent;
}
2、Nginx アンチリーチ設定
2.1 背景と目的
ホットリンクは、今日のインターネット世界に広く普及しており、公式 Web サイトから写真、ビデオ、記事などの URL アドレスを取得し、それらを直接自分の Web サイトに掲載して無断で使用することによって、写真、ビデオ、記事などを海賊化します。リソースを盗むことは、ブラック産業が最小のコストで最大の利益を得るための一般的な方法です。たとえば、著者は最近家の購入を検討していますが、シェルの Web サイトには実際の住宅図面と VR があります。一部の不動産業者は、クリックを騙すために Beike.com 上の実際の住宅図面を直接盗みます。したがって、大規模な Web サイトでは、自身の利益が損なわれないように盗難防止対策を講じることが非常に重要です。Nginx がそのような静的リソース (写真、ビデオ、記事など) をプロキシする場合、設定を通じて盗難防止接続の機能を実現できます。
2.2 ホットリンクを防ぐにはどうすればよいですか?
前述したように、ホットリンクとは、公式 Web サイトを直接使用して、写真やビデオなどの URL を保存し、対応するリソースを取得することです。最も単純な盗難防止のアイデアは、クライアント IP やリクエスト URL など、リソースをリクエストするときにクライアントが保持するいくつかの重要な情報に基づいてリクエストの正当性を検証することであり、それが違法な場合、リクエストは直接拒否されますreferer
。また、これらの基本情報は偽造される可能性があるため、必ずしも安全であるとは限りません。このほかにも、ログイン認証やCookieの使用などの盗難防止方法もあります。さらに、ライブ ストリーミングなどの特定のシナリオでは、タイムスタンプ アンチ リーチ、swf アンチ リーチ、バックトゥソース認証アンチ リーチなど、より高度な盗難防止方法があります。
2.3 参照モジュールの盗難防止
Nginx がリーチ対策機能を実現するために使用するモジュールはrefer
モジュールであり、その原理は、Web サイトがあなたの写真を盗んだ場合、ユーザーがホットリンクをクリックまたはコンテンツを表示したときに、http リクエストのヘッダーのリファラーフィールドが海賊版サイトのURLです。このように、ヘッダー情報を取得することで、http がリクエストを開始したページがわかり、そのアドレスが当社の正規のページであるかどうかを判断し、そうでない場合はホットリンクであると判断します。'
簡単な Nginx アンチリーチ設定は次のとおりです。
server {
listen 80;
server_name youdomain.com;
valid_referers none blocked *.youdomain.org www.youdomain.com/nginx server_names ~\.baidu\.;
if ($invalid_referer) {
return 499;
}
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
none
:referer
ヘッダーが欠落しているリクエストへのアクセスを許可しますblocked:
このフィールドはありますreferer
が、その値はファイアウォールまたはプロキシによって削除されますserver_names
:referer
サイトのドメイン名と のserver_names
ドメイン名が一致する場合、アクセスが許可されます- 任意の文字または正規表現
Nginx はリファラー フィールドと valid_referers の背後にあるリファラー リストを見て照合し、一致する場合は組み込み変数 $invalid_referer の値を 0 に設定し、一致しない場合は値を 1 に設定します。
2.4 secure_link モジュールの盗難防止
ヘッダー値をチェックするだけの以前のreferer
盗難防止リンク方法は脆弱すぎるため、海賊版はリファラー値を偽造することで盗難防止措置を簡単にスキップできます。Nginx には、より高度な盗難防止方法があります。これはsecure_link
モジュールに基づいており、要求されたリンクの許可と有効期限が切れているかどうかを確認でき、主にダウンロード サーバーの侵入防止に使用されます。このモジュールはデフォルトでは Nginx にコンパイルされないため、ソース コードのコンパイル中に追加する必要があります--with-secure_link_module
。
このモジュールは、URL のハッシュ値を検証することでホットリンクを防止します。その盗難防止プロセスは次のとおりです。
- 安全な暗号化された URL がサーバーまたは Nginx によって生成され、クライアントに返されます。
secure_link
クライアントは安全な URL を使用して Nginx にアクセスし、写真などのリソースを取得します。検証に合格するかどうかはNginx変数によって決まります。
設定secure_link
とsecure_link_md5
命令により、リンクの権限や有効期限を確認・判断する機能を実現できます。
referer
module 内の変数と同様に$invalid_referer
、secure_link
このモジュールも組み込み変数 KaTeX parse error: Expected 'EOF', got 'judgment' at Position 14: を使用して、secure_link
検証が合格したかどうかを判断します。secure_link の値には、次の 3 つの状況があります。
- 空の文字列: 検証に失敗しました
- 0: URL の有効期限が切れています
- 1: 検証に合格しました
secure_link_md5
コマンドを使用して有効な URL を生成します。例えば:
secure_link_md5 "$secure_link_expires$uri$remote_addr secret";
上記の設定が Nginx にある場合secure_link_md5
、有効な URL を生成するコマンドは次のとおりです。
# 2023-04-19 17:00:00 转换成时间戳为1681894800
echo -n '1681894800/test.png127.0.0.1 secret' | \
openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
上記のコマンドにより、cPnjBG9bAZvY_jbPOj13mA という値が得られますmd5
。これは非常に重要です。次に、コマンドに関連付けられた URL を構築しますsecure_link
。secure_link
ディレクティブの構成が次の場合:
secure_link $arg_md5,$arg_expires;
次に、リクエストの URL には md5 と有効期限のパラメータを含める必要があります。次に例を示します。
http://192.168.1.10:9008/test.png?md5=cPnjBG9bAZvY_jbPOj13mA&expires=1681894800
Nginx での検証設定の例は次のとおりです。
location ~* .(gif|jpg|png|swf|flv|mp4)$ {
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr secret";
# 空字符串,校验不通过
if ($secure_link = "") {
return 403;
}
# 时间过期
if ($secure_link = "0") {
return 410 "URL过期,请重新生成";
}
root /root/test;
}
2.5 概要
一般的な Nginx のリーチング対策方法では、リファラー フィールドを使用してリクエストのソースを特定し、リクエストが合法かどうかを判断します。ただし、この分野は偽造が容易であるため、この方法が盗難防止機能の実装に使用されることはほとんどありません。Nginxsecure_link
モジュールは主に、写真やビデオのダウンロードやダウンロードURLの生成に一般的に使用されるハッシュアルゴリズム暗号化方式を使用しており、安全性が高いです。さらに、いくつかのサードパーティ モジュールを使用して、Nginx の盗難防止リンク機能を強化することもできます。たとえば、一般的に使用されるサードパーティ モジュール ngx_http_accesskey_module を使用して、ファイル ダウンロードの盗難防止機能を実現できます。