본문 바로가기

[NGINX] Basic Authentication와 IP Address

Nginx 단에서 HTTP 인증을 사용할 수 있는 설정이다.

HTTP 인증과 더불어 IP 접근 제한 등 다른 제한 수단과 함께 사용가능하다.

 

문법

location /api {
    auth_basic           “접근을 위해 인증이 필요합니다.”;
    auth_basic_user_file ${PATH_NAME}/.htpasswd; 
}

.htpasswd 파일은 md5로 암호화되어있는 id:password의 쌍으로 이루어진 파일이다.

파일 생성 방법으로 Docs에서는 apache2-utils (Debian, Ubuntu) 혹은 httpd-tools (RHEL/CentOS/Oracle Linux) 등 비밀번호 파일 생성 툴을 사용할 수 있다.

웹 서버의 경우 openssl로 암호화된 비밀번호를 얻을 수 있다.
(출처)
> openssl passwd -1​

 

만약, 특정 location은 HTTP 인증을 사용하고 싶지 않다면 다음처럼 server 문에 auth_basic을 추가하고, auth_basic을 사용하고 싶지 않은 location 블록에 off를 명시한다.

server {
    ...
    auth_basic           “접근을 위해 인증이 필요합니다.”;
    auth_basic_user_file conf/htpasswd;

    location /public/ {
        auth_basic off;
    }
}

 

IP 주소 제한과 함께 사용하기

공식문서에서는 적어도 두 개의 조건에 IP 주소제한과 HTTP 인증을 함께 사용하면 유용하다고 소개한다.

  • 사용자가 HTTP인증도 하는 동시에 유효한 IP로 접근해야만 허용
  • 사용자가 HTTP인증을 통과하거나 또는 유효한 IP로 접근할 때 허용 (둘 중 하나만 만족)

위 조건을 구현하기 위해서 satisfy디렉티브를 사용한다.

# 1. 사용자가 HTTP인증도 하는 동시에 유효한 IP로 접근해야만 허용
location /api {
    #...
    satisfy all;    

    deny  192.168.1.2;
    allow 192.168.1.1/24;
    allow 127.0.0.1;
    deny  all;

    auth_basic           “접근을 위해 인증이 필요합니다.”;
    auth_basic_user_file conf/htpasswd;
}

satisfy all로 설정하면 HTTP인증을 통과하는 동시에 유효한 IP로 접근해야만 접근을 허용한다.

 

# 2. 사용자가 HTTP인증을 통과하거나 또는 유효한 IP로 접근할 때 허용 (둘 중 하나만 만족)
location /api {
    #...
    satisfy any;    

    deny  192.168.1.2;
    allow 192.168.1.1/24;
    allow 127.0.0.1;
    deny  all;

    auth_basic           “접근을 위해 인증이 필요합니다.”;
    auth_basic_user_file conf/htpasswd;
}

 

반대로 satisfy any로 설정하면 IP 접근 조건 혹은 HTTP 인증 조건 둘 중 하나만 만족하면 접근을 허용한다.

[NGINX Docs] Combine restriction by IP and HTTP authentication with the satisfy directive. If you set the directive to to all, access is granted if a client satisfies both conditions. If you set the directive to any, access is granted if if a client satisfies at least one condition:

 

설정이 완료되면 이제 HTTP 인증으로 접근할 수 있다.

HTTP 인증 예시

 

참고

NGINX Docs