Proxmox 매뉴얼 : 03.12 인증서 관리

Proxmox VE 8.1.3 매뉴얼을 DeepL/Google Translate를 이용해서 기계번역하고, 살짝 교정했습니다.
https://pve.proxmox.com/pve-docs/pve-admin-guide.html

3.12.1. 클러스터 내 통신을 위한 인증서

각 Proxmox VE 클러스터는 기본적으로 자체(자체 서명) CA(Certificate Authority)를 생성하고 앞서 언급한 CA가 서명하는 각 노드에 대한 인증서를 생성합니다. 이 인증서는 클러스터의 pveproxy 서비스 및 SPICE를 사용하는 경우 셸/콘솔 기능과의 암호화된 통신에 사용됩니다.

CA 인증서 및 키는 Proxmox Cluster File System(pmxcfs)에 저장됩니다.

3.12.2. API 및 웹 GUI용 인증서

REST API 및 웹 GUI는 각 노드에서 실행되는 pveproxy 서비스에서 제공합니다.
pveproxy에서 사용하는 인증서에는 다음과 같은 옵션이 있습니다:

  1. 기본적으로 /etc/pve/nodes/NODENAME/pve-ssl.pem에 있는 노드별 인증서가 사용됩니다. 이 인증서는 클러스터 CA에서 서명하므로 브라우저 및 운영 체제에서 자동으로 신뢰하지 않습니다.
  2. 외부에서 제공한 인증서(예: 상용 CA에서 서명한 인증서)를 사용합니다.
  3. 자동 갱신 기능이 있는 신뢰할 수 있는 인증서를 받으려면 ACME(Let’s Encrypt)를 사용하며, 이는 Proxmox VE API 및 웹 인터페이스에도 통합되어 있습니다.

옵션 2 및 3의 경우 /etc/pve/local/pveproxy-ssl.pem 파일(및 /etc/pve/local/pveproxy-ssl.key, 비밀번호가 없어야 함)이 사용됩니다.

참고: /etc/pve/local은 /etc/pve/nodes/NODENAME에 대한 노드별 심볼릭 링크입니다.

인증서는 Proxmox VE Node 관리 명령으로 관리합니다(pvenode(1) 설명서 참조).

경고: 자동으로 생성된 노드 인증서 파일 /etc/pve/local/pve-ssl.pem 및 /etc/pve/local/pve-ssl.key 또는 클러스터 CA 파일 /etc/pve/pve-root-ca.pem 및 /etc/pve/priv/pve-root-ca.key에서 교체하거나 수동으로 수정하지 마세요.

3.12.3. 사용자 지정 인증서 업로드

Proxmox VE 노드에 사용하려는 인증서가 이미 있는 경우 웹 인터페이스를 통해 간단히 해당 인증서를 업로드할 수 있습니다.

참고: 인증서 키 파일을 제공하는 경우 비밀번호로 보호되어서는 안 됩니다.

3.12.4. Let’s Encrypt(ACME)를 통한 신뢰할 수 있는 인증서

Proxmox VE에는 Automatic Certificate Management Environment(ACME) 프로토콜의 구현이 포함되어 있어 Proxmox VE 관리자는 최신 운영 체제 및 웹 브라우저에서 즉시 허용되고 신뢰할 수 있는 TLS 인증서를 쉽게 설정하기 위해 Let’s Encrypt와 같은 ACME 공급자를 사용할 수 있습니다.

현재 구현된 두 개의 ACME 엔드포인트는 Let’s Encrypt(LE) 프로덕션과 스테이징 환경입니다. 저희 ACME 클라이언트는 내장된 웹 서버를 사용하여 http-01 챌린지의 유효성 검사를 지원하고 acme.sh가 하는 모든 DNS API 엔드포인트를 지원하는 DNS 플러그인을 사용하여 dns-01 챌린지의 유효성 검사를 지원합니다.

ACME 계정

사용하려는 엔드포인트에 클러스터당 ACME 계정을 등록해야 합니다. 해당 계정에 사용되는 이메일 주소는 갱신 기한 또는 이와 유사한 알림을 ACME 엔드포인트에서 받을 수 있는 연락처로 사용됩니다.

