커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 네트워크(network) > 메일 서버(mail) 도움말
검색 : 사이트 WHOIS 웹서버 종류

메일 필터링(스팸메일) / procmail (14, 글 18, 자료 8)

  sendmail 8.9.x/8.10.x 설치 가이드 - 두번째 판(2001년 1월) 작성일 : 2003/08/05 10:56
 
  • 글쓴이 : 박재호 ( http://my.netian.com/~jrogue/ )
  • 조회수 : 9933
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
     

    sendmail daemon의 기능

    매일 전자편지를 주고받고 있는 일반 사용자들은 솔직히 어떤 경로를 통해 어떻게 전자편지가 인터넷을 떠돌아다니고 있는지 의식하지 않을 경우가 많다. 하지만 전자편지 서버를 관리하는 분이라면 sendmail을 의식하지 않고서는 반나절도 못버틸 것이다.

    sendmail은 인터넷 전자편지의 표준 규약인 SMTP (Simple Mail Transfer Protocol)를 지원하는 전형적인 MTA(Message Transfer Agent) 데몬으로 1970년대 후반에 버어클리 유닉스로 유명한 캘리포니아의 버어클리 대학의 인재인 Eric Allman씨에 의해 작성되었다. Eric Allman씨는 현재 Sendmail Inc.라고 불리우는 자신의 회사를 운영하고 있으며 공개 소프트웨어계의 거물급 인사이다.

    UNIX 기계에 MTA(Message Transfer Agent)인 sendmail과 중간 매개체인 popper/imap4를 설치하여 mail 서버로 삼고, PC쪽에서 NS, Outlook, Eudora등의 MUA(Message User Agent)를 설치하여 서버쪽에 저장된 편지를 끌어당겨서 읽도록 환경을 설정하고 운영하는 과정은 익히 알려진 표준화된 관리방법으로 자리잡고 있다.

    이 문서(1판)는 복잡성을 피하기위해(sendmail을 본격적으로 설명하려면 날밤새어야 한다.) sendmail 8.9.x/8.10.x 계열 설치와 관련한 가장 기본적인 최소한의 사항만 설명했으므로 보다 자세한 내용을 알고 싶다면 sendmail 패키지에 딸려오는 문서를 확인하기 바란다. 8.8.x 계열을 사용하시는 분들께서는 이번 기회에 기능이 향상된 8.9.x/8.10.x 버전을 설치해보는 것도 나쁘지는 않을 것이다.

    sendmail 8.9.x/8.10.x의 설치방법

    sendmail 8.9.x/8.10.x를 설치하기 위해서는 다음 절차를 따른다.

    패키지 구하기

    sendmail 8.9.x/8.10.x를 설치하기 위해서는 넘어야할 난관이 많다. 일단 다음 패키지를 가져오도록 한다.

    1. 공개 DB 라이브러리로 유명한 www.sleepycat.com에서 Berkeley DB 2.7.5 버전을 가져온다. sendmail은 이 라이브러리를 사용하여 각종 sendmail 관련 데이타베이스(alias, relay, spam list)등을 관리한다.
    2. GNU에서 만든 M4 1.4 버전을 가져온다. sendmail.cf는 m4 패키지를 사용하여 마크로 치환이라는 방법을 통하여 표준 템플릿으에서 생성된다.
    3. www.sendmail.org에서 sendmail 8.9.3 버전 혹은 sendmail 8.10.0 버전을 가져온다.
    4. sendmail을 설치 하는 도중에 groff 패키지가 없다고 경고가 날 수도 있는데, 이를 피하기 위해서 부가적으로 GNU에서 만든 groff 패키지를 가져온다. 물론 시간이 없는 분들은 가져오지 않아도 무방하다.

    주의사항

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

    1. sendmail은 해커들의 주요 공격 목표이므로 항시 최신판으로 무장하고 있어야 함에 주의하자. 다음 명령을 내려보면 sendmail의 버전을 확인할 수 있다.
      % telnet localhost smtp
      Trying 127.0.0.1
      Connected to localhost
      Escape character is '^]'.
      220 localhost ESMTP Sendmail 8.9.3/8.9.3; Tue, 27 Jul 1999 17:05:09 +1000 (KDT)
      
    2. sendmail은 설치와 환경 설정이 상당히 까다로우므로 설치하는 데 어려움을 겪을 수 있다. 따라서 초보 관리자 분들은 충분한 시스템 경력이 있는 분들에게 도움을 청해서 같이 작업에 나서도록 하자.

    패키지 풀기

    각 절차를 밟기 전에 C 컴파일러의 존재유무를 확인한다. 만일 C 컴파일러가 없다면 gcc를 구해서 먼저 설치해둔다.

    1. Berkeley DB:
      다음과 같이 uncompress와 tar 명령을 내려 패키지를 푼다. db-3.x 계열을 가져왔을 경우 sendmail-8.9.3을 컴파일 할 수 없다는 사실에 주목하기 바란다.
      % gzip -d db-2.7.5.tar.gz
      % tar xf db-2.7.5.tar
      
    2. m4, groff:
      다음과 같이 gzip과 tar 명령을 내려 패키지를 푼다. groff를 가지고 오지 않았을 경우에는 groff 패키지를 풀지 않아도 된다.
      % gzip -d m4-1.4.tar.gz
      % tar xf m4-1.4.tar
      % gzip -d groff-1.11a.tar.gz
      % tar xf groff-1.11a.tar
      
    3. sendmail:
      다음과 같이 gzip과 tar 명령을 내려 패키지를 푼다.

      • 8.9.3 버전
        % gzip -d sendmail.8.9.3.tar.gz
        % tar xf sendmail.8.9.3.tar
        
      • 8.10.0 버전
        % gzip -d sendmail.8.10.0.tar.gz
        % tar xf sendmail.8.10.0.tar
        

    configure 및 make

    이상의 방법으로 각각의 압축된 tar 파일을 풀었다면 다음에 열거하는 순서에 따라 configure와 make 절차를 밟는다. sendmail을 제외한 Berkeley DB, m4, groff는 설치까지 한번에 해두자.

    1. Berkeley DB:
      Berkeley DB는 자동화된 Makefile 생성기인 configure를 제공하므로 설치는 의외로 쉽다. dist 디렉토리로 이동하여 configure 명령을 내린다.
      % cd db-2.7.5/dist
      % ./configure
      

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

      이제 make 명령으로 라이브러리를 만들자.

      % make
      
      얼마후 컴파일이 완료되었다는 메세지가 나올 것이다. 만일 Berkeley DB를 다른 곳에도 사용하고 싶다면 다음 명령을 내려 Berkeley DB를 /usr/local/BerkeleyDB 아래에 패키지 형식으로 설치한다. 하지만 BerkeleyDB를 sendmail 컴파일에만 적용할 경우 굳이 시스템에 설치까지해야할 특별한 이유는 없다.
      % su -
      Password:******
      # make install
      ...
      
    2. m4:
      GNU M4는 sendmail을 컴파일할 때, 골칫덩어리 sendmail.cf를 작성할 경우에 사용되므로 sendmail 설치에 앞서 미리 설치를 해두어야 한다. M4 패키지는 여느 GNU 프로그램과 마찬가지로 컴파일과 설치는 상당히 수월하다. 두번 생각할 필요도 없이 다음 절차를 밟아 한번에 처리해버리자.
      % cd m4-1.4/
      % ./configure
      % make
      % su -
      Password:******
      % make install
      
    3. groff:
      GNU groff는 sendmail에 딸려있는 문서를 formatting하기 위해 사용된다. 이를 설치하지 않아도 sendmail 자체를 컴파일하는 데 전혀 문제가 없다. 하지만 많은 분들이 sendmail 8.9.x 계열 컴파일 중에 오류(실제는 경고)가 난다는 항의를 했으므로 오해의 소지를 없애기 위해서 이 패키지 설치법도 추가했다. 8.10.x 계열을 사용하는 경우에는 groff가 없다는 오류 메세지를 출력하지 않음에 유의하기 바란다.
      % cd groff-1.11a
      % ./configure
      % make
      % su -
      Password:******
      % make install
      
    4. sendmail:
      sendmail은 컴파일에 앞서 몇가지 환경을 수작업으로 설정해야 한다. sendmail-8.9.3/BuildTools/OS(8.9.x 계열) 혹은 sendmail-8.10.0/devtools/OS(8.10.x 계열) 아래에 보면 각종 기종에 맞추어 config 파일이 존재함을 알 수 있다. 먼저 다음과 같은 방법으로 현재 사용중인 시스템 사양을 확인해보자.
      % uname -a
      HP-UX myhost B.10.01 B 9000/817 763013161 x-사용자 라이센스
      
      기종을 파악하는데 성공했다면(위의 예에서는 HP-UX 10.x) sendmail-8.9.3/BuildTools/OS(8.9.x 계열) 혹은 sendmail-8.10.0/devtools/OS(8.10.x 계열) 디렉토리 아래에서 자신의 운영체제에 맞는 config 파일(이하 설명을 쉽게하기 위해 config 파일을 HP-UX.10.x로 가정한다.)을 찾아야 한다. 자신의 운영체제에 꼭 맞는 config 파일이 없다면 밑져야 본전이니 유사한 녀석이라도 선택해본다. 이제 config 파일을 수정하기 위해 다음 명령을 내린다.

      • 8.9.x 계열
        % cd sendmail-8.9.3/BuildTools/OS
        % chmod u+w HP-UX.10.x
        
      • 8.10.x 계열
        % cd sendmail-8.10.0/devtools/OS
        % chmod u+w HP-UX.10.x
        
      vi나 emacs등의 문서 편집기로 HP-UX.10.x를 열어서 몇 가지 사항을 편집해야 한다.

      • confCC: confCC의 값이 기본적으로 cc로 되어있을 것이다. gcc를 사용하시는 분들은 gcc로 변경한다.
      • confMAPDEF: -DNDBM이 의미하는 바와 같이 시스템의 NDBM 라이브러리를 쓰도록 정의되어있는데, 우리는 Berkeley DB를 사용할 예정이므로 -DNDBM을 -DNEWDB로 변경한다.
      • confLIBS: NDBM를 쓰기 위해 -ldbm을 사용하여 라이브러리를 링크시키는데, 우리는 Berkeley DB를 사용할 예정이므로 -ldbm을 -ldb로 변경한다.

      HP-UX.10.x가 어떻게 모습을 바꾸었을지 궁금하지 않은가? 다음에 바뀐 HP-UX.10.x 파일 전문을 실어둔다. 노파심에서 말하지만 여기에 소개한 HP-UX.10.x 파일을 이름만 바꾸어 다른 운영체제에서 그대로 사용하려는 우는 범하지 말기 바란다. 각자 참조해서 config 파일을 수정하기 바란다.

      ------------ HP-UX.10.x ---------------------------------
      #       @(#)HP-UX.10.x  8.10    (Berkeley)      3/21/1998
      # HP-UX.10.x modified by Park, JaeHo(jrogue@netian.com)
      define(`confCC', `gcc -D_HPUX_SOURCE')
      define(`confMAPDEF', `-DNEWDB -DNIS -DMAP_REGEX')
      define(`confENVDEF', `-DV4FS ')
      define(`confOPTIMIZE', `-O')
      define(`confLIBS', `-ldb')
      define(`confSHELL', `/usr/bin/sh')
      define(`confSTDIR', `/etc/mail')
      define(`confHFDIR', `/usr/share/lib')
      define(`confINSTALL', `${BUILDBIN}/install.sh')
      define(`confSBINGRP', `mail')
      ------------ HP-UX.10.x ---------------------------------
      
      여기까지 잘 따라았다면 절반 정도는 환경설정을 마친 상황이다. 이제 부가적인 설정을 위한 정보가 들어있는 site.config.m4 파일을 작성해보자. site.config.m4는 반드시 sendmail-8.9.3/BuildTools/Site(8.9.x계열) 혹은 sendmail-8.10.0/devtools/Site(8.10.x 계열)에 위치해야 한다. 기본적인 패키지에는 이 파일이 포함조차 되어있지 않으므로 반드시 문서 편집기를 사용하여 새롭게 생성해야 한다.

      성질이 급하신 분들을 위해 일단 예제부터 살펴보자.

      ------------ site.config.m4 ---------------------------------
      # site.config.m4 written by Park, JaeHo(jrogue@netian.com)
      # Copyright (C) 1999 by Park, JaeHo
      APPENDDEF(`confINCDIRS', `-I/usr/local/BerkeleyDB/include')
      APPENDDEF(`confLIBDIRS', `-L/usr/local/BerkeleyDB/lib')
      ------------ site.config.m4 ---------------------------------
      
      M4 패키지에서 APPENDDEF라는 명령은 해당 매크로 확장 뒷부분에 새로운 문자열을 추가시키는 작용을 한다. 앞서 살펴본 HP-UX.10.x에 빠진 매크로 정의(Berkeley DB 인클루드 파일과 라이브러리 파일 경로지정)를 site.config.m4에서 처리할 수 있는 것이다. Makefile을 직접 수정할 수도 있지만 나중에 새로 Makefile이 생성되면서 변동 사항이 날아갈 가능성도 있으므로 위험 천만.

      Berkeley DB를 설치하지 않고 컴파일만 해둔 경우라면 /usr/local/BerkeleyDB/include, /usr/local/BerkeleyDB/lib 디렉토리를 다음과 같이 db-2.7.5가 설치되어있는 db-2.7.5/dist 디렉토리로 바꾸어서 정의하면 된다. 단, /home/ftp 경로는 각자 환경에 맞추어 변경하기 바란다.

      ------------ site.config.m4 ---------------------------------
      # site.config.m4 written by Park, JaeHo(jrogue@netian.com)
      # Copyright (C) 1999 by Park, JaeHo
      APPENDDEF(`confINCDIRS', `-I/home/ftp/db-2.7.5/dist')
      APPENDDEF(`confLIBDIRS', `-L/home/ftp/db-2.7.5/dist')
      ------------ site.config.m4 ---------------------------------
      
      M4 매크로 패키지로 config 파일을 작성할 경우 특히 저지르기 쉬운 실수는 '와 `를 섞어쓰는 것이다. 아무쪼록 예제를 잘 참조하여 눈 크게 뜨고 `와 '를 분명하게 구분하여 사용하기 바란다.

      컴파일을 위한 환경설정이 다 끝났으므로 이제 다음과 같은 방식으로 sendmail과 makemap을 컴파일하자.

      • 8.9.x 계열
        % cd sendmail-8.9.3/src
        % sh ./Build
        % cd sendmail-8.9.3/makemap
        % sh ./Build
        
      • 8.10.x 계열
        % cd sendmail-8.10.0/
        % sh ./Build
        
      Build는 보른 쉘 스크립트로서 m4를 사용하여 앞서 작성한 config 파일을 가지고 Makefile을 생성시키는 동시에 make 명령을 자동으로 수행하여 실행 파일을 만드는 역할을 한다. 컴파일이 완료되면 sendmail-8.9.3/src/obj.HP-UX.10.01.8xx(8.9.x 계열), sendmail-8.9.3/makemap/obj.HP-UX.10.01.8xx 디렉토리에 각종 목적 파일과 실행파일이 있을 것이다. HP-UX.10.01.8xx 부분은 하드웨어 및 운영체제 환경에 따라 얼마든지 달라질 수 있다. 8.9.x 계열과는 달리 8.10.x 계열은 sendmail과 makemap을 포함한 모든 실행 파일이 sendmail-8.10.0/obj.HP-UX.10.01.8xx/ 아래의 sendmail과 makemap 디렉토리로 들어가므로 makemap등을 위해 별도로 디렉토리를 옮겨 컴파일할 필요가 없다. 사용자의 편의를 위해 개선된 사항 중의 하나이다.

    sendmail의 환경 설정 및 설치

    sendmail의 컴파일이 무사히 완료되었다면 이제 sendmail 환경을 잡는 동시에 설치까지 완료해보자. 여기서부터는 정신을 바짝차리지 않으면 예기치 못한 문제가 사방에서 터져나올 가능성이 있다. 다음에 소개하는 절차를 순서대로 밟기 바란다.

    1. sendmail.cf 작성:
      sendmail의 꽃은 뭐니뭐니해도 sendmail.cf이다. 예전에는 sendmail.cf를 수작업으로 일일이 작성하는 엄청난 작업을 했었지만, 요즘에는 기술이 발달한 만큼 특수한 일을 하지 않는다고 가정하면 몇 가지 수정만으로 가볍게 sendmail.cf를 작성할 수 있다. 하지만 만일 당신이 특수한 일을 하려고 굳게 마음먹었다면 기본적인 내용이 담긴 본 문서 대신 sendmail 패키지에 포함된 문서를 살펴보기 바란다.

      sendmail.cf를 작성하기 위해 기본적으로 손을 대어야 하는 파일은 sendmail-8.9.3/cf/cf(8.9.x 계열) 혹은 sendmail-8.10.0/cf/cf(8.10.x 계열) 디렉토리 내에 들어있다. 앞서 컴파일에 필요한 환경 설정시에 운영체제별로 나열된 config 파일을 적당히 수정하는 일과 마찬가지로 sendmail.cf를 만들기 위해서는 sendmail-8.9.3/cf/cf(8.9.x 계열) 혹은 sendmail-8.10.x/cf/cf(8.10.x 계열) 디렉토리 내부의 운영체제에 맞는 파일을 찾아서 적당히 수정해야 한다.

      sendmail-8.9.3/cf/cf(8.9.x 계열) 혹은 sendmail-8.10.x/cf/cf(8.10.x 계열) 디렉토리 내부를 살펴보면 generic- 접두어로 시작하는 확장자가 mc로 끝나는 config 파일 (예: generic-hpux10.mc)들이 보일 것이다. 운영체제에 맞는 녀석이 존재하는지 확인하고 만일 없다면(예: linux), 유감스럽지만 새로 하나 만들어야 한다. 지원되는 운영체제에 비해 config 파일이 많이 빠져있으므로, config 파일을 직접 만들 수 있는 방법을 제시하겠다.

      linux 사용자와 같이 config 파일이 존재하지 않는 사용자라면 다음 방법을 적용해본다. config 파일이 존재하는 사용자라면 설명은 건너뛰도록 한다.

      1. 임의의 config 파일을 복사하여 새로운 이름으로 config 파일을 생성한다. 수정을 위해 미리 쓰기 권한을 부여해둔다.
        % cp generic-hpux10.mc generic-linux.mc
        % chmod u+w generic-linux.mc
        
      2. 새로 만든 config 파일을 열어서 VERSIONID와 OSTYPE 매크로 정의 부분을 환경에 맞추어 수정한다. VERSIONID에는 원래 config 파일의 이름 대신 새로 부여한 이름을 기록하며, OSTYPE에는 sendmail-8.9.3/cf/ostype/(8.9.x 계열인 경우), 혹은 sendmail-8.10.0/cf/ostype/(8.10.x 계열인 경우) 디렉토리 아래에서 자신의 운영체제에 맞는 파일을 찾아내어 확장자인 m4를 떼어버리고 원래 운영체제 식별자 대신 기록한다. 백문이 불여일견이라고 linux 사용자들이 쓸 수 있는 config 파일 예제를 제시하겠다.
        --------------- generic-linux.mc --------------------------------
        divert(-1)
        # generic-linux.mc written by Park, JaeHo(jrogue@netian.com)
        # Copyright (C) 1999 by Park, JaeHo
        divert(0)dnl
        VERSIONID(`@(#)generic-linux.mc        8.8 (Berkeley) 5/19/1998')
        OSTYPE(linux)dnl
        DOMAIN(generic)dnl
        MAILER(local)dnl
        MAILER(smtp)dnl
        --------------- generic-linux.mc --------------------------------
        
      자신에 맞는 generic config 파일을 작성했다면 이제 3rd party relay attack(이후 상세히 설명한다.)을 방어하기 위해 다음 한줄을 config 파일(예: generic-hpux10.mc)의 가장 마지막 줄에 추가시켜보자. config 파일의 쓰기 권한을 주는 일을 잊지말도록 한다.
      -------------- 가장 마지막 줄에 추가 -------------------
      FEATURE(access_db, `hash -o /etc/mail/access')dnl
      -------------- 가장 마지막 줄에 추가 -------------------
      
      만일 access.db를 사용하지 않고 단순한 3rd party relay control 기법인 relay-domains를 사용할 경우에는 다음 두가지 FEATURE를 사용하면 된다.
      -------------- 가장 마지막 줄에 추가 -------------------
      FEATURE(relay_hosts_only)
      -------------- 가장 마지막 줄에 추가 -------------------
      
      -------------- 가장 마지막 줄에 추가 -------------------
      FEATURE(relay_entire_domain)
      -------------- 가장 마지막 줄에 추가 -------------------
      
      relay_hosts_only는 /etc/mail/relay-domains에 적힌 각 호스트에 대해 relay를 허용할 수 있도록 만드는 FEATURE이다. 그리고 relay_entire_domain은 /etc/mail/relay-domains에 적힌 domain에 대해 relay를 허용할 수 있도록 만드는 FEATURE이다. 이제 두 가지 FEATURE의 차이점(host.domain.com vs domain.com)을 알겠는가?

      뒤에서도 설명하겠지만 access.db가 훨씬 세련된 control을 허용하므로 귀찮더라도 relay-domains 대신 access.db를 사용하기를 권한다.

      마지막으로 sendmail.cf를 만드는 일만 남았다. 다음과 같이 GNU m4 패키지를 사용하여 sendmail.cf를 생성시키자.

      • 8.9.x 계열
        
        % cd sendmail-8.9.3/cf/cf
        % /usr/local/bin/m4 ../m4/cf.m4 generic-hpux10.mc > sendmail.cf
        
      • 8.10.x 계열
        % cd sendmail-8.10.0/cf/cf
        % /usr/local/bin/m4 ../m4/cf.m4 generic-hpux10.mc > sendmail.cf
        
      너무 싱겁게 끝이 났는가? 여기서 다룬 내용은 그야말로 빙산의 일각에 불과하므로 익숙해짐에 따라서 다른 문서를 참조하여 여러 가지 설정을 시도해보기 바란다.

      주의: Solaris 7 운영체제에는 기본적으로 sendmail 8.9.3이 따라온다. 하지만 같이 포함되어있는 sendmail.cf를 보면 relay등에 대한 대응책이 미비함을 알 수 있다. 조금만 신경써서 새로 강화된 sendmail.cf를 만들어 사용하기 바란다.

    2. sendmail 설치:
      이제 sendmail, makemap, sendmail.cf, aliases, aliases.db, accesses, access.db등의 sendmail 가족을 설치하자. sendmail 8.9.x/8.10.x 버전은 예전 8.8.x 버전 보다 훨씬 까탈스러워졌으므로 파일이나 디렉토리 접근허가가 잘못 설정되어있으면 아에 동작을 안하는 경우가 발생할 수 있으므로 주의 깊게 파일 위치와 접근허가를 살펴보도록 한다.

      • sendmail 설치:
        sendmail을 설치하기 이전에 만일의 사태에 대비하여 예전의 sendmail을 백업받아두기 바란다. sendmail 위치는 시스템에 따라 달라지지만, /usr/sbin/ 이나, /usr/lib/ 디렉토리 아래에 찾아보면 존재할 것이므로 이를 sendmail.org 등의 이름으로 바꾼다.

        컴파일 후 sendmail이 컴파일된 디렉토리에서 make install이라고 입력하면 설치가 진행된다. 디렉토리 위치는 sendmail 8.9.x는 sendmail-8.9.3/src/obj.HP-UX.10.01.8xx를 따르며, sendmail 8.10.x는 sendmail-8.10.0/obj.HP-UX.10.01.8xx/sendmail를 따르므로 해당 디렉토리로 이동한 다음 설치 명령을 내린다. 원래 시스템에 존재하는 sendmail이 설치된 디렉토리로 정확하게 sendmail을 복사하기 위해(다른 디렉토리에 설치될 경우 rc 시작 스크립트를 뜯어 고쳐야 하는 문제점이 생긴다.) Makefile을 열어 BINDIR 값을 확인하는 습관을 기르자.

        이상의 설명을 그대로 옮기면 다음과 같이 될 것이다.

        % su -
        Password:******
        # which sendmail
        no sendmail in /usr/local/bin /bin /usr/bin ...
        # cd /
        # find . -name sendmail
        ./sbin/init.d/sendmail
        ./usr/sbin/sendmail		
        ./usr/lib/sendmail		# <-- 이게 원본 sendmail이라고 가정
        # mv /usr/lib/sendmail /usr/lib/sendmail.org
        # cd sendmail-8.9.3/src/obj.HP-UX.10.01.8xx		# 8.9.3
        # cd sendmail-8.10.0/obj.HP-UX.10.01.8xx/sendmail	# 8.10.0
        # make install
        
      • makemap 복사:
        makemap은 3rd party relay 허용이나 spammer 리스트를 file hash table에 저장하기 위해 제공되는 유틸리티이다. 8.9.x 계열은 sendmail-8.9.3/makemap/obj.HP-UX.10.01.8xx/ 디렉토리 아래에서 8.10.x 계열은 sendmail-8.10.0/obj.HP-UX.10.01.8xx/makemap/ 디렉토리 아래에서 make install 명령으로, sendmail 경우와 유사한 방식으로 설치하면 된다.
        % su -
        Password:******
        # cd sendmail-8.9.3/makemap/obj.HP-UX.10.01.8xx		# 8.9.3
        # cd sendmail-8.10.0/obj.HP-UX.10.01.8xx/makemap	# 8.10.0
        # make install
        
      • sendmail.cf 복사:
        만일의 사태에 대비하여 기존 sendmail.cf를 보존한 다음(sendmail.cf가 존재하는 디렉토리를 미리 찾아두기 바란다.), 앞서 만든 sendmail.cf를 /etc/mail/ 디렉토리 아래로 복사하고, 관리 편의성을 위해 /etc/ 아래에 심볼 링크를 하나 만들어둔다.
        % su -
        Password:******
        # mv /etc/mail/sendmail.cf /etc/mail/sendmail.cf.org
        # cp sendmail-8.9.3/cf/cf/sendmail.cf /etc/mail/
        # ln -s /etc/mail/sendmail.cf /etc/sendmail.cf
        
        
      • sendmail.cw 생성:
        sendmail.cw(8.10.x에서는 local-host-names)가 없으면 generic config 파일에서 기본적으로 생성한 sendmail.cf를 사용하는 sendmail이 제대로 동작하지 않을 수가 있다. 하지만 대부분의 사용자는 sendmail.cw(혹은 local-host-names)가 필요하지 않으므로 이럴 경우에는 다음과 같은 편법을 사용하여 sendmail을 속인다. aliases, accesses 경우도 마찬가지이므로 필요없는 분들은 0byte짜리 빈 파일을 생성시켜서 그대로 놓아둔다.

        • 8.9.x 계열
          # cd /etc/mail
          # touch sendmail.cw
          # cd ..
          # ln -s mail/sendmail.cw .
          
        • 8.10.x 계열
          # cd /etc/mail
          # touch local-host-names
          # cd ..
          # ln -s mail/local-host-names .
          
        하지만 만일 호스트 이름이 하나 이상이 아닐 경우(웹 호스팅이나 기타의 사정으로 얼마든지 복수의 이름을 가져야할 필요도 있을 것이다.) sendmail.cw(local-host-names)에 호스트 이름을 한줄에 하나씩 domain 이름까지 붙여서 여기에 기술해두도록 한다. 그렇지 않으면 호스트 이름에 따라 편지가 배달되고 배달되지 않고 하는 상황에 직면할 수 있다.

      • aliases 및 aliases.db 생성:
        aliases 파일은 간단한 mailing list 제작이나 특정 계정으로 들어오는 편지를 여러 사람에게 전달하거나 사정에 의해서 존재하지 않는 계정으로 들어오는 편지를 존재하는 계정을 가진 사람에게 전달할 경우에 필요한 규칙을 담고 있다.

        파일을 일일이 뒤져서 규칙을 찾을 수도 있지만, sendmail에서는 속력을 올리기 위해 Berkeley DB등 각종 패키지를 사용하여 aliases 파일에 담겨진 내용을 aliases.db라고 불리우는 파일 hash table에 저장을 해둔다.

        alias 기능이 제대로 동작하는지 검사하기 위해(aliases가 제대로 설정되어있지 않으면 sendmail이 전혀 동작하지 않는다는 점을 기억하라.) 간단한 aliases 파일을 생성시키고 aliases.db를 만들어보자. 먼저 기존에 존재하는 aliases 파일을 백업받아둔 후 편집기로 aliases를 /etc/mail 디렉토리에 새롭게 생성시킨다. aliases 예는 다음과 같다.

        ----------------- aliases ----------------------------------
        # aliases written by Park, JaeHo(jrogue@netian.com)
        # Copyright (C) 1999 by Park, JaeHo
        administrator: root
        ----------------- aliases ----------------------------------
        
        위 예제는 (실제 존재하지 않는) administrator 계정으로 들어오는 편지를 root 계정으로 전달하는 간단한 규칙을 담고 있다. 하지만 aliases만 덩그러니 있어서는 아무 일도 안된다. sendmail이 alias 검색을 위해 사용하는 aliases.db를 생성시키도록 하자.
        # cd /etc/mail/
        # touch aliases.db
        # chmod 644 aliases.db
        # sendmail -bi
        
        touch 명령어는 0 bytes짜리 파일을 만들어내는 명령이다. sendmail -bi 명령어는 aliases 파일에 있는 규칙을 aliases.db에 file hash table 형식으로 저장하는 명령이다. touch 명령을 사용하는 이유는 sendmail -bi 명령이 aliases.db를 초기에 생성시키는 데 실패할 경우를 피하기 위해서이다.

        sendmail -bi 명령이 제대로 동작했다면 다음과 같은 메세지가 나올 것이다. 숫자는 약간씩 틀릴 수 있지만 형식은 동일하게 나와야 한다.

        /etc/mail/aliases: 1 aliases, longest 4 bytes, 17 bytes total
        
        sendmail의 alias에 재미를 들인 관리자가 간단한 메일링 리스트 운영을 위해 alias를 파일로 관리할 필요가 있다면 다음 예를 참조하기 바란다.
        ----------------- aliases ----------------------------------
        # aliases written by Park, JaeHo(jrogue@netian.com)
        # Copyright (C) 1999 by Park, JaeHo
        administrator: root
        sendmail-news: :include:/etc/mail/MailLists/sendmail-news.list
        ----------------- aliases ----------------------------------
        
        sendmail-news는 alias 이름이고 /etc/mail/MailLists/sendmail-news.list는 sendmail-news에 수신인 전자편지 주소가 한줄에 하나씩 기입된 파일이다. sendmail-news alias를 aliases 파일에 추가할 경우와는 달리 sendmail-news.list에 있는 구성원을 추가하거나 삭제할 경우에는 sendmail -bi 명령을 내릴 필요가 없음에 유의하자.

      • relay-domains 설정:
        relay-domains 파일은 가장 단순하게(quick & dirty) relay를 제어하고 싶을 경우 사용하는 파일이다. 만일 당신이 access.db를 사용하여 본격적인 relay 컨트롤을 수행할 계획이라면 relay-domains는 설정할 필요가 전혀 없다. access.db를 사용하는 방법은 바로 다음에 나오므로 참고하기 바란다.

        /etc/mail/relay-domains 파일에 relay를 원하는 domain 혹은 host를 한줄에 하나씩 적어준 다음 sendmail을 재시동하면 relay-domains에 포함된 domain 혹은 host에 대해서 relay를 허용하게 된다. host 혹은 domain 단위로 설정하는 방법은 sendmail.cf의 relay-domains관련 FEATURE 설정 항목을 참조하기 바란다.

        만일 relay-domains 파일을 수정한 이후 sendmail을 재시동하지 않을 경우 변경된 내용은 반영되지 않음에 유의하기 바란다. FAQ 중 하나이다.

      • accesses 및 access.db 생성:
        accesses 파일은 RELAY를 허용하거나 spammer를 제한하는 목적으로 전자편지와 관련된 각종 접근 제약 사항을 정하는 규칙을 담고 있다. 3rd party relay나 spammer 퇴치에 관련된 내용은 별도 자료를 준비중이니 여기서는 기본적인 내용 이외에는 다루지 않을 생각이다.

        aliases와 마찬가지로 accesses 파일에 대한 매번 접근은 시스템 효율을 저하시키므로 file hash table을 사용하여 이런 문제를 해결한다.

        sendmail 8.9.x/8.10.x에서 3rd party relay control module을 탑재하였음에도 불구하고 accesses 파일에 relay 허용 IP 범위를 제대로 정해주지 않으면, 직전 버전 sendmail에서 잘가던 전자편지가 숫제 배달이 안될 수도 있으므로 accesses 파일을 잘 구성해두어야 한다. 간단한 accesses 파일을 생성시키고 access.db 파일을 만들어보자. 먼저 기존에 존재할지도 모르는 accesses 파일을 백업한 후 편집기로 accesses를 /etc/mail 디렉토리에 새롭게 생성시킨다. accesses 예는 다음과 같다.

        ----------------- accesses ----------------------------------
        # accesses written by Park, JaeHo(jrogue@netian.com)
        # Copyright (C) 1999 by Park, JaeHo
        www.xxx.yyy        RELAY
        devilhacker@devilhacker.com REJECT
        ----------------- accesses ----------------------------------
        
        www.xxx.yyy는 Relay를 허용할 IP 주소 범위이다. 관리하는 도메인이 두개로 쪼개어져 있지 않는한 www.xxx.yyy.zzz의 IP 형식에서 앞 세부분만 그대로 따서 쓰면 끝이다. 만일 도메인이 분리되어 있어 www.xxx.ttt도 허용하고 싶으면 다음과 같이 한줄만 더 추가하면 된다.
        ----------------- accesses ----------------------------------
        # accesses written by Park, JaeHo(jrogue@netian.com)
        # Copyright (C) 1999 by Park, JaeHo
        www.xxx.yyy        RELAY
        www.xxx.ttt        RELAY
        devilhacker@devilhacker.com REJECT
        ----------------- accesses ----------------------------------
        
        이제 www.xxx.yyy 및 www.xxx.ttt를 제외한 어떤 호스트에서도 당신이 관리하는 전자편지 서버를 경유하여 당신이 관리하는 서버가 아닌 다른 곳에 불법적으로 편지를 전송할 수 없을 것이다. 즉, 3rd party relay attack이 원천적으로 봉쇄된다는 이야기이다.

        RELAY 아래 행을 보면 전자편지 주소와 REJECT가 적혀있는데, 앞의 전자편지 주소는 spammer로 의심되는 또는 spammer 전자편지 주소이며, 뒤의 REJECT는 이 계정에서 오는 편지는 무조건 받아들이지 마라는 표식이다. spammer를 여럿 알고 있으면 relay 허용과 동일한 방법으로 한줄에 하나씩 차례로 전자편지 주소와 REJECT를 적어주면 된다. 만일 REJECT 대신 DISCARD를 적어주면 sendmail이 편지는 받아들이되 이를 조용히 /dev/null로 직행시키는 효과를 얻을 수 있다.

        만일 당신이 장난스러운 관리자라면 spammer에게 편지를 REJECT하면서 다음과 같은 특별한 메세지를 남길 수도 있다. 550은 이 바닥에서 표준화된 REJECT error code이며 I hate spammer!는 당신이 spammer에게 보내는 선물이다. 이제 조금 분풀이가 되었는가? :)

        ----------------- accesses ----------------------------------
        # accesses written by Park, JaeHo(jrogue@netian.com)
        # Copyright (C) 1999 by Park, JaeHo
        #
        devilhacker@devilhacker.com 550 I hate spammers like you!
        ----------------- accesses ----------------------------------
        

        이제 access.db를 생성시키고 makemap으로 규칙을 등록하자.

        # cd /etc/mail/
        # touch access.db
        # chmod 644 access.db
        # ./makemap hash /etc/mail/access < /etc/mail/accesses
        
        매번 makemap 명령을 입력하기 귀찮다면 다음과 같은 셸 스크립트를 하나 만들어두는 편도 좋겠다.
        --------------- do_it.sh -------------------------------------
        # do_it shell script written by Park, JaeHo(jrogue@netian.com)
        # Copyright (C) 1999 by Park, JaeHo
        #!/bin/sh
        
        /etc/mail/makemap hash /etc/mail/access < /etc/mail/accesses
        --------------- do_it.sh -------------------------------------
        
        do_it.sh를 사용하기 전에 실행 권한을 주는 것을 잊지 말기 바란다.

      • 디렉토리 접근허가 변경:
        sendmail 8.9.x/8.10.x 버전이 예전에 비해 까탈스럽다는 표현을 썼는데, 3rd party relay attack 방지 기능 강화를 비롯하여 보안쪽으로 강화된 측면이 한두가지가 아니다. sendmail의 테스트에 앞서 다음 사항을 살펴보자.

        • /etc/와 /etc/mail/ 디렉토리 이하 어떠한 자손 디렉토리에도 그룹(group) 및 기타(other) 사용자에게 쓰기 권한이 설정되어 있으면 안된다.
        • mailing list를 담고 있는 외부 파일에 그룹(group) 및 기타(other) 사용자에게 쓰기 권한이 설정되어 있으면 안된다.
        • 일반 사용자 .forward 파일에에 그룹(group)과 기타(other) 사용자에게 쓰기 권한이 설정되어 있으면 안된다.
        • /etc, /etc/mail, /usr, /var, /var/spool, /var/spool/mqueue 디렉토리의 소유주는 root이어야 한다.

        이상의 문제점을 해결하기 위해서는 다음 명령을 내려서 화근을 없애도록 한다.

        # chmod go-w / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue
        # chown root / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue
        # chmod -R go-w /etc/mail
        
        시스템 별로 spool 디렉토리의 위치는 틀려질 수 있으므로 각자 환경에 맞추어서 접근 권한을 조정해두기 바란다.

        mailing list 파일들도 마찬가지 방법을 적용하여 그룹과 기타 사용자의 쓰기 권한을 제거하기 바란다. 개인 사용자 .forward 파일에 쓰기 권한을 수정하기 위해서는 몇가지 트릭이 필요한데, 이는 find(1)의 매뉴얼 페이지를 참조하기 바란다.

        sendmail 디렉토리 관련 접근허가 테스트를 위해서는

        % su -
        Password:******
        # sendmail -v -bi
        
        명령을 내려보자. 경고문구가 나오면 해당 디렉토리 접근허가와 소유주를 변경하여 보안을 강화하도록 조치를 취해야 한다.

    3. sendmail 시동:
      sendmail 가족들이 모두 제자리를 잡았다면 이제 sendmail daemon을 동작시켜보자. 원래 돌고 있던 sendmail daemon을 잠시 내린 다음 새로운 sendmail daemon을 올리도록 하자. -bd는 background daemon의 약어이고 -q는 mail queue를 처리하는 인터벌(단위: h--> 시, m --> 분, s --> 초)이다.
      
      % su -
      Password:******
      # ps -ef | grep sendmail
         root  1503     1  0  7월 26  ?         0:16 sendmail: accepting connections
      on port 25
      # kill -9 1503
      # /usr/lib/sendmail -bd -q30m
      # ps -ef | grep sendmail
         root  1809     1  0  7월 29  ?         0:16 sendmail: accepting connections
      on port 25
      
      화면에 특별한 메시지가 나타나지 않는다면 daemon이 성공리에 동작한 것이다. ps 명령으로 다시 한번 sendmail daemon이 동작하고 있는지 확인해보기 바란다.

    sendmail의 테스트 방법

    지금까지 sendmail 설치를 위해 머나먼 길을 달려왔다. 이제 sendmail을 테스트해보는 작업이 남아있다.
    1. sendmail daemon 확인:
      먼저 sendmail daemon이 정상적으로 연결을 허용하고 있는지 살펴보아야 한다. 호스트 이름이 localhost라고 가정할때 다음과 같은 방법으로 smtp 포트를 열어보자.
      % telnet localhost smtp
      Trying 127.0.0.1
      Connected to localhost
      Escape character is '^]'.
      220 localhost ESMTP Sendmail 8.9.3/8.9.3; Tue, 27 Jul 1999 17:05:09 +1000 (KDT)
      
      위 시나리오와 같이 sendmail banner가 나오면 정상적으로 sendmail daemon이 동작하고 있는 것이다.

    2. sendmail 발송 확인:
      sendmail 선택 사양 중에 -v가 있다. v는 verbose를 의미하며 편지 발송중에 일어나는 각종 활동 사항을 화면에 표시해준다. localhost에 yourid 계정이 존재한다고 가정할때 다음과 같은 방법으로 편지가 제대로 발송되는지 확인할 수 있다.
      % /usr/lib/sendmail -v yourid
      test
      .
      yourid... Connecting to local...
      yourid... Sent
      
    3. sendmail 수신 확인:
      mail, pine, mutt등을 사용하여 localhost의 yourid 계정에서 직접 수신된 편지를 확인해본다. 만일 편지가 수신된지 않을 경우 송신 계정에서 mail, pine, mutt등을 사용하여 반송된 편지가 없는지 확인한다. 반송된 편지 헤더에는 여러 가지 중요한 자료가 담겨있으므로 무엇이 잘못되었는지 분석할 수 있다.

    4. 외부에서 송수신 확인:
      내부에서 편지를 주고받을 수 있으면 이제 외부 호스트와 localhost의 yourid 계정 사이에 편지를 주고받아 송수신이 가능한지 살펴본다.

    5. Relay 확인:
      내부 PC에서 sendmail 호스트를 localhost로 잡아두고 전자편지를 발송하여 제대로 전달되는지 살펴본다.

    전자편지와 관하여 발생하는 오류는 워낙 종류가 다양하고 구동되는 환경이 다르기 때문에 일반화된 해결책을 제시하기는 상당히 어렵다. 그렇다고 미리 포기하기는 이르다. sendmail은 syslogd를 사용하여 syslog를 남기므로 반송된 전자편지 헤더를 분석하는 작업과 더불어 log 파일을 분석하는 작업이 문제 해결에 많은 도움을 줄 수 있다.

    Trouble Shooting

    독자 여러분이 주시는 반응을 보아 자주 들어오는 질문에 대해 해결방안을 제시할 예정이다.
    1. Berkely DB를 설치할 경우 gcc를 찾지 못한다:
      % env CC=gcc
      
      명령을 내려 C 컴파일러를 gcc로 설정한다.
    2. sendmail을 debugging option을 주어 동작시키는 법: sendmail이 내부적으로 어떤 조절 파일과 rule set를 사용하여 전자편지 발송을 수행하는지 알고 싶다면 다음과 같은 명령을 내려본다.
      % /usr/lib/sendmail -d
      
      뭔가 화면 가득히 나타날 것인데 그 중에서 각별히 신경써야 하는 부분은 첫부분에 출력되는 메세지이다.
      Version 8.9.3
       Compiled with: MAP_REGEX LOG MATCHGECOS MIME7TO8 MIME8TO7 NAMED_BIND
                      NETINET NETUNIX NEWDB NIS QUEUE SCANF SMTP USERDB XDEBUG
      setoption SevenBitInput (7).=False
      setoption EightBitMode (8).=pass8
      setoption AliasWait (a).=10
      setoption AliasFile (A).=/etc/mail/aliases
      setoption MinFreeBlocks (b).=100
      setoption BlankSub (B).=.
      setoption HoldExpensive (c).=False
      setoption DeliveryMode (d).=background
      setoption TempFileMode (F).=0600
      setoption HelpFile (H).=/usr/share/lib/sendmail.hf
      setoption SendMimeErrors (j).=True
      setoption ForwardPath (J).=$z/.forward.$w+$h:$z/.forward+$h:$z/.forward.$w:$z/.d
      setoption ConnectionCacheSize (k).=2
      setoption ConnectionCacheTimeout (K).=5m
      setoption UseErrorsTo (l).=False
      setoption LogLevel (L).=9
      setoption CheckAliases (n).=False
      setoption OldStyleHeaders (o).=True
      setoption PrivacyOptions (p).=authwarnings
      setoption QueueDirectory (Q).=/var/spool/mqueue
      setoption Timeout (r).queuereturn=5d
      setoption Timeout (r).queuewarn=4h
      setoption SuperSafe (s).=True
      setoption StatusFile (S).=/etc/mail/sendmail.st
      setoption TimeZoneSpec (t).=
      setoption SmtpGreetingMessage (0x90).=$j Sendmail $v/$Z; $b
      setoption UnixFromLine (0x91).=From $g  $d
      setoption OperatorChars (0x92).=.:%@!^/[]+
      drop_privileges(0): Real[UG]id=259:20, RunAs[UG]id=0:0
      getauthinfo: jhpark@localhost
      
      ============ SYSTEM IDENTITY (after readcf) ============
            (short domain name) $w = sky
        (canonical domain name) $j = kies.co.kr
               (subdomain name) $m = kies.co.kr
                    (node name) $k = sky
      ========================================================
      
      메세지를 보면 알 수 있듯이, sendmail 버전과 컴파일된 모듈 종류와, 어떤 option을 사용하여 어떤 환경 파일로 동작하는지 일목요연하게 나타난다. sendmail 설정이 제대로 되지 않았다고 의심이 갈 경우 이상의 메세지를 분석해보면 문제의 원인을 의외로 쉽게 찾아낼 수도 있으므로, 요긴하게 사용하기 바란다.
    3. queue에 쌓여있는 메세지 보는 법: sendmail이 현재 처리 중인 메세지 목록을 보기 위해서 다음과 같은 명령어를 내릴 수 있다. 문제가 발생한 전자편지 목록을 확인할 수 있으므로 관리에 조금이나마 도움이 될 것이다.
      % su -
      Password:******
      # /usr/lib/sendmail -bp
                      Mail Queue (5 requests)
      --Q-ID-- --Size-- -----Q-Time----- ------------Sender/Recipient------------
      OAA28715       42 Tue Mar 28 14:19 
      
                       (Deferred: Connection timed out with www.bar.co.kr.)
                                         
      OAA28415       45 Tue Mar 28 14:10 
                       (Deferred: Connection refused by thereis.com)
                                         
      KAA23198       41 Tue Mar 28 10:02 
                       (Deferred: Connection refused by thereis.com)
                                         
      
      JAA10254       41 Fri Mar 24 09:14 
                       (Deferred: Connection refused by thereis.com)
                                         
      QAA01802       46 Thu Mar 23 16:05 
                       (Deferred: Connection refused by nothing.co.kr.)
                                         
      

    기타

    • 이 문서의 저작권과 라이선스 방식은 삼바 설치와 활용 가이드에 준한다.
    • 의문 사항이 생길 경우 전자편지를 사용하여 질문하면 feedback을 받을 수 있을 것이다.
      커피닉스 카페 최근 글
    [08/25] #gpt_question_subje
    [08/20] From what I've seen
    [08/14] сайт
    [06/16] [질문]SAN 스위치 브로드케이드 dcx8510-4 장비관련입니다.
    [04/22] Re: 영화속에 컴퓨터 이야기 ~스워드피쉬(2001)
    [10/20] Cross Compiler 깔
    [07/14] SSL АО
    [04/26] Re: 도스화면 원격조종 여부
    [04/25] 도스화면 원격조종 여부
    [10/30] Cshell에서 난수 설정
    [10/23] 공항철도주식회사 SE 구인 件
    [01/26] Re: wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/25] wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/11] 특정 안드로이드 WebView 버전에서 SSL 문제 (WebView 버그)
    [08/01] DNS forwarder (전달자) 서버를 통해서 쿼리하면 역방향을 받아오질 못합니다.
      New!   최근에 등록한 페이지
      KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
      오픈캐스케이드 캐드 (OpenCASCADE CAD)
      QCad for Windows --- GNU GPL (Free Software)
      The Hello World Collection
      IPMI를 활용한 리눅스 서버관리
      DNS 설정 검사
      nagiosgraph 설치 방법
      Slony-I 설치 방법 (postgresql replication tool)
      Qmail기반의 Anti spam 시스템 구축하기
      clusterssh

    [ 함께하는 사이트 ]




    운영진 : 좋은진호(truefeel), 야수(yasu), 범냉이, sCag
    2003년 8월 4일~