커피닉스, 시스템 엔지니어의 쉼터
  POP3 daemon 설치와 활용 가이드 - 일곱째 판 (2001년 7월) 작성일 : 2003/08/05 10:59
 
  • 글쓴이 : 박재호 ( http://my.netian.com/~jrogue/ )
  • 조회수 : 6655
     

    POP3 전자편지 daemon의 기능

    일반 PC에 SMTP (Simple Mail Transfer Protocol)를 지원하는 서버를 설치하기에는 부담스러운 경우가 있다. 따라서, 대부분의 경우 기존 UNIX 기계에 sendmail MTA(Message Transfer Agent)를 설치하여 mail 서버로 삼고, PC쪽에서는 NS, Outlook, Eudora등의 MUA(Message User Agent)를 설치하여 서버쪽에 저장된 편지를 끌어당겨서 읽도록 한다. 이럴 경우, 클라이언트로부터 계정별 전자편지 요청을 받아들이기 위해 UNIX 서버쪽의 소프트웨어가 필요한데, 이 소프트웨어가 바로 POP3(Post Office Protocol version 3) daemon이다.

    이 문서는 POP3 최종 사용자를 위한 내용만을 담고 있으므로, POP3 환경에서 개발에 필요한 사항에 대해서는 해당 RFC(RFC1939)를 참고하기 바란다.

    POP3의 설치방법

    POP3를 설치하기 위해서는 다음의 절차를 따른다.

    패키지 구하기

    Eudora로 유명한 Qualcomm(CDMA 로열티로 일약 부자가 된 회사이다. 최근 Eudora 개발 중단등의 좋지않은 루머도 들린다.)에서 qpopper4.0.3 버전을 가져온다. 화면에 이상한 글자가 쏟아질 경우 마우스의 오른쪽 버튼을 눌러 "다른 이름으로 저장(Sava Link As...)"을 수행하면 된다.

    주의사항

    qpopper의 설치 작업으로 넘어가기 이전에, 다음 주의사항을 반드시 숙지하기 바란다.

    1. Buffer Overflow 공격을 피하기 위해 반드시 3.x이나 4.x 버전을 가져온다. 기존 2.3, 2.4 버전을 쓰시는 분들께서는 이번 기회에 POP3 서버를 교체하는 편이 좋겠다. 버전 확인은 다음과 같이 하면 된다:
      % telnet localhost pop3
      Trying 127.0.0.1
      Connected to localhost.
      Escape character is '^]'.
      +OK QPOP (version 3.0.2) at localhost starting.
      
    2. NFS로 디렉토리를 마운트시켜 사용할 경우 qpopper를 쓰면 위험할 수도 있다. 4.0.x에 들어와서는 환경 설정 파일에 no-atomic-open이라는 지시자를 지정하여 NFS locking 매커니즘을 사용할 수도 있지만 아직 베타 상태이므로 적용은 관리자 판단에 맡긴다.

    패키지 풀기

    다음과 같이 uncompress와 tar 명령을 내려 패키지를 푼다. 시스템에 C 컴파일러가 설치되어 있는지 확인하고 만일 존재하지 않을 경우 gcc를 설치한다.
    % gzip -d qpopper4.0.3.tar.gz
    % tar xf qpopper4.0.3.tar
    % cd qpopper4.0.3
    
    

    configure

    이상의 방법으로 압축된 tar 파일을 풀었다면 qpopper4.0.3 디렉토리로 들어가서 configure를 수행하자. 예전 버전과는 달리 2.5.x 버전부터는 configure script를 사용하여 자동으로 Makefile을 생성할 수 있도록 설계되어 있다. 3.1.2버전에서 공식적으로 지원하는 운영체제는 Solaris, HP-UX, IRIX, SCO, SunOS4.x, Linux, BSDI, FreeBSD, Digital UNIX(OSF/1), A/UX, NCR, NeXT등이다.
    % cd qpopper4.0.3
    % ./configure
    

    시스템의 여러 가지 환경을 체크하느라 화면에 글자가 올라가는 광경이 보일 것이다. configure가 성공적으로 끝나면 Makefile이 생성되어 있을 것이다. 경우에 따라서는 configure를 수행시킬때 선택 사양을 추가해야할 필요성이 생긴다. 현재 경로인 .이 PATH 환경변수에 없어 configure가 없다고 나올 경우를 대비해 ./을 configure앞에 붙인 것을 눈여겨 보자.

    만일 shadow password를 지원해야 하는 상황에서 configure 명령을 내릴 경우 다음과 같이 선택 사양을 주어 자동으로 마크로를 Makefile에 추가하도록 한다. 물론 이후에 설명할 마크로 설정 방법을 사용할 수도 있으나, 아무래도 configure시에 미리 설정해두는 편이 편리하다.

    % configure --enable-specialauth
    

    qpopper에서 shadow password를 지원하는 시스템은 다음과 같다:

    • shadow password를 사용하는 Linux
    • C2 보안체계가 설정되어 있는 Digital UNIX
    • Trusted 모드로 동작하는 HP-UX
    • shadow password를 사용하는 SunOS 4.x

    위 네가지 시스템에서는 configure시 --enable-specialauth나 마크로 AUTH_SPECIAL을 명시적으로 정해주어야 shadow password를 인식한다. 하지만 다음에 나열하는 세가지 시스템은 기본적으로 shadow password를 사용하도록 설정되어 있으므로 configure 선택 사양을 마크로 정의등의 특별한 조치를 취할 필요가 없다.

    • SCO UNIX
    • ULTRIX
    • SOLARIS

    만일 POP3 계정 사용자 전체에게 보내는 블루틴(bulletin) 기능을 지원하고 싶다면 다음과 같이 선택 사양을 주어 자동으로 마크로를 Makefile에 추가하도록 한다.

    % configure --enable-bulletins=/var/spool/bulls
    

    /var/spool/bulls는 블루틴 메세지들이 축적될 기본 디렉토리 이름이다.

    사용자를 위한 popbull 파일을 다른 경로에 저장하고 싶을 경우 다음 선택 사양을 사용한다.

    만일 사용자의 홈 디렉토리에 .popbull 파일 대신에 데이타베이스를 사용하고 싶다면 --enable-bulletins 선택 사양 대신 다음과 같은 선택 사양을 사용한다.

    % configure --enable-bulldb=/var/spool/bulls
    
    또한 새로운 사용자에게 최대로 한번에 받아볼 bulletin 갯수를 지정하려면 다음과 같은 선택 사양을 사용한다.

    
    % configure --with-new-bulls=10
    

    이상의 선택 사양을 지정하면 새로운 사용자는 최대 10개까지의 bulletin만을 받게 될 것이다.

    특정 그룹에 대해서만 bulletin을 받도록 지정하려면 다음과 같은 선택 사양을 사용한다.

    % configure --enable-group-bulls
    

    블루틴 기능에 대해서는 활용 방안에서 별도 설명할 예정이다.

    만일 POP3 서버를 서버 모드(Server Mode)로 동작시키고 싶다면 다음과 같이 선택 사양을 주어 자동으로 마크로를 Makefile에 추가하도록 한다. 서버 모드에 대해서는 활용 방안에서 별도 설명할 예정이다.

    % configure --enable-servermode
    

    만일 POP3 서버에 PAM 인증 기능을 추가하려면 다음과 같이 선택 사양을 주어 자동으로 마크로를 Makefile에 추가하도록 한다.

    % configure --with-pam=servicename
    

    기본 servicename은 pop3이다.

    전자편지를 서버에 남기도록 설정하는 사용자가 있다. 물론 이러한 기능이 때로는 도움이 되지만 때로는 서버에 부하를 줄 수도 있으므로 3.0에 들어와서는 서버쪽에서 자동으로 다운로드 받은 편지를 삭제할 수 있는 방법이 생겼다.

    % configure --enable-auto-delete
    

    qpopper의 버전 번호를 표시하는 기능이 때로는 보안에 구멍을 줄 수도 있다. 부가적인 정보를 감추기 위해서 다음의 선택 사양을 적용해보자.

    % configure --enable-shy
    

    각 사용자의 홈 디렉토리에 쿼터를 주고 있을 경우 전자편지 임시 파일을 사용자의 홈 디렉토리에 생성시킨다면, 전자편지의 크기를 제한할 수 있을 것이다.

    % configure --enable-home-dir-mail=file
    
    이상의 선택 사양을 사용자의 홈 디렉토리에 file이라는 이름으로 spool 파일을 생성시킨다.

    해쉬방식으로 spool 디렉토리를 지정할 수 있다.

    % configure --enable-hash-spool=1
    % configure --enable-hash-spool=2
    

    1로 지정하면 계정의 첫째 글자를 사용하여 spool 하부 디렉토리를 생성시키며, 2로 지정하면 계정의 첫째와 두째 글자를 사용하여 spool 하부 디렉토리를 생성시킨다. 예를 들어, jrogue라는 사용자의 스풀 파일이 /var/mail에 저장된다고 할 경우 다음과 같은 디렉토리-파일 구조를 갖는다. 사용자가 많아질 경우 유리할 것이다.

    • --enable-hash-spool을 지정하지 않았을 경우: /var/mail/jrogue
    • --enable-hash-spool=1로 지정했을 경우: /var/mail/j/jrogue
    • --enable-hash-spool=2로 지정했을 경우: /var/mail/j/r/jrogue

    디버깅을 위한 코드를 생성할 필요가 있다. 이럴 경우 다음과 같은 선택 사양을 사용한다.

    % configure --enable-debugging
    

    전자편지 drop 파일을 생성하기 위한 디렉토리를 지정할 필요가 있다. 이럴 경우 다음과 같은 선택 사양을 사용한다. 여기서 path 기본값은 spool 경로이다.

    % configure --enable-temp-drop-dir=path
    

    종종 temp drop 파일을 지우지 못하도록 할 필요가 있다. 이럴 경우 다음과 같은 선택 사양을 사용한다.

    % configure --enable-keep-temp-drop
    

    HASH_SPOOL이나 HOMEDIRMAIL을 정의할 경우 예전 위치에서 .user.pop을 검사할 필요가 없다. 이럴 경우 다음과 같은 선택 사양을 사용한다.

    % configure --disable-old-spool-loc
    

    해쉬 spool 디렉토리를 검사하거나 만들지 않도록 하려면 다음과 같은 선택 사양을 사용한다.

    % configure --disable-check-hash-dir
    

    지정한 그룹에 있는 사용자에 대해서만 서버 모드로 동작하게 하려면 다음과 같은 선택 사양을 사용한다.

    % configure --enable-server-mode-group-include=group
    

    지정한 그룹에 있는 사용자에 대해서만 서버 모드로 동작하지 않게 하려면 다음과 같은 선택 사양을 사용한다.

    % configure --enable-server-mode-group-exclude=group
    

    secure NIS+를 쓸 경우 다음과 같은 선택 사양을 사용한다.

    % configure --enable-secure-nis-plus
    
    

    효율을 높이거나 기타 사정이 있어 inetd를 쓰는 대신 독자적인 데몬으로 동작하려면 다음과 같은 선택 사양을 사용한다.

    % configure --enable-standalone
    

    이상의 --enable-standalone 선택 사양을 사용할 경우 inetd에서 시동하는 대신에 다음과 같이 독자적인 데몬으로 동작할 수 있다. 199.46.50.7은 허용하는 IP 주소이며 110은 포트 번호이다.

    # popper 199.46.50.7:110 -S
    
    

    모든 호스트를 허용하려면 다음과 같이 IP를 지정하지 않으면 된다.

    # popper 110 -S -T600
    

    만일 독자적인 데몬으로 수행할 경우 inetd에서 POP3 관련 설정을 모두 빼야 한다. 그리고 TCPWrapper와 같은 주소 필터링 프로그램을 사용할 경우에는 inetd를 반드시 써야 하므로, 이 기능을 활용할 수 없다.

    파일에 열거한 사용자만 접근을 허용할 경우 다음과 같은 선택 사양을 사용한다. path에는 한줄에 하나씩 게정을 명기한다.

    
    % configure --enable-auth-file=path
    

    파일에 열거한 사용자만 접근을 허용하지 않을 경우 다음과 같은 선택 사양을 사용한다. path에는 한줄에 하나씩 게정을 명기한다.

    % configure --enable-nonauth-file=path
    

    컴파일러 최적화를 수행하지 않으려면 다음과 같은 선택 사양을 사용한다.

    % configure --disable-optimizations
    
    

    추가적인 컴파일러 오류를 보기 위해 다음과 같은 선택 사양을 사용한다.

    % configure --with-warnings
    

    유효기간이 지난 암호를 검사하지 않으려면 다음과 같은 선택 사양을 사용한다.

    % configure --disable-check-pw-max
    

    Status나 X-UIDL 헤더를 변경하지 않으려면 다음과 같은 선택 사양을 사용한다. 이 선택 사양을 지정해두면, 매 세션마다 각 메세지를 다시 계산한다.

    % configure --disable-status
    

    예전 스타일(3.x 이전)로 UID를 생성하려면 다음 선택 사양을 사용한다.

    % configure --enable-old-uidl
    

    매 세션이 끝나면 인증, 초기화, 청소에 걸린 시간을 기록하려면 다음 선택 사양을 사용한다.

    
    % configure --enable-timing
    

    사용자 인증이 성공적으로 끝나면 결과를 기록한다. 연속되는 SMTP 세션에서 동일한 IP 주소에 있는 사용자에게 짧은 시간 동안 이 정보를 사용하여 인증이 가능하도록 만들어준다.

    % configure --enable-log-login
    

    DRAC을 지원하려면 다음 선택 사양을 사용한다. DRAC은 SMTP_AUTH를 쓸 수 없는 환경에서 SMTP 세션 인증을 POP3 데몬으로 수행하는 규약이다. 여기서 lib-path는 DRAC 라이브러리를 설치한 경로이다.

    % configure --enable-drac=lib-path
    
    

    SSL/TLS 지원을 위해 OpenSSL을 사용할 경우 다음 선택 사양을 사용한다.

    % configure --with-openssl=path
    

    SSL/TLS 지원을 위해 SSL Plus를 사용할 경우 다음 선택 사양을 사용한다.

    % configure --with-sslplus=path
    

    SSL/TLS 지원을 위해 Security Builder를 사용할 경우 다음 선택 사양을 사용한다.

    % configure --with-sslplus-crypto=path
    

    주의) SSL/TLS 지원은 결코 만만한 작업이 아니다. SSL/TLS 자체에 필요한 옵션을 설정해야할 뿐더러 qpopper 4.0.x에서 새로 도입한 환경 설정 파일을 지정해야 제대로 동작한다. SSL/TLS 자체에 필요한 옵션 정의(공개키와 비밀키 정의부터 파일 생성까지)는 OpenSSL 메뉴얼을 참조하고, 환경 설정 파일은 qpopper 패키지 samples 디렉토리 아래에 qpopper.config를 참조하기 바란다.

    컴파일시 정의해야 하는 마크로 설정

    일반적인 환경에서 qpopper를 사용할 경우라면 configure에 의해 생성된 Makefile을 가지고 컴파일하면 별 다른 문제가 없다. 하지만 세상 일이 그렇게 쉽지만은 않다. 몇몇 특별한 환경에서는 Makefile에 마크로 정의를 해주어야 한다.

    마크로 정의를 위해서는 Makefile을 열어

    
    DEFS            =       -DHAVE_CONFIG_H
    
    라인 뒤에 마크로를 추가해야 한다. 만일 MY_MACRO라는 마크로를 정의할 경우 위 라인을 다음과 같이 고쳐야 한다.
    DEFS            =       -DHAVE_CONFIG_H  -DMY_MACRO
    
    Makefile에 추가할 몇가지 마크로를 표([Makefile에 관련된 마크로 이름과 설명])형태로 정리하였다. 자신의 환경에 맞추어 올바르게 설정해서 사용하기 바란다.

    마크로 이름 설명
    AUTH_SPECIAL shadow password나 특수한 암호 프로그램으로 사용자 암호를 처리 -DAUTH_SPECIAL
    SECURENISPLUS NIS+를 사용할 경우 -DSECURENISPLUS
    BULLDIR POP3 사용자들에게 블루틴(bulletin) 기능을 제공하고 싶을 경우 -DBULLDIR=\"/var/spool/bulls\"
    BULLDB 블루틴 관련 정보를 사용자 홈 디렉토리가 아닌 ndbm 파일에 저장할 경우 -DBULLDB
    NEWBULLCNT 새로운 사용자가 최대한으로 받을 초기 블루틴 갯수 -DNEWBULLCNT=10
    SERVER_MODE POP3 서버를 서버 모드로 동작시킬 경우 -DSERVER_MODE
    AUTHFILE POP3 서버가 허가하는 사용자 목록이 담긴 파일 이름을 지정할 경우 -DAUTHFILE=\"/etc/authfile\"
    NONAUTHFILE POP3 서버가 허가하지 않는 사용자 목록이 담긴 파일 이름을 지정할 경우 -DNONAUTHFILE=\"/etc/nonauthfile\"
    DEBUG popper -d 명령으로 로그 파일을 남기고 싶을 경우 -DDEBUG
    KERBEROS Kerberos IV를 지원하고 싶을 경우, 반드시 Makefile에 -lkrb를 추가 -DKERBEROS
    KUSEROK Kerberos에서 kuserok 함수를 사용할 경우 -DKUSEROK
    HASH_SPOOL spool 디렉토리 및 파일 구조를 해쉬를 사용하여 지정하고 싶을 때 -DHASH_SPOOL=(1|2)
    KEEP_TEMP_DROP 사용자의 .user.pop 파일을 지우지 않을 경우. 최종적으로 편지를 읽은 시간을 알 수 있다. -DKEEP_TEMP_DROP
    HOMEDIRMAIL 전자편지가 사용자의 홈 디렉토리에 spool될 경우 -DHOMEDIRMAIL=\".mail\"
    AUTO_DELETE 자동으로 다운로드 받은 편지를 서버쪽에서 삭제하고 싶을 경우 -DAUTO_DELETE
    SHY qpopper의 버전 번호를 숨기고 싶을 경우 -DSHY
    USE_PAM PAM을 사용하여 인증할 경우 -DUSE_PAM=\"pop3\"
    [Makefile에 관련된 마크로 이름과 설명]

    컴파일

    만일 마크로 설정을 위해 Makefile을 수정했을 경우
    % make clean
    
    명령으로 혹시 남아있을지도 모르는 목적 파일을 모두 삭제해야 함에 유의하자.

    이제 모든 준비가 완료되었으면 다음 명령을 내려 컴파일을 시도하자.

    % make
    
    컴파일이 끝나면 popper라는 실행파일이 만들어져 있을 것이다.

    설치

    컴파일이 완료되었다면 popper를 설치한다. 시스템 관리자로 변신해서 파일을 복사하고 조절 파일을 수정하는 작업을 살펴보자.

    먼저 생성된 popper를 복사한다. 만일 /usr/local/lib 디렉토리가 없다면 mkdir 명령으로 생성시킨다. 디렉토리가 존재할 경우 mkdir 명령을 내릴 필요없이 복사 작업만 하면 된다. 기존에 popper가 설치되어 있다면, 비상시를 대비하여 이를 popper.old라는 이름으로 변경하여 보존한다.

    % su -
    Password:******
    # cd /usr/local
    # mkdir lib
    # cp popper /usr/local/lib/
    
    이제 /etc 디렉토리 아래의 services와 inetd.conf 파일을 다음과 같이 수정한다.

    1. services 의 hostnames 밑에 다음 라인을 추가한 다음 저장한다.
      pop3            110/tcp                         # popper
      
    2. inetd.conf의 마지막 행에 다음 라인을 추가한 다음 저장한다.
      pop3    stream  tcp     nowait  root    /usr/local/lib/popper popper -s 
      
    3. pop3에 관련된 라인이 절대로 중복되어서는 안된다. 라인을 추가하기 전에 반드시 확인이 필요하다. 그리고 popper 명령을 제외한 각 공백은 탭 키를 눌러 널찍널찍하게 들여쓰기를 맞추도록 한다.
    4. pop이나 imap과 혼동해서는 안된다. 두 프로토콜과 pop3는 호환성이 없다.
    5. Linux의 경우 110번 포트가 pop-3라고 되어있다. 혼동을 막기 위해 아에 이를 주석처리하기 바란다.
    6. 만일 inetd.conf를 수정하였다면, inetd를 다음과 같이 죽였다 살린다.
      # kill -HUP < inetd process id >
      
    7. AIX를 사용할 경우 다음과 같은 방법으로 inetd를 재시동할 수 있다.
      # refresh -s inetd 
      
      

    inetd 대신 xinetd를 사용할 경우에는 다음 절차를 따르기 바란다.

    1. /etc/xinetd.d 디렉토리에 pop3라는 파일을 만든다. 이 파일에는 다음과 같은 내용이 들어있어야 한다. 여기서 server에서 지정하는 디렉토리는 상황에 따라 변동해야 한다.
          service pop3
          {
              socket_type     = stream
              protocol        = tcp
              wait            = no
              user            = root
              server          = /usr/local/lib/popper
              server_args     = qpopper -s
              port            = 110
          }
      

    POP3 서버의 테스트 방법

    POP3 서버가 설치된 호스트 이름이 localhost이며 계정 이름이 myname이라고 가정하면, 다음의 방법으로 서비스 유무를 손쉽게 확인할 수 있다. telnet을 수행한 다음 user 뒤에 계정 이름을, pass 뒤에 암호를 넣으면 된다. POP3의 규약에 의거하여 userpass라는 명령어도 직접 타이핑해야 함에 유의하기 바란다.
    % telnet localhost pop3
    Trying 127.0.0.1
    Connected to localhost.
    Escape character is '^]'.
    +OK QPOP (version 3.1.2) at localhost starting.
    user myname
    +OK Password required for myname.
    pass ******
    +OK myname has 0 visible messages (0 octets).
    quit
    +OK Pop server at localhost signing off.
    Connection closed by foreign host.
    
    위의 시나리오와 같이 banner가 나오고 사용자에 대한 편지 확인이 되면 qpopper가 정상적으로 설치된 것이다.

    POP3 서버의 활용 방안

    POP3 서버를 컴파일하고 설치하고 테스트까지 완료되었다면, 이제 서버의 활용 방안에 대해 생각해보아야 한다. 구슬이 서말이라도 꿰어야 보배라고 하지 않았던가?

    먼저 서버를 동작시킬 경우에 있어 필요한 명령행 선택 사양부터 숙지하고 있어야 한다. 아래 표([qpopper의 명령행 선택 사양])에 필요한 요소를 정리해 두었다. 명령행 선택 사양은 컴파일시 정의된 기본값보다 우선 순위가 주어지므로 환경 설정시 필요할 때마다 참고하기 바란다.

    사용법: popper [-B] [-b bulldir] [-c] [-D drac-host] [-d] [-e] [-k] [-R] [-S] [-s] [-T timeout] [-t trace-file] [-f config-file]

    선택 사양 설명
    -B --enable-bulldb로 컴파일했을 경우, bulletin 데이타베이스를 열 수 없어도 작업을 진행하도록 허용한다.
    -b bulldir 블루틴을 저장할 디렉토리를 지정한다.
    -c 사용자 계정을 소문자로 변경하여 검사하도록 만든다.
    -D drac-host --enable-drac 선택 사양으로 컴파일 되었을 경우 drac 호스트를 지정한다. 기본값은 localhost이다.
    -d 디버깅 로깅을 수행한다(-DDEBUG로 컴파일한 경우에만 적용).
    -e POP3 확장 모드로 동작한다.
    -k Kerberos를 지원한다(-DKERBEROS로 컴파일한 경우에만 적용).
    -R 클라이언트의 IP 주소에 대한 역매핑을 하지 않는다.
    -S --enable-servermode를 지정하지 않았을 경우 서버 모드로 동작한다.
    -s 통계를 위해 로깅을 수행한다.

       Stats: randy 0 0 1 385 randy.example.org 192.168.2.4
    Username----^   ^ ^ ^  ^         ^               ^
    Deleted msgs----! ! !  !         !               !
    Deleted octets--  ! !  !         !               !
    Msgs left on server-!  !         !               !
    Octets left on server--!         !               !
    Name of client machine-----------!               !
    IP address of client machine---------------------!
    
    -T timeout qpopper의 종료시간을 지정한다. RFC의 기본값은 600초이나, 30에서 120초가 적합하다.
    -t trace-file 디버그와 통계 파일을 위한 로그 파일 경로를 지정한다.
    -f config-file 환경 설정 파일을 읽어서 여기에 지정한 옵션으로 동작하게 만든다. 환경 설정 파일 예는 qpopper 패키지 samples 디렉토리 아래 qpopper.config 파일을 참조하기 바란다. 대부분 명령행으로 설정할 수 있으므로 많은 옵션을 사용하는 경우가 아니라면 굳이 환경 설정 파일을 쓸 필요가 없다.
    [qpopper의 명령행 선택 사양]

    블루틴(bulletin) 기능 사용하기

    센드메일과 POP 서버를 관리하다보면 동시에 여러 사용자에게 편지를 전달(동보 전송)할 필요성이 생긴다. 물론 메일링리스트를 만들어 이를 활용하더라도 큰 문제는 없으나 POP 서버를 사용할 경우 한가지 묘책이 있다. 바로 블루틴 기능이다.

    블루틴 기능은 관리자에 의해 만들어진 메시지가 센드메일등의 MTA(Message Transfer Agent)를 거치지 않고 모든 POP 사용자에게 자동으로 전달되는 메커니즘을 제공한다. POP3 서버는 개별 사용자 디렉토리의 ~/에 .popbull이라는 파일을 만들어두고 이를 참조하여 각 사용자가 어떤 블루틴까지 읽었는지 판단하게 된다. .popbull에는 정수값이 들어있으며 이보다 큰 값을 가진 블루틴이 BULLDIR에 존재할 경우 POP3 서버가 이를 자동으로 사용자의 지역 기계의 MUA(Message User Agent)에 보내준다. 만일 마크로 BULLDB를 정의해두면(혹은 --enable-bulldb 선택 사양으로 configure를 수행하면), 블루틴에 필요한 정보가 사용자 디렉토리가 아니라 BULLDIR의 bulldb.pag 및 bulldb.dir 파일에 중앙집권식으로 저장된다.

    configure시나 마크로 설정을 통해 블루틴 기능을 지원하도록 컴파일했다면 다음 사항을 살펴본다.

    1. BULLDIR로 정의된 디렉토리가 존재하는지 검사한다. 만일 존재하지 않는다면 mkdir 명령으로 새로 만든다.
    2. 위 디렉토리의 접근허가를 살펴본다. 일반 사용자에게 읽기/찾기 권한이 부여되어 있는지 확인하고, 그렇지 않다면 chmod 명령으로 권한을 변경한다.
    3. RFC822 규약에 맞추어 블루틴에 올릴 편지 전문을 작성한다. 센드메일등의 MTA를 거치지 않으므로 MUA가 혼동을 일으키지 않게 하려면 관리자가 수작업으로 Date, From, Subject등의 SMTP 헤더를 규칙에 맞추어 추가해야 한다. 아래에 제시하는 편지를 기초로 필요한 부문을 고쳐서 사용하기 바란다.
      From qpop Mon Jan 18 11:41:00 1999
      Date: Mon, 18 Jan 1999 11:41:00 +0900 (KST)
      From: "POP Administrator" 
      Subject: Example bulletin
      
      This is a test bulletin using POP3 bulletin facility.
      
    4. 작성한 편지의 파일 이름을 정한다. 이름 규칙은 일련번호.제목으로 구성되며 일련번호는 디렉토리에 최대로 저장할 편지 개수 + 1까지를 포함할 수 있는 자리수를 가지도록 한다. 합법적인 이름의 예는 다음과 같다:
      • 00000.Bulletin
      • 00001.Shutdown
      앞서 언급한 바와 같이 앞의 일련번호와 사용자 계정의 .popbull 파일의 일련번호를 비교하여 해당 사용자에게 메시지를 전달하므로, 파일 이름 결정은 언제나 신중해야 한다. 여기서 일련번호는 중복되지 않도록 하며 오름차순으로 부여하도록 한다.
    5. 만일 configure 시에 --enable-group-bulls 선택 사양을 붙였다면 이름을 다음과 같이 지정한다.
      • 001.staff.new_program_installed
      둘째 필드는 그룹 이름이며, 이상의 예와 같이 설정한 편지는 staff 그룹에게만 전달될 것이다.

    하지만 편리한 블루틴 기능에도 다음 두가지 사소한 결점이 존재한다. 참고하기 바란다.

    • pine이나 mutt등으로 UNIX에서 메일박스를 바로 읽어들일 경우 블루틴이 무용지물로 변한다. 이럴 경우 뾰족한 방법이 없다.
    • 일련번호의 재사용(recycle) 기능이 아직 구현되어 있지 않다. 따라서 일련번호를 모두 사용한 이후에는 find 명령으로 각 사용자 디렉토리를 모두 뒤져 .popbull 파일을 삭제해야 하는 불상사가 생길지도 모른다.
    • 새로운 사용자가 등록되었을 경우 기존의 모든 불루틴이 전달되는 문제는 --with-new-bulls를 사용하여 configure 명령을 내리면 쉽게 해결할 수 있다.

    서버 모드로 동작시키기

    POP3도 하나의 서버이다. 그러면 서버서버모드로 동작시킨다는 의미는 과연 무엇인가?

    POP3 서버를 사용하는 사용자가 늘어날 경우 능률이 급격하게 떨어지는 현상을 발견할 수 있다. 이럴 경우 POP3 서버에 접속하는 클라이언트만 메일박스를 읽어들인다고 가정할 수 있다면 서버 모드로 동작시키는 편이 월등히 유리하다.

    서버 모드가 아닌 일반 모드에서 POP3를 동작시킬 경우 사용자 인증후에 사용자의 메일박스를 임시 파일(.username.pop)에 복사하며, 이후 사용자가 세션을 마칠때 삭제되지 않은 메시지들이 원래의 메일박스로 옮겨지게 된다. 하지만 모든 사용자가 세션 중에 모든 편지를 다 읽어서 삭제시킨다든지, 아니면 모든 사용자가 세션 중에 모든 편지를 삭제하지 않고 그대로 놓아둔다면, 이러한 불필요한 복사작업은 의미가 없어질 것이다.

    서버 모드는 바로 이러한 오버헤드를 줄이기 위해 메일박스 자체에 락(lock)을 걸고 내용을 검사하고 다시 락을 푸는 방법을 사용한다. qpopper는 편지가 새롭게 도착하여 메일박스의 뒷부분에 붙기만 한다고 가정한다(즉, 중간에 다른 프로그램이 편지를 지우거나 하는 골치아픈 경우는 생각하지 않는다). qpopper는 남아있는 편지를 체크하기 위해 편지의 Status header와 UID 갱신 유무를 검사하여, 만일 변동이 있을 경우 메일박스를 고치며, 그렇지 않다면 메일박스를 그대로 둔다.

    서버 모드의 장점은 불필요한 파일 복사를 최소화할 수 있다는 점이다. 요즘 같이 첨부파일이 많이 붙은 편지가 난무할 때 이러한 서버 모드의 장점은 더욱 두드러진다. 편지가 서버에 남아있거나 읽거나(고)/삭제되지 않았을 경우에는 임시 영역으로의 복사가 일어나지 않으므로 불필요한 디스크 접근이 줄어드는 것이다.

    하지만 서버 모드를 사용할 경우 해당 호스트의 모든 사용자가 POP3 프로토콜만을 이용해서 메일박스에 접근해야 한다는 기본 가정이 존재함에 각별히 유의해야 한다. 블루틴과 마찬가지로 UNIX 터미날에서 mail등의 명령으로 메일박스에 바로 접근할 경우 문제가 생길 수도 있다.

    서버 모드와 더불어 POP3 서버의 성능을 높이기 위해 또 한가지 방법이 존재한다. 바로 POP_DROP 마크로를 config.h에 정의하는 것인데, 메일박스를 임시 파일로 복사할 때 별도의 디렉토리를 지정할 수 있도록 하여 시스템의 능률을 향상시켜준다. 만일 1,000명 이상의 사용자를 지원해야 한다면 config.h 파일에 다음 마크로를 적용해서 qpopper를 새로 컴파일해보기 바란다.

    #define POP_DROP "/usr/spool/poptemp/.%s.pop"
    

    보안 문제로 인해 /tmp 디렉토리를 POP_DROP의 기본 디렉토리로 정의하는 일은 피하기 바란다. 또한 POP_DROP 기본 디렉토리 (/usr/spool/poptemp)의 접근허가와 소유주를 메일박스가 저장되는 디렉토리와 동일하게 설정해두어야 하는 사실을 잊지말기 바란다.

    특정 사용자만 POP3 서비스를 허용하기

    전자편지 서버를 관리하다보면 별의별 일이 다 생기게 된다. 경우에 따라 특정 사용자에게만 POP3 서비스를 열거나 닫아두는 기능이 필요할 수도 있다. 이럴 경우 앞서 마크로 설정에서 소개한 AUTHFILE, NONAUTHFILE 마크로가 특히 유용하다.

    AUTHFILE 및 NONAUTHFILE 마크로에 정의된 파일을 각각 열어 사용자의 계정 이름을 한줄에 하나씩 순서없이 열거하면 된다. 구분자(separator)가 없음에 유의하라.

    만일 AUTHFILE 마크로를 설정해두었다면 모든 서비스 대상 사용자를 AUTHFILE에 넣어야 한다. 사용자가 많을 경우 다음과 같이 awk등으로 passwd 파일의 첫째 컬럼만 끊어서 초안을 작성하면 된다.

    % awk -F: '{print $1}' /etc/passwd
    

    NONAUTHFILE과 AUTHFILE에 사용자 이름이 동시에 들어가 있으면 어떻게 될까? NONAUTHFILE이 우선함을 명심하자. 즉 동시에 접근허가/거부를 설정하면 항상 거부가 접근에 우선한다. 경험에 의하면 AUTHFILE 마크로는 설정하지 않는 편이 좋겠다. 아주 부지런한 관리자가 아니고서는.

    Trouble Shooting

    qpopper의 테스트를 위해
    % telnet localhost pop3
    
    명령을 내렸을 경우 다음과 같은 메시지가 나올 수 있다.

    1. pop3: bad port number
    2. connect: Connection refused
    3. connect: Connection closed

    이럴 경우 번호에 맞추어 다음의 경우를 차근차근 따져보기 바란다.

    1. services 파일에 POP3 포트 번호가 설정이 안된 경우: 직접 services 파일을 열어 pop3 설정을 확인한다. Linux의 경우 pop3 대신 pop-3라고 정의되어 있을 것이므로 이 행을 주석처리하고 새로 pop3라는 이름으로 설정하기 바란다.
    2. inetd.conf 파일에 POP3가 설정이 안된 경우: 직접 inetd.conf 파일을 열어 pop3 설정을 확인한다.
    3. popper daemon에 문제가 있는 경우: inetd.conf나 service 파일에 적힌 popper의 위치와 실행 파일 이름을 확인한다. 그리고 inetd를 다시 동작시킨다. 또한 inetd.conf에 110번 포트를 잡는 프로그램을 두 개 이상 등록하면 이런 현상이 생길 수 있다. 다음 코드에서 /usr/local/lib/popper를 마우스로 긁어서 ls -al 명령을 내려 qpopper 프로그램이 존재하는지 확인하기 바란다.

         pop3    tcp     /usr/local/lib/popper    qpopper -s
      

    접속이 잘되었더라도 사용자 계정과 암호를 주면 이를 거부할 때가 있다. 이럴 경우에는 다음 항목을 살펴본다.

    1. shadow password 사용시: configure를 --enable-specialauth 선택 사양을 주어 새로 돌리거나 Makefile에 AUTH_SPECIAL 마크로를 추가해서 새로 컴파일한다.
    2. AUTHFILE, NONAUTHFILE 마크로 정의시: 각각의 인증 목록 파일을 검사하여 해당 사용자가 인증이 거부되고 있는 상황인지 살펴보기 바란다.

    하지만 사용자 인증까지 잘 넘어갔음에도 불구하고 임시 파일을 생성시킬 수 없다는 오류가 발생할 수 있다.

    1. -ERR System error, can't open temporary file, do you own it?

    이럴 경우 다음 항목을 살펴본다.

    1. 각종 파일에 대한 소유주가 틀리게 설정된 경우: popper daemon의 소유주가 root인지 확인하며, 전자편지가 저장되는 디렉토리(예: /usr/mail)의 소유주가 root이고 그룹이 mail이며, 전자편지가 저장되는 디렉토리에 생성되는 임시 파일인 .username.pop의 소유주가 username인지 확인한다. 또한 전자편지가 저장되는 디렉토리의 접근허가를 살펴서 임시 파일인 .username.pop이 생성될 수 있는지 확인한다. 만일 디렉토리 접근허가에 문제가 있으면 다음과 같은 명령을 내려 전자편지가 저장되는 디렉토리의 접근허가를 drwxrwxrwt로 변경한다.
      # chmod 1777 /usr/mail
      

    이상의 경우를 모두 따져보았음에도 불구하고 원인을 제대로 파악할 수 없다면 Makefile에 DEBUG 마크로를 추가해서 새로 컴파일하여 inetd.conf의 popper 명령에 -d 선택사양을 주어 popper를 시동하도록 한다. syslog 파일에 popper의 활동상황이 기록되어 있으므로 이를 분석하여 문제를 해결한다. 또한 선택 사양을 잘못 설정하여 문제가 발생할 수도 있으므로, 이럴 경우 선택 사양을 지정하지 않고 순수하게 configure 명령만으로 popper를 만들어 테스트에 임하기 바란다.

    기타

    • 이 문서의 저작권 및 라이선스 방식은 삼바 설치 및 활용 가이드에 준한다.
    • 의문 사항이 생길 경우 전자편지를 사용하여 질문하면 feedback을 받을 수 있을 것이다.


    커피닉스, 시스템 엔지니어의 쉼터 / URL : http://coffeenix.net/board_view.php?bd_code=15