1. 보안 강화 아키텍처 개요
기존 중앙 서버 인프라는 포트 노출 및 무인증 통신으로 인해 보안 위협에 취약할 수 있습니다. 본 개정 스택에서는 Nginx Proxy Manager (NPM)와 Authentik SSO를 중앙 인프라에 통합하여 전방 보안 장벽을 구축합니다.
💡 자원 최적화 설계 전략 (Postgres/Redis 공유)
새로 추가되는 SSO(Authentik) 서비스의 오버헤드를 제어하기 위해, 기존 PostgreSQL 및 Redis 컨테이너 자원을 고스란히 재활용합니다.
- PostgreSQL 16:
authentik이라는 데이터베이스를 기존 PostgreSQL 인프라 내에 생성하여 자원을 공유합니다. - Redis 7: DB Index
3을 독립 할당하여 기존 CertBridge용 인덱스2및 n8n 등과의 충돌을 방지합니다.
🌐 서비스 포트 맵 & 네트워크 토폴로지
| 컨테이너명 | 기본 포트 | 역할 | 보안 상태 |
|---|---|---|---|
certbridge-npm |
80, 443, 81 | Edge Reverse Proxy & SSL (Web UI) | 외부 노출 (유일한 진입점) |
certbridge-authentik-server |
9000, 9443 | Authentik Core Portal & API | 내부 브릿지망 또는 NPM 연동 |
certbridge-api |
8090 | CertBridge REST API Server | 내부망 전용 (NPM을 통해서만 HTTPS 외부 노출) |
certbridge-minio |
9010, 9011 | Object Storage & Management Console | NPM Proxy Provider로 SSO 연동 통제 |
certbridge-neo4j |
7474, 7687 | Neo4j Graph Database & Browser UI | NPM Proxy Provider로 SSO 연동 통제 |
2. 에어갭(오프라인) 패키지 준비
인터넷 연결이 전혀 불가능한 에어갭(Air-Gap) 폐쇄망 우분투 서버에서 설치하기 위해서는, 인터넷이 연결된 사전 머신에서 필요한 모든 Docker 이미지와 패키지를 다운로드해야 합니다.
2-1. Hugging Face에서 에어갭 파일 다운로드
우리는 Hugging Face 저장소 (VanyaJ/certbridge)에 미리 빌드된 linux/amd64 플랫폼 전용 Docker 이미지 아카이브와 서버 패키지를 배포해 두었습니다.
# 1. CertBridge 핵심 서버 아카이브 다운로드 wget https://huggingface.co/VanyaJ/certbridge/resolve/main/certbridge-server-v0.1.0-ubuntu.tar.gz # 2. 에어갭 Docker 이미지 다운로드 (docker-images/ 디렉토리에 배치할 것) mkdir -p docker-images wget -P docker-images/ https://huggingface.co/VanyaJ/certbridge/resolve/main/docker-images/pgvector_pgvector_pg16.tar.gz wget -P docker-images/ https://huggingface.co/VanyaJ/certbridge/resolve/main/docker-images/redis_7-alpine.tar.gz wget -P docker-images/ https://huggingface.co/VanyaJ/certbridge/resolve/main/docker-images/minio_minio_latest.tar.gz wget -P docker-images/ https://huggingface.co/VanyaJ/certbridge/resolve/main/docker-images/neo4j_5-community.tar.gz wget -P docker-images/ https://huggingface.co/VanyaJ/certbridge/resolve/main/docker-images/node_20-alpine.tar.gz wget -P docker-images/ https://huggingface.co/VanyaJ/certbridge/resolve/main/docker-images/jc21_nginx-proxy-manager_latest.tar.gz wget -P docker-images/ https://huggingface.co/VanyaJ/certbridge/resolve/main/docker-images/ghcr.io_goauthentik_server_2024.4.2.tar.gz
2-2. (대안) prepare-airgap-package.sh 활용
인터넷이 연결된 외부 우분투 PC에서 직접 이 스크립트를 수행하면, Docker 이미지 및 Node/Docker deb 설치 패키지까지 하나의 번들로 묶어 압축해 줍니다.
# 스크립트 실행하여 하나의 대용량 패키지로 아카이빙 bash prepare-airgap-package.sh
3. 오프라인 설치 프로토콜 (Ubuntu)
다운로드한 패키지와 docker-images 폴더를 이동식 저장장치(USB/외장하드 등) 또는 내부망 파일 공유를 통해 에어갭 대상 우분투 서버로 복사합니다.
패키지 압축 해제 및 이미지 디렉토리 병합
서버 패키지를 해제한 경로 아래로, 개별 다운로드한 docker-images 디렉토리를 병합합니다.
tar -xzf certbridge-server-v0.1.0-ubuntu.tar.gz cd certbridge-server-ubuntu # 다운로드한 docker-images 폴더를 이곳으로 복사 mv /path/to/downloaded/docker-images ./
자동 셋업 스크립트 실행
오프라인 설치용 셋업 스크립트 setup-airgap.sh에 실행 권한을 부여하고 가동합니다. 이 스크립트는 Docker load 명령을 통해 오프라인 tar 및 tar.gz 이미지를 전체 복구하고 인프라 서비스를 기동합니다.
chmod +x setup-airgap.sh sudo ./setup-airgap.sh
독립 모드(--profile standalone) 서비스 기동 상태 조회
NPM 및 Authentik 서비스를 포함하여 정상 구동 중인지 아래 명령으로 확인합니다.
sudo docker compose --profile standalone ps
4. Nginx Proxy Manager 설정 가이드
Nginx Proxy Manager(NPM)는 CertBridge 스택의 최전방에서 모든 외부 유입 요청을 처리하고, SSL 암호화 통신을 종단하며, 도메인/경로 분기를 수행합니다.
관리자 화면(Admin UI) 로그인
웹 브라우저로 http:// 에 접속합니다. 최초 기본 로그인 계정은 다음과 같습니다.
- Email Address:
admin@example.com - Password:
changeme
※ 로그인 직후 즉시 관리자 이메일과 비밀번호를 변경해야 합니다.
사설 SSL/TLS 인증서 추가 (에어갭 환경)
인프라망이 에어갭 오프라인이므로 Let's Encrypt 자동 발급을 사용할 수 없습니다. 기관 내부 CA 또는 사설로 발급받은 인증서 파일을 수동 등록해야 합니다.
- NPM 상단 메뉴의 "SSL Certificates" 탭 클릭
- 우측 상단 "Add SSL Certificate" > "Custom" 선택
- 인증서 이름 입력 후, Certificate Key File (.key) 및 Certificate File (.crt/pem) 업로드 후 저장
Proxy Host 추가 (CertBridge API 등)
NPM 프록시 호스트를 생성하여 외부 HTTPS 요청을 내부 컨테이너로 전달합니다.
- Domain Names:
certbridge.local(또는 기관용 도메인) - Scheme:
http - Forward Hostname / IP:
certbridge-api(Docker 브릿지 컨테이너 호스트명) - Forward Port:
8090 - Block Common Exploits: 활성화
- SSL 탭: 위에서 등록한 Custom SSL 선택 및 Force SSL 활성화
5. Authentik SSO / MFA 설정 프로토콜
Authentik은 싱글 사인온(SSO)과 멀티팩터 인증(MFA)을 일관되게 제공하여, API, MinIO Console, Neo4j Graph DB로의 무단 침입을 통제합니다.
최초 인스턴스 셋업 및 초기화
웹 브라우저로 http:// 에 접속합니다. 최초 부트스트랩 화면에서 관리자 계정 akadmin에 대한 안전한 비밀번호를 설정하여 초기화를 완료합니다.
Proxy Provider 생성 (NPM Forward Auth 연동용)
MinIO와 Neo4j 등 개별 보안이 필요한 레거시 화면 보호를 위해 Proxy Provider를 생성합니다.
- Authentik Admin Interface 진입 (우측 상단 "Admin interface")
- 좌측 메뉴 Applications > Providers > "Create" 클릭
- Proxy Provider 선택 후 설정:
- Name:
infra-proxy-provider - Authorization flow: 기본 flow 선택 (e.g. default-authorization-flow)
- External host:
http://minio.certbridge.local(외부 노출될 URL) - Mode:
Forward auth (single application)선택
- Name:
NPM Custom Nginx Configuration 적용
Nginx Proxy Manager에서 해당 Proxy Host로 들어오는 트래픽이 Authentik을 거쳐 인증되도록 Custom Nginx 설정 블록을 넣어줍니다.
# Authentik Forward Auth Integration
location / {
# Authentik Server IP / Container Port
auth_request /outpost.goauthentik.io/auth/request;
error_page 401 = @goauthentik_login;
# Pass the actual request back to Authentik
proxy_pass $forward_scheme://$server:$port;
# Auth variables sync
auth_request_set $auth_cookie $upstream_http_set_cookie;
add_header Set-Cookie $auth_cookie;
# Headers
auth_request_set $authentik_username $upstream_http_x_authentik_username;
auth_request_set $authentik_groups $upstream_http_x_authentik_groups;
auth_request_set $authentik_email $upstream_http_x_authentik_email;
auth_request_set $authentik_name $upstream_http_x_authentik_name;
proxy_set_header X-Authentik-Username $authentik_username;
proxy_set_header X-Authentik-Groups $authentik_groups;
proxy_set_header X-Authentik-Email $authentik_email;
proxy_set_header X-Authentik-Name $authentik_name;
}
location = /outpost.goauthentik.io/auth/request {
proxy_pass http://certbridge-authentik-server:9000/outpost.goauthentik.io/auth/request;
proxy_set_header Host $host;
proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Content-Length "";
proxy_method GET;
}
location @goauthentik_login {
return 302 http://certbridge-authentik-server:9000/outpost.goauthentik.io/auth/start?rd=$scheme://$http_host$request_uri;
}
6. 문제 해결 (Troubleshooting)
1. DB Connection Refused (postgres/redis)
Authentik 컨테이너가 시작할 때 PostgreSQL 또는 Redis에 접속하지 못해 크래시되는 경우:
원인: postgres나 redis가 아직 기동되지 않았거나 헬스체크 검증 단계에 시간이 필요한 경우입니다.
해결책: docker compose logs -f certbridge-db 명령으로 DB 서버 시작 로그를 확인하고, docker compose restart certbridge-authentik-server를 통해 Authentik을 재시작해 주십시오.
2. Authentik DB init failure (Postgres)
Authentik DB가 자동으로 생성되지 않아 인증 시스템이 구동되지 않는 경우:
원인: docker-compose.yml의 볼륨에 00-init-authentik-db.sql 이 제대로 바인딩되지 않아 authentik 이라는 데이터베이스가 Postgres 내에 누락된 경우입니다.
해결책: docker compose exec -it certbridge-db psql -U certbridge -c "CREATE DATABASE authentik;" 을 터미널에 직접 수행하여 DB를 수동 생성하고 Authentik을 재기동하십시오.