기술나눔

Apache 안티 리칭, 웹 페이지 압축, 웹 페이지 캐싱

2024-07-12

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

목차

웹페이지 압축

유형

모듈 작업 단계를 동적으로 추가

Apache를 다시 설치하는 단계

웹 캐시

단계

버전 정보 숨기기

단계

아파치 안티 리칭

정의

원칙

안티 핫링크 실험 환경 구성

실험실 환경

로컬 이미지 핫링크의 예

단계

핫링크 방지 예시

단계


웹페이지 압축

웹사이트의 접속 속도는 애플리케이션의 응답 속도, 네트워크 대역폭, 서버 성능, 클라이언트와의 네트워크 전송 속도 등 다양한 요인에 의해 결정됩니다. 가장 중요한 요소 중 하나는 Apache 자체의 응답성입니다. 웹 압축을 사용하여 애플리케이션 속도를 높일 수 있습니다. 더 중요한 것은 비용이 전혀 들지 않으며 서버 CPU 사용량이 1~2% 포인트 이하로 약간만 증가한다는 것입니다.

유형

  • 압축
    • 높은 압축 효율성, 높은 CPU 사용량
  • 꺾다
    • 압축 효율성은 gzip만큼 높지 않으며 CPU 소모도 적습니다.

deflate 모듈을 통한 웹페이지 압축

소스 코드 패키지를 통해 Apache를 이미 설치한 경우 소스 코드 패키지를 계속 유지하고 있으면 이를 재구성하고 컴파일하고 설치할 수 있습니다. Apache를 다시 설치해도 이전 매개변수에는 영향이 없습니다.

또는 마지막 설치 중에 모듈을 동적으로 로드하는 기능을 구성한 경우 apxs 도구를 사용하여 다시 설치하지 않고도 모듈을 동적으로 추가할 수 있습니다.

모듈 작업 단계를 동적으로 추가

Apache를 다시 설치하지 않고 수축 모듈을 동적으로 추가

필터와 관련된 모듈 코드를 저장하기 위해 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 중지서비스 종료

소스코드 패키지 압축해제 디렉터리를 입력하고, 설치 디렉터리를 지정하고, 일부 기능을 활성화합니다. 수축 모듈은 웹페이지 압축에 사용됩니다.

./구성처리 후 사용make && make install컴파일 및 설치 명령

  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 deflate이 명령은 Apache 구성 파일에서 활성화되어 있지 않기 때문에 쿼리할 수 없습니다.

httpd의 기본 구성 파일을 편집하면 약 143번째 줄에서 많은 항목이 있음을 알 수 있습니다.로드모듈문을 사용하면 이러한 LoadModules 아래에 새 모듈 로딩 문을 추가할 것입니다.

모듈 로딩 문의 두 번째 부분에서는 절대 경로 또는 상대 경로를 사용할 수 있습니다. Apache를 설치할 때 접두사(prefix) 규칙이 ./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구성 파일에 구문 오류가 있는지 감지하려면 구문 확인 메시지가 표시되면 오류가 없음을 의미합니다.

새로 추가된 구성을 적용하려면 httpd에서 수정된 구성 파일을 다시 로드해야 하므로 서비스를 다시 시작하십시오.

이때, 브라우저에서 웹서버에 접속하여 키보드의 F12를 눌러 개발자 도구를 열고, 웹서버의 IP 주소를 선택하면 압축 기술이 gzip이라는 것을 응답 헤더에서 확인할 수 있습니다.

실험 종료


웹 캐시

웹 페이지 캐싱은 자주 변경되지 않거나 거의 변경되지 않는 일부 페이지를 캐시하는 것입니다. 다음에 브라우저가 이러한 페이지에 다시 액세스할 때 해당 페이지를 다시 다운로드할 필요가 없으므로 사용자의 액세스 속도가 향상됩니다. Apache의 mod_expires 모듈은 페이지 헤더 정보에 Expires 태그와 Cache-Control 태그를 자동으로 생성합니다. 클라이언트 브라우저는 추가 요청 없이 다음 방문을 위해 로컬 시스템의 캐시에 있는 페이지를 얻기 위해 태그를 기반으로 결정합니다. 불필요한 트래픽을 줄이고 액세스 속도를 높이는 목적을 달성하기 위해 클라이언트 액세스 빈도와 횟수를 줄입니다.

웹페이지 캐싱 구현

단계

httpd 기본 구성 파일을 열고 만료 모듈을 활성화하고 추가한 후 서비스를 다시 시작합니다.

  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

서비스를 다시 시작한 후 브라우저로 이동하여 웹 서버에 접속하면 응답 헤더에 두 줄의 정보가 더 있는 것을 확인할 수 있습니다.


버전 정보 숨기기

소프트웨어의 취약점 정보는 특정 버전과 관련되어 있기 때문에 버전 번호는 공격자에게 매우 유용합니다. 브라우저의 개발자 도구에서 응답 헤더의 서버 항목에서 Apache의 버전 정보를 확인할 수 있습니다.

네트워크 공격자가 Apache의 버전 정보를 획득하면 표적 공격을 수행하여 웹 사이트에 손실을 입힐 수 있습니다. 따라서 실제 프로덕션 환경에서는 공격 위험을 줄이기 위해 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(유닉스)

ServerTokens 마이너

주 버전 번호와 부 버전 번호를 반환합니다.

예: 아파치/2.4

ServerTokens 최소

주 버전 번호를 반환합니다.

예: 아파치/2

ServerTokens 메이저

주 버전 번호만 반환됩니다.

예: 아파치/2

서버토큰 제품

버전 번호를 생략하고 Apache만 표시하는 최소한의 정보를 반환합니다.

예: 아파치

저장하고 종료한 후 서비스를 다시 시작하세요.웹 서버에 접속

