View Categories

MariaDB – Authelia 연동을 위한 5단계 보안 강화 구축 가이드

2 min read

컨테이너 기반의 홈서버나 엔터프라이즈 인프라를 구축할 때 MariaDB는 가장 먼저 고려하게 되는 오픈소스 관계형 데이터베이스입니다. 특히 Authelia와 같은 인증 솔루션이나 WordPress 같은 CMS 서비스의 백엔드 저장소로 활용될 때, 데이터의 정합성만큼이나 중요한 것이 바로 보안과 접근 제어입니다.

현업에서 수많은 데이터베이스 컨테이너를 관리하며 겪었던 가장 큰 고충은 컨테이너 재시작 시 발생하는 권한 오류와 루트 비밀번호 노출 문제였습니다. 이번 가이드에서는 linuxserver/mariadb 이미지를 기반으로, Secrets를 활용한 보안 강화와 네트워크 안정성을 위한 고정 IP 할당 기법을 실무 수준에서 상세히 다룹니다.

📂 1. 물리적 경로 및 시크릿(Secrets) 데이터 설계 #

데이터베이스의 영속성을 보장하기 위해 호스트 디렉토리를 바인딩하는 것은 기본입니다. 하지만 많은 엔지니어가 간과하는 부분이 비밀번호 관리입니다. 환경 변수(ENV)에 직접 비밀번호를 적어두면 docker inspect 명령 한 번에 모든 보안이 무너집니다.

# MariaDB 데이터 및 설정 저장용 디렉토리 생성
mkdir -p $DOCKERDIR/appdata/mariadb/data
mkdir -p $DOCKERDIR/secrets

# 루트 비밀번호를 파일 형태로 저장하여 보안 강화
# 여기에 입력하는 비밀번호는 특수문자를 포함한 16자리 이상의 강력한 조합을 권장합니다.
nano $DOCKERDIR/secrets/mysql_root_password

💡 실무 팁: PUIDPGID 설정은 호스트 시스템의 실제 유저 권한과 일치시켜야 합니다. 권한 불일치로 인해 /config 내의 로그 파일이 생성되지 않거나 DB 엔진이 기동되지 않는 이슈를 사전에 방지할 수 있습니다.

docker mariadb architecture

🛠️ 2. MariaDB Docker-Compose 최적화 구성 #

서비스 간의 통신 안정성을 확보하기 위해 내부망 전용 고정 IP를 할당하는 방식을 추천합니다. 특히 Authelia처럼 DB 연결 실패 시 전체 서비스 로그인이 불가능해지는 핵심 서비스는 컨테이너 이름 기반의 DNS 해석보다 IP 기반 연결이 훨씬 견고합니다.

services:
  mariadb:
    container_name: mariadb
    image: linuxserver/mariadb:latest
    networks:
      t2_proxy:      
        ipv4_address: 192.168.90.250 # 내부망 고정 IP 할당
    security_opt:
      - no-new-privileges:true
    restart: always
    ports:
      - "$MARIADB_PORT:3306" # 평소에는 주석 처리 권장
    volumes:
      - $DOCKERDIR/appdata/mariadb/data:/config
      - /etc/localtime:/etc/localtime:ro
    environment:
      - PUID=$PUID
      - PGID=$PGID
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_root_password
    secrets:
      - mysql_root_password

secrets:
  mysql_root_password:
    file: $DOCKERDIR/secrets/mysql_root_password

⚙️ 주요 설정 변수 상세 설명 #

설정 항목용도 및 보안 효과
no-new-privileges컨테이너 내 프로세스가 추가적인 권한(Root)을 얻는 것을 차단하여 보안성 강화
MYSQL_ROOT_PASSWORD_FILE환경 변수가 아닌 파일 시스템의 시크릿을 통해 비밀번호를 안전하게 주입
/etc/localtime호스트와 컨테이너 시간 동기화. 트랜잭션 로그 및 데이터 스탬프 정확도 유지

🔐 3. Authelia 전용 데이터베이스 및 유저 생성 #

MariaDB 설치가 완료되었다면, 이제 Authelia가 사용할 별도의 논리적 공간을 생성해야 합니다. 루트 권한을 앱에 직접 주는 것은 매우 위험한 설계입니다. 오직 해당 데이터베이스에만 접근 가능한 전용 계정을 생성하는 것이 원칙입니다.

# 1. 실행 중인 컨테이너의 MariaDB 콘솔 접속
docker exec -it mariadb mysql -u root -p

# 2. SQL 쿼리 실행 (비밀번호는 강력하게 설정)
CREATE DATABASE authelia;
CREATE USER 'authelia_user'@'%' IDENTIFIED BY 'complex_password_here';
GRANT ALL PRIVILEGES ON authelia.* TO 'authelia_user'@'%';
FLUSH PRIVILEGES;
EXIT;

⚠️ 주의사항: 'authelia_user'@'%'에서 %는 모든 IP로부터의 접속을 허용합니다. 보안을 더 강화하고 싶다면 'authelia_user'@'192.168.90.%'와 같이 특정 서브넷으로 제한하는 것이 좋습니다.

database access control

🚀 4. 실무 트러블슈팅: 시크릿 인식이 안 될 때 #

간혹 컨테이너의 초기 기동 시 MYSQL_ROOT_PASSWORD_FILE을 제대로 읽지 못해 Access Denied 오류가 발생하는 경우가 있습니다. 이는 주로 볼륨 권한이 초기화되지 않았을 때 발생합니다. 이럴 때는 당황하지 말고 아래 명령어로 강제 재설정을 수행합니다.

# 컨테이너 강제 초기 비밀번호 설정
docker exec -it mariadb mysqladmin -u root password '새로운비밀번호'

또한 외부 관리 도구(DBeaver, DataGrip)를 사용해야 할 때만 3306 포트를 개방하고, 일반적인 운영 상황에서는 ports 설정을 주석 처리하여 외부 침입 경로를 차단하십시오. 내부 서비스 간 통신은 t2_proxy 네트워크를 통해 고정 IP로 연결되므로 포트 노출 없이도 완벽하게 작동합니다.

상세한 SQL 문법이나 추가적인 옵션은 MariaDB 공식 문서를 참고하시기 바랍니다. 시스템 아키텍처를 더 깊이 이해하고 싶다면 더 많은 가이드 보기를 통해 관련 문서를 확인하세요.

정리하며 #

안전한 MariaDB 구축은 단순히 컨테이너를 실행하는 것을 넘어, 데이터 영속성 보장과 비밀번호 노출 차단에서 시작됩니다. 오늘 다룬 고정 IP 할당과 Secrets 활용법은 Authelia뿐만 아니라 앞으로 추가될 수많은 마이크로서비스의 안정적인 토대가 될 것입니다.

Powered by BetterDocs

답글 남기기