NGINX로 웹서비스를 구동할때 특정 디렉토리 하위 페이지를 HTTP 인증 레벨에서 로그인 설정을 한 다음 권한이 있는 사용자에게만 접근을 허용할 수 있습니다.
이 방식은 보안을 필요로 하는 페이지나 워드프레스 같은 CMS의 로그인 환경을 이중으로 보호하는데 사용할 수 있습니다.
목차
NGINX HTTP Basic Authentication 설정
NGINX에서 HTTP 프로토콜을 통한 인증을 구현하는 ngx_http_auth_basic_module 모듈이 설치되어 있어야 하며 일반적으로 패키지를 통한 설치를 했다면 기본적으로 포함되어 있습니다.
기본 문법
http { auth_basic "message"; # 로그인 팝업창 메시지 auth_basic_user_file /etc/nginx/.htpasswd; # 로그인시 필요한 사용자 계정과 비밀번호 정보 파일 }
각 문법에 대한 기능은 위의 주석과 같으며 http { }
블럭에 위와 같이 설정할 경우 모든 가상호스트의 접근에 HTTP 인증을 요구합니다.
도메인 접근시 로그인
server { listen 80; server_name localhost; auth_basic "접근을 제한합니다."; auth_basic_user_file /etc/nginx/.htpasswd; location / { ... } }
가상호스트 레벨에서 웹페이지 전체에 대한 HTTP 인증을 설정하고 싶다면server { }
블럭에 위와 같이 설정합니다. 위와 같이 설정할 경우 http://localhost 하위의 모든 페이지는 HTTP 인증을 요구합니다.
특정 페이지 접근시 로그인
server { listen 80; server_name localhost; location / { ... } location /admin/ { auth_basic "접근을 제한합니다."; auth_basic_user_file /etc/nginx/.htpasswd; } }
특정 페이지에만 HTTP 인증을 설정하고 싶다면 위와 같이 location { } 블럭에 설정합니다.
.htpasswd 파일 설정
사용자의 ID와 암호를 정보가 담긴 .htpasswd 파일은아이디:패스워드
와 같은 구조로 만들어야 하는데 패스워드는 MD5로 암호화가 되어 있어야 합니다.
패드워드를 암호화해서 저장하는 방법은 간단하게 openssl을 사용하는 방법과 아파치 유틸리티(htpasswd)를 이용하는 방법이 있습니다.
htpasswd로 사용자와 패스워드 설정
root@SERVER:/# apt-get install apache2-utils root@SERVER:/# htpasswd -cm /etc/nginx/.htpasswd test New password: Re-type new password: Adding password for user test root@SERVER:/#
아파치 유틸리티가 설치되어 있지 않다면 설치한 다음 두번째와 같이 htpasswd 명령어로 test 라는 계정에 대한 비밀번호를 지정합니다.
root@SERVER:/# htpasswd -m /etc/nginx/.htpasswd apple New password: Re-type new password:
-c
옵션은 새로운 파일을 생성하는데 필요한 명령어 이므로 두번째 계정 설정부터는 -c
옵션을 뺀 다음 명령어를 입력해서 인증에 필요한 계정을 설정합니다.
test:$apr1$SMGr7CI3$bSNkhorr9foTkOu8fGgDZ1 apple:$apr1$qcL9L700$ZxlRcOYuLez3a8TPcJgLD0 mango:$apr1$fULRAQ4f$KUqpnPeubjl.fNKheGnSQ1
.htpasswd 파일을 편집기로 열어보면 위처럼 패스워드가 암호화로 저장되어 있는 것을 확인할 수 있습니다.
openSSL로 사용자와 패스워드 설정
웹서버라면 기본적으로 openssl이 설치되어 있기 때문에 추가적으로 패키지를 설치하지 않아도 된다는 장점이 있습니다.
root@SERVER:/# openssl passwd -1 Password: Verifying - Password: $1$4PxZW35L$U8eGi12vYe2e8aNwkf17m0
위와 같은 명령어를 통해 비밀번호로 사용할 텍스트를 입력하면 위와 같은 암호화된 텍스트를 반환합니다.
root@SERVER:/# vim /etc/nginx/.htpasswd test:$1$4PxZW35L$U8eGi12vYe2e8aNwkf17m0
/etc/nginx/.htpasswd 파일을 에디터로 수동으로 생성해 아이디와 암호화된 비밀번호를 입력합니다.