Sendmail + SSL + SASL, QPopper - 윈디하나의 솔라나라

목차

개요

설치

필요 라이브러리

  1. Berkeley DB

    윈디하나의 솔라나라: BerkeleyDB 참조
  2. OpenSSL

    윈디하나의 솔라나라: OpenSSL 참조
  3. Cyrus SASL

    root@wl ~ # wget ftp://ftp.cyrusimap.org/cyrus-sasl/cyrus-sasl-2.1.26.tar.gz
    root@wl ~ # tar xvfz cyrus-sasl-2.1.26.tar.gz
    root@wl ~ # cd cyrus-sasl-2.1.26
    root@wl ~/cyrus-sasl-2.1.26 # ./configure \
      --enable-login \
      --with-pwcheck \
      --disable-digest \
      --disable-srp \
      --disable-krb4 \
      --disable-gssapi \
      --disable-anon \
      CFLAGS="-m64"
    root@wl ~/cyrus-sasl-2.1.26 # vi ./lib/saslutil.c
    //extern int gethostname(char *, int); 
    root@wl ~/cyrus-sasl-2.1.26 # make
    root@wl ~/cyrus-sasl-2.1.26 # make install
    root@wl ~/cyrus-sasl-2.1.26 # ln -s /usr/local/lib/sasl2 /usr/lib/sasl2 1)
    root@wl ~/cyrus-sasl-2.1.26 # mkdir -p /var/state/saslauthd 2)
    root@wl ~/cyrus-sasl-2.1.26 # vi /usr/local/lib/sasl2/Sendmail.conf
    pwcheck_method: saslauthd
    root@wl ~/cyrus-sasl-2.1.26 # /usr/local/sbin/saslauthd -v 3)
    saslauthd 2.1.21
    authentication mechanisms: getpwent pam rimap shadow
    root@wl ~/cyrus-sasl-2.1.26 # /usr/local/sbin/saslauthd -a pam 4)
    root@wl ~/cyrus-sasl-2.1.26 # vi /etc/init.d/saslauthd 5)
    #!/bin/sh
    case "$1" in
      start)
            /usr/local/sbin/saslauthd -a pam
            ;;
      stop)
            pkill saslauthd
            ;;
      *)
            echo "Usage: saslauthd {start|stop}"
            exit 1
    esac
    exit 0
    root@wl ~/cyrus-sasl-2.1.26 # chmod 744 /etc/init.d/saslauthd
    root@wl ~/cyrus-sasl-2.1.26 # ln -s /etc/init.d/saslauthd /etc/rc2.d/S87saslauthd
    root@wl ~/cyrus-sasl-2.1.26 # ln -s /etc/init.d/saslauthd /etc/rc0.d/K37saslauthd
    root@wl ~/cyrus-sasl-2.1.26 # ln -s /etc/init.d/saslauthd /etc/rc1.d/K37saslauthd
    root@wl ~/cyrus-sasl-2.1.26 # ln -s /etc/init.d/saslauthd /etc/rcS.d/K37saslauthd
    
    1) 간혹 sasl2라이브러리를 /usr/lib/sasl2에서 찾는 프로그램이 있다. 이를 위해 심볼릭 링크를 걸어주었다.
    2) SASL2부터 shadow를 지원하지 않는다. saslauthd 데몬을 이용해 인증해야 한다.
    3) saslauthd이 이용할 수 있는 인증 메카니즘을 확인한다. pam이 반드시 있어야 한다.
    4) pam방식의 인증을 사용할 수 있도록 데몬을 띄운다. SMTP AUTH할때 반드시 이 데몬이 띄워져 있어야 한다.
    5) 서버 재시작시 자동으로 실행되도록 스크립트를 작성한다.