버전 정보에는 Apache 하나만 표시되는 것을 볼 수 있습니다.


아파치 안티 리칭

Apache 핫링크는 다른 웹사이트나 승인되지 않은 제3자가 귀하의 웹사이트에 있는 이미지, 비디오, 오디오 또는 기타 리소스에 직접 연결하는 것을 방지하는 보호 조치입니다.

웹사이트가 귀하의 사이트에서 직접 리소스를 사용하는 경우 실제로는 귀하의 허가 없이 귀하의 대역폭과 서버 리소스를 소비하고 있는 것입니다.

정의

  • 핫링크 방지란 서버 구성을 통해 외부 웹사이트나 승인되지 않은 제3자가 귀하의 웹사이트에 있는 리소스 링크를 직접 사용하는 것을 금지하는 것을 의미합니다. 누군가 자신의 페이지에서 직접 리소스 링크를 사용하려고 하면 방문자는 해당 페이지에서 리소스를 로드할 수 없거나 대체 콘텐츠가 나타나는 문제를 보게 됩니다.

원칙

  • HTTP Referer 확인: 서버는 HTTP 요청의 Referer 헤더를 확인하여 리소스 요청의 소스를 결정합니다. 추천자가 귀하가 허용한 소스(예: 귀하의 웹사이트)에서 나온 것이 아닌 것으로 확인되면 서버는 리소스 제공을 거부하거나 대체 콘텐츠를 반환할 수 있습니다.
  • 재작성 규칙: Apache의 재작성 규칙을 사용하여 요청을 재작성하고 Referer 헤더를 확인한 다음 설정에 따라 리소스를 제공할지 아니면 요청을 거부할지 결정합니다.

안티 핫링크 실험 환경 구성

CPU 이름

도메인 이름

IP 주소

운영 체제

주요 소프트웨어 및 버전

아파치1

www.e1.com

192.168.10.101

센트OS7.9

httpd-2.4.25.tar.gz

아파치2

www.e2.com

192.168.10.201

센트OS7.9

httpd-2.4.25.tar.gz 또는 yum 설치

고객

윈도우 10

브라우저

실험실 환경

첫 번째 서버를 직접 복제하거나 yum -y install httpd를 사용하여 httpd를 설치하고 IP 주소를 192.168.10.102로 변경합니다.

두 서버의 호스트 이름을 수정합니다.

  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 ~]#

해당 도메인 이름을 확인할 수 있도록 두 웹 서버의 호스트 파일을 수정합니다.

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 클라이언트 호스트의 호스트 파일의 경우 C:WindowsSystem32driversetc 아래에서 호스트 파일을 두 번 클릭하여 메모장으로 엽니다.

두 웹 서버의 방화벽과 커널 보안 메커니즘을 끄고 httpd 서비스를 활성화한 다음 클라이언트 호스트에 있는 두 웹 서버에 액세스할 수 있는지 확인하십시오.

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

로컬 이미지 핫링크의 예

101 호스트는 내 사이트이고 201 호스트 웹 서버의 사진을 훔쳐야 합니다.

즉, www.e1.com은 www.e2.com의 이미지 링크를 훔칩니다.

단계

201 호스트로 오세요

httpd가 웹 페이지 파일을 저장하는 디렉토리를 입력하고 이미지를 끌어서 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을 방문하면 웹 페이지에 사진이 있는 것을 볼 수 있습니다.

다른 웹사이트에서 이미지를 훔치려면 해당 이미지에 대한 링크가 필요합니다. 브라우저에서 이미지를 마우스 오른쪽 버튼으로 클릭하고 이미지 링크 복사를 선택하세요.

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 호스트로 이동하여 두 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 호스트의 이미지 링크를 훔쳐갈 경우 상대방이 훔치고 싶어하는 이미지 대신 고정된 이미지만 표시됩니다.

단계

거머리 방지 실험을 위한 원본 이미지를 제공하는 201 호스트(www.e2.com)의 htdocs 디렉터리로 다른 이미지(error.jpg)를 가져옵니다.

그런 다음 httpd의 구성 파일을 편집하고 다시 쓰기 모듈(주소 다시 쓰기)을 활성화합니다. 다시 쓰기의 목적은 누군가 내 logo.jpg를 요청하면 해당 요청을 error.jpg로 리디렉션하는 것입니다.

주소 다시 쓰기 기능을 사용하면 요청의 접두사가 www.e2.com인 경우 요청의 접두사가 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

매개변수

설명하다

ALL을 허용합니다.

.htaccess 파일에서 RewriteEngine 및 기타 다시 쓰기 규칙을 허용합니다.

ALL: 모든 유형의 다시 쓰기 지시문을 .htaccess 파일의 규칙으로 재정의할 수 있습니다.

없음: 서버 구성을 재정의하기 위해 이 디렉터리에서 .htaccess 파일을 사용하는 것을 허용하지 않습니다.

RewriteEngine 켜기

재작성을 활성화합니다. 이는 재작성 규칙을 활성화하는 첫 번째 단계입니다.

다시 쓰기 조건

재작성 조건 정의

%{HTTP_참조자}

Apache에 내장된 변수입니다. 이 변수는 사용자가 접속할 때 요청 메시지의 헤더 정보에 있는 URL을 얻을 수 있습니다.

요청의 Referer 값과 일치

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

URL(.*: 단일 또는 여러 문자와 일치) 아래의 모든 파일

http://www.e2.com/으로 시작하고 단일 또는 여러 문자로 끝나는 문자열과 일치하지 않음을 나타냅니다.

[체크 안함]

필터링은 대소문자를 구분하지 않습니다.

다시 쓰기 규칙

재작성 규칙 정의

.*.(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 이미지로 리디렉션됩니다.