技術共有

Apache のリーチング対策、Web ページの圧縮、Web ページのキャッシュ

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

目次

Webページの圧縮

タイプ

モジュール操作ステップを動的に追加

Apacheを再インストールする手順

ウェブキャッシュ

ステップ

バージョン情報を隠す

ステップ

Apache アンチリーチング

意味

原理

アンチホットリンク実験環境を構成する

研究室環境

ローカルイメージのホットリンクの例

ステップ

アンチホットリンクの例

ステップ


Webページの圧縮

Web サイトのアクセス速度は、アプリケーションの応答速度、ネットワーク帯域幅、サーバーのパフォーマンス、クライアントとのネットワーク通信速度などの複数の要因によって決まります。最も重要な要素の 1 つは、Apache 自体の応答性です。 Web 圧縮を使用すると、アプリケーションの速度を上げることができます。さらに重要なのは、費用がまったくかからず、サーバーの CPU 使用率が 1 ~ 2 パーセント ポイント以下わずかに増加するだけであるということです。

タイプ

  • 圧縮
    • 高い圧縮効率、高い CPU 使用率
  • 収縮する
    • 圧縮効率は gzip ほど高くはありませんが、CPU 消費量は少なくなります。

deflate モジュールによる Web ページの圧縮

ソース コード パッケージを通じて Apache をすでにインストールしている場合、ソース コード パッケージがまだ残っている場合は、Apache を再インストールしても以前のパラメータには影響しません。

または、前回のインストール時にモジュールを動的にロードする機能を構成した場合は、apxs ツールを使用して、再インストールせずにモジュールを動的に追加できます。

モジュール操作ステップを動的に追加

Apache を再インストールせずに deflate モジュールを動的に追加します

Apache HTTP サーバーに cd して、フィルターに関連するモジュール コードを保存します

操作にはapxsツールを使用します

  • -i: モジュールをインストールします。コンパイルしたモジュールを Apache サーバーにインストールします。
  • -c: モジュールをコンパイルします。ソース コード ファイル (ここでは mod_deflate.c) を共有オブジェクト ファイル (.so ファイル) にコンパイルします。
  • -a: モジュールを自動的にアクティブ化します。モジュールをコンパイルしてインストールした後、すぐに有効にします。構成ファイルを手動で編集する必要はありません。

最後に、パイプと grep を指定して apachectl コマンドを使用して、deflate モジュールが正常にロードされたかどうかを確認します。

  1. [root@localhost filters]# cd /root/httpd-2.4.25/modules/filters/
  2. [root@localhost filters]# apxs -i -c -a mod_deflate.c
  3. [root@localhost filters]# apachectl -t -D DUMP_MODULES | grep deflate
  4. deflate_module (shared)

httpd 設定ファイルで mod_deflate モジュールを有効にする

  1. [root@localhost filters]# vim /usr/local/httpd/conf/httpd.conf
  2. 在末行模式下搜索:/deflate
  3. LoadModule deflate_module modules/mod_deflate.so # 去掉开头注释
  4. <IfModule mod_deflate.c>
  5. # 对指定的类型应用deflat进行压缩(文本、样式表、图像)
  6. AddOutputFilterByType DEFLATE text/html text/css text/jpg text/png text/gif
  7. DeflateCompressionLevel 9 # 指定了压缩级别为9,表示最高级别的压缩(压缩比最高,但消耗CPU资源较多)
  8. SetOutputFilter DEFLATE # 指定默认的输出过滤器为deflate进行输出内容的压缩
  9. </IfModule>

Apacheを再インストールする手順

Apache を直接再インストールして deflate モジュールを追加します

最初に使用するapachectl -t -D DUMP_MODULES | grep deflateApache に現在 deflate モジュールがあるかどうかを確認するコマンド

Apache が有効な場合は、使用しますsystemctl 停止 httpdサービスを終了する

ソース コード パッケージの解凍ディレクトリを入力し、インストール ディレクトリを指定して、いくつかの機能を有効にします。 deflate モジュールは Web ページの圧縮に使用されます。