SENDMAIL

  1. sendmail 설치

    솔라리스에 설치되어있는 Sendmail을 삭제
    root@wl ~ # svcadm disable sendmail 1)
    root@wl ~ # pkgrm SUNWsndmu 1)
    root@wl ~ # pkgrm SUNWsndmr 1)
    
    계정 생성확인 2)
    root@wl ~ # cat /etc/group | grep smmsp
    smmsp::25:
    root@wl ~ # cat /etc/passwd | grep smmsp
    smmsp:x:25:25:SendMail Message Submission Program:/:
    
    설치
    root@wl ~/src # wget ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.15.2.tar.gz
    root@wl ~/src # tar xvfz sendmail.8.15.2.tar.gz
    root@wl ~/src # cd sendmail-8.15.2
    root@wl ~/src/sendmail-8.15.2 # cp ./devtools/Site/site.config.m4.sample ./devtools/Site/site.config.m4
    root@wl ~/src/sendmail-8.15.2 # vi ./devtools/Site/site.config.m4 3)
    ...
    dnl ### C compiler settings
    
    APPENDDEF(`confENVDEF', `-m64')
    APPENDDEF(`confLIBS', `-m64')
    
    dnl APPENDDEF(`confMAPDEF', `-DNIS')
    dnl APPENDDEF(`confMAPDEF', `-DNISPLUS')
    
    dnl ### makemap
    APPENDDEF(`confMAPDEF', `-DNEWDB') 
    APPENDDEF(`confLIBDIRS', `-L/usr/local/db/lib -R/usr/local/db/lib')
    APPENDDEF(`confINCDIRS', `-I/usr/local/db/include')
    
    dnl ### SASLv2 Support
    APPENDDEF(`confENVDEF', `-DSASL=2')
    APPENDDEF(`conf_sendmail_LIBS', `-lsasl2')
    APPENDDEF(`confLIBDIRS', `-L/usr/local/lib/sasl2 -R/usr/local/lib/sasl2')
    APPENDDEF(`confINCDIRS', `-I/usr/local/include/sasl')
    
    dnl ### LDAP Support for Solaris
    APPENDDEF(`confMAPDEF', `-DLDAPMAP')
    APPENDDEF(`confENVDEF', `-DSM_CONF_LDAP_MEMFREE')
    APPENDDEF(`confLIBS', `-lldap')
    root@wl ~/sendmail-8.15.2 # wget https://bugzilla.redhat.com/attachment.cgi?id=1226889
    root@wl ~/sendmail-8.15.2 # patch -p0 < sendmail-8.15.2-openssl11.patch
    ...
    File to patch: ./sendmail/tls.c
    ...
    root@wl ~/sendmail-8.15.2 # ./Build 4)
    root@wl ~/sendmail-8.15.2 # mkdir /usr/share/man/cat1; mkdir /usr/share/man/cat5; mkdir /usr/share/man/cat8 5)
    root@wl ~/sendmail-8.15.2 # ./Build -E DESTDIR=/usr/local/sendmail install
    root@wl ~/sendmail-8.15.2 # cp obj.`uname -s`.`uname -r`.`uname -i`/mail.local/mail.local /usr/lib 6)
    root@wl ~/sendmail-8.15.2 # ln -s /usr/local/lib/libsasl2.so.2 /usr/lib/libsasl2.so.2 7)
    root@wl ~/sendmail-8.15.2 # ln -s /usr/local/ssl/lib/libssl.so.1.0.0 /usr/lib/libssl.so.1.0.0
    root@wl ~/sendmail-8.15.2 # ln -s /usr/local/ssl/lib/libcrypto.so.1.0.0 /usr/lib/libcrypto.so.1.0.0
    root@wl ~/sendmail-8.15.2 # /usr/lib/sendmail -d0 < /dev/null 8)
    Version 8.15.2
     Compiled with: DNSMAP IPV6_FULL LDAPMAP LOG MAP_REGEX MATCHGECOS MILTER
                    MIME7TO8 MIME8TO7 NAMED_BIND NDBM NETINET NETINET6 NETUNIX
                    NEWDB PIPELINING SASLv2 SCANF STARTTLS USERDB USE_LDAP_INIT
                    XDEBUG
    
    ============ SYSTEM IDENTITY (after readcf) ============
          (short domain name) $w = wl
      (canonical domain name) $j = wl.local.
             (subdomain name) $m = local.
                  (node name) $k = wl
    ========================================================
    
    Recipient names must be specified
    
    1) 솔라리스에 번들된 Sendmail을 삭제한다.
    2) smmsp 계정과 그룹을 만든다. 솔라리스 9 이상의 경우 이미 생성되어있으니 할 필요없다.
    3) site.config.m4 파일을 만든다. M4에 대해서는 윈디하나의 솔라나라: M4, GNU M4를 읽어보자.
    4) 빌드 스크립트를 실행한다.
    5) 매뉴얼 파일을 복사할 곳을 미리 만들어놓는다. 매뉴얼 파일이 /usr/local/man 아래의 적당한 곳으로 가도록 Build 파일을 수정해도 된다.
    6) mail.local 파일은 복사되지 않는다. (보안문제로) 이 파일이 없으면 메일이 로컬에 저장되지 않는다. 복사해 놓는다.
    7) crle 명령을 사용해도 된다.
    8) SASLv2와 STARTTLS 문자가 보이는지 확인한다.
  2. sendmail.cf 파일 생성

    root@wl ~/src/sendmail-8.14.4 # cd ./cf/cf 1)
    root@wl ~/src/sendmail-8.14.4/cf/cf # cp generic-solaris.mc sendmail.mc 2)
    root@wl ~/src/sendmail-8.14.4/cf/cf # vi sendmail.mc 3)
    define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')dnl
    define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl
    TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl
    
    define(`CERT_DIR', `/usr/local/ssl/certs')
    define(`confCACERT', `CERT_DIR/ca.crt')
    define(`confCACERT_PATH', `CERT_DIR')
    define(`confSERVER_CERT', `CERT_DIR/signed-req.pem')
    define(`confSERVER_KEY', `CERT_DIR/req.key')
    define(`confCLIENT_CERT', `CERT_DIR/signed-req.pem')
    define(`confCLIENT_KEY', `CERT_DIR/req.key')
    
    FEATURE(dnsbl, `spamlist.or.kr',            `Rejected ($&{client_addr}) - see http://www.kisarbl.or.kr/')dnl
    
    FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl
    FEATURE(`access_db',`hash -o /etc/mail/access.db')dnl
    FEATURE(`smrsh',`/usr/lib/smrsh')dnl
    
    FEATURE(use_cw_file)dnl
    FEATURE(use_ct_file)dnl
    FEATURE(`always_add_domain')dnl
    FEATURE(`accept_unqualified_senders')dnl
    FEATURE(`accept_unresolvable_domains')dnl
    FEATURE(`relay_entire_domain')dnl
    root@wl ~/src/sendmail-8.14.4/cf/cf # ./Build sendmail.cf 4)
    root@wl ~/src/sendmail-8.14.4/cf/cf # cp /etc/mail/sendmail.cf /etc/mail/sendmail.cf.old 5)
    root@wl ~/src/sendmail-8.14.4/cf/cf # cp /etc/mail/submit.cf /etc/mail/submit.cf.old
    root@wl ~/src/sendmail-8.14.4/cf/cf # ./Build install-cf 6)
    
    1) cf 디렉토리안의 cf 디렉토리로 이동한다.
    2) 설치하려는 운영체제가 솔라리스이므로 generic-solaris.mc 파일을 sendmail.mc로 복사한다.
    3) 복사한 sendmail.mc 을 수정한다. DOMAIN(generic)dnl 아래에 위 내용을 붙이면 된다.
    4) 이 명령이 수행되면 sendmail.cfsubmit.cf가 생성될 것이다.
    5) 기존 파일이 있다면 백업받는다.
    6) 이 명령이 수행되면 sendmail.cfsubmit.cf/etc/mail로 복사될 것이다.
  3. 센드메일 설정

    root@wl /etc/mail # vi trusted-users 1)
    root
    root@wl /etc/mail # vi local-host-names 2)
    mydomain.com
    solanara.net
    root@wl /etc/mail # vi relay-domains 3)
    solanara.net
    root@wl /etc/mail # vi access 4)
    127.0.0.1 RELAY
    192.168.0 RELAY
    spam.com REJECT
    root@wl /etc/mail # makemap hash access < access
    root@wl /etc/mail # vi virtusertable 5)
    admin@solanara.net hana
    admin@solanara2.net hana2
    root@wl /etc/mail # makemap hash virtusertable < virtusertable
    root@wl /etc/mail # vi aliases 6)
    # The program "newaliases" must be run after this file is updated
    # for any changes to show through to sendmail.
    # The following alias is required by the mail protocol, RFC 2821
    # Set it to the address of a HUMAN who deals with this system's mail problems.
    postmaster: root
    
    # Alias for mailer daemon; returned messages from our MAILER-DAEMON
    # should be routed to our local Postmaster.
    MAILER-DAEMON:  postmaster
    # General redirections for pseudo accounts.
    bin:            root
    daemon:         root
    system:         root
    toor:           root
    uucp:           root
    manager:        root
    dumper:         root
    operator:       root
    decode:         root
    nobody: /dev/null
    root@wl /etc/mail # mkdir /var/spool/mqueue/ 7)
    root@wl /etc/mail # chown root:bin /var/spool/mqueue/
    root@wl /etc/mail # chmod 750 /var/spool/mqueue/
    root@wl /etc/mail # newaliases 8)
    
    1) 루트사용자를 지정한다.
    2) 메일을 받을 도메인을 모두 적어준다. SENDMAIL 동작에 있어서 기본적인 {w}클래스(SENDMAIL 문서를 보면 많이 나와있을 것이다)를 정의한다.
    3) 릴레이 도메인을 적어준다. 보통 local-host-names 과 같다.
    4) 릴레이를 허용할 호스트이름을 적어준다. 이 데몬에 접속해 메일을 보낼 클라이언트의 IP를 모두 적어주면 된다. 192.168.0 과 같이 적으면 이 IP로 시작하는 모든 클라이언트에서 릴레이 가능하다.
    5) 한대의 서버에 두개이상의 도메인을 운영할때 필요한 설정이다. 첫번째 필드와 두번째 필드는 반드시 탭으로 구분되어야 한다.
    6) 별명을 정해준다. :과 계정명 사이의 공백은 탭 문자를 사용하며, 여러개의 계정을 지정할때는 ,로 구분한다. 예) admin:[TAB]user1,user2
    6) 필요한 디렉토리를 생성한다.
    6) 별명파일을 생성한다. 이후에도 별명정보가 변경되었을 경우에 newaliases 만 실행시키면 된다. (sendmail을 재시작할 필요 없다)
  4. 시작

    root@wl /etc/mail # vi /etc/init.d/sendmail
    #!/bin/sh
    # 출처 모름. 윈디하나가 만든건 아님 ^^
    version=`echo \$Z | /usr/lib/sendmail -bt -d0 | grep Version | awk '{print $2}'`
    case "$1" in
      start)
            # Start daemons.
            echo "Starting Sendmail $version"
            # Enable the below line to set serious logging for trouble shooting
            # /usr/lib/sendmail -O LogLevel=14 -L sm-mta -bd -q1h
            /usr/lib/sendmail -L sm-mta -bd -q1h
            /usr/lib/sendmail -L sm-msp-queue -Ac -q30m
            ;;
      stop)
            # Stop daemons.
            echo "Shutting down Sendmail $version"
            kill `cat /var/run/sendmail.pid | head -1`
            kill `cat /var/spool/clientmqueue/sm-client.pid | head -1`
            ;;
      *)
            echo "Usage: sendmail {start|stop}"
            exit 1
    esac
    exit 0
    root@wl /etc/mail # chmod 744 /etc/init.d/sendmail
    root@wl /etc/mail # ln -s /etc/init.d/sendmail /etc/rc0.d/K36sendmail
    root@wl /etc/mail # ln -s /etc/init.d/sendmail /etc/rc1.d/K36sendmail
    root@wl /etc/mail # ln -s /etc/init.d/sendmail /etc/rc2.d/S88sendmail
    root@wl /etc/mail # ln -s /etc/init.d/sendmail /etc/rcS.d/K36sendmail
    root@wl /etc/mail # /etc/init.d/sendmail start
    
  5. 테스트

    root@wl ~ # telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 wl.local. ESMTP Sendmail 8.14.4/8.14.4; Tue, 15 Feb 2011 10:51:21 +0900 (KST)
    EHLO localhost
    250-wl.local. Hello localhost [127.0.0.1], pleased to meet you
    250-ENHANCEDSTATUSCODES
    250-PIPELINING
    250-8BITMIME
    250-SIZE
    250-DSN
    250-ETRN
    250-AUTH CRAM-MD5 PLAIN LOGIN
    250-STARTTLS
    250-DELIVERBY
    250 HELP
    quit
    221 2.0.0 wl.local. closing connection
    Connection to localhost closed by foreign host.
    root@wl ~ # 
    

QPOPPER

솔라리스에 번들된 SENDMAIL 사용

문제 해결

RSS ATOM XHTML 5 CSS3