NGINX Plus

Upstream 서버에 대한 HTTP 트래픽 보호

SSL/TLS 암호화를 사용하여 NGINX 또는 NGINX Plus 와 Upstream 서버 간의 HTTP 트래픽을 보호합니다.

이 문서에서는 NGINX와 Upstream 그룹 또는 Proxy 서버 간의 HTTP 트래픽을 암호화하는 방법을 설명합니다.

목차

1. 전제 조건
2. SSL 서버 인증서 가져오기
3. SSL 클라이언트 인증서 가져오기
4. NGINX 구성
5. Upstream 서버 구성
6. 전체 예제

1. 전제 조건

2. SSL 서버 인증서 가져오기

신뢰할 수 있는 Certificate Authority(CA)에서 서버 인증서를 구매하거나 OpenSSL 라이브러리를 사용하여 자체 내부 CA를 생성하고 자체 인증서를 생성할 수 있습니다. 서버 인증서는 Private Key와 함께 각 Upstream 서버에 배치해야 합니다.

3. SSL 클라이언트 인증서 가져오기

NGINX는 SSL 클라이언트 인증서를 사용하여 Upstream 서버에 자신을 식별합니다. 이 클라이언트 인증서는 신뢰할 수 있는 CA가 서명해야 하며 해당 Private Key와 함께 NGINX에 구성됩니다.

또한 들어오는 모든 SSL 연결에 대해 클라이언트 인증서가 필요하도록 Upstream 서버를 구성하고 NGINX의 클라이언트 인증서를 발급한 CA를 신뢰하도록 구성해야 합니다. 그러면 NGINX가 Upstream에 연결할 때 클라이언트 인증서를 제공하고 Upstream 서버가 이를 수락합니다.

4. NGINX 구성

먼저 URL을 Upstream 그룹으로 변경하여 SSL 연결을 지원합니다. NGINX 구성 파일에서 proxy_pass 지시문에 Proxy된 서버 또는 Upstream 그룹에 대한 “https” 프로토콜을 지정합니다.

location /upstream {
    proxy_pass https://backend.example.com;
}

각 Upstream 서버에서 클라이언트 인증서와 NGINX를 인증하는 데 사용할 Key를 proxy_ssl_certificateproxy_ssl_certificate_key 지시문을 사용하여 추가합니다.

location /upstream {
    proxy_pass                https://backend.example.com;
    proxy_ssl_certificate     /etc/nginx/client.pem;
    proxy_ssl_certificate_key /etc/nginx/client.key;
}

Upstream 또는 자체 CA에 자체 서명된 인증서를 사용하는 경우, proxy_ssl_trusted_certificate도 포함하세요. 파일은 PEM 형식이어야 합니다. 선택 사항으로 proxy_ssl_verifyproxy_ssl_verfiy_depth 지시문을 포함하면 NGINX가 보안 인증서의 유효성을 확인하도록 합니다.

location /upstream {
    #...
    proxy_ssl_trusted_certificate /etc/nginx/trusted_ca_cert.crt;
    proxy_ssl_verify       on;
    proxy_ssl_verify_depth 2;
    #...
}

새로운 SSL 연결마다 클라이언트와 서버 간에 전체 SSL Handshake가 필요하므로 CPU 사용량이 상당히 높습니다. 이전에 협상된 connection 매개변수를 NGINX Proxy가 사용하도록 하고 소위 축약된 Handshake를 사용하려면 proxy_ssl_session_reuse 지시문을 포함하세요.

location /upstream {
    #...
    proxy_ssl_session_reuse on;
    #...
}

선택 사항으로 어떤 SSL 프로토콜과 암호를 사용할지 지정할 수 있습니다.

location /upstream {
        #...
        proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        proxy_ssl_ciphers   HIGH:!aNULL:!MD5;
}

5. Upstream 서버 구성

각 Upstream 서버는 HTTPS 연결을 허용하도록 구성해야 합니다. 각 Upstream 서버에 대해 서버 인증서 및 Private Key에 대한 경로를 ssl_certificatessl_certificate_key 지시문을 사용하여 정의합니다.

server {
    listen              443 ssl;
    server_name         backend1.example.com;

    ssl_certificate     /etc/ssl/certs/server.crt;
    ssl_certificate_key /etc/ssl/certs/server.key;
    #...
    location /yourapp {
        proxy_pass http://url_to_app.com;
        #...
    }
}

ssl_client_certificate 지시문을 사용하여 클라이언트 인증서의 경로를 지정합니다.

server {
    #...
    ssl_client_certificate /etc/ssl/certs/ca.crt;
    ssl_verify_client      optional;
    #...
}

6. 전체 예제

http {
    #...
    upstream backend.example.com {
        server backend1.example.com:443;
        server backend2.example.com:443;
   }

    server {
        listen      80;
        server_name www.example.com;
        #...

        location /upstream {
            proxy_pass                    https://backend.example.com;
            proxy_ssl_certificate         /etc/nginx/client.pem;
            proxy_ssl_certificate_key     /etc/nginx/client.key;
            proxy_ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;
            proxy_ssl_ciphers             HIGH:!aNULL:!MD5;
            proxy_ssl_trusted_certificate /etc/nginx/trusted_ca_cert.crt;

            proxy_ssl_verify        on;
            proxy_ssl_verify_depth  2;
            proxy_ssl_session_reuse on;
        }
    }

    server {
        listen      443 ssl;
        server_name backend1.example.com;

        ssl_certificate        /etc/ssl/certs/server.crt;
        ssl_certificate_key    /etc/ssl/certs/server.key;
        ssl_client_certificate /etc/ssl/certs/ca.crt;
        ssl_verify_client      optional;

        location /yourapp {
            proxy_pass http://url_to_app.com;
        #...
        }

    server {
        listen      443 ssl;
        server_name backend2.example.com;

        ssl_certificate        /etc/ssl/certs/server.crt;
        ssl_certificate_key    /etc/ssl/certs/server.key;
        ssl_client_certificate /etc/ssl/certs/ca.crt;
        ssl_verify_client      optional;

        location /yourapp {
            proxy_pass http://url_to_app.com;
        #...
        }
    }
}

이 예제에서 proxy_pass 지시문의 “https” 프로토콜은 NGINX가 Upstream 서버로 전달되는 트래픽을 보호하도록 지정합니다.

보안 연결이 NGINX에서 Upstream 서버로 처음 전달될 때, 전체 Handshake 프로세스가 수행됩니다. proxy_ssl_certificate 지시문은 Upstream 서버에 필요한 PEM 형식 인증서의 위치를 정의하고, proxy_ssl_certificate_key 지시문은 인증서의 private Key 위치를 정의하며, proxy_ssl_protocolsproxy_ssl_ciphers 지시문은 어떤 프로토콜과 암호를 사용할지 제어합니다.

다음에 NGINX가 Upstream 서버에 연결을 전달할 때, proxy_ssl_session_reuse 지시문으로 인해 session 매개변수가 재사용되어 보다 빠르게 보안 연결이 설정됩니다.

proxy_ssl_trusted_certificate 지시문으로 지정된 파일의 신뢰할 수 있는 CA 인증서는 Upstream에서 인증서를 확인하는 데 사용됩니다. proxy_ssl_verify_depth 지시문은 인증서 체인에 있는 두 개의 인증서를 확인하도록 지정하고, proxy_ssl_verify 지시문은 인증서의 유효성을 확인합니다.