HttpGuard

HttpGuard 는 openresty 를 기반 으로 lua 스 크 립 트 언어 로 개 발 된 cc 공격 방지 소프트웨어 입 니 다.한편, openresty 는 고성능 웹 서버 Nginx 와 일련의 Nginx 모듈 을 통합 시 켰 는데 그 중에서 가장 중요 한 것 은 우리 가 주로 사용 하 는 nginx lua 모듈 이다.HttpGuard 는 nginx lua 개발 을 바탕 으로 nginx 의 높 은 병발, 고성능 의 특징 을 계승 하여 매우 작은 성능 손실 로 대규모 cc 공격 을 예방 할 수 있 습 니 다.    HttpGuard 방 cc 의 일부 특성 을 소개 합 니 다.
  • 방문객 의 일정 시간 요청 횟수 제한
  • 방문객 에 게 302 전향 응답 헤드 를 보 내 악성 사용 자 를 식별 하고 재 방문 을 막는다
  • 방문객 에 게 점프 기능 을 가 진 js 코드 를 보 내 악성 사용 자 를 식별 하고 재 방문 을 막는다
  • 방문객 에 게 쿠키 를 보 내 악성 사용 자 를 식별 하고 재 방문 을 막는다
  • 방문객 에 게 인증 코드 가 있 는 페이지 를 보 내 서 오상 을 방지 하 는 것 을 지원 한다
  • 악성 방문객 의 연결 을 직접 차단 하 는 것 을 지원 합 니 다
  • iptables 와 결합 하여 악성 방문객 의 재 접속 을 막 는 것 을 지원 합 니 다
  • 화이트 리스트 기능 지원
  • 특정 포트 의 연결 수 를 통계 하여 자동 으로 cc 모드 를 켜 거나 닫 는 것 을 지원 합 니 다
  • 패 시 브 디펜스
    1. 단위 시간 내 단일 IP 의 방문 횟수 통계
    2. 단위 시간 내 단일 UA 의 방문 횟수 통계 (기관차 대상)
    능 동 방어
    1.302 점프
    2. js 점프
    3. 쿠키 검증
    앞의 두 개 는 할 말 이 없다. 아주 간단 하 다. 뒤의 세 가지 실현 방식 에 중심 을 두 고 말 하 자.
    302 점프
    302 점프 는 주로 방문 한 ip 에 대해 랜 덤 으로 302 점프 를 하 는데 점프 할 때 원시 url 뒤에 몇 개의 파 라 메 터 를 추가 합 니 다. 보통 캡 처 프로그램 이나 cc 공격 은 header 를 식별 하지 않 고 밸브 값 을 설정 합 니 다. IP 가 여러 번 점프 하지 않 을 때 그 를 제거 할 수 있 습 니 다.만약 에 점프 에 성공 하면 정상 적 인 사용자 라 고 볼 수 있 습 니 다. 그러면 저 희 는 쿠키 값 과 시 효 를 설정 할 수 있 습 니 다. 물론 쿠키 의 값 은 ip 과 일부 특수 매개 변 수 를 통 해 계산 되 기 때문에 다른 사람 이 해결 하지 못 하 게 할 수 있 습 니 다. 그리고 이 시효 내 에 사용 자 를 탐지 하지 않 습 니 다.
    점프
    사실 js 점프 도 위 와 비슷 하지만 점프 방식 은 js 를 통 해 이 루어 진다.요청 이 왔 을 때 간단 한 js 점프 를 토 해 낸 다음 에 원시 url 뒤에 파 라 메 터 를 추가 하면 다음 검증 같은 것 은 위의 302 점프 와 같 습 니 다.
    쿠키 검증
    쿠키 인증 은 사용자 가 처음 방문 할 때 쿠키 를 심 어 주 고 방문 횟수 를 기록 하 는 것 입 니 다. 만약 에 두 번 째 방문 에 쿠키 가 없 으 면 다시 쿠키 를 시도 할 수 있 습 니 다. 쿠키 전송 실패 횟수 가 특정한 밸브 값 보다 많 으 면 이 IP 를 제거 할 수 있 습 니 다.
    github 프로젝트 주소:https://github.com/centos-bz/HttpGuard연락처 작성 자: admin \ # centos. bz 협찬 작가 지속 개발:  알 리 페 이 바코드 306972903 을 보고 HttpGuard 1 을 배치 하기 시 작 했 습 니 다. openresty 또는 nginx lua 를 설치 하려 면 HttpGuard 를 설치 하기 전에 openresty 또는 nginx lua 를 설치 해 야 합 니 다. 세 가지 방법 이 있 습 니 다.
  • ezhttp 원 키 로 설치https://www.lxconfig.com/thread-52-1-1.html
  • openresty 홈 페이지 에 따라 수 동 으로 설치http://openresty.com/
  • Nginx 설치 및 nginx 설치lua 모듈
  • 2. HttpGuard 를 설치 하면 우리 가 HttpGuard 를 / data / www / waf / 에 설치한다 고 가정 합 니 다. 물론 임의의 디 렉 터 리 에 설치 할 수 있 습 니 다.
    cd /data/www
    wget --no-check-certificate https://github.com/centos-bz/HttpGuard/archive/master.zip
    unzip master.zip
    mv HttpGuard-master waf
    3. 인증 코드 이미 지 를 생 성 하 는 것 은 인증 코드 가 사용 자 를 식별 하 는 것 을 지원 하기 위해 저 희 는 먼저 인증 코드 이미 지 를 생 성 해 야 합 니 다.인증 코드 그림 을 만 들 려 면 시스템 에 phop 과 phop - gd 모듈 이 설치 되 어 있어 야 합 니 다.1, 편집 / data / www / waf / captcha / getImg. php 파일, 찾기
  • $font = '/data/www/waf/captcha/t1.ttf';

  • font 의 경 로 를 t1. tff 파일 로 정확하게 가리 키 십시오.2. getImg. php 파일 을 명령 행 으로 실행 합 니 다.
  • cd /data/www/waf/captcha/
  • /usr/local/php/bin/php getImg.php

  • 만 개의 그림 을 만 드 는 데 몇 분 이 걸 릴 것 같 습 니 다.
    4. nginx. conf 설정 파일 을 수정 하여 http 블록 에 다음 코드 를 입력 하 십시오.
  • lua_package_path "/data/www/waf/?.lua";
  • lua_shared_dict guard_dict 100m;
  • lua_shared_dict dict_captcha 70m;
  • init_by_lua_file '/data/www/waf/init.lua';
  • access_by_lua_file '/data/www/waf/runtime.lua';
  • lua_max_running_timers 1;

  • 관련 경 로 를 수정 해 야 한 다 는 것 을 기억 하 세 요.
    5. HttpGuardHttpGuard 를 설정 하 는 모든 설정 항목 은 config. lua 파일 에 있 습 니 다. 다음 글 에 따라 설정 파일 을 수정 하 십시오.https://www.lxconfig.com/thread-121-1-1.html
    1. ASP HTML 등 다른 페이지 의 보호 설정
    url - protect / 해당 파일 에 한 줄 추가 $  ... 하면 된다
    2、limitReqModules = { state = "On" , maxReqs = 50 , amongTime = 10, urlProtect = baseDir.."url-protect/limit.txt" },
    그 중에서 maxReqs 의 값 은 너무 작 으 면 안 되 고 너무 작 으 면 인증 을 해도 일부 그림 이 표시 되 지 않 습 니 다.
    3. 모든 페이지 를 보호 할 때 www. xxx. com /  인증 코드 를 입력 한 후 www. xxx. com / favicon. ico 로 건 너 뛰 기
    해결 방법:. ico 끝 페이지 보호
    ^(?!\.ico)*.$
    Nginx 와 Lua
    Posted on 2012-08-31
    화운 사신 어록: 천하 의 무공 은 견고 하지 않 으 면 깨 지지 않 고 빠 르 기만 하면 깨 지지 않 는 다!Nginx 의 집 구경 솜 씨 는 속도 이 고 Lua 의 장기 이자 속도 이다. 이 두 가지 결합 은 속도 에 있어 유전자 적 인 장점 이 있다.
    가장 먼저 Nginx, Lua 를 조합 한 것 은 OpenResty 입 니 다. ngx 가 있 습 니 다.lua 모듈, Lua 를 Nginx 에 삽입 하기;그리고 Tengine 에 도 ngx 가 포함 되 어 있 습 니 다.lua 모듈.이들 의 차이 점: OpenResty 는 Nginx 의 Bundle 이다.텐 진 은 엔 진 스 의 포크 다.특히 OpenResty 와 Tengine 은 모두 국민 스스로 만 든 프로젝트 로 전 자 는 주로 춘 형 과 효 철 이 개 발 했 고 후 자 는 타 오 바 오 가 관리 했다.
    OpenResty 와 Tengine 중 어느 것 이 좋 고 어느 것 이 나 쁜 지 는 여러분 에 게 스스로 판단 하도록 남 겨 두 고 다음 과 같은 자 료 는 참고 할 수 있 습 니 다.
  • ngx_openresty: an Nginx ecosystem glued by Lua
  • 타 오 바 오 Nginx 응용, 맞 춤 형 개발 실전
  • 춘 형 이 Tech - club 에서 'Lua 가 붙 인 Nginx 생태 환경' 에 관 한 강연 실 록 을 추천 합 니 다. 재 미 있 습 니 다!
    설치 하 다.
    최신 버 전의 Nginx, LuaJIT, ngx 가 필요 합 니 다.devel_kit,ngx_lua 등 설치 파일.
    Lua 나 LuaJIT 를 설치 해도 되 지만 효율 적 인 차원 에서 LuaJIT 를 설치 하 는 것 을 추천 합 니 다.
    shell> wget http://luajit.org/download/LuaJIT-<VERSION>.tar.gz
    shell> tar zxvf LuaJIT-<VERSION>.tar.gz
    shell> cd LuaJIT-<VERSION>
    shell> make
    shell> make install

    결 성 된 경로 에 설치 되 어 있 기 때문에 LuaJIT 에 대응 하 는 lib, include 는 모두 / usr / local 디 렉 터 리 에 있 습 니 다.
    shell> export LUAJIT_LIB=/usr/local/lib
    shell> export LUAJIT_INC=/usr/local/include/luajit-<VERSION>

    다음은 Nginx 를 컴 파일 할 수 있 습 니 다.
    shell> wget http://nginx.org/download/nginx-<VERSION>.tar.gz
    shell> tar zxvf nginx-<VERSION>.tar.gz
    shell> cd nginx-<VERSION>
    shell> ./configure
        --add-module=/path/to/ngx_lua \
        --add-module=/path/to/ngx_devel_kit
    shell> make
    shell> make install

    Nginx 를 시작 해 보 세 요. 운 이 좋 지 않 으 면 다음 과 같은 오류 가 발생 할 수 있 습 니 다.
    cannot open shared object file: No such file or directory
    이게 뭐야?ldd 명령 으로 볼 수 있 습 니 다:
    shell> ldd /path/to/nginx
    libluajit-<VERSION>.so => not found

    이러한 문 제 는 보통 Idconfig 명령 을 사용 하면 해결 할 수 있 습 니 다.
    shell> echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
    shell> ldconfig

    Nginx 를 다시 시작 해 보면 OK 가 될 거 예요.
    활용 단어 참조
    우 리 는 먼저 간단 한 프로그램 으로 온장 을 따뜻 하 게 합 니 다. 다음 코드 를 Nginx 설정 파일 nginx. conf 에 추가 하고 Nginx 를 다시 시작 한 다음 에 탐색 하면 효 과 를 볼 수 있 습 니 다.
    location /lua {
        set $test "hello, world.";
        content_by_lua '
            ngx.header.content_type = "text/plain";
            ngx.say(ngx.var.test);
        ';
    }

    깊이 공부 중 ngxlua 에 앞서 춘 형 이 쓴 Nginx 튜 토리 얼 을 자세히 읽 어 보 는 것 을 권장 합 니 다.
    여기 서 중요 한 것 은 Nginx 프로필 이 사용 하 는 언어 는 본질 적 으로 '프로 세 스 적' 이 아니 라 '성명 적' 입 니 다.Nginx 가 요청 을 처리 할 때 명령 의 집행 은 명령 을 정의 할 때의 물리 적 순서 에 의 해 결정 되 는 것 이 아니 라 명령 이 속 한 단계 에 달 려 있다. Nginx 가 자주 사용 하 는 단 계 는 rewrite 단계, access 단계, content 단계 등 이 있다.데모 코드 의 set 명령 은 rewrite 단계, content 에 속 합 니 다.by_lua 명령 은 content 단계 에 속 합 니 다. 두 명령 의 순 서 를 교환 해 보면 프로그램 이 정상적으로 작 동 할 수 있 습 니 다.
    레 디 스 와 결합 해 좀 더 실전 적 인 예 를 들 어 보 겠 습 니 다.
    우선, 우 리 는 Redis 프로필 config. json 을 만들어 야 합 니 다. 내용 은 다음 과 같 습 니 다.
    {
        "host": "<HOST>",
        "port": "<PORT>"
    }

    그리고 설정 파일 을 분석 하 는 스 크 립 트 init. lua 를 만 들 었 습 니 다. 그 중에서 Lua CJSON 모듈 을 사 용 했 습 니 다.
    local cjson = require "cjson";
    
    local config = ngx.shared.config;
    
    local file = io.open("config.json", "r");
    local content = cjson.decode(file:read("*all"));
    file:close();
    
    for name, value in pairs(content) do
        config:set(name, value);
    end

    설명: 코드 에 공유 메모리 가 사용 되 었 습 니 다. 요청 할 때마다 프로필 을 분석 할 필요 가 없습니다.
    이 어 렌 더 링 내용 의 스 크 립 트 content. lua 를 만 들 고 Resty Redis 모듈 을 사 용 했 습 니 다.
    ngx.header.content_type = "text/plain";
    
    local redis = require "resty.redis";
    
    local config = ngx.shared.config;
    
    local instance = redis:new();
    
    local host = config:get("host");
    local port = config:get("port");
    
    local ok, err = instance:connect(host, port);
    if not ok then
        ngx.log(ngx.ERR, err);
        ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE);
    end
    
    instance:set("name", "laowang");
    
    local name = instance:get("name")
    
    instance:close();
    
    ngx.say("name: ", name);

    설명: Resty Redis 모듈 을 vendor 디 렉 터 리 에 두 고 나중에 Nginx 에서 통일 적 으로 설정 하 는 것 을 권장 합 니 다.
    마지막 으로 Nginx 프로필 에 설정 해 야 합 니 다.
    lua_shared_dict config 1m;
    lua_package_path "/path/to/vendor/?.lua;;";
    
    init_by_lua_file /path/to/init.lua;
    
    server {
        lua_code_cache off;
    
        location /lua {
            content_by_lua_file /path/to/content.lua;
        }
    
        ...
    }

    설명: 디 버 깅 편 의 를 위해 lua 를 닫 았 습 니 다.code_cache, 생산 환경 이 라면 열 어야 합 니 다.
    또한 CJSON 을 설치 할 때 Makefile 파일 에 있 는 파일 의 경 로 를 주의해 야 합 니 다.
    PREFIX = /usr/local
    LUA_INCLUDE_DIR = $(PREFIX)/include

    LuaJIT 가 설치 되 어 있다 면 해당 디 렉 터 리 에 헤더 파일 을 복사 하 는 것 이 좋 습 니 다.
    cp /usr/local/include/luajit-<VERSION>/* /usr/local/include/


    제 가 최근 에 참여 한 프로젝트 는 웹 폴 링 에 사용 되 는 인 터 페 이 스 를 제 공 했 습 니 다. 모두 Nginx + Lua 로 이 루어 졌 습 니 다. 모두 10 여 대의 서버 만 있 지만 매일 수 십 억 번 의 요 구 량 을 제공 할 수 있 습 니 다. 도둑 라 라 의 강 함 입 니 다.
    마지막 으로, 나 는 어떤 반 강 이 버클륨 큰 자라 의 큰 자라 인 23870 을 인용 합 시다: 루 아, 미혼 남성 프로그래머 의 최 애.

    좋은 웹페이지 즐겨찾기