NGINX Plus

HTTP 기본 인증으로 액세스 제한하기

NGINX Plus 의 HTTP 기본 인증을 사용하여 액세스를 제어하고, 선택적으로 IP 주소 기반 액세스 제어와 결합할 수 있습니다.

목차

1. 소개
2. 전제 조건
3. 비밀번호 파일 생성
4. HTTP 기본 인증을 위한 NGINX 및 NGINX Plus 구성하기
5. 기본 인증과 IP 주소별 액세스 제한을 결합
6. 전체 예제

1. 소개

사용자 이름/비밀번호 인증을 구현하여 웹사이트 또는 웹사이트의 일부에 대한 액세스를 제한할 수 있습니다. 사용자명과 비밀번호는 비밀번호 파일 생성 도구(예: apache2-utils)를 사용하여 생성하고 채워진 파일에서 가져옵니다.

HTTP 기본 인증은 IP 주소Geographical Location로 액세스를 제한하는 등 다른 액세스 제한 방법과 결합할 수도 있습니다.

2. 전제 조건

  • NGINX Plus 또는 NGINX Open Source
  • 비밀번호 파일 생성 유틸리티(예: apache2-utils(Debian, Ubuntu) 또는 httpd-tools(RHEL/CentOS/Oracle Linux)).

3. 비밀번호 파일 생성

사용자명-비밀번호 쌍을 만들려면 비밀번호 파일 생성 유틸리티(예: apache2-utils 또는 httpd-tools)를 사용합니다.

1. apache2-utils(Debian, Ubuntu) 또는 httpd-tools(RHEL/CentOS/Oracle Linux)가 설치되어 있는지 확인합니다.

2. 비밀번호 파일과 첫 번째 사용자를 만듭니다. -c 플래그(새 파일을 만들려면)를 사용하고 파일 경로명을 첫 번째 인수로, 사용자 이름을 두 번째 인수로 사용하여 htpasswd 유틸리티를 실행합니다.

$ sudo htpasswd -c /etc/apache2/.htpasswd user1

Enter 키를 누르고 메시지가 표시되면 user1의 비밀번호를 입력합니다.

3. 사용자-비밀번호 쌍을 추가로 생성합니다. 파일이 이미 존재하므로 -c 플래그를 생략합니다.

$ sudo htpasswd /etc/apache2/.htpasswd user2

4. 파일에 페어링된 사용자 이름과 해시된 비밀번호가 포함되어 있는지 확인할 수 있습니다.

$ cat /etc/apache2/.htpasswd
user1:$apr1$/woC1jnP$KAh0SsVn5qeSMjTtn0E9Q0
user2:$apr1$QdR8fNLT$vbCEEzDj7LyqCMyNpSoBh/
user3:$apr1$Mr5A0e.U$0j39Hp5FfxRkneklXaMrr/

4. HTTP 기본 인증을 위한 NGINX 및 NGINX Plus 구성하기

1. 보호하려는 위치 내에서 auth_basic 지시문을 지정하고 비밀번호로 보호되는 영역의 이름을 지정합니다. 이 영역의 이름은 자격 증명을 요청할 때 사용자 이름/비밀번호 대화창에 표시됩니다.

location /api {
    auth_basic "Administrator’s Area";
    #...
}

2. 사용자/비밀번호 쌍이 포함된 .htpasswd 파일 경로와 함께 auth_basic_user_file 지시문을 지정합니다.

location /api {
    auth_basic           "Administrator’s Area";
    auth_basic_user_file /etc/apache2/.htpasswd; 
}

또는 기본 인증으로 전체 웹사이트에 대한 액세스를 제한하되 일부 웹사이트 영역은 공개할 수 있습니다. 이 경우 상위 구성 수준에서 상속을 취소하는 auth_basic 지시문의 off 매개변수를 지정합니다.

server {
    ...
    auth_basic           "Administrator’s Area";
    auth_basic_user_file conf/htpasswd;

    location /public/ {
        auth_basic off;
    }
}

5. 기본 인증과 IP 주소별 액세스 제한을 결합

HTTP 기본 인증은 IP 주소별 액세스 제한과 효과적으로 결합할 수 있습니다. 최소 두 가지 시나리오를 구현할 수 있습니다.

  • 사용자는 인증되고 유효한 IP 주소가 있어야 합니다.
  • 사용자는 인증되었거나 유효한 IP 주소를 가지고 있어야 합니다.

1. allowdeny 지시문을 사용하여 특정 IP 주소로부터의 액세스를 허용하거나 거부합니다.

location /api {
    #...
    deny  192.168.1.2;
    allow 192.168.1.1/24;
    allow 127.0.0.1;
    deny  all;
}

192.168.1.1.2 주소를 제외한 192.168.1.1/24 네트워크에 대해서만 접근 권한이 부여됩니다. allowdeny 지시문은 정의된 순서대로 적용된다는 점에 유의하세요.

2. IP 및 HTTP 인증에 의한 제한을 satisfy 지시문과 결합합니다. 지시문을 all로 설정하면 클라이언트가 두 조건을 모두 충족하면 접근 권한이 부여됩니다. 지시문을 any로 설정하면 클라이언트가 하나 이상의 조건을 충족하면 액세스가 허용됩니다.

location /api {
    #...
    satisfy all;    

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

    auth_basic           "Administrator’s Area";
    auth_basic_user_file conf/htpasswd;
}

6. 전체 예제

이 예는 간단한 인증과 IP 주소별 액세스 제한을 결합하여 상태 영역을 보호하는 방법을 보여줍니다.

http {
    server {
        listen 192.168.1.23:8080;
        root   /usr/share/nginx/html;

        location /api {
            api;
            satisfy all;

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

            auth_basic           "Administrator’s Area";
            auth_basic_user_file /etc/apache2/.htpasswd; 
        }
    }
}

상태 페이지에 액세스하면 로그인하라는 메시지가 표시됩니다.

auth_required

제공된 이름과 비밀번호가 비밀번호 파일과 일치하지 않으면 401(Authorization Required) 오류가 발생합니다.