chore: 실행 환경 구성 문서 추가 및 수정
This commit is contained in:
+101
-11
@@ -6,31 +6,104 @@
|
||||
|
||||
## 전제
|
||||
|
||||
[03](../03-nginx/) 이 끝나 nginx 가 Traefik 으로 프록시한다. 그리고 **공개
|
||||
DNS 에 이름 세 개가 이 호스트를 가리키고 있어야 한다** — Let's Encrypt 가
|
||||
HTTP-01 로 검증하러 오기 때문이다.
|
||||
[03](../03-nginx/) 이 끝나 엣지 nginx 가 Traefik 으로 프록시한다.
|
||||
|
||||
## 어디서 치는가
|
||||
|
||||
**이 단계는 전부 `[kc-lab-edge]` 에서 친다.** 인증서·certbot·갱신 타이머·
|
||||
deploy 훅이 전부 엣지 게스트에 산다. 물리 호스트에는 아무것도 두지 않는다 —
|
||||
그래야 `virsh undefine kc-lab-edge` 한 줄로 이 계층을 통째로 되돌릴 수 있다.
|
||||
|
||||
## ★ 검증 방식을 먼저 정한다 — HTTP-01 이냐 DNS-01 이냐
|
||||
|
||||
같은 Let's Encrypt 인증서인데 **「이 도메인이 네 것이냐」를 증명하는 방법**만
|
||||
다르다. 그리고 이 실험대에서는 **선택의 여지가 없다.**
|
||||
|
||||
| | HTTP-01 | DNS-01 |
|
||||
|---|---|---|
|
||||
| 검증 방향 | Let's Encrypt **→ 우리 서버** (인바운드) | certbot **→ DNS 공급자 API** (아웃바운드) |
|
||||
| 공개 인터넷에서 보여야 하나 | **그렇다** | 아니다 |
|
||||
| 와일드카드 | 불가 | 가능 |
|
||||
| 필요한 것 | 80 포트 · 공개 A 레코드 | DNS 공급자 API 토큰 |
|
||||
|
||||
**이 실험대는 공개 인터넷을 쓰지 않는다.** 도메인 세 개는 tailnet 주소를
|
||||
가리킨다.
|
||||
|
||||
```bash
|
||||
dig +short auth.hyeonworks.com
|
||||
```
|
||||
```
|
||||
100.83.212.4
|
||||
```
|
||||
|
||||
`100.64.0.0/10` 은 CGNAT 용으로 예약된 대역이라 **공개 인터넷에서 라우팅
|
||||
자체가 되지 않는다.** 방화벽을 여는 문제가 아니라 그 주소가 인터넷에 존재하지
|
||||
않는다. Let's Encrypt 를 tailnet 에 초대할 방법도 없다. **그래서 HTTP-01 은
|
||||
쓸 수 없고 DNS-01 을 쓴다.**
|
||||
|
||||
> **공개 서버라면 HTTP-01 이 맞다.** 토큰도 DNS 연동도 필요 없어서 관리할
|
||||
> 것이 적다. DNS-01 이 더 좋은 방식이어서 고르는 것이 아니라, HTTP-01 이
|
||||
> 못 쓰이는 환경이라 고르는 것이다. 개념은
|
||||
> [`session-lab-concepts.md`](../../session-lab-concepts.md) 의
|
||||
> 「DNS-01 은 언제 쓰는가」.
|
||||
|
||||
---
|
||||
|
||||
## 1. certbot 을 깐다
|
||||
|
||||
**하기**
|
||||
cloud-init 이 이미 깔았다면 건너뛴다 —
|
||||
[`kc-lab.yaml.example`](../../../deploy/lab/cloud-init/kc-lab.yaml.example) 의
|
||||
`packages` 에 들어 있다.
|
||||
|
||||
**하기** — `[kc-lab-edge]`
|
||||
```bash
|
||||
sudo pacman -S certbot certbot-nginx # Arch
|
||||
sudo apt install certbot python3-certbot-nginx # Debian/Ubuntu
|
||||
sudo apt install -y certbot python3-certbot-dns-cloudflare
|
||||
```
|
||||
|
||||
**확인** — 쓸 수 있는 검증 방식이 무엇인가
|
||||
```bash
|
||||
certbot plugins 2>/dev/null | grep -E '^\*'
|
||||
```
|
||||
|
||||
**실측**
|
||||
```
|
||||
* dns-cloudflare
|
||||
* standalone
|
||||
* webroot
|
||||
```
|
||||
|
||||
**어디를 봐야 하는가** — `dns-cloudflare` 한 줄이 있는가. 없으면 플러그인
|
||||
패키지가 안 깔린 것이고, `--dns-cloudflare` 를 줘도 `unrecognized arguments`
|
||||
로 끝난다.
|
||||
|
||||
## 2. 인증서를 받는다
|
||||
|
||||
이름 세 개를 **한 인증서**에 넣는다.
|
||||
DNS-01 이면 **와일드카드를 받을 수 있다.** 이 실험대는 처음에 이름 셋을
|
||||
따로 받았고, 그 비용이 B-7 에서 청구됐다 — oauth2-proxy 를 올릴 네 번째
|
||||
이름이 없어 Grafana 의 `app2` 를 빌려야 했다.
|
||||
|
||||
**하기** — `[kc-lab-edge]`. 토큰은 **존 하나 + DNS:Edit** 으로 좁힌다.
|
||||
계정 전역 API Key 를 쓰지 않는다.
|
||||
|
||||
**하기**
|
||||
```bash
|
||||
sudo certbot certonly --webroot -w /var/www/html \
|
||||
-d auth.hyeonworks.com -d app1.hyeonworks.com -d app2.hyeonworks.com
|
||||
sudo install -m 600 /dev/null /etc/letsencrypt/cloudflare.ini
|
||||
sudo tee /etc/letsencrypt/cloudflare.ini >/dev/null <<'EOF'
|
||||
dns_cloudflare_api_token = <Cloudflare API 토큰>
|
||||
EOF
|
||||
|
||||
sudo certbot certonly --dns-cloudflare \
|
||||
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
|
||||
-d hyeonworks.com -d '*.hyeonworks.com' --dry-run
|
||||
```
|
||||
|
||||
**확인** — 인증서가 실제로 생겼고 이름 셋이 다 들어갔는가
|
||||
**`--dry-run` 을 먼저 붙인다.** Let's Encrypt 는 같은 이름 조합에 대해
|
||||
**주당 중복 인증서 5장** 제한이 있고, `--dry-run` 은 그 한도를 쓰지 않는다.
|
||||
통과하면 `--dry-run` 만 떼고 다시 친다.
|
||||
|
||||
> **DNS-01 은 느리다.** TXT 레코드가 퍼질 때까지 기다려야 해서 발급이 수십
|
||||
> 초 걸린다. certbot 이 기본 대기 시간을 두고 있으니 중간에 끊지 않는다.
|
||||
|
||||
**확인** — 인증서가 실제로 생겼고 이름이 다 들어갔는가
|
||||
```bash
|
||||
sudo certbot certificates
|
||||
```
|
||||
@@ -218,6 +291,20 @@ EOF
|
||||
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
|
||||
```
|
||||
|
||||
**저장소에 같은 파일이 있다** —
|
||||
[`deploy/lab/edge/reload-nginx.sh`](../../../deploy/lab/edge/reload-nginx.sh).
|
||||
여기 손으로 치지 말고 그걸 밀어 넣는 편이 낫다.
|
||||
|
||||
```bash
|
||||
cat deploy/lab/edge/reload-nginx.sh \
|
||||
| ssh kc-lab-edge 'sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh >/dev/null'
|
||||
ssh kc-lab-edge 'sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh'
|
||||
```
|
||||
|
||||
> **이 훅은 한동안 저장소에 없었다.** 호스트에만 있어서, 호스트를 초기화하면
|
||||
> **아무 오류 없이 사라지고** D-4 가 측정한 상태(갱신 성공 · 서빙 38분 25초
|
||||
> 지연 · 타이머는 `SUCCESS`)로 되돌아갔다. 저장소에 두는 이유가 이것이다.
|
||||
|
||||
`deploy/` 에 넣는다. `post/` 는 갱신이 없어도 매번 돌아 하루 두 번 워커를
|
||||
갈아치운다. `deploy/` 는 **실제로 갱신됐을 때만** 실행된다.
|
||||
|
||||
@@ -301,6 +388,9 @@ nginx 의 `types_hash` 경고가 stderr 로 나갔을 뿐이고 내용은
|
||||
| 갱신은 됐는데 옛 인증서가 나감 | **deploy 훅 없음** | 워커 PID · `sudo ls /etc/letsencrypt/renewal-hooks/deploy/` |
|
||||
| 훅이 실패한 것처럼 보임 | stderr 경고를 error 로 표시 | 문구 말고 **워커 PID** |
|
||||
| 발급 한도 | 주당 중복 인증서 5장 | `--dry-run` 으로 먼저 시험 |
|
||||
| `unrecognized arguments: --dns-cloudflare` | 플러그인 미설치 | `certbot plugins \| grep '^\*'` |
|
||||
| DNS-01 이 오래 걸림 | TXT 전파 대기 | **정상이다.** 끊지 않는다 |
|
||||
| 재구축 뒤 인증서가 없음 | 발급하지 말고 **백업을 되돌린다** | 한도를 아끼는 길이다 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user