웹 인터페이스 Datacenter -> ACME 또는 pvenode 명령줄 도구를 사용하여 ACME 계정을 등록하고 비활성화할 수 있습니다.

pvenode acme account register account-name mail@example.com

팁: 속도 제한으로 인해 실험을 하거나 ACME를 처음 사용하는 경우 LE 스테이징을 사용해야 합니다.

ACME 플러그인

ACME 플러그인 작업은 귀하와 귀하가 운영하는 Proxmox VE 클러스터가 도메인의 실제 소유자인지 자동 확인을 제공하는 것입니다. 이것은 자동 인증서 관리를 위한 기본 빌딩 블록입니다.

ACME 프로토콜은 다양한 유형의 챌린지를 지정합니다. 예를 들어 웹 서버가 도메인을 제어한다는 것을 증명하기 위해 특정 콘텐츠가 포함된 파일을 제공하는 http-01과 같은 챌린지를 지정합니다. 기술적인 제한으로 인해 또는 공개 인터넷에서 레코드 주소에 연결할 수 없는 경우에는 이것이 불가능할 수도 있습니다. 이러한 경우 dns-01 챌린지를 사용할 수 있습니다. 이 챌린지는 도메인의 영역에 특정 DNS 레코드를 생성하여 수행됩니다.

https://pve.proxmox.com/pve-docs/images/screenshot/gui-datacenter-acme-overview.png

Proxmox VE는 이 두 가지 챌린지 유형을 모두 기본적으로 지원하며, 웹 인터페이스의 Datacenter -> ACME에서 플러그인을 구성하거나 pvenode acme plugin add 명령을 사용하여 플러그인을 구성할 수 있습니다.

ACME 플러그인 구성은 /etc/pve/priv/acme/plugins.cfg에 저장됩니다. 플러그인은 클러스터의 모든 노드에서 사용할 수 있습니다.

노드 도메인

각 도메인은 노드별로 다릅니다. 노드 -> 인증서에서 새 도메인을 추가하거나 기존 도메인 항목을 관리하거나 pvenode config 명령을 사용하여 관리할 수 있습니다.

노드에 원하는 도메인을 구성하고 원하는 ACME 계정을 선택한 후에 웹 인터페이스에서 새 인증서를 주문할 수 있습니다. 성공하면 10초 후에 인터페이스가 다시 로드됩니다.

갱신은 자동으로 이루어집니다.

3.12.5. ACME HTTP 챌린지 플러그인

포트 80에서 생성된 기본 제공 웹서버를 통해 http-01 챌린지의 유효성을 검사하기 위해 항상 암시적으로 구성된 독립 실행형 플러그인이 있습니다.

참고: 독립형이라는 이름은 타사 서비스 없이 자체적으로 유효성 검사를 제공할 수 있다는 의미입니다. 따라서 이 플러그인은 클러스터 노드에서도 작동합니다.

Let’s Encrypt ACME로 인증서 관리에 사용하려면 몇 가지 전제 조건이 있습니다.

  • 계정을 등록하려면 Let’s Encrypt의 ToS에 동의해야 합니다.
  • 노드의 포트 80은 인터넷에서 연결할 수 있어야 합니다.
  • 포트 80에 다른 리스너가 없어야 합니다.
  • 요청된 (하위)도메인은 노드의 공인 IP로 확인해야 합니다.

3.12.6. ACME DNS API 챌린지 플러그인

http-01 방법을 통한 유효성 검사를 위한 외부 액세스가 불가능하거나 원하지 않는 시스템에서는 dns-01 유효성 검사 방법을 사용할 수 있습니다. 이 유효성 검사 방법에는 API를 통해 TXT 레코드를 프로비저닝할 수 있는 DNS 서버가 필요합니다.

유효성 검사를 위한 ACME DNS API 구성하기

Proxmox VE는 acme.sh 프로젝트용으로 개발된 DNS 플러그인을 재사용하므로 특정 API 구성에 대한 자세한 내용은 해당 설명서를 참조하세요.
DNS API로 새 플러그인을 구성하는 가장 쉬운 방법은 웹 인터페이스(Datacenter -> ACME)를 사용하는 것입니다.

챌린지 유형으로 DNS를 선택합니다. 그런 다음 API 제공업체를 선택하고 자격 증명 데이터를 입력하여 해당 API를 통해 계정에 액세스할 수 있습니다.

