---
title: MariaDB – Authelia 연동을 위한 5단계 보안 강화 구축 가이드
description: "컨테이너 기반의 홈서버나 엔터프라이즈 인프라를 구축할 때 **MariaDB**는 가장 먼저 고려하게 되는 오픈소스 관계형 데이터베이스입니다. 특히 Authelia와 같은 인증 솔루션이나 WordPress 같은 CMS 서비스의 백엔드 저장소로 활용될 때, 데이터의 정합성만큼이나 중요한 것이 바로 보안과 접근 제어입니다. 현업에서 수많은 데이터베이스 컨테이너를…"
url: "https://dsportal.io/docs/mariadb-authelia-docker-setup/"
updated: "2026-04-18"
category: 보안/인증
---

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

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

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

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

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

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

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

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

![docker mariadb architecture](https://dsportal.io/wp-content/uploads/2026/03/ds-banner-69b2e92617472.png)

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

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

```yaml
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가 사용할 별도의 논리적 공간을 생성해야 합니다. 루트 권한을 앱에 직접 주는 것은 매우 위험한 설계입니다. 오직 해당 데이터베이스에만 접근 가능한 전용 계정을 생성하는 것이 원칙입니다.

```bash
# 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](https://dsportal.io/wp-content/uploads/2026/03/ds-banner-69b2e939bb16e.png)

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

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

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

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

상세한 SQL 문법이나 추가적인 옵션은 [MariaDB 공식 문서](https://mariadb.com/kb/en/documentation/)를 참고하시기 바랍니다. 시스템 아키텍처를 더 깊이 이해하고 싶다면 [더 많은 가이드 보기](/docs/)를 통해 관련 문서를 확인하세요.

## 정리하며

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