📨 이전 편을 먼저 읽고 오세요!
이 글은 "리눅스에서 메일 서버 구축하기" 시리즈의 다섯 번째 글입니다.
이전 편에서 Dovecot 필수 설정 파일 4개를 분석했어요. 만약 아직 읽지 않았다면 먼저 확인해보는 걸 추천합니다.
👉 이전 편: Dovecot 필수 설정 파일 분석
🔄 순서 조정 안내
지난 편에서 "다음 글에서 auth-sql.conf.ext
설정을 다룬다"고 예고했지만,
실제로 글을 작성하다 보니 DB 테이블 설계를 먼저 설명하는 것이 더 논리적인 순서라고 판단했습니다.
따라서 이번 글에서는 Dovecot의 가상 사용자 개념과 PostgreSQL 테이블 설계를 다루고,
다음 편에서 Dovecot과 PostgreSQL을 연동하는 auth-sql.conf.ext
설정을 설명할 예정입니다.
🎯 Dovecot 가상 사용자란? 왜 필요한가?
Dovecot에서 사용자를 인증하는 방식은 크게 두 가지입니다.
- 시스템 계정 기반 인증
- 리눅스의
/etc/passwd
및/etc/shadow
파일을 이용해 인증 - 일반적인 시스템 사용자 계정을 활용
-
계정 관리가 번거롭고, 메일 전용 계정을 만들기 어려움
-
가상 사용자 기반 인증 (Virtual Users)
- 별도의 데이터베이스(PostgreSQL, MySQL 등)를 이용해 인증
- 시스템 계정과는 독립적인 메일 전용 사용자 관리 가능
- 보안성과 확장성이 뛰어나 대규모 메일 서비스에 적합
우리는 PostgreSQL을 이용해 가상 사용자 환경을 구축할 예정입니다.
즉, 실제 리눅스 계정을 만들지 않고도 데이터베이스에서 사용자 정보를 가져와 인증하는 방식입니다.
🔹 가상 사용자 환경의 장점
- 시스템 계정과 분리되어 보안성이 높음
- 사용자 계정을 손쉽게 추가, 삭제 가능
- 다중 도메인 지원 가능 (하나의 서버에서 여러 메일 도메인 관리 가능)
- 확장성이 뛰어나며, 관리가 용이함
🛠️ PostgreSQL에서 테이블 설계
Dovecot에서 가상 사용자를 적절하게 관리하려면 최소한 3개의 테이블이 필요합니다.
1️⃣ 필수 테이블 구성
mail_domain
- 메일 서버에서 관리할 도메인 목록mail_users
- 실제 메일 사용자 정보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_id
→ mail_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!)
Add a New Comment