。/構成、設定加工してから使用してください作成 && インストールコンパイルしてインストールするコマンド

  1. [root@localhost httpd-2.4.25]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-deflate
  2. [root@localhost httpd-2.4.25]# make && make install

ll コマンドを使用して、deflate モジュールが有効になっているかどうかを確認します。mod_deflate.so ファイルが存在することがわかります。

  1. [root@localhost httpd-2.4.25]# ll /usr/local/httpd/modules/mod_deflate.so
  2. -rwxr-xr-x 1 root root 53096 7月 10 20:43 /usr/local/httpd/modules/mod_deflate.so

ただし、使用しますapachectl -t -D DUMP_MODULES | grep deflateApache 構成ファイルで有効になっていないため、コマンドを照会できません。

httpd のメイン設定ファイルを編集すると、143 行目あたりに多くの設定ファイルがあることがわかります。ロードモジュールステートメントを追加する場合は、これらの LoadModules の下に新しいモジュール読み込みステートメントを追加します。

モジュール読み込みステートメントの 2 番目の部分では、絶対パスまたは相対パスを使用できます。これは、Apache をインストールするときに、プレフィックス (プレフィックス) ルールが ./configure スクリプトによって定義されるため、特定のパスを指定する必要があります。 Apache 設定ファイルへのパス、プレフィックス パスは省略できます。