팁: 제공업체의 API 자격 증명을 얻는 방법에 대한 자세한 내용은 acme.sh DNS API 사용 방법 위키를 참조하세요.

많은 DNS 공급업체와 API 엔드포인트가 있으므로 Proxmox VE는 일부 공급업체에 대한 자격 증명 양식을 자동으로 생성합니다. 다른 공급자의 경우 더 큰 텍스트 영역이 표시되며, 여기에 모든 자격증명 KEY=VALUE 쌍을 복사하기만 하면 됩니다.

CNAME 별칭을 통한 DNS 유효성 검사

기본/실제 DNS가 API를 통한 프로비저닝을 지원하지 않는 경우 특수 별칭 모드를 사용하여 다른 도메인/DNS 서버에서 유효성 검사를 처리할 수 있습니다. acme-challenge.domain1.example에 대해 _acme-challenge.domain2.example를 가리키는 영구 CNAME 레코드를 수동으로 설정하고 Proxmox VE 노드 구성 파일에서 별칭 속성을 domain2.example로 설정하여 domain2.example의 DNS 서버가 domain1.example에 대한 모든 챌린지의 유효성을 검사할 수 있도록 하세요.

플러그인 조합

요구 사항/ DNS 프로비저닝 기능이 서로 다른 여러 도메인을 통해 노드에 연결할 수 있는 경우 http-01 및 dns-01 유효성 검사를 결합할 수 있습니다. 도메인마다 다른 플러그인 인스턴스를 지정하여 여러 공급업체 또는 인스턴스의 DNS API를 혼합하는 것도 가능합니다.

팁: 여러 도메인에서 동일한 서비스에 액세스하면 복잡성이 증가하므로 가능하면 피해야 합니다.

3.12.7. ACME 인증서 자동 갱신

노드가 ACME 제공 인증서로 성공적으로 구성되었다면(pvenode 또는 GUI를 통해), 인증서는 pve-daily-update.service에 의해 자동으로 갱신됩니다. 현재 인증서가 이미 만료되었거나 향후 30일 이내에 만료될 경우 갱신이 시도됩니다.

3.12.8. pvenode를 사용한 ACME 예제

예제: Let’s Encrypt 인증서를 사용하기 위한 샘플 pvenode 호출

root@proxmox:~# pvenode acme account register default mail@example.invalid
Directory endpoints:
0) Let's Encrypt V2 (https://acme-v02.api.letsencrypt.org/directory)
1) Let's Encrypt V2 Staging (https://acme-staging-v02.api.letsencrypt.org/directory)
2) Custom
Enter selection: 1

Terms of Service: https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
Do you agree to the above terms? [y|N]y
...
Task OK
root@proxmox:~# pvenode config set --acme domains=example.invalid
root@proxmox:~# pvenode acme cert order
Loading ACME account details
Placing ACME order
...
Status is 'valid'!

All domains validated!
...
Downloading certificate
Setting pveproxy certificate and key
Restarting pveproxy
Task OK

예시: 도메인 유효성 검사를 위한 OVH API 설정하기

참고: 계정 등록 단계는 어떤 플러그인을 사용하든 동일하며 여기서는 반복하지 않습니다.
참고: OVH API 문서에 따라 OVH_AK 및 OVH_AS를 OVH에서 얻어야 합니다.

먼저 사용자와 Proxmox VE가 API에 액세스할 수 있도록 모든 정보를 얻어야 합니다.

root@proxmox:~# cat /path/to/api-token
OVH_AK=XXXXXXXXXXXXXXXX
OVH_AS=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
root@proxmox:~# source /path/to/api-token
root@proxmox:~# curl -XPOST -H"X-Ovh-Application: $OVH_AK" -H "Content-type: application/json" \
https://eu.api.ovh.com/1.0/auth/credential  -d '{
  "accessRules": [
    {"method": "GET","path": "/auth/time"},
    {"method": "GET","path": "/domain"},
    {"method": "GET","path": "/domain/zone/*"},
    {"method": "GET","path": "/domain/zone/*/record"},
    {"method": "POST","path": "/domain/zone/*/record"},
    {"method": "POST","path": "/domain/zone/*/refresh"},
    {"method": "PUT","path": "/domain/zone/*/record/"},
    {"method": "DELETE","path": "/domain/zone/*/record/*"}
]
}'
{"consumerKey":"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ","state":"pendingValidation","validationUrl":"https://eu.api.ovh.com/auth/?credentialToken=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"}

(open validation URL and follow instructions to link Application Key with account/Consumer Key)

root@proxmox:~# echo "OVH_CK=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" >> /path/to/api-token

이제 ACME 플러그인을 설정할 수 있습니다:

root@proxmox:~# pvenode acme plugin add dns example_plugin --api ovh --data /path/to/api_token
root@proxmox:~# pvenode acme plugin config example_plugin
┌────────┬──────────────────────────────────────────┐
│ key    │ value                                    │
╞════════╪══════════════════════════════════════════╡
│ api    │ ovh                                      │
├────────┼──────────────────────────────────────────┤
│ data   │ OVH_AK=XXXXXXXXXXXXXXXX                  │
│        │ OVH_AS=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY  │
│        │ OVH_CK=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ  │
├────────┼──────────────────────────────────────────┤
│ digest │ 867fcf556363ca1bea866863093fcab83edf47a1 │
├────────┼──────────────────────────────────────────┤
│ plugin │ example_plugin                           │
├────────┼──────────────────────────────────────────┤
│ type   │ dns                                      │
└────────┴──────────────────────────────────────────┘

마지막으로 인증서를 받으려는 도메인을 구성하고 해당 도메인에 대한 인증서를 주문할 수 있습니다:

root@proxmox:~# pvenode config set -acmedomain0 example.proxmox.com,plugin=example_plugin
root@proxmox:~# pvenode acme cert order
Loading ACME account details
Placing ACME order
Order URL: https://acme-staging-v02.api.letsencrypt.org/acme/order/11111111/22222222

Getting authorization details from 'https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/33333333'
The validation for example.proxmox.com is pending!
[Wed Apr 22 09:25:30 CEST 2020] Using OVH endpoint: ovh-eu
[Wed Apr 22 09:25:30 CEST 2020] Checking authentication
[Wed Apr 22 09:25:30 CEST 2020] Consumer key is ok.
[Wed Apr 22 09:25:31 CEST 2020] Adding record
[Wed Apr 22 09:25:32 CEST 2020] Added, sleep 10 seconds.
Add TXT record: _acme-challenge.example.proxmox.com
Triggering validation
Sleeping for 5 seconds
Status is 'valid'!
[Wed Apr 22 09:25:48 CEST 2020] Using OVH endpoint: ovh-eu
[Wed Apr 22 09:25:48 CEST 2020] Checking authentication
[Wed Apr 22 09:25:48 CEST 2020] Consumer key is ok.
Remove TXT record: _acme-challenge.example.proxmox.com

All domains validated!

Creating CSR
Checking order status
Order is ready, finalizing order
valid!

Downloading certificate
Setting pveproxy certificate and key
Restarting pveproxy
Task OK

예시: staging에서 일반 ACME 디렉토리로 전환하기

계정의 ACME 디렉터리를 변경하는 것은 지원되지 않지만 Proxmox VE는 둘 이상의 계정을 지원하므로 프로덕션(신뢰할 수 있는) ACME 디렉터리를 엔드포인트로 사용하여 새 계정을 만들 수 있습니다. 스테이징 계정을 비활성화하고 다시 만들 수도 있습니다.

예: pvenode를 사용하여 default ACME 계정을 staging에서 디렉토리로 변경하기

root@proxmox:~# pvenode acme account deactivate default
Renaming account file from '/etc/pve/priv/acme/default' to '/etc/pve/priv/acme/_deactivated_default_4'
Task OK

root@proxmox:~# pvenode acme account register default example@proxmox.com
Directory endpoints:
0) Let's Encrypt V2 (https://acme-v02.api.letsencrypt.org/directory)
1) Let's Encrypt V2 Staging (https://acme-staging-v02.api.letsencrypt.org/directory)
2) Custom
Enter selection: 0

Terms of Service: https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
Do you agree to the above terms? [y|N]y
...
Task OK
답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

You May Also Like