Authelia Traefik 연동을 통한 완벽한 2FA & SSO 보안 인증 구축 가이드 #
Authelia Traefik 연동은 자체 호스팅(Self-Hosted) 서비스를 운영하는 유저들에게 선택이 아닌 필수적인 보안 전략입니다. 본 가이드에서는 Traefik 리버스 프록시 환경에서 Authelia를 통해 모든 내부 서비스에 강력한 2단계 인증(2FA)과 싱글 사인온(SSO) 기능을 추가하는 방법을 IT 블로거의 시선으로 상세히 다룹니다.
🛡️ 1. Authelia Traefik 보안 인증의 개요 #
Authelia는 오픈 소스 인증 및 권한 부여 서버로, 대시보드나 API가 없는 서비스들 앞단에 ‘보안 장벽’을 세워줍니다. 특히 Traefik과의 연동성이 뛰어나며, 한 번의 로그인으로 모든 도커 컨테이너에 접근할 수 있는 SSO 환경을 제공합니다. 본 가이드에서는 보안성을 극대화하기 위해 MariaDB를 백엔드 저장소로 활용하고, Docker Secrets를 사용하여 민감한 정보를 보호하는 방식을 채택합니다.
“보안은 가장 약한 연결 고리만큼만 강합니다. 비밀번호 유출에 대비해 반드시 2FA(TOTP, Duo Push 등)를 활성화해야 합니다.”
📂 2. 사전 준비: 디렉토리 구조 및 Docker Secrets 설정 #
먼저 Authelia가 사용할 데이터 저장소와 설정 파일 경로를 생성해야 합니다. 또한, 환경 변수에 비밀번호를 노출하지 않기 위해 Docker Secrets를 활용합니다.
# Authelia 설정 및 데이터 폴더 생성
mkdir -p $DOCKERDIR/appdata/authelia
# Secrets 파일 저장을 위한 폴더 생성
mkdir -p $DOCKERDIR/secrets다음은 보안을 위한 필수 시크릿 파일 목록입니다. 각 파일을 $DOCKERDIR/secrets/ 폴더 안에 생성하고 안전한 값을 입력하세요.
| 파일명 | 설명 | 권장 형식 |
|---|---|---|
| authelia_jwt_secret | JSON Web Token 서명용 키 | 무작위 영숫자 조합 |
| authelia_session_secret | 쿠키 세션 암호화 키 | 무작위 영숫자 조합 |
| authelia_storage_mysql_password | MariaDB 접속 암호 | DB 설정값과 동일 |
| authelia_storage_encryption_key | DB 데이터 암호화 키 | 64자리 이상 랜덤 문자열 |
🚀 3. Authelia Docker-Compose 구성 및 배포 #
이제 Authelia Traefik 연동을 위한 핵심 docker-compose.yml 설정을 작성합니다. 아래 코드는 Docker Secrets를 통해 보안을 강화한 프로덕션 레벨의 설정입니다.
services:
authelia:
container_name: authelia
image: authelia/authelia:latest
restart: always
networks:
- t2_proxy
- default
depends_on:
- mariadb
volumes:
- $DOCKERDIR/appdata/authelia:/config
secrets:
- authelia_jwt_secret
- authelia_session_secret
- authelia_storage_mysql_password
- authelia_storage_encryption_key
environment:
- TZ=$TZ
- AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET_FILE=/run/secrets/authelia_jwt_secret
- AUTHELIA_SESSION_SECRET_FILE=/run/secrets/authelia_session_secret
- AUTHELIA_STORAGE_MYSQL_PASSWORD_FILE=/run/secrets/authelia_storage_mysql_password
- AUTHELIA_STORAGE_ENCRYPTION_KEY_FILE=/run/secrets/authelia_storage_encryption_key
labels:
- "traefik.enable=true"
- "traefik.http.routers.authelia-rtr.entrypoints=https"
- "traefik.http.routers.authelia-rtr.rule=Host(`authelia.$DOMAINNAME0`)"
- "traefik.http.routers.authelia-rtr.tls=true"
- "traefik.http.routers.authelia-rtr.middlewares=chain-authelia@file"
- "traefik.http.routers.authelia-rtr.service=authelia-svc"
- "traefik.http.services.authelia-svc.loadbalancer.server.port=9091"🔑 4. 핵심 설정 포인트 상세 분석 #
위의 설정에서 주목해야 할 세 가지 핵심 포인트가 있습니다. 이 부분은 시스템의 안정성과 보안에 직결됩니다.
- depends_on: mariadb – Authelia는 사용자 세션 정보를 저장하기 위해 데이터베이스가 필요합니다. DB가 완전히 준비된 후 서비스가 시작되도록 보장합니다.
- _FILE 접미사 환경 변수 – 암호화 키를 직접 환경 변수에 적는 것은 보안상 위험합니다. Docker Secrets 경로를 매핑함으로써 컨테이너 내부에서도 실제 비번이 노출되지 않도록 설계했습니다.
- Traefik Middlewares –
chain-authelia@file설정을 통해 다른 앱들이 Authelia의 인증을 거치도록 강제할 수 있습니다.
더 상세한 설정 방법은 Authelia 공식 문서에서 확인할 수 있습니다.
🔗 5. 타 서비스 연동 및 실무 활용 팁 #
Authelia Traefik 구축의 꽃은 바로 기존 서비스에 보안 레이어를 입히는 과정입니다. 예를 들어 Portainer나 Nextcloud 같은 서비스를 보호하려면 해당 서비스의 docker-compose.yml 라벨에 단 한 줄만 추가하면 됩니다.
# 예시: Portainer를 Authelia로 보호하기
labels:
- "traefik.http.routers.portainer.middlewares=chain-authelia@file"이 라벨이 적용된 컨테이너는 이제 외부에서 접속 시 로그인하지 않은 사용자를 자동으로 Authelia 로그인 페이지로 리다이렉트 시킵니다. 아이디와 패스워드뿐만 아니라 TOTP와 같은 2FA 인증을 통과해야만 실제 서비스 화면을 볼 수 있게 됩니다.
이것으로 강력한 보안 체계 구축이 완료되었습니다. 더 많은 정보와 팁이 필요하다면 아래 링크를 확인해 보세요.
