MySQL 과 큐메일과의 인터페이스 방창현 winchild@hanmail.net 1. 개요 MySQL 과 큐메일의 인터페이스는 메일 서비스를 전문으로 하는 서비스를 위하여 필요한 부분입니다. 원래 큐메일을 비롯한 유닉스계열의 전자우편 프로그램들은 유닉스나 리눅스의 표준 계정파일인 /etc/passwd 파일에 등록되어 있는 이용자를 대상으로 메일 서비스를 하도록 되어 있습니다. 그러나 /etc/passwd 에 등록된 다는 것은 SHELL 게정을 준다는 이야기고 SHELL 게정을 주지 않는다고 하더라도 /etc/passwd 파일은 일반 유닉스 파일시스템이므로 관리하기가 상당히 나쁘며 원래 수백, 수천명을 /etc/passwd 파일에 등록하여 사용하도록 되어 있지도 않 습니다. (안되는 것은 아니지만 ...) 따라서 이렇게 문제가 많은 /etc/passwd 파일을 사용하지 말고 메일서비스만 받게 할것같으면 그 계정시스템을 MySQL을 이용해서 하자는것이 기본 취지 입니다. 원래 큐메일을 알기전에 샌드메일에서도 이런 부분이 있었습니다. 샌드메일의 소오스를 고쳐서 해야하는 엄청난 작업 (샌드메일의 소오스는 오랜기간 버전업 되어 소오스가 장난이 아닙니다. 그 소설... 으으..., 더구나 버그를 픽스하는 패치는 왜그리도 자주 업그레이드 되는지...) 을 할 엄두가 나지를 않아서 편법 이었지만 BSD db를 이용한 접근방법으로 해결했었습니다. 편법이지만 별로 문제는 없었지요. 큐메일을 알게된 이후로 즉각적으로 이전에 했었던 계정시스템을 DB로 바꾸어야 하는 작업이 따라 왔습니다. 이번에도 큐메일의 인터페이스를 누군가 했을거란 짐작으로 인터넷을 열심히 뒤진결과 일본의 어느 대학에서 패치를 내놓았더군요. 그 패치를 설치하고 인터페이스를 시켜본 결과를 정리한것 입니다. 2. 큐메일 본격적인 설명을 하기전에 큐메일은 이전의 샌드메일과는 비교되지 않는 시스템 이더군요. 특히나 시큐리티에 아주 예민하여 모든 프로그램이 정확한 위치에 정확 한 설정으로 되어 있지 않으면 그냥 거부 입니다. 확인되지는 않았지만 DNS에 등록되지 않은 유령사이트에서 편지가 오는것도 거부하는것 같군요. 샌드메일의 시큐리티 홀땜시 골치가 아픈 사람은 필히 바꾸어야 하지 않을까 싶습니다. 특히 큐메일은 샌드메일과는 비교가 되지 않을 만큼 많은 컨트리 뷰트가 있습니다. 한국에도 미러사이트 (http://qmail.manic.co.kr/top.html) 가 있으니 확인해 보십 시오. 이 MySQL 만해도 그 컨트리 뷰트중의 하나 입니다. 큐메일은 샌드메일보다 설치가 간단하며 쉽게 동작했습니다. (단 정확하게 설치 하였을 경우, 제대로 되지 않으면 전부 지우고 다시 해야할 정도로 정밀한 시스템 이더군요.) 샌드메일의 /etc/sendmail.cf 를 만져본 분이면 이해 하실수 잇을것 같습니다. 3. MySQL 과의 인터페이스 우선 파일을 받로고 합니다. 현재의 버전은 qmail-1.03 에서 동작하는 패치버전이 나와있습니다. qmail 설치를 먼저 해야 하는데 그것은 KLDP 에 따로올린 HOW-TO 를 참조하시기 바랍니다. 설치를 모두 한후에 큐메일이 동작하는것을 확인한 후에 아래의 설치과정을 따라하시면 될것 입니다. mysql의 인터페이스 모듈은 MySQL 사 이트 (http://www.tcx.se, http://www.mysql.com) 에서 구할수 있습니다. # tar zxvf qmail-1.03.tar.gz # gzip -d qmail-1.03-mysql-0.4.0.pathc.gz # cd qmail-1.03 # patch -p1 < ../qmail-mysql-patch 큐메일과 mysql의 연동은 qmail-1.03-mysql-0.4.0.patch.gz 파일을 qmail을 받아서 푼 디렉토리에서 패치를 하여 mysql 모듈이 깔리도록 합니다. 이때 patch 를 받는 과정에서 Windows에서 받으면 gz 은 gzip 에서 풀수 있는 파일 옵션이므로 패치 파일이 풀려서 브라우져에 주욱 나타나게 됩니다. 그러면 이것을 그냥 저장하게 되는데 이때 윈도그의 파일시스템 형태로 저장됩니다. (CR+LF) 이것을 유닉스 또는 리눅스에 올려서 사용하는데 요즘의 리눅스 ftp 는 기본이 바이너리 전송 입니다. 따라서 CR+LF 파일이 그대로 저장되지요. 이것을 vi에서 띄워서 보면 그냥 잘보입니다. (아래에 DOS 포맷이라고 조그많게 나타나기는 하지만 신경쓰나요?) 그래서 잘오라왔으려니 하고 패치를 수행하면 이게 에러를 냅니다. 저 이문제를 잡는데 반나절이 결렸습니다. 따라서 윈도그에서 받았다면 꼭 ASCII 전송을 하거나 CR+LF 를 LF 의 유닉스 텍스트 파일 포맷으로 변환해 주셔야 합니다. 패치가 에러없이 수행되엇으면 make 파일과 mysql 과 연동하는 파일들이 패치 됩니다. README.mysql.en 파일이 하나 생성되었을 것입니다. 이것이 mysql과 연동시키는 간단한 설명이니 참조하시기 바랍니다. 패치 되고나면 컴파일 및 설치를 합니다. 한다. 설치시에는 root 계정이어야 합니다. # make # make setup check qmail 패치외에 POP-3 서비스를 위한 checkpassword 의 패치도 필요합니다. # tar zxvf checkpassword-0.81.tar.gz # gzip -d checkpassword-0.81-mysql-0.5.0.patch.gz # cd checkpassword-0.81 # patch -p1 < ../checkpassword-0.81-mysql-0.5.0.patch # make # make setup check 마찬가지로 README.nysql.en 파일이 생성되어 있으므로 설치에 참고하시고 컴파일과 설치를 진행합니다. 역시 설치시에는 root 로... /var/qmail/control/sqlserver 파일을 다음과 같은 내용으로 생성합니다. mysql_use yes server localhost login qmail password qmail1234 db qmail table users check_host no 간략하게 설명하면... mysql_use yes ... mysql 을 사용한다. server localhost ... 서버는 현재의 mysql 서버를 사용한다. login qmail ... mysql DB에 접근하는 사용자명 password qmail1234 ... mysql DB에 접근시에 필요한 비밀번호 db qmail ... 사용자 계정을 가지고 있는 DB명 table users ... 사용자 계정이 들어있는 테이블명 check_host no ... 이것이 yes 이면 mysql DB에 있는 이용자명과 도메인 (호스트)로 부터만 메일을 수신한다. (무슨소리인지 잘 모르겠음...) 로그인은 MySQL 에 접근하는것을 사전에 확인해 보도록 해야 합니다. 즉 mysql -u qmail 로 접근해 봐서 비밀번호를 넣고 설정한 qmail DB 에 들어갈수 있는지를 확인하라는 것입니다. 즉 이때에 login 은 DB의 접근권한?가지는 id를 이용하라는 것입니다. mysql의 access 모드와 password의 적절한 조정이 필요할 것 입니다.. 최초에 오픈시라면 mysql의 DB접근권한을 예제와 같는 test db와 같이 모두 열어놓고 인터페이스가 완료 된후에 테스트를 거쳐서 적당하게 권한을 조정하는것이 속을 썩지 않을 것입니다. 모두 열었을 경우에는 password 항목을 지정할 필요가 없습니다. (외부로도 열린것이 이므로 웨퍼나 파이어 월을 설정하지 않았으면 보안에 심각한 문제가 있음은 당근....) 설치되어 운영되고 있는 mysql DB 에 위에서 언급한 db 명 테이블명및 해당 이용 자의 권한을 설정합니다. 이용자 테이블을 생성합니다. 이것은 필요에 따라서 만드는 것이므로 메일의 서비스 에 필요한 항목을 추가해서 테이블을 만들어도 됩니다. 즉 해당 항목만 있으면 된다는 이야기 지요. CREATE TABLE users ( id char(32) DEFAULT '' NOT NULL, crypt char(32) binary DEFAULT '' NOT NULL, passwd char(32) binary DEFAULT '' NOT NULL, uid int(10) unsigned DEFAULT '65534' NOT NULL, gid int(10) unsigned DEFAULT '65534' NOT NULL, shell char(100) binary DEFAULT '' NOT NULL, home char(100) binary DEFAULT '' NOT NULL, start_date date DEFAULT '0000-00-00' NOT NULL, expire_date date DEFAULT '2030-01-01' NOT NULL, active enum('Y','N') DEFAULT 'Y' NOT NULL, KEY id (id(10)), KEY start_date (start_date), KEY expire_date (expire_date), KEY active (active) ); 각 필드의 간단한 설명은... id field: 이용자 id uid field: 이용자 번호 gid field: 이용자 그룹번호 home field: 이용자의 메일박스 디렉토리 패스 (풀 패스이어야 함) shell field: 이용자의 SHELL (보통은 /bin/false를 지정) mbox_host field: 잘모름. 하여튼 NULL 이어야 한다고 함... 원문 : Recieve a mail when one's address ("To: xxx@xxx") is 'id'@'mbox_host'. must be accepted NULL. active: 메일을 이용할 수 있는 상태 플래그 start_date: 메일의 이용기간을 정함. 시작일 expire_date: 메일의 이용 기간을 정함. 끝일 테이블을 생성후에 이용자의 계정을 DB에 등록 합니다. passwd 기록시에는 encryption 을 하기위에 mysql 매크로 거맨드인 password () 를 사용합니다. 이용자가 등록되었으면 DB에 기록한 home 디렉토리를 생성 합니다. 예제: MySQL table id | uid | gid | home | shell ---------+-------+------+---------------------+----------- username | 1234 | 6789 | /somewhere/username | /bin/false 와 같이 DB에 등록되어 있으면... # mkdir /somewhere/username # maildirmake /somewhere/username/Maildir # chown -R 1234 /somewhere/username/ # chgrp -R 6789 /somewhere/username/ 와 같이하여 Maildir 구조의 메일박스를 생성합니다.. 꼭 해당 ID로 소유가 설정 되도록 하여야 합니다. (아니면 수신되지 않음) 이때 Maildir 로 서비스가 되게 하려면 해당이용자의 홈디렉토리의 .qmail 파일에 ./Maildir/ 문장을 넣어 놓거나 qmail 실행시?기본 서비스가 ./Maildir/ 서비스가 되도록 구동합니다. qmail-start ./Maildir/ 로 실행하는데 /var/qmail/rc 의 스크립트 파일을 수정 합니다. 아니면 그냥 Mailbox 를 사용하던가... 설정되었으면 테스트를 해봅니다. # /var/qmail/bin/qmail-getpw username localhost username12346789/home1/qmail-box/g/gumdong 와 같이 id, uid, gid, home 을 돌려줄것입니다. 제대로 DB를 접근하지 못하면 DB의 내용과는 다른 alias의 기본값이 나타나게 됩니다. 이때는 mysql을 log파일을 남기도록 실행을 시켜서 적절한 시점에 SQL 쿼리를 내는지 확인하십시오. mysqld를 로그를 남기도록 실행하는 방법은 다음과 같습니다. 단일 프로세스로 구동되는 것이므로 실제 서비스에는 적용하지 마십시요. # /usr/local/libexec/mysqld --log=/tmp/mysql.log 그러면 테스트 메일을 보내 봅니다. # echo to:username | /var/qmail/bin/qmail-inject 성공적으로 메일이 보내졌는지 ~username/Maildir/new 디렉토리의 파일을 참조하 십시요. 만약에 파일이 보내지지 않으면 /var/mail/maillog 파일을 확인하여 원인을 찾아 보도록 하여야 합니다. 파일의 수신은 성공적으로 이루어 졌는데 POP-3 와 연동하는 checkpassword 가 정상 적으로 동작하는 지 다음과 같이 확인합니다. # telnet localhost pop-3 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. +OK <6195.936784767@calypso.mydomain.or.kr> user username +OK pass 1234 +OK quit +OK Connection closed by foreign host. 이렇게 pass 까지 DB에 넣어진 내용과 일치하여 +OK 가 나오면은 확인 된것입니다. 만일 제대로 되지 않으면 DB의 crypt 항목에 있는 비밀번호와 일치하는지 확인 해야 합니다. crypt 항목에 비밀번호를 넣을 때는 encrypt() 의 mysql 매크로를 이용합니다. > update users set crypt=encrypt('1234') where id='gumdong'\g 정상적으로 동작하지 않을시에 앞에서 언급한 큐메일의 로그와 mysql의 로그를 참조하십시요.