IfModule タグは、モジュール構成を条件付きでロードするために使用されます。その機能は、指定されたモジュールが現在の Apache 環境にロードされているかどうかを確認することです。モジュールがロードされた場合にのみ、IfModule タグで囲まれた構成命令が有効になります。

  1. [root@localhost httpd-2.4.25]# vim /usr/local/httpd/conf/httpd.conf
  2. LoadModule deflate_module modules/mod_deflate.so
  3. <IfModule mod_deflate.c> # 只有当 mod_deflate 模块加载时才会执行下面的配置
  4. DeflateCompressionLevel 6 # 压缩级别,数字越大压缩比就越大
  5. SetOutputFilter DEFLATE # 启用deflate模块
  6. # 告诉服务器对哪些文件进行压缩,如果是已经压缩过的,就不再压缩
  7. AddOutputFilterByType DEFLATE text/html text/plain text/xml text/csstext/javascript application/x-javascript application/javascript application/json
  8. SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
  9. SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
  10. SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
  11. AddOutputFilterByType DEFLATE text/*
  12. AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript
  13. AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
  14. </IfModule>

保存して終了すると、使用できますhttpd -t構成ファイルに構文エラーがあるかどうかを検出するには、「構文 OK」と表示された場合は、エラーがないことを意味します。

新しく追加された構成を有効にするために httpd は変更された構成ファイルを再ロードする必要があるため、サービスを再起動します。

このとき、ブラウザで Web サーバーにアクセスし、キーボードの F12 を押して開発者ツールを開き、Web サーバーの IP アドレスを選択すると、応答ヘッダーで圧縮テクノロジが gzip であることがわかります。

実験終了


ウェブキャッシュ

Web ページのキャッシュとは、頻繁に変更されない、またはめったに変更されない一部のページをキャッシュすることで、次回ブラウザがこれらのページに再度アクセスするときに、これらのページを再度ダウンロードする必要がなくなり、ユーザーのアクセス速度が向上します。 Apache の mod_expires モジュールは、ページ ヘッダー情報に Expires タグと Cache-Control タグを自動的に生成します。クライアント ブラウザは、タグに基づいて、次回のアクセスのためにローカル マシンのキャッシュにページを取得するかどうかを決定し、別のリクエストを行う必要はありません。不要なトラフィックを削減し、アクセス速度を向上させる目的を達成するために、クライアントのアクセスの頻度と数を減らします。

Webページのキャッシュを実装する

ステップ

httpd メイン構成ファイルを開き、expires モジュールを有効にして追加し、サービスを再起動します。

  1. [root@localhost httpd-2.4.25]# vim /usr/local/httpd/conf/httpd.conf
  2. 在末行模式搜索:/expires_module
  3. 将前面的注释去掉,开启expires模块
  4. LoadModule expires_module modules/mod_expires.so
  5. <IfModule mod_expires.c>
  6. ExpiresActive On # 开启缓存功能
  7. ExpiresDefault "access plus 60 seconds" # 缓存时间设置为60秒
  8. </IfModule>
  9. 检测语法正确性,重启服务
  10. [root@localhost httpd-2.4.25]# httpd -t
  11. Syntax OK
  12. [root@localhost httpd-2.4.25]# systemctl restart httpd

サービスを再起動した後、ブラウザに移動して Web サーバーにアクセスすると、応答ヘッダーにさらに 2 行の情報があることがわかります。


バージョン情報を隠す

ソフトウェアの脆弱性情報は特定のバージョンに関連しているため、バージョン番号は攻撃者にとって非常に役立ちます。ブラウザの開発者ツールでは、応答ヘッダーのサーバー項目で Apache のバージョン情報を確認できます。

ネットワーク攻撃者が Apache のバージョン情報を入手すると、標的型攻撃が実行され、Web サイトに損失が発生します。したがって、実際の本番環境では、攻撃のリスクを軽減するために、Apache のバージョン番号を隠す必要があります。

ステップ

  1. [root@localhost httpd-2.4.25]# vim /usr/local/httpd/conf/httpd.conf
  2. 在末行模式下搜索:/httpd-default
  3. 将Include语句前的注释去掉,表示包含Include语句后面指定的文件在当前文件中(相当于把指定文件的内容复制粘贴到当前文件的当前Include语句的位置)
  4. # Various default settings
  5. Include conf/extra/httpd-default.conf

保存して終了し、httpd.default ファイルを開きます

  1. [root@localhost httpd-2.4.25]# vim /usr/local/httpd/conf/extra/httpd-default.conf
  2. 在第55行就可以设置隐藏版本信息,这里改为Prod
  3. ServerTokens Prod

コメントでオプションが提供されていることがわかります。次のいずれかに設定: Full | OS | Minor | Minimal | Major | Prod

オプション

説明する

サーバートークンがいっぱい

オペレーティング システムの種類やコンパイルされたモジュールのリストなど、最も詳細なサーバー情報を返します。

例: Apache/2.4.41 (Unix) OpenSSL/1.1.1d PHP/7.3.11

サーバートークンOS

オペレーティング システムの種類のみが返されます。

例: Apache/2.4.41 (Unix)

サーバートークンマイナー

メジャー バージョン番号とマイナー バージョン番号を返します。

例: Apache/2.4

サーバートークン最小

メジャー バージョン番号を返します。

例: Apache/2

ServerTokens メジャー

メジャー バージョン番号のみが返されます。

例: Apache/2

ServerTokens 製品版

バージョン番号を省略して、Apache のみを表示する最小限の情報を返します。

例: アパッチ

保存して終了し、サービスを再起動します。Webサーバーにアクセスする

バージョン情報には Apache が 1 つだけ表示されていることがわかります。


Apache アンチリーチング

Apache ホットリンクは、他の Web サイトまたは無許可の第三者が Web サイト上の画像、ビデオ、オーディオ、またはその他のリソースに直接リンクすることを防ぐ保護手段です。

Web サイトがサイトのリソースを直接使用すると、おそらくユーザーの許可なしに、実際には帯域幅とサーバー リソースが消費されます。

意味

  • アンチホットリンクとは、サーバー構成を通じて、外部 Web サイトまたは無許可の第三者が Web サイト上のリソース リンクを直接使用することを禁止することを指します。誰かが自分のページでリソース リンクを直接使用しようとすると、訪問者はそのページでリソースを読み込めない、または代替コンテンツが表示されるという問題が発生します。

原理

  • HTTP Referer チェック: サーバーは、HTTP リクエストの Referer ヘッダーをチェックして、リソースリクエストのソースを特定します。リファラーが許可したソース (自分の Web サイトなど) からのものではないことが判明した場合、サーバーはリソースの提供を拒否するか、代替コンテンツを返すことができます。
  • 書き換えルール: Apache の書き換えルールを使用してリクエストを書き換え、Referer ヘッダーを確認し、設定に基づいてリソースを提供するかリクエストを拒否するかを決定します。

アンチホットリンク実験環境を構成する

CPU名

ドメイン名

IPアドレス

オペレーティング·システム

主なソフトウェアとバージョン

アパッチ1

ホームページ

192.168.10.101

CentOS7.9

httpd-2.4.25.tar.gz

アパッチ2

ホームページ

192.168.10.201

CentOS7.9

httpd-2.4.25.tar.gz または yum のインストール

クライアント

ウィンドウズ10

ブラウザ

研究室環境

最初のサーバーのクローンを直接作成するか、yum -y install httpd を使用して httpd をインストールし、IP アドレスを 192.168.10.102 に変更します。

2 つのサーバーのホスト名を変更します。

  1. 101主机
  2. [root@localhost ~]# hostname apache1
  3. [root@localhost ~]# bash
  4. [root@apache1 ~]#
  5. 201主机
  6. [root@localhost ~]# hostname apache2
  7. [root@localhost ~]# bash
  8. [root@apache2 ~]#

2 つの Web サーバーのホスト ファイルを変更して、対応するドメイン名を解決できるようにします。

以下の同じ手順に従って、201 ホストを変更します。

  1. [root@apache1 ~]# vim /etc/hosts
  2. 在hosts文件末尾追加
  3. 192.168.10.101 www.e1.com
  4. 192.168.10.201 www.e2.com

Win10 クライアント ホストの hosts ファイルについては、C:WindowsSystem32driversetc の下で hosts ファイルをダブルクリックし、メモ帳で開きます。

2 つの Web サーバーのファイアウォールとカーネル セキュリティ メカニズムをオフにし、httpd サービスを有効にして、クライアント ホスト上の 2 つの Web サーバーにアクセスできるかどうかを確認してください。

  1. 在两个Web服务器操作
  2. [root@apache1 ~]# systemctl start httpd
  3. [root@apache1 ~]# setenforce 0

ローカルイメージのホットリンクの例

101 ホストは私のサイトであり、201 ホスト Web サーバー上の写真を盗む必要があります。

つまり、www.e1.com は www.e2.com の画像リンクを盗みます。

ステップ

201ホストに来てください

httpd が Web ページ ファイルを保存するディレクトリを入力し、画像をドラッグして、index.html ファイルを編集します。

  1. [root@apache2 ~]# cd /usr/local/httpd/htdocs/
  2. 在该目录下从宿主机拖入一张图片
  3. [root@apache2 htdocs]# vim index.html
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7. <title>标题</title>
  8. </head>
  9. <body>
  10. <h1>原图网站</h1>
  11. <img src="logo.jpg" /> # 如果图片文件是在网页文件同一目录下,可以不用加路径
  12. </body>
  13. </html>

保存して終了します。この時点で、ブラウザを使用してホスト マシン上の www.e2.com にアクセスすると、Web ページに画像があることがわかります。

他の Web サイトから画像を盗用する場合は、ブラウザで画像を右クリックし、[画像リンクのコピー] を選択します。

101ホストに来てください

101Webサーバーのホームページに画像へのリンクを追加します。

  1. [root@apache1 ~]# cd /var/www/html # 使用yum安装httpd的存放网页文件的目录
  2. [root@apache1 html]# vim index.html
  3. <html>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>标题</title>
  7. </head>
  8. <body>
  9. <h1>盗图网站</h1>
  10. <img src="http://www.e2.com/logo.jpg" />
  11. </body>
  12. </html>

保存して終了し、クライアント Win10 ホストに移動し、2 つの URL www.e1.com と www.e2.com にアクセスします。

F12 を使用して開発者ツールを開きます。www.e2.com のリクエスト URL と画像リンクが www.e2.com のものであることがネットワーク上で確認できます。

www.e1.com のリクエスト URL は www.e1.com ですが、画像リクエストは www.e2.com ホストの IP + 画像リンクです。

これまでのところ、単純なローカル画像のホットリンクが実装されています。

アンチホットリンクの例

他のホストが201ホストの画像リンクを盗むと、相手が盗みたい画像ではなく固定画像のみが表示されます。

ステップ

別の画像 (error.jpg) を、リーチ対策実験用の元の画像を提供する 201 ホスト (www.e2.com) の htdocs ディレクトリにインポートします。

次に、httpd の設定ファイルを編集し、書き換えモジュール (アドレス書き換え) を有効にします。書き換えの目的は、誰かが私の logo.jpg をリクエストした場合に、そのリクエストを error.jpg にリダイレクトすることです。

アドレス書き換え機能を使用すると、リクエストのプレフィックスが www.e2.com であれば、アクセスが許可されます。許されません。

  1. [root@apache2 htdocs]# vim /usr/local/httpd/conf/httpd.conf
  2. 在末行模式下搜索:/rewrite
  3. LoadModule rewrite_module modules/mod_rewrite.so # 将开头注释去掉,启用rewrite模块
  4. 在末行模式下搜索:/htdocs
  5. 在<Directory "/usr/local/httpd/htdocs">标签内往下翻
  6. 找到AllowOverride参数的行,修改内容为下方内容
  7. AllowOverride None
  8. RewriteEngine On
  9. RewriteCond %{HTTP_REFERER} !^http://e2.com$ [NC]
  10. RewriteCond %{HTTP_REFERER} !^http://e2.com/.*$ [NC]
  11. RewriteCond %{HTTP_REFERER} !^http://www.e2.com$ [NC]
  12. RewriteCond %{HTTP_REFERER} !^http://www.e2.com/.*$ [NC]
  13. RewriteRule .*.(gif|jpg|swf)$ http://www.e2.com/error.png

パラメータ

説明する

すべて上書きを許可

.htaccess ファイルで RewriteEngine およびその他の書き換えルールを許可します。

ALL: すべてのタイプの書き換えディレクティブを .htaccess ファイル内のルールによってオーバーライドできるようにします。

なし: このディレクトリ内の .htaccess ファイルを使用してサーバー構成をオーバーライドすることを禁止します。

RewriteEngine オン

書き換えを有効にする。これは書き換えルールを有効にする最初のステップです。

書き換え条件

書き換え条件の定義

%{HTTP_REFERER}

Apacheの組み込み変数です。この変数は、ユーザーがアクセスした際にリクエストメッセージのヘッダー情報にあるURLを取得することができます。

リクエスト内のリファラー値と一致します

!^http://www.e2.com/.*$

URL 下の任意のファイル (.*: 単一または複数の任意の文字に一致)

http://www.e2.com/ で始まり、単一または複数の文字で終わる文字列と一致しないことを示します

[NC]

フィルタリングでは大文字と小文字が区別されません

書き換えルール

書き換えルールを定義する

.*.(gif|jpg|swf)$ http://www.e2.com/error.png

前回の書き換え条件が一致した場合、要求された URL が .gif、.jpg、または .swf で終わる場合

その後、リクエストは http://www.e2.com/error.png にリダイレクトされます。

.*: 任意の数の任意の文字に一致します

.: エスケープ文字によってエスケープされたドット。これは単純なドットの意味です。

保存して終了し、サービスを再起動します。

最後に、クライアント ホスト (Win10) にアクセスして、ブラウザーによって画像がキャッシュされるのを回避するテストを行ったので、Ctrl + Shift + Delete ショートカット キーを使用してブラウザーのキャッシュをクリアします。

次に、www.e2.com にアクセスすると、すべて正常に動作します。

www.e1.com にアクセスすると、盗まれた画像リンクはリダイレクトされた error.png 画像になります。