\ micro howto: 'SMTP-AUTH dla Postfiksa 2'

Micro-HowTo 'SMTP-AUTH dla Postfiksa 2'.

Wstęp

SMTP-AUTH dla Postfiksa 2 oparte na:
  • PAM (i hasłach systemowych (z łatwością jednak adaptowalne do np. LDAP czy MySQL));
  • SASL 2
  • Debian 5 (działa także na Debian 6 i Ubuntu natty z nowszym software).

    Wszystko z paczek.

  • postfix - A high-performance mail transport agent
  • postfix-tls - TLS and SASL support for Postfix
  • sasl2-bin - Programs for manipulating the SASL users database
  • libsasl2 - Authentication abstraction library
  • libsasl2-modules - Pluggable Authentication Modules for SASL

    (Pliki dostarczane z Cyrus-SASL są w sasl2-bin.)

    Instalacja

    Instalujesz wymagane pakiety
    # apt-get install libsasl2-2 libsasl2-modules postfix-tls sasl2-bin
    

    Uwaga: zgodnie z http://42.pl/url/cG nie uda się zrobić CRAM-MD5 z wykorzystaniem PAM/shadow:

    ,--[ http://42.pl/url/cH ]--
    | CRAM-MD5 relies on having a plain-text password to create the challenge.
    | If you use an authentication method where your password is in shadow, or
    | crypt-password in MySQL, then it stands to reason that CRAM-MD5 won't work.
    `---

    Niestety.

    Konfiguracja

    Istotne wpisy w plikach konfiguracyjnych (jeśli masz nieco inne, zmień. Jeśli Ci czegoś brakuje, dodaj.):

    *** /etc/mailname:
    Check if you see your FQDN hostname ( == 'hostname --fqdn')
    
    *** /etc/postfix/master.cf:
    # Kluczowe: smtp nie może[1] być chrootowane (5 kolumna) - inaczej postfix 
    # nie będzie mógł czytać /var/run/saslauthd/mux
    # i zaowocuje to komunikatem: postfix/smtpd[$pid]: warning: SASL authentication failure: 
    # cannot connect to saslauthd server: Permission denied
    # Do przejrzenia: http://42.pl/url/cC, http://42.pl/url/cD i http://42.pl/url/cE.
    smtp      inet   n  -  n  -  -  smtpd -o smtpd_sasl_auth_enable=yes
    smtp      unix   -  -  n  -  -  smtp
    smtps     inet   n  -  n  -  -  smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
    587       inet   n  -  n  -  -  smtpd -o smtpd_enforce_tls=yes -o smtpd_sasl_auth_enable=yes
    # Zapewne niektóre opcje nie są niezbędne, ale 'If It Works, Don't Fix It!'.
    
    [1] Dokładniej to może, tylko trzeba trochę się nagimnastykować z dostępem do /var/run/saslauthd/mux właśnie...
    Dziękuję za wskazówkę, eloy.
    *** /etc/postfix/main.cf:
    smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, check_relay_domains
    smtp_sasl_auth_enable        = yes
    smtpd_sasl_auth_enable       = no
    broken_sasl_auth_clients     = yes
    smtp_sasl_password_maps      = hash:/etc/postfix/null
    # /etc/postfix/null to jest hash z /dev/null wykonany za pomocą 'postmap /dev/null; mv /dev/null.db /etc/postfix'
    smtpd_use_tls                = yes
    smtpd_tls_auth_only          = no
    smtpd_tls_key_file           = /etc/postfix/ssl/tls.pem
    smtpd_tls_cert_file          = /etc/postfix/ssl/tls.pem
    smtpd_tls_CAfile             = /etc/postfix/ssl/tls.pem
    # Miałem wcześniej przygotowany certyfikat sygnowany własnym CA (skrypty do
    # przygotowania tegoż są w OpenSSL bodajże) - zawsze zresztą TLS możesz wyłączyć 
    # (odpowiada za to smtpd_use_tls)
    smtpd_tls_loglevel           = 1
    # powyższa opcja: jeśli nie wystarcza Ci poziom logowania transakcji TLS - zwiększ tę liczbę
    smtpd_tls_received_header    = yes
    tls_random_source            = dev:/dev/urandom
    
    *** /etc/postfix/sasl/smtpd.conf:
    pwcheck_method:  saslauthd
    saslauthd_path:  /var/run/saslauthd/mux
    # Bardzo ważne: postfix musi być w stanie czytać ten plik - u siebie zrobiłem to 
    # dodając go do grupy sasl (/var/run/saslauthd był własnością root.sasl)
    mech_list:       plain login
    minimum_layer:   0
    auto_transition: no
    
    *** /etc/default/saslauthd:
    START=yes
    MECHANISMS="pam"
    
    *** /etc/pam.d/smtp:
    auth       required     pam_unix.so nullok try_first_pass
    account    required     pam_unix.so
    password   required     pam_permit.so
    session    required     pam_permit.so
    

    Gotowe, teraz test

    Teraz:
    /etc/init.d/postfix reload
    /etc/init.d/saslauthd restart
    
    I sprawdzamy:

    Najpierw sprawdzę czy SASL jest w stanie korzystając z PAM (taką metodę autoryzacji zdefiniowaliśmy w /etc/default/saslauthd) zautoryzować użytkownika - jeśli tak, da nam to pewność, że SASL jest skonfigurowany prawidłowo i że potrafi skorzystac ze zdefiniowanej metody autoryzacji (tu: PAM) - potem pozostanie jedynie upewnienie się, że postfix potrafi skontaktować się z SASL (pamiętaj o /var/run/saslauthd/mux) no i poinformować, że umie SMTP AUTH (patrz niżej).
    Tak wygląda problem z dostępem do MUX saslauthd:

    postfix/smtpd[32640]: warning: SASL authentication failure: cannot connect to saslauthd server: No such file or directory
    postfix/smtpd[32640]: warning: SASL authentication failure: Password verification failed
    postfix/smtpd[32640]: warning: hostname.tld[xxx.xxx.xxx.xxx]: SASL PLAIN authentication failed: generic failure
    
    -- wyjąłem postfiksa z chroota (patrz początek strony o master.cf) i jest OK

    Test autoryzacji SASL:
    Mam użytkownika systemowego "abc" o haśle "def".
    $ testsaslauthd -u abc -p def
    0: OK "Success."
    

    Jest dobrze, SASL działa.
    W razie potrzeby przetestowania użytkownika wirtualnego trzymanego np w mysql:
    $ testsaslauthd  -r domena.pl -s smtp -u uzytkownik -p haselko
    0: OK "Success."
    
    (-- oczywiście PAM musi umieć podpiąć się do mysql: 'libpam-mysql' na Debianie)

    Teraz test postfix+SASL:
    Najpierw generuję niezbędny ciąg znaków (\0username\0passwd zakodowane Base64) dla metody AUTH PLAIN:
    $ perl -MMIME::Base64 -e 'print encode_base64("\0abc\0def");'
    YWJjAGFiYwBkZWY=
    
    Tu taki hint - jeśli masz użytkowników wirtualnych, np. username@domena.com, to uważaj na znak '@' w username - perl zamierza go potraktować specjalnie, więc musisz go 'zacytować':
    $ perl -MMIME::Base64 -e 'print encode_base64("\0uzytkownik\@domena.pl\0Pompony");'
    AHV6eXRrb3duaWtAZG9tZW5hLnBsAFBvbXBvbnk=
    
    Teraz przeprowadzam normalną sesję ESMTP (potrzebny 'netcat' - jeśli go nie masz, możesz normalnie się zatelnetować na port 25 i wpisywać te polecenia po kolei):
    
    # { echo "ehlo test"; echo "AUTH PLAIN YWJjAGFiYwBkZWY="; echo "quit"; } | nc localhost 25
    220 host.domain.pl (NO UCE ESMTP) welcomes. We block/report all spam.
    250-host.domain.pl
    250-PIPELINING
    250-SIZE 10240000
    250-ETRN
    250-STARTTLS
    250-AUTH LOGIN PLAIN
    250-AUTH=LOGIN PLAIN
    250-XVERP
    250 8BITMIME
    235 Authentication successful
    221 Bye
    
    Konfigurację klientów można znaleźć gdzieś indziej - np. tutaj. Co prawda dotyczy innego serwera, ale powinno się dać ją zastosować ;)

    Powodzenia :) Sam wykorzystuję powyższy przepis w praktyce ;)

    Troubleshooting

    Logi, logi i jeszcze raz logi.

    /var/log/mail.err
    /var/log/mail.info
    /var/log/daemon.log
    /var/log/auth.log
    /var/log/messages
    

    Jeśli będziesz szukał pomocy gdzieś na forach:
    - przygotuj wersje używanych pakietów (apt-cache policy nazwapakietu)
    - przygotuj wszystkie wymienione pliki konfiguracyjne (por. 'postconf -n'), wytnij komentarze
    - upewnij się, że NA PEWNO masz poprawną parę username/password (pokaż jak to sprawdzasz)
    - przeprowadź testy krok po kroku i dla każdego kroku pokazuj błędy z logów
    - jeśli do testów nie używasz netcata, a klienta pocztowego, użyj
      więcej niż jednego - np. mutta, Outlook Expressa, Thunderbirda -
      dokładnie opisz wtedy konfigurację
    - napisz na czym polega problem (co nie działa)
    - napisz co już zrobiłeś w celu znalezienia przyczyny problemu 
    
    ICIC

    Ostatnia modyfikacja: 2012.03.25 14:00