KMS 키 관리 서비스 Fortanix + NGINX 통합 사용사례
이 포스트는 Fortanix Self-Defending KMS 와 NGINX 및 NGINX Plus 통합하여 TLS Key와 인증서 관리를 용이하게 하기 위한 방법을 설명합니다.
NGINX 서버가 많은 경우 TLS Key와 인증서를 관리하기 어려울 수 있습니다. 한 가지 솔루션은 하드웨어 보안 모듈(HSM)과 같은 Key 관리 시스템(KMS)를 사용하여 중앙에서 관리하는 것입니다.
퍼블릭(Public) 또는 하이브리드(Hybrid) 클라우드에 최신 애플리케이션을 배포한 기업은 전 세계의 다양한 플랫폼에 배포된 웹 애플리케이션에서 암호화 작업을 Offload 할 수 있도록 클라우드에 구애받지 않고 매우 안전하며 확장 가능하고 가용성이 높은 KMS가 필요합니다. 보안을 극대화하기 위해 많은 조직이 KMS 및 해당 작업에 대한 완전한 제어 및 소유권을 원하며, 이는 많은 클라우드 HSM 및 SaaS 제품을 배제하게 합니다.
Fortanix Self-Defending Key Management Service™(Self-Defending KMS)는 다음 요구 사항을 모두 충족합니다.
- 클라우드에 구애받지 않음 – On-Premise뿐만 아니라 모든 퍼블릭 클라우드 플랫폼에서 실행되는 애플리케이션에서 액세스할 수 있습니다.
- 높은 보안성, 확장성 및 고가용성 – Intel® SGX(Software Guard Extensions) 기술을 사용하여 유휴 및 이동 중인 데이터에 대한 매우 안전한 암호화를 제공합니다. 모든 암호화 작업은 HSM 등급 보안을 위해 SGX 보안 Enclave 내에서 수행됩니다.
- Intel SGX를 지원하는 퍼블릭 클라우드 또는 On-Premise 어플라이언스로 Self-Defending KMS를 배포할 수 있습니다. 작성 당시에는 Microsoft Azure와 IBM Cloud가 포함되었습니다.
- 전체 제어 – 인프라 또는 IaaS에 배포하고 중앙 집중식 관리를 위한 웹 기반 UI를 제공합니다.

이 포스트에서는 NGINX Open Source 및 NGINX Plus를 사용한 Self-Defending KMS의 두 가지 사용 사례를 다룹니다.
- TLS 암호화 작업 Offload (NGINX 및 NGINX Plus 둘 다 사용 가능)
- NGINX Plus Key-Value Store에 TLS Key 및 임시 TLS Key Load (NGINX Plus만 사용 가능)
두 사용 사례 모두 먼저 다음 섹션의 지침에 따라 Self-Defending KMS 애플리케이션을 생성하고 해당 TLS Key를 가져와야 합니다.
목차
1. Self-Defending KMS 애플리케이션 생성 및 TLS Key 가져오기
1-1. Self-Defending KMS 애플리케이션 생성
1-2. Self-Defending KMS 로 TLS Key 가져오기
2. Fortanix Self-Defending KMS 로 TLS 암호화 작업 Offload
2-1. 전제조건
2-2. Fortanix PKCS #11 플러그(Plug‑In)인 설치
2-3. 암호화 작업을 Offload하도록 NGINX 구성
2-4. 연결 테스트
3. Fortanix Self‑Defending KMS에서 NGINX Plus Key‑Value Store로 TLS 및 임시 TLS Key 로드
3-1. 전제조건
3-2. Key-Value Store에 Key 및 인증서를 Load하도록 NGINX Plus 구성
3-3. Fortanix Self‑Defending KMS의 데이터로 NGINX Plus Key‑Value Store 채우기
3-3-1. Self‑Defending KMS에 저장된 TLS Key 및 인증서로 Key‑Value Store 채우기
3-3-2. Self‑Defending KMS에서 생성한 임시 TLS Key 및 인증서로 Key‑Value Store 채우기
4. 결론
1. Self-Defending KMS 애플리케이션 생성 및 TLS Key 가져오기
다음 소프트웨어를 사용하여 지침을 테스트했습니다.
- NGINX Plus R20 및 NGINX Open Source 1.16.1.
- Ubuntu 16.04 및 18.04
- Microsoft Azure에서 호스팅되는 Fortanix Self-Defending KMS 클러스터. 앞서 언급했듯이 Azure는 DCsv2 시리즈 VM(가상 머신)에서 Intel SGX를 지원합니다.
Self-Defending KMS를 구입한 경우 Fortanix 지원 포털에 로그인하여 설치 지침에 액세스할 수 있습니다. SaaS 버전의 무료 평가판을 시작할 수도 있습니다(쉬운 시작하기 섹션까지 아래로 스크롤하고 TRY SAAS
클릭). SaaS 버전의 GUI는 다음 스크린샷과 약간 다를 수 있습니다. 필요에 따라 이 지침을 수정하십시오.
1-1. Self-Defending KMS 애플리케이션 생성
첫 번째 단계는 Self-Defending KMS에서 애플리케이션 객체를 생성하는 것입니다. 애플리케이션 객체는 NGINX 서버에서 사용할 인증서, Key 및 Secret을 저장합니다.
1. Fortanix Self-Defending KMS GUI에 로그인합니다.
2. 애플리케이션을 관리할 그룹을 아직 생성하지 않은 경우 Fortanix 설명서의 지침을 따르십시오. 이 포스트에서는 이전에 aserracorp-admins
라는 그룹을 만들었습니다. 그룹은 그룹 구성원이 사용할 수 있는 보안 객체(애플리케이션, Key, 인증서 등)의 모음입니다.
3. 왼쪽 탐색 열에서 Apps
아이콘을 클릭한 다음 + 아이콘을 클릭하여 새 애플리케이션을 만듭니다.
4. Adding new app
추가 창에서 App name
필드에 애플리케이션 이름을 입력합니다(여기서는 app.aserracorp.com
).
5. authentication method에서 API Key
를 선택합니다.
6. 애플리케이션이 속한 그룹을 선택합니다(여기서는 2단계에서 생성한 aserracorp-admins
그룹입니다).
7. 오른쪽 아래 모서리에 있는 SAVE 버튼을 클릭합니다.

