graph TD
subgraph "External World (Public)"
User[외부 사용자/브라우저]
LE[Let's Encrypt 공인 CA]
end
subgraph "DMZ (External Zone)"
NPM[Nginx Proxy Manager]
end
subgraph "Internal Network (Trusted Zone)"
FreeIPA[FreeIPA Root CA]
Vault[Vault Intermediate CA]
ServerA[서버 A App]
ServerB[서버 B DB]
end
%% 외부 흐름
LE -- "1. 공인 인증서 발급" --> NPM
User -- "2. HTTPS 접속 (신뢰)" --> NPM
NPM -- "3. 백업" --> Vault
%% 내부 흐름 - 신뢰 체인 구축
FreeIPA -- "4. 서명 (너를 중간관리자로 임명함)" --> Vault
%% 내부 흐름 - 인증서 발급
Vault -- "5. 내부용 사설 인증서 발급" --> ServerA
Vault -- "5. 내부용 사설 인증서 발급" --> ServerB
%% 내부 통신
ServerA -- "6. HTTPS/TLS (FreeIPA 믿으니까 OK)" --> ServerB
- Nginx Proxy Manager (이하 NPM) 에서 도메인 * 인증서를 let's encrypt 에서 받아와 생성한다.
- NPM에 생성된 인증서가 생성되면 Vault Server 로 업로드 하는 OS 스케쥴러 설정
- Vault 서버 역시 인증서 업데이트 확인 되면 Vault KV 에 인증서 저장
- Vault Agent 들이 변경된 인증서를 가져가고, 데몬 재기동
내부 서버들은 FreeIPA 서버(이하 IPA 서버)에 등록된 FreeIPA Client이므로 IPA 서버의 root CA 인증서를 신뢰함.
형님(IPA 서버)가 안전하다고 보장하는 Vault 서버이기 때문에, Vault 서버에서 발행하는 인증서도 각 서버들은 신뢰함.
Intermediate CA 인데, Vault 서버가 CSR 을 만들어 IPA 서버에게 제출, IPA 서버는 해당 CSR에 서명해줘서 Intermediate 용 인증서가 생성 됨. 각 서버들은 이 인증서를 IPA root CA 키가 서명한 것을 보고 신뢰함.
graph TD
%% 스타일 정의
classDef public fill:#e1f5fe,stroke:#01579b,stroke-width:2px;
classDef dmz fill:#fff3e0,stroke:#e65100,stroke-width:2px;
classDef internal fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px;
classDef automation fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px;
subgraph "External World (Public)"
User[외부 사용자]:::public
LE[Let's Encrypt 공인 CA]:::public
end
subgraph "DMZ (External Zone)"
NPM[Nginx Proxy Manager]:::dmz
end
subgraph "Internal Network (Trusted Zone)"
Vault[Vault Root CA<br/>Self-Signed]:::internal
ServerA[서버 A App]:::internal
ServerB[서버 B DB]:::internal
end
subgraph "Management & Automation"
Ansible[Ansible Controller<br/>Configuration Manager]:::automation
end
%% 1. 외부 흐름
LE -- "1. 공인 인증서 발급" --> NPM
User -- "2. HTTPS 접속 (공인 신뢰)" --> NPM
NPM -.-> |"3. 백업 (KV Engine)"| Vault
%% 2. 신뢰 배포 (Trust Distribution) - 핵심 변경 사항
Vault -.-> |"4. Root CA 추출"| Ansible
Ansible -- "5. OS 신뢰 저장소에<br/>Root CA 배포 및 업데이트" --> ServerA
Ansible -- "5. OS 신뢰 저장소에<br/>Root CA 배포 및 업데이트" --> ServerB
Ansible -- "5. OS 신뢰 저장소에<br/>Root CA 배포 및 업데이트" --> NPM
%% 3. 내부 인증서 발급
Vault -- "6. 내부용 사설 인증서 발급 (PKI)" --> ServerA
Vault -- "6. 내부용 사설 인증서 발급 (PKI)" --> ServerB
%% 4. 내부 통신
NPM -- "7. Proxy Pass (재암호화)" --> ServerA
ServerA -- "8. mTLS 통신<br/>(Ansible이 심어준 Root CA로 서로 신뢰)" --> ServerB