본내용은 일반적으로 특정 디렉토리의 보안을 설정할때 아이디/암호등의 단조로운 방식을 벗어나서
특정 client에게만 특정 디렉토리의 내용을 열람할수 있게 하고 싶을때 유용하다
# 일반적인 nginx에서는 지원하지 않으므로 openresty 패키지가 필요하다 openresty는 nginx + 유용한 번들 모듈의
모음
소스 다운로드 : https://openresty.org/
# devel kit를 add해야 아래 misc 모듈설치가 가능하다
모듈 다운로드1: https://github.com/simpl/ngx_devel_kit
#nginx 설정의 지시자를 사용하려면 반드시 필요
모듈 다운로드2: https://github.com/openresty/set-misc-nginx-module/pulls
# 설치
./configure –with-http_ssl_module \ –add-module=/path/to/ngx_devel_kit \ –add-module=/path/to/set-misc-nginx-module
make -j2
make install
# nginx 설정 예제
# GET /?e=1893452400&n=MC4wLjAuMC8w&s=QVvNrcn-j4smvOFhuPTUU7EgoI8# returns 403 when signature on the arguments is not correct OR# when expire time is passed or network does not match.# It is an alternative to the HttpSecureLinkModule in Nginx.# This example has expiry "2030-01-01" and network "0.0.0.0/0".location /secret-directory { # /secret-directory에 설정# $signature(client 요청값 php참조) 에 인증키값과 e n 의 아규먼트를 hmac_sha1로 암호화
set_hmac_sha1 $signature 'secret-key' "e=$arg_e&n=$arg_n"; # $signature값을 base64url 로 인코딩
set_encode_base64url $signature; if ($signature != $arg_s) { return 403; # 값이 맞지 않을겨우 에러 } set_expired $expired $arg_e; if ($expired) { # 만료일을 넘어섰을시 에러 return 403; } set_decode_base64url $network $arg_n; set_ip_matches $ip_matches $network $remote_addr; if ($ip_matches = 0) { return 403; # 암호화된 signature의 ip와 실제 clientip의 값이 맞지 않을경우 에러 } root /var/www; # 모든것을 충족할때 접근허용}# php소스 예제
<?phpfunction base64url_encode($s) # s아규먼트 { return rtrim(strtr(base64_encode($s),"+/", "-_"),"="); }$secret = "secret-key";$expiry = strtotime("2030-01-01 00:00:00");$network = base64url_encode("0.0.0.0/0");$query = "e=$expiry&n=$network";$signature = base64url_encode(hash_hmac('sha1',$query,$secret,true));$url = "http://도메인/secret-directory/?$query&s=$signature";echo "$url\n";# $url의 값이 인코딩된 형태로 나타나게 되며, 아규먼트 e n s가 없거나 맞지 않을경우 403에러를 뿌린다
정상적인 요청($url) e=만료일 n=네트워크+만료일의 암호화값 s=$signature를 암호화한값
http://도메인/package.zip?e=1893452400&n=MC4wLjAuMC8w&s=QVvNrcn-j4smvOFhuPTUU7EgoI8
그외요청: 모두 403 차단
# openresty 와 각 변수값들을 custom 하여 여러가지로 활용할수 있습니다
# network 값을 $remote_addr 변수처리해 client마다 각각 다른 sha1암호화 signature를 생성할수 있습니다
more information:
https://www.leaseweblabs.com/2014/03/custom-http-secure-link-using-openresty-nginx-module/
감사합니다