8. 세부 정보 창에서 COPY API KEY 버튼을 클릭하여 API Key를 클립보드에 복사합니다(임시 파일에 복사할 수도 있음). Fortanix PKCS #11 플러그인 설치에서 Key를 사용합니다.

1-2. Self-Defending KMS 로 TLS Key 가져오기
https://fortanix.aserracorp.com
에 준비된 Fortanix Self-Defending KMS를 사용하겠습니다. 먼저 NGINX Private Key를 Self-Defending KMS로 가져옵니다.
1. 왼쪽 탐색 열에서 Security Objects
아이콘을 클릭한 다음 + 아이콘을 클릭하여 새 보안 객체를 만듭니다.
2. Adding New Security Object
창에서 Security Object name
필드에 보안 객체 이름을 입력합니다(여기서는 app.aserracorp.com-key
).
3. IMPORT
를 선택합니다.
4. Choose a type for your Security Object
섹션에서 RSA
를 선택합니다.
5. Choose value format
필드에서 Base64
를 선택합니다.
6. TLS Key를 업로드합니다.
7. Add it to a group
섹션에서 Self-Defending KMS 애플리케이션 만들기의 6단계에서 선택한 그룹(여기서는 aserracorp-admins
)을 선택합니다.
8. IMPORT 버튼을 클릭합니다.

2. Fortanix Self-Defending KMS 로 TLS 암호화 작업 Offload

