CertBridge 보안 강화 및 에어갭 가이드

오프라인(Air-Gap) 우분투 환경에서 Nginx Proxy Manager와 Authentik SSO를 활용하여 SSL 보안 터미네이션 및 계정 통합 인증 시스템을 안전하게 구성하는 고급 가이드입니다.

🔒 v0.1.0 · Ubuntu amd64 · NPM & Authentik

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 이미지 아카이브와 서버 패키지를 배포해 두었습니다.

Download Assets
# 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
# 스크립트 실행하여 하나의 대용량 패키지로 아카이빙
bash prepare-airgap-package.sh

3. 오프라인 설치 프로토콜 (Ubuntu)

다운로드한 패키지와 docker-images 폴더를 이동식 저장장치(USB/외장하드 등) 또는 내부망 파일 공유를 통해 에어갭 대상 우분투 서버로 복사합니다.

1

패키지 압축 해제 및 이미지 디렉토리 병합

서버 패키지를 해제한 경로 아래로, 개별 다운로드한 docker-images 디렉토리를 병합합니다.

tar -xzf certbridge-server-v0.1.0-ubuntu.tar.gz
cd certbridge-server-ubuntu
# 다운로드한 docker-images 폴더를 이곳으로 복사
mv /path/to/downloaded/docker-images ./
2

자동 셋업 스크립트 실행

오프라인 설치용 셋업 스크립트 setup-airgap.sh에 실행 권한을 부여하고 가동합니다. 이 스크립트는 Docker load 명령을 통해 오프라인 tar 및 tar.gz 이미지를 전체 복구하고 인프라 서비스를 기동합니다.

chmod +x setup-airgap.sh
sudo ./setup-airgap.sh
3

독립 모드(--profile standalone) 서비스 기동 상태 조회

NPM 및 Authentik 서비스를 포함하여 정상 구동 중인지 아래 명령으로 확인합니다.

sudo docker compose --profile standalone ps

4. Nginx Proxy Manager 설정 가이드

Nginx Proxy Manager(NPM)는 CertBridge 스택의 최전방에서 모든 외부 유입 요청을 처리하고, SSL 암호화 통신을 종단하며, 도메인/경로 분기를 수행합니다.

1

관리자 화면(Admin UI) 로그인

웹 브라우저로 http://:81 에 접속합니다. 최초 기본 로그인 계정은 다음과 같습니다.

  • Email Address: admin@example.com
  • Password: changeme

※ 로그인 직후 즉시 관리자 이메일과 비밀번호를 변경해야 합니다.

2

사설 SSL/TLS 인증서 추가 (에어갭 환경)

인프라망이 에어갭 오프라인이므로 Let's Encrypt 자동 발급을 사용할 수 없습니다. 기관 내부 CA 또는 사설로 발급받은 인증서 파일을 수동 등록해야 합니다.

  1. NPM 상단 메뉴의 "SSL Certificates" 탭 클릭
  2. 우측 상단 "Add SSL Certificate" > "Custom" 선택
  3. 인증서 이름 입력 후, Certificate Key File (.key) 및 Certificate File (.crt/pem) 업로드 후 저장
3

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로의 무단 침입을 통제합니다.

1

최초 인스턴스 셋업 및 초기화

웹 브라우저로 http://:9000/if/flow/initial-setup/ 에 접속합니다. 최초 부트스트랩 화면에서 관리자 계정 akadmin에 대한 안전한 비밀번호를 설정하여 초기화를 완료합니다.

2

Proxy Provider 생성 (NPM Forward Auth 연동용)

MinIO와 Neo4j 등 개별 보안이 필요한 레거시 화면 보호를 위해 Proxy Provider를 생성합니다.

  1. Authentik Admin Interface 진입 (우측 상단 "Admin interface")
  2. 좌측 메뉴 Applications > Providers > "Create" 클릭
  3. 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) 선택
3

NPM Custom Nginx Configuration 적용

Nginx Proxy Manager에서 해당 Proxy Host로 들어오는 트래픽이 Authentik을 거쳐 인증되도록 Custom Nginx 설정 블록을 넣어줍니다.

NPM Advanced Config (Custom Nginx Configuration)
# 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을 재기동하십시오.