📨 이전 편을 먼저 읽고 오세요!
이 글은 "리눅스에서 메일 서버 구축하기" 시리즈의 다섯 번째 글입니다.
이전 편에서 Dovecot 필수 설정 파일 4개를 분석했어요. 만약 아직 읽지 않았다면 먼저 확인해보는 걸 추천합니다.
👉 이전 편: Dovecot 필수 설정 파일 분석


🔄 순서 조정 안내
지난 편에서 "다음 글에서 auth-sql.conf.ext 설정을 다룬다"고 예고했지만,
실제로 글을 작성하다 보니 DB 테이블 설계를 먼저 설명하는 것이 더 논리적인 순서라고 판단했습니다.

따라서 이번 글에서는 Dovecot의 가상 사용자 개념과 PostgreSQL 테이블 설계를 다루고,
다음 편에서 Dovecot과 PostgreSQL을 연동하는 auth-sql.conf.ext 설정을 설명할 예정입니다.


🎯 Dovecot 가상 사용자란? 왜 필요한가?

Dovecot에서 사용자를 인증하는 방식은 크게 두 가지입니다.

  1. 시스템 계정 기반 인증
  2. 리눅스의 /etc/passwd/etc/shadow 파일을 이용해 인증
  3. 일반적인 시스템 사용자 계정을 활용
  4. 계정 관리가 번거롭고, 메일 전용 계정을 만들기 어려움

  5. 가상 사용자 기반 인증 (Virtual Users)

  6. 별도의 데이터베이스(PostgreSQL, MySQL 등)를 이용해 인증
  7. 시스템 계정과는 독립적인 메일 전용 사용자 관리 가능
  8. 보안성과 확장성이 뛰어나 대규모 메일 서비스에 적합

우리는 PostgreSQL을 이용해 가상 사용자 환경을 구축할 예정입니다.
즉, 실제 리눅스 계정을 만들지 않고도 데이터베이스에서 사용자 정보를 가져와 인증하는 방식입니다.

🔹 가상 사용자 환경의 장점

  • 시스템 계정과 분리되어 보안성이 높음
  • 사용자 계정을 손쉽게 추가, 삭제 가능
  • 다중 도메인 지원 가능 (하나의 서버에서 여러 메일 도메인 관리 가능)
  • 확장성이 뛰어나며, 관리가 용이함

Pigeon holding a letter near a database


🛠️ PostgreSQL에서 테이블 설계

Dovecot에서 가상 사용자를 적절하게 관리하려면 최소한 3개의 테이블이 필요합니다.

1️⃣ 필수 테이블 구성

  1. mail_domain - 메일 서버에서 관리할 도메인 목록
  2. mail_users - 실제 메일 사용자 정보
  3. mail_alias - 이메일 별칭(포워딩) 관리

이렇게 분리하는 이유는 확장성유지보수 용이성 때문입니다.
추후 여러 개의 메일 도메인을 운영하거나, 특정 이메일을 다른 주소로 포워딩할 때 매우 유용합니다.


2️⃣ 테이블 스키마 및 SQL 예제

📌 1. mail_domain (도메인 목록 관리)
메일 서버에서 허용할 도메인을 관리하는 테이블입니다.
즉, example.com, mydomain.com 같은 메일 도메인을 정의합니다.

CREATE TABLE mail_domain (
    id SERIAL PRIMARY KEY,
    domain_name VARCHAR(255) NOT NULL UNIQUE,
    active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 설명
- domain_name → 메일 도메인 (예: example.com)
- active → 해당 도메인을 사용할지 여부 (비활성화 가능)
- created_at → 생성 날짜

샘플 데이터 삽입 예제

INSERT INTO mail_domain (domain_name) VALUES ('example.com');
INSERT INTO mail_domain (domain_name) VALUES ('mydomain.com');

📌 2. mail_users (메일 사용자 계정)
실제 메일을 사용할 사용자 계정 정보가 저장됩니다.
각 사용자는 특정 도메인에 속해야 합니다.

CREATE TABLE mail_users (
    id SERIAL PRIMARY KEY,
    domain_id INT NOT NULL REFERENCES mail_domain(id) ON DELETE CASCADE,
    email VARCHAR(255) NOT NULL UNIQUE,
    password TEXT NOT NULL,
    home_directory TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 설명
- domain_idmail_domain 테이블의 id와 연결 (메일 사용자가 속한 도메인)
- email → 사용자 이메일 주소 (user@example.com)
- password → 암호화된 비밀번호 저장
- home_directory → 메일 저장 경로 (/var/mail/vmail/user@example.com)
- created_at → 계정 생성 날짜

샘플 데이터 삽입 예제

INSERT INTO mail_users (domain_id, email, password, home_directory)
VALUES (1, 'user@example.com', 'hashed_password_here', '/var/mail/vmail/user@example.com');

📌 3. mail_alias (이메일 별칭 / 포워딩) 메일 주소를 다른 주소로 포워딩하거나, 하나의 주소로 여러 개의 별칭을 사용할 때 필요합니다.

CREATE TABLE mail_alias (
    id SERIAL PRIMARY KEY,
    domain_id INT NOT NULL REFERENCES mail_domain(id) ON DELETE CASCADE,
    source_email VARCHAR(255) NOT NULL,
    destination_email VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 설명

  • source_email → 원본 이메일 주소 (예: contact@example.com)
  • destination_email → 전달될 이메일 주소 (예: admin@example.com)
  • 특정 메일 주소를 자동으로 다른 주소로 전달하는 기능을 수행

샘플 데이터 삽입 예제

INSERT INTO mail_alias (domain_id, source_email, destination_email)
VALUES (1, 'contact@example.com', 'admin@example.com');

이제 contact@example.com으로 온 메일은 자동으로 admin@example.com으로 전달됩니다.

🔍 추후 확장을 위한 추천 테이블

기본적인 메일 서비스 운영 외에도 추가 기능을 확장할 수 있습니다. 아래는 추후 확장할 수 있는 테이블 예시입니다.

테이블명 역할
mail_quota 사용자별 메일 용량 제한
mail_blacklist 차단할 이메일 목록
mail_whitelist 허용할 이메일 목록
mail_forwarding 외부 메일 계정으로 포워딩
mail_autoresponder 자동 응답 메시지 관리
mail_address_book 내부 주소록 관리

🏁 정리 및 다음 단계

이번 글에서 다룬 내용
- Dovecot 가상 사용자의 개념 및 필요성
- PostgreSQL 테이블 설계 (mail_domain, mail_users, mail_alias)
- 이메일 관리 확장을 위한 추가 테이블 추천

다음 편 예고: auth-sql.conf.ext 설정 및 비밀번호 해싱 방식
이제 데이터베이스 테이블이 준비되었습니다. 다음 편에서는 Dovecot이 PostgreSQL에서 사용자 정보를 가져와 인증하는 방법을 설명하고,
메일 사용자 계정에서 사용할 비밀번호 해싱 방식에 대해 다룰 예정입니다.

특히, MD5, SHA-256, BCRYPT 방식의 특징과 보안성 차이를 비교하고,
각각의 방법을 Dovecot 및 PostgreSQL에서 어떻게 적용하는지 구체적으로 살펴보겠습니다.

👉 다음 편: auth-sql.conf.ext 설정과 비밀번호 해싱 방법 (Coming Soon!)