2-1. 전제조건
1. Self-Defending KMS 애플리케이션 만들기 및 TLS Key 가져오기 단계를 완료합니다.
2. 선호하는 ssh 클라이언트를 사용하여 NGINX 서버에 연결합니다.
2-2. Fortanix PKCS #11 플러그(Plug‑In)인 설치
전제조건을 충족한 후:
1. NGINX 인스턴스에서 다음 명령을 실행하여 NGINX 서버에 Fortanix 플러그인을 다운로드하고 설치합니다. 명령은 Debian 및 Ubuntu 시스템에 적합합니다. RHEL/CentOS/Oracle Linux의 경우 플러그인용 RPM 패키지를 다운로드할 수 있습니다.
### Update installed packages
$ sudo apt-get update
$ sudo apt-get upgrade
### Download and install the Fortanix PKCS #11 plug-in
$ sudo wget https://d2bzqwib4mjc49.cloudfront.net/3.14.1298/fortanix-pkcs11-3.14.1298-amd64.deb
$ sudo dpkg -I ./fortanix-pkcs11-3h1298-amd64.deb
2. 이 명령을 실행하여 OpenSSL pkcs#11 engine library를 설치합니다.
$ sudo apt-get install libengine-pkcs11-openssl
3. OpenSSL 구성 파일(openssl.cnf
)을 다음 단계에서 수정할 준비를 위해 백업을 생성하십시오.
$ sudo cp /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf.backup
4. openssl.cnf
의 내용을 Fortanix PKCS#11 engine을 참조하는 다음 텍스트로 바꿉니다. <API_KEY>는 Self-Defending KMS 애플리케이션 생성 8단계에서 복사한 API Key로 대체합니다. 파일을 저장합니다.
# PKCS11 engine config
openssl_conf=openssl_def
[openssl_def]
engines=engine_section
[req]
distinguished_name=req_distinguished_name
[req_distinguished_name]
# empty
[engine_section]
pkcs11=pkcs11_section
[pkcs11_section]
engine_id=pkcs11
dynamic_path=/usr/lib/engines/engine_pkcs11.so
MODULE_PATH=/opt/fortanix/pkcs11/fortanix_pkcs11.so
PIN=<API_KEY>
init=1
2-3. 암호화 작업을 Offload하도록 NGINX 구성
1. NGINX Service(/lib/systemd/system/nginx.service
)를 편집하여 [Service] 섹션에 표시된 환경 변수를 추가하여 Self-Defending KMS Endpoint(예: https://fortanix.aserracorp.com
)을 가리킵니다.
#
[Unit]
Description=A high-performance web server and reverse proxy
Documentation=man:nginx(8)
After=network.target
[Service]
Environment="FORTANIX_API_ENDPOINT=https://fortanix.aserracorp.com"
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
2. NGINX 구성을 수정합니다. 이 예제에서는 기본 /etc/nginx/nginx.conf
파일과 /etc/nginx/conf.d/default.conf
에 정의된 간단한 웹 서버로 구성된 매우 기본적인 구성으로 작업하고 있습니다. 인증서 파일이 /etc/nginx/cert.pem
에 로컬로 저장되는 동안 해당 Key는 ssl_certificate_key 지시문에서 지정한 대로 Fortanix Self-Defending KMS에 안전하게 보관됩니다. app.aserracorp.com-key Label은 Self-Defending KMS로 TLS Key 가져오기의 2단계에서 정의한 Key입니다.
### /etc/nginx/nginx.conf
# SSL settings in the 'http' context
ssl_certificate /etc/nginx/cert.pem;
ssl_certificate_key engine:pkcs11:label_app.aserracorp.com-key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
###/etc/nginx/conf.d/default.conf
server {
# SSL configuration
listen 443 ssl default_server;
server_name app.aserracorp.com;
root /var/www/html;
# Add index.php to this list if using PHP
index index.html index.htm index.nginx-debian.html;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to returning 404
try_files $uri $uri/ =404;
}
}
3. 이 명령을 실행하여 systemd 관리자 구성을 reload 하고 NGINX Service를 다시 시작하십시오.
$ sudo systemctl daemon-reload && sudo systemctl restart nginx
2-4. 연결 테스트
이제 NGINX가 구성되었으므로 브라우저에서 기본 “Welcome to nginx!” 웹 페이지에서 확인된 대로 app.aserracorp.com
의 웹 서버에 성공적으로 액세스할 수 있습니다.

Self‑Defending KMS 포털에서 app.aserracorp.com-key
Key에 대한 정보와 사이트에서 사용된 시기를 볼 수 있습니다.

3. Fortanix Self‑Defending KMS에서 NGINX Plus Key‑Value Store로 TLS 및 임시 TLS Key 로드
NGINX Plus R18 이상 버전부터는 TLS Key 및 인증서, NGINX Plus의 In-Memory Key‑Value Store의 저장을 지원하며, 이는 NGINX Plus 구성 파일의 변수를 통해 보안 외부 저장소에서 데이터를 가져와 채워집니다.
이 섹션에서는 이 사용 사례를 위해 NGINX Plus 및 Fortanix Self-Defending KMS를 구성하는 방법을 보여줍니다. TLS Key와 인증서는 Self-Defending KMS에 안전하게 저장되며 Fortanix Self-Defending KMS 에이전트를 사용하여 요청 시 가져와 NGINX Plus Key-Value Store를 채웁니다. 이 설정의 가장 큰 장점은 Key와 인증서가 Intel SGX 보안 엔클레이브에서 관리되므로 루트킷, BIOS 공격, 중간자 또는 메모리 스크래핑과 같은 기술로 도난당할 수 없다는 것입니다.

3-1. 전제조건
1. Self-Defending KMS 애플리케이션 생성 및 TLS Key 가져오기의 단계를 완료하십시오.
2. 선호하는 ssh 클라이언트를 사용하여 NGINX Plus 서버에 연결합니다.
3. Fortanix 설명서의 지침에 따라 Self-Defending KMS CLI 도구를 설치합니다.
4. Fortanix 지원 포털에서 Self‑Defending KMS NGINX Plus 에이전트를 다운로드하고 설치합니다(로그인 필요).
3-2. Key-Value Store에 Key 및 인증서를 Load하도록 NGINX Plus 구성
전제조건을 충족한 후:
1. 기본 NGINX Plus 구성 파일인 /etc/nginx/nginx.conf
를 편집합니다. ssl_certificate 및 ssl_certificate_key 지시문을 제거하거나 주석 처리하십시오.
2. 다음 내용으로 /etc/nginx/conf.d/ssl_keyval.conf
라는 새 구성 파일을 만듭니다.
이 구성의 경우:
- keyval_zone 지시문은 TLS Key와 인증서를 저장하기 위해 sdkms_ssl_pem이라는 Key-Value-Store를 설정합니다.
- keyval 지시문은 NGINX Plus가 $ssl_server_name 변수에 캡처된 수신 요청의 SNI Host 헤더 값을 기준으로 연결 시 Key-Value Store의 인증서와 일치함을 의미합니다.
- ssl_certificate 및 ssl_certificate_key 지시문은 포트 443에 바인딩 된 server 블록의 PEM 데이터를 로드합니다.
- 두 번째 server 블록에서 location /api 지시문은 NGINX Plus API에 액세스하기 위한 Endpoint를 정의합니다.
log_format sdkms_ssl_keyval '$remote_addr [$time_local] - '
'ssl_server_name:"$ssl_server_name" '
'host:"$host"';
keyval_zone zone=sdkms_ssl_pem:1m;
keyval $ssl_server_name $certificate_pem zone=sdkms_ssl_pem;
server {
listen 443 ssl;
access_log /var/log/nginx/sdkms-ssl-keystore-access.log sdkms_ssl_keyval;
error_log /var/log/nginx/sdkms-ssl-keystore-error.log debug;
# Load PEMs from variable. Note the 'data:' prefix.
ssl_certificate data:$certificate_pem;
ssl_certificate_key data:$certificate_pem;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
server {
listen 8443;
#access_log /var/log/nginx/status-api-access.log notice;
error_log /var/log/nginx/status-api-error.log notice;
location /api {
api write=on;
allow 127.0.0.1;
deny all;
if $request_method !~ ^(GET|POST|HEAD|OPTIONS|PUT|PATCH|DELETE)$ {
return 405;
}
}
}
3. NGINX Plus 서비스를 다시 시작합니다.
$ sudo systemctl restart nginx
3-3. Fortanix Self‑Defending KMS의 데이터로 NGINX Plus Key‑Value Store 채우기
이제 NGINX Plus Key‑Value Store가 구성되었지만 여전히 비어 있고 웹 서버에 대한 요청으로 인해 상태 코드 500 내부 서버 오류가 발생합니다. 이제 NGINX Plus Key‑Value Store를 TLS Key 및 인증서로 채우도록 Fortanix Self-Defending KMS 를 설정합니다. 사용 사례에 따라 두 가지 방법이 있습니다.
3-3-1. Self‑Defending KMS에 저장된 TLS Key 및 인증서로 Key‑Value Store 채우기
이 사용 사례에서는 Self‑Defending KMS에 TLS Key 및 인증서를 저장하고 NGINX Plus 서버에서 실행 중인 해당 에이전트가 Key‑Value Store를 채웁니다.
1. NGINX Plus 서버에서 다음 명령을 실행하여 Self‑Defending KMS 에이전트를 시작합니다.
$ sdkms_agent.sh <key-value_store_name> <Self-Defending_KMS_URL> <API_key> <SNI_Host_name> <private_key_name> <certificate_name>
예를 들어 개인 키(Private Key)를 NGINX_Private_Key
로, 인증서를 NGINX_Certificate
로 app.aserracorp.com
에서 실행 중인 클러스터로 가져오고 NGINX Plus 서버의 SNI 호스트 이름이 nginx-demo.aserracorp.com
인 경우 명령은 다음과 같습니다.
$ sdkms_agent.sh sdkms_ssl_pem https://app.aserracorp.com M2ZjNzczZTMtM2U...p3 nginx-demo.aserracorp.com NGINX_Private_Key NGINX_Certificate
2. 다음 명령을 실행하여 NGINX Plus Key‑Value Store가 Key가 nginx-demo.aserracorp.com
호스트명이고 값이 개인 키 및 인증서의 텍스트인 항목으로 채워져 있는지 확인합니다.
$ curl http://127.0.0.1:8443/api/6/http/keyvals/sdkms_ssl_pem
{
"nginx-demo.aserracorp.com":"-----BEGIN RSA PRIVATE KEY-----\nMIIEPQIB…CpGeJuCsk=\n-----END RSA PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIDHDCCA…RA==\n-----END CERTIFICATE-----\n"
}
3-3-2. Self‑Defending KMS에서 생성한 임시 TLS Key 및 인증서로 Key‑Value Store 채우기
이 사용 사례에서 Self‑Defending KMS 에이전트는 Self‑Defending KMS에서 임시 TLS Key와 인증서를 요청하고 이를 NGINX Plus Key‑Value Store에 Load합니다. 에이전트는 Fortanix Self‑Defending KMS에서 X.509 인증 기관(CA) 플러그인을 호출하여 Self‑Defending KMS에 저장된 기존 CA를 사용하여 임시 Key와 인증서를 발급합니다.
1. Self‑Defending KMS 계정에 다음을 추가합니다:
- root CA 개인 키 및 인증서
- Fortanix의 X.509 CA 플러그인
2. NGINX Plus 서버에서 다음 명령을 실행하여 자체 방어 KMS 에이전트를 시작합니다:
$ python sdkms_get_ephemeral_tls_cert.py <key-value_store_name> <Self-Defending_KMS_URL> <API_key> <plug-in_ID> <SNI_Host_name> <issuer_key_name> <issuer_certificate_name>
예를 들어 CA 개인 키가 CA_Private_Key이고 인증서가 app.aserracorp.com에서 실행되는 클러스터의 CA_Certificate이고 NGINX Plus 서버의 SNI 호스트 이름이 nginx-demo.aserracorp.com인 경우 명령은 다음과 같습니다.
$ python sdkms_get_ephemeral_tls_cert.py sdkms_ssl_pem https://app.aserracorp.com M2ZjNzczZTMtM2U...p3 4b816a17-09e2-4ddd-98c8-593f6d3079d3 nginx-demo.aserracorp.com CA_Private_Key CA_Certificate
3. 다음 명령을 실행하여 NGINX Plus Key‑Value Store Key가 nginx-demo.aserracorp.com 호스트명이고 값이 개인 키 및 인증서의 항목이 텍스트로 채워져 있는지 확인합니다.
$ curl http://127.0.0.1:8443/api/6/http/keyvals/sdkms_ssl_pem
{
"nginx-demo.aserracorp.com":"-----BEGIN RSA PRIVATE KEY-----\nrB4BNhQOPva…KTSPCwx6=\n-----END RSA PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\ngAwlBagIVAJJ…Nw8u4mA0==\n-----END CERTIFICATE-----\n"
}
4. 결론
Fortanix Self‑Defending KMS는 클라우드에서 하드웨어 등급의 보안을 제공하는 유일한 Key 관리 및 암호화 솔루션입니다. 가장 안전하고 기업용 Multi‑Tenant Key 관리 솔루션일 뿐만 아니라 100% REST, PKCS11, KMIP 및 JCE 기반 API를 지원하여 DevOps에 매우 친숙합니다.
개발자가 처음부터 안전한 애플리케이션을 작성할 수 있도록 많은 SDK를 제공합니다. NGINX 및 NGINX Plus 배포에서 Key 및 인증서 관리를 위해 위에서 설명한 통합 흐름을 기존 CI/CD Pipeline에 쉽고 안전하게 연결할 수 있습니다. Fortanix Self-Defending KMS의 기본 플러그인 지원은 이러한 흐름을 다른 클라우드 기본 통합으로 쉽게 확장하여 더 많은 비즈니스 Workflow를 만족시킬 수 있음을 의미합니다.
NGINX Plus와 함께 Key 및 인증서 통합을 배포 테스트 및 사용해 보려면 지금 30일 무료 평가판을 신청하거나 사용 사례에 대해 최신 소식을 빠르게 전달받고 싶으시면 아래 뉴스레터를 구독하세요.
댓글을 달려면 로그인해야 합니다.