Module ngx_http_secure_link_module

Module ngx_http_secure_link_module The ngx_http_secure_link_module module (0.7.18) is used to check authenticity of requested links, protect resources from unauthorized access, and limit link lifetime. The authenticity of a requested link is verified by co

nginx.org

 

  • ngx_http_secure_link_module 모듈 사용 용도
    1. 요청된 링크의 진위를 확인
    2. 무단 액세스로부터 리소스를 보호
    3. 링크 수명을 제한

  • 검사의 상태는 $secure_link 변수에서 사용
  • 요청된 링크의 신뢰성은 요청에 전달된 체크섬 값과 요청에 대해 계산된 값을 비교하여 확인
  • 링크의 수명이 제한되어 있고 시간이 만료된 경우 해당 링크는 오래된 것으로 간주

  • ngx_http_secure_link_module 모듈은 두 가지 대체 작동 모드를 제공
    1. secure_link_secret 지시문에 의해 활성화→ 요청된 링크의 신뢰성을 확인하고 무단 액세스로부터 리소스를 보호하는 데 사용
    2. secure_link 및 secure_link_md5 지시문에 의해 활성화되며 링크 수명을 제한하는 데에도 사용

 

 

secure_link 지시어

  • secure_link 지시어는 링크의 체크섬 값과 수명을 추출할 변수가 있는 문자열을 정의
  • secure_link 지시어는 일반적으로 요청과 연결됨

  • 문맥: http, server, location
  • 사용 문법
    # 문법 : secure_link 표현법
    secure_link expression;

 

  • 문자열에서 추출한 체크섬 값은 secure_link_md5 지시문에서 정의한 표현식의 MD5 해시 값과 비교
    1. 체크섬이 다른 경우 $secure_link 변수는 빈 문자열로 설정
    2. 체크섬이 같으면 링크 수명을 확인

  • 링크의 수명이 제한되어 있고 시간이 만료된 경우에도 $secure_link 변수 설정
    1. 링크의 수명이 제한되어 있고 시간이 만료된 경우 $secure_link 변수는 "0"으로 설정
    2. 그렇지 않은 경우 $secure_link 변수는 "1"로 설정

  • 요청에 전달된 MD5 해시 값은 base64url로 인코딩
    1. 링크의 수명이 제한된 경우 만료 시간은 Epoch(1970년 1월 1일 00:00:00 GMT) 이후 초 단위로 설정
    2. MD5 해시 다음에 표현식에 지정되며 쉼표로 구분
    3. 요청에 전달된 만료 시간은 secure_link_md5 지시문에서 사용하기 위해 $secure_link_expires 변수를 통해 사용 가능
      만료 시간이 지정되지 않은 경우 링크의 수명은 무제한임

 

 

2. secure_link_md5 지시어

  • MD5 해시 값이 계산되고 요청에 전달된 값과 비교되는 식을 정의
  • 식에는 링크(리소스)의 보안 부분과 비밀 요소가 포함되어야함

  • 문맥: http, server, location
  • 사용 문법
    # 문법 : secure_link_md5 표현법
    secure_link_md5 expression;

 

  • 링크의 수명이 제한된 경우 표현식에 $secure_link_expires도 포함되어야함
  • 무단 액세스를 방지하기 위해 식에는 주소 및 브라우저 버전과 같은 클라이언트에 대한 일부 정보가 포함될 수 있음
    location /s/ {
        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;
        }
        ...
    }

 

  • "/s/link?md5=_e4Nc3iduzkWRm01TBBNYw&expires=2147483647" 링크는 IP 주소가 127.0.0.1인 클라이언트의 "/s/link"에 대한 액세스를 제한
    링크의 수명은 2038년 1월 19일(GMT)까지 제한

 

  • UNIX에서 md5요청 인수 값은 다음과 같이 얻을 수 있음
    $ echo -n '2147483647/s/link127.0.0.1 secret' | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =

 

 

3. secure_link_secret 지시어

  • 요청된 링크의 진위 여부를 확인하는 데 사용되는 암호를 정의

  • 문맥: location
  • 사용 문법
    # 문법 : secure_link_secret 표현법
    secure_link_secret word;

 

  • 요청된 링크의 전체 URI은 아래와 같음
    1. hash → 링크와 secret 단어의 연결을 위해 계산된 MD5 해시의 16진수 표현
    2. prefix → 슬래시가 없는 임의의 문자열
    3. link → 요청 url
      # /접두사/해시/링크
      /prefix/hash/link

 

  • 요청된 링크가 진위 확인을 통과하면 $secure_link 변수가 요청 URI에서 추출된 링크로 설정
  • 그렇지 않으면 $secure_link 변수가 빈 문자열로 설정됨
    location /p/ {
        secure_link_secret secret;
     
        if ($secure_link = "") {
            return 403;
        }
     
        rewrite ^ /secure/$secure_link;
    }
     
    location /secure/ {
        internal;
    }

 

  • "/p/5e814704a28d9bc1914ff19fa0c4a00a/link" 요청은 내부적으로 "/secure/link"로 리디렉션
  • UNIX에서 예제의 해시 값은 아래와 같이 얻을 수 있음
    $ echo -n 'linksecret' | openssl md5 -hex

 

 

'Nginx > Nginx 모듈 학습' 카테고리의 다른 글

ngx_http_mp4_module 모듈  (0) 2023.09.24
ngx_http_referer_module 모듈  (0) 2023.09.23
ngx_http_realip_module 모듈  (0) 2023.09.23
ngx_http_slice_module 모듈  (0) 2023.09.22
ngx_http_split_clients_module 모듈  (0) 2023.09.22

+ Recent posts