노드를 새 자리에 세우면서 붙는 방식을 정해야 했다. 방향을 잘못 잡으면 나중에 못 바꾼다.
Table of contents
Open Table of contents
선택지 — 두 방향
가능한 방향은 둘이었다.
안 → 밖 우리 서버가 노드에 붙는다
밖 → 안 노드가 우리 서버에 붙는다
처음에는 안 → 밖 으로 생각했고 우리가 물어보고 답을 받는 구조가 자연스러웠다.
그런데 노드가 있을 자리를 보니 밖에서 못 들어가는 망이었다. 아웃바운드만 되는 자리라서 안 → 밖 은 애초에 성립하지 않았다.
결과 — 방향이 정해지니 나머지가 따라왔다
노드가 밖으로 붙는 방식으로 정하니 여러 가지가 함께 달라졌다.
안 → 밖 이었으면
노드 쪽에 포트를 열어야 한다
우리 주소를 노드 쪽 방화벽에 등록
노드가 서버 인증서를 가진다
밖 → 안 이 되니
우리 쪽에 포트를 연다
노드 주소를 우리 쪽에 등록
우리가 서버 인증서를 가지고 노드가 클라이언트 인증서를 가진다
서버 인증서와 클라이언트 인증서를 누가 갖는지가 통째로 뒤집혔다.
방향을 정하고 나서 발급을 신청해야 순서가 맞는다. 이 선택을 나중에 뒤집으려면 인증서 체계부터 다시 만들어야 하고 이미 붙어 있는 노드가 여럿이면 그 작업이 사실상 불가능해진다.
판단 기준 — 노드를 알아보는 방법
노드가 붙어 오면 어느 노드인지 알아야 했다.
방법 1 주소로 구분한다
방법 2 붙을 때 식별자와 비밀값을 보낸다
방법 3 클라이언트 인증서로 구분한다
노드 IP 가 고정이 아니어서 방법 1 은 못 쓰고 방법 2 는 비밀값이 새면 흉내낼 수 있었다.
방법 3 으로 정하고 노드마다 인증서를 따로 발급했다.
CN=node-a.internal
CN=node-b.internal
ssl_client_certificate /etc/ssl/ca.crt;
ssl_verify_client on;
proxy_set_header X-Node-Id $ssl_client_s_dn_cn;
ssl_verify_client 를 켜고 CN 값을 X-Node-Id 로 넘겨 뒤쪽에서 누구인지 알게 했다.
ca.crt 로 검증되는 인증서가 없으면 붙지도 못한다. 값이 새는 것과 달리 인증서는 회수할 수 있다는 점이 두 방식을 가르는 실질적 차이였다.
조치 — 회수할 수 있게 만들었다
노드 하나를 못 쓰게 해야 할 때를 대비했다.
ssl_crl /etc/ssl/revoked.crl;
revoked.crl 에 들어간 인증서는 못 붙는다.
CRL 회수 절차도 함께 적었는데 급할 때 찾아보면 늦는다.
1. 인증서 일련번호를 확인한다
2. 회수 목록에 추가한다
3. 앞단을 다시 읽힌다
4. 실제로 못 붙는지 확인한다
마지막 확인 단계를 넣은 것은 revoked.crl 에 넣고도 nginx 가 다시 안 읽으면 계속 붙기 때문이다.
절차만 적어 두고 확인하지 않으면 정작 필요할 때 안 되는 경우가 있다. 회수가 언제부터 유효한지까지 적어 둬야 그 자리에서 판단이 된다.
검증 — 붙어 있는 것 보기
노드가 붙어 오는 구조라 지금 몇 개가 붙어 있는지 우리 쪽에서 알아야 했다.
$this->redis->setex("node:alive:{$nodeId}", 90, time());
노드가 30초마다 신호를 보내고 setex 로 90초 동안 살아 있는 것으로 본다.
$alive = $this->redis->keys('node:alive:*');
node:alive:* 를 등록된 목록과 비교해 빠진 것을 알렸다.
등록된 노드 6개, 살아 있는 노드 5개 ← node-c 없음
끊겼을 때 다시 붙는 것도 노드가 한다.
끊김 감지 → 5초 뒤 재시도 → 실패하면 10초 → 20초 → 최대 60초
우리 쪽에서는 아무것도 못 하고 node-c 처럼 안 붙는 것이 생기면 그 자리에 사람이 가야 한다.
그래서 노드 쪽 재시도를 튼튼하게 넣고 오래 못 붙으면 스스로 기록을 남기게 했다. 양쪽 다 되게 만들 수도 있었지만 인증 구조가 두 벌이 되고 어느 쪽으로 붙었는지에 따라 다르게 다뤄야 해서 한 방향으로만 두고 그 이유를 적어 뒀다.
정리
- 연결 방향이 정해지면 방화벽과 인증서와 재시도 주체가 따라 정해진다
- 나중에 바꾸려면 인증서 발급부터 다시 해야 하므로 처음에 정한다
- 주소가 고정이 아니면 주소로 구분할 수 없다
- 클라이언트 인증서로 구분한다
- 값은 새면 흉내낼 수 있지만 인증서는 회수할 수 있다
- 회수 절차를 적어 두고 실제로 못 붙는지 확인하는 단계를 넣는다
- 붙어 오는 구조면 누가 붙어 있는지 우리 쪽에서 봐야 한다
- 다시 붙는 것을 상대가 하면 우리는 아무것도 못 한다
- 상대 쪽 재시도를 튼튼하게 만든다
- 양쪽 다 되게 만들지 않고 왜 이 방향인지 적어 둔다