
Upstream 서버에 대한 HTTP 트래픽 보호
SSL/TLS 암호화를 사용하여 NGINX 또는 NGINX Plus 와 Upstream 서버 간의 HTTP 트래픽을 보호합니다.
이 문서에서는 NGINX와 Upstream 그룹 또는 Proxy 서버 간의 HTTP 트래픽을 암호화하는 방법을 설명합니다.
목차
1. 전제 조건
2. SSL 서버 인증서 가져오기
3. SSL 클라이언트 인증서 가져오기
4. NGINX 구성
5. Upstream 서버 구성
6. 전체 예제
1. 전제 조건
- NGINX Open Source 또는 NGINX Plus
- Proxy된 서버 또는 Upstream 서버 그룹
- SSL 인증서 및 Private Key
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_certificate
및 proxy_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_verify
및 proxy_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_certificate
및 ssl_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_protocols
및 proxy_ssl_ciphers
지시문은 어떤 프로토콜과 암호를 사용할지 제어합니다.
다음에 NGINX가 Upstream 서버에 연결을 전달할 때, proxy_ssl_session_reuse
지시문으로 인해 session 매개변수가 재사용되어 보다 빠르게 보안 연결이 설정됩니다.
proxy_ssl_trusted_certificate
지시문으로 지정된 파일의 신뢰할 수 있는 CA 인증서는 Upstream에서 인증서를 확인하는 데 사용됩니다. proxy_ssl_verify_depth
지시문은 인증서 체인에 있는 두 개의 인증서를 확인하도록 지정하고, proxy_ssl_verify
지시문은 인증서의 유효성을 확인합니다.