Skocz do zawartości
  • Cześć!

    Witaj na forum RootNode - aby pisać u nas musisz się zarejestrować, a następnie zalogować. Posty pisane z kont niezarejestrowanych nie są widoczne publicznie.

Serwer pocztowy i PHP


Fizyda

Rekomendowane odpowiedzi

Nie mam już żadnego punktu zaczepienia, może ktoś podsunie jakiś pomysł bo męczę temat już bardzo długi okres czasu bez żadnych efektów.

 

Mam serwer mailowy (postfix) na nim skonfigurowane (dla każdej domeny) SPF, DKIM, DMARC, spamassasin i clamav. Obok jest serwer WWW i PHP. Serwer nazywa się s1.server.cpl. Obsługuje kilka domen domenapierw.cpl i domenadru.cpl.

 

Gdy wysyłam maile z poziomu klienta pocztowego (niezależnie dla jakiej domeny) i loguje się jako powiedzmy [email protected] to wszysto działa tj. dodawany jest podpis DKIM, maile wychodzące są skanowane przez spamassasina i clamav. Jednak gdy mail jest wysyłany przez mail() z poziomu PHP uruchomionego na użytkownika domenapierw w tedy gmail widzi, że mail przechodzi przez s1.server.cpl oraz pierwotnym autorem jest [email protected]. Autor "pierwotny" jest do wyczytania jedynie w nagłówkach wiadomości, w samym gmailu autorem jest adres którym posługuje się skrypt PHP czyli: [email protected].

 

Problemem w tym wszystkim jest to, że maile wysyłane z poziomu skryptu PHP nie są podpisane kluczem DKIM, nie są sprawdzone przez spamassasina czy clamav. Początkowo myślałem, że one w ogóle nie przechodzą przez postfixa. Jednak w nagłówkach tych maili jest informacja, że są wysyłane przez niego.

 

Zanim ogarnąłem, że maile nie przechodzą przez żadne filtry, lecz tylko przez samego postfixa myślałem, że problemem jest brak podpisu DKIM. SPF dla tych maili przechodził, maile nie przechodziły tylko DMARC ze względu na brak bodpisu DKIM. Dlatego na początku szedłem w innym kierunku i  tak oto:

Pierwszym tropem jaki podjąłem było dodanie DKIM dla s1.server.cpl ponieważ dla tej subdomeny nie było klucza DKIM, jedynie dla server.cpl. Po dodaniu klucza nic się nie zmieniło.

Drugą myślą było podpisywanie maili dla użytkownika [email protected] kluczem domeny domenapierw.cpl. Niestety bez rezultatu.

 

Dopiero w tym miejscu zorientowałem się, że maile w ogóle nie przechodzą przez OpenDKIM, później dopatrzyłem się, że nie przechodzą też przez spamassasina.

Nie mam teraz pomysłu w czym może być problem. Teoretycznie maile powinny przejść przez wszystkie pipe po kolei tak jak w przypadku wysyłania maili z poziomu klienta pocztowego. Niestety tak się nie dzieje.

 

Niczego nie załączam na razie bo nie mam pojęcia co mogłoby być przydatne. Jeśli jakiś cfg jest potrzebny bądź nagłówki przykładowych maili to proszę dać znać.

Ogólnie serwer s1.server.cpl jest skonfigurowany na wzór shared hostingów, lecz bez panelu i z przeznaczeniem tylko dla moich stron.

Zapomniałbym, oczywiście mogę w skryptach wysyłać maile przez SMTP przy pomocy SwiftMail czy innej biblioteki. Jednak chciałbym uniknąć konieczności tworzenia kont dla stron, a potem konfiguracji tego. Dodatkowo zależałoby mi na tym by skrypt mógł (tak jak w obecnej chwili) wysyłać maile z dowolnego adresu email dla domeny w jakiej jest uruchomiony. Jedyny problem w obecnej chwili jest taki, że maile nie przechodzą weryfikacji DMARC z powodu braku podpisu DKIM. No i nie są też sprawdzane przez spamassasina, ale wydaje mi się, że to jest ze sobą powiązane.

Odnośnik do komentarza
Udostępnij na innych stronach

To to się domyśliłem od razu jak dostałem pierwszy raport DMARC dla domeny. Mój problem jest taki, że nie wiem gdzie szukać problemu w konfiguracji usług by wszystko działało. Ewentualnie jak inaczej to skonfigurować. PHP używa polecenia sendmail do wysyłki maili. Postfix ma zaimplementowaną obsługę interfejsu sendmaila i teoretycznie maile lecą przez postfixa. Widać to też po nagłówkach maili gdzie jest informacja iż serwerem wysyłającym jest postfix. Niestety mimo tego maile wysyłane w ten sposób nie są podpisywane przez DKIM i sprawdzane przez resztę. Dzieje się tak TYLKO DLA MAILI WYSYŁANYCH PRZEZ SKRYPT PHP, dla wysyłanych przez Thunderbird wszystko działa poprawnie. Więc to nie jest problem złej konfiguracji serwera mailowego, ale problem leży gdzieś w integracji php i serwer mailowy.

Przez serwer mailowy mam na myśli całość czyli Postfix, DKIM, Spamassasin, clamav.

 

Ja nie szukam powodu czemu maile nie przechodzą DMARC, bo to jest oczywiste, szukam przyczyny czemu tylko maile wysyłane przez PHP nie są podpisywane.

Odnośnik do komentarza
Udostępnij na innych stronach

@l3szcz Mowa o formularzu kontaktowym na WP, tutaj problem jest najmniejszy ponieważ maile lecą na tą samą domenę. Drugi problem to wysyłka maili przez phpBB, ponieważ maile lecą już do użytkowników to zależy mi na tym by przechodziły DMARC.

Jeśli chodzi o WP to maile idą przez wp_mail() - kod: https://developer.wordpress.org/reference/functions/wp_mail/#source

Co do phpBB to nie wiem co tam obecnie siedzi, ale na 90% bazuje na PHPowym mail();

 

@Mion Umiem napisać kod wysyłki maili tak by był podpisywany kluczem DKIM przez PHP, umiem również użyć SMTP do wysyłki maila. Czyli zalogować się na serwer SMTP i przez niego wysłać. Tylko nie o to chodzi bo nie mam zamiaru za każdym razem modyfikować kodu silnika strony odpowiedzialnego za wysyłkę maila. Chcę rozwiązania uniwersalnego, które będzie działało out of the box.

 

Mój problem polega na tym, że nie wiem i nie umiem ustalić przyczyny dlaczego mail wysłany przez skrypt PHP wysyłany jest z pominięciem ustalonych filtrów. Mail wychodzący powinien przejść drogę:

Postfix > DKIM > Spamassasin > Clamav > Postfix > Odbiorca *

Niestety jest dla maili wysyłanych przez PHP jest:

Postfix > Odbiorca

 

* a nawet jak dobrze pamiętam cfg to po każdym filtrze wraca do Postfixa i dopiero on przekazuje mail do kolejnej usługi. Maile przychodzące przechodzą dodatkowo przez DMARC oraz SPF.

Edytowane przez Fizyda
Odnośnik do komentarza
Udostępnij na innych stronach

21 minut temu, Fizyda napisał:

@l3szcz Mowa o formularzu kontaktowym na WP, tutaj problem jest najmniejszy ponieważ maile lecą na tą samą domenę. Drugi problem to wysyłka maili przez phpBB, ponieważ maile lecą już do użytkowników to zależy mi na tym by przechodziły DMARC.

Jeśli chodzi o WP to maile idą przez wp_mail() - kod: https://developer.wordpress.org/reference/functions/wp_mail/#source

Co do phpBB to nie wiem co tam obecnie siedzi, ale na 90% bazuje na PHPowym mail();

 

@Mion Umiem napisać kod wysyłki maili tak by był podpisywany kluczem DKIM przez PHP, umiem również użyć SMTP do wysyłki maila. Czyli zalogować się na serwer SMTP i przez niego wysłać. Tylko nie o to chodzi bo nie mam zamiaru za każdym razem modyfikować kodu silnika strony odpowiedzialnego za wysyłkę maila. Chcę rozwiązania uniwersalnego, które będzie działało out of the box.

 

Mój problem polega na tym, że nie wiem i nie umiem ustalić przyczyny dlaczego mail wysłany przez skrypt PHP wysyłany jest z pominięciem ustalonych filtrów. Mail wychodzący powinien przejść drogę:

Postfix > DKIM > Spamassasin > Clamav > Postfix > Odbiorca *

Niestety jest dla maili wysyłanych przez PHP jest:

Postfix > Odbiorca

 

* a nawet jak dobrze pamiętam cfg to po każdym filtrze wraca do Postfixa i dopiero on przekazuje mail do kolejnej usługi. Maile przychodzące przechodzą dodatkowo przez DMARC oraz SPF.

Wiadomości które są wysyłane z tego samego serwera za pomocą wiersza poleceń sendmail (ze skryptów php) nie muszą być sprawdzane czy nie zawierają spamu, wirusów (Spamassasin ,Clamav), ponieważ nie pochodzą one z zewnątrz, ale z twojego serwera. Postfix wymaga wymuszenia by wiadomości ze skryptu zostały podpisane. Albo dodajesz odpowiednią konfigurację do samego postfix albo do skryptu PHP. Wiadomo że łatwiej to wykonać globalnie w samym postfix. Ten link co podałem ma jedynie ciebie naprowadzić ponieważ nie znam i nie mam czasu przechodzić przez twoje pliki konfiguracyjne. Według mojej skromnej opinii błędna jest konfiguracja postfix ponieważ w niej brakuje wymuszenia podpisania wiadomości wysyłanych lokalnie bez autoryzacji via PHP

Edytowane przez SiXwishlist
  • Lubię 1
Odnośnik do komentarza
Udostępnij na innych stronach

Sprawdzałem już kilka razy, ustawione są wartości domyślne.

sendmail_from		no value
sendmail_path		/usr/sbin/sendmail -t -i

# wiadomo tylko pod Windowsem, ale i tak podaje
SMTP			localhost
smtp_port		25

mail.add_x_header		On
mail.force_extra_parameters	no value
mail.log			no value

`/usr/sbin/sendmail` Jest to interfejs sendmaila wystawiony przez postfixa. Mail wysłany przez phpBB zawiera w nagłówku wiadomości:

Received: by smtp.server.cpl (Postfix, from userid 1004) id 14E1662002; Fri,

Gdzie userid to id użytkownika pod którym działa PHP (domenapierw). Potem jest jeszcze nagłówek:

spf=pass (google.com: domain of [email protected] designates <adres_ip> as permitted sender) [email protected];

Mogę się mylić, ale nagłówki wiadomości wskazują iż mail przechodzi przez Postfixa, lecz nie jest kierowany do żadnych filtrów, w tym DKIM.

 

Dla pewności by nie tracić Waszego czasu i nie popełnić idiotyczne gafy sprawdziłem ID użytkownika, na 100% jest to ten sam na którym działa PHP.

 

10 minut temu, SiXwishlist napisał:

Wiadomości które są wysyłane z tego samego serwera za pomocą wiersza poleceń sendmail (ze skryptów php) nie muszą być sprawdzane czy nie zawierają spamu, wirusów (Spamassasin ,Clamav), ponieważ nie pochodzą one z zewnątrz, ale z twojego serwera.

Super w końcu jakiś konkret. Przypuszczałem, że to może być tego typu problem, ale nie mogłem znaleźć żadnego punktu zaczepienia. Oczywiście nie oczekuję, że ktoś odwali tutaj za mnie czarną robotę, poza tym dla mnie to trochę przyjemność w rozwiązywaniu tej zagadki ;).

Fajnie, że rozwinąłeś pierwszą odpowiedź bo nie ukrywam, że początkowo nie wiedziałem o co Ci chodzi. Bardziej myślałem, że myślisz, że nie wiem jak skonfigurować DKIM i nie mogłem tego powiązać z moim problemem.

 

Zerknąłem w mój main.cf i widzę, że jakiś kretyn (ja :D) zakomentował `non_smtpd_milters`.

Dobra teraz już nawet przypomniałem sobie czemu tak zrobiłem, po prostu miałem loopa i maile nie wychodziły z serwera. To będzie prawdopodobnie to. Zmienię config, przetestuję i na pewno dam znać jak poszło.

Edytowane przez Fizyda
Odnośnik do komentarza
Udostępnij na innych stronach

non_smtpd_milters potrafi wykorzystać wiele elementów które umieścisz za znakiem "=" wszystko co tam wpiszesz musi mieć odpowiednią składnie i powinno zawierać wskazanie by wykorzystywał jedynie adres lokalny i odpowiedni port który wykorzystywany jest również w smtpd_milters i opendkim. Bardzo ostrożnie podchodź do wysyłania wiadomości przez sendmail via PHP ponieważ w przypadku złej konfiguracji lub błędu skryptu można wykorzystać twój serwer do rozesłania wiadomości typu spam. Dlatego bardziej zalecane jest wysyłania via SMTP + autoryzacja. Zdecydowanie jest to bardziej bezpieczna droga.  Przejrzyj ten poradnik i przed wprowadzeniem zmian utwórz backup plików w których przeprowadzisz zmiany:  https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy 

  • Lubię 1
Odnośnik do komentarza
Udostępnij na innych stronach

@SiXwishlist dzięki za pomoc, trafiłeś w sendo problemu. W obecnej chwili maile wysyłane przez PHP poprawnie są podpisywane i wszystkie ładnie przechodzą DMARC ;).

Co prawda konfiguracja serwera nie jest jeszcze idealna ponieważ pojawił się inne problem, ale naprawiłem ten najistotniejszy. W sumie to przez problem który się pojawił zakomentowałem wcześniej `non_smtpd_milters`. Chodziło o to, że wysyłając maile przez program pocztowy są one dwukrotnie podpisane, czyli dwa razy przechodzą przez OpenDKIM i OpenDMARK (ustawione jako smtpd_milters i non_smtpd_milters). Powodem będzie albo konfiguracja po odebraniu maili od Spamassasina lub Clamav które są ustawione jako content_filter. Obstawiam Spamassasina ponieważ zwraca on maile przy pomocy sendmaila.

Mam też w obecnej chwili brak filtrowania przez spamassasina i skanowanie przez clamav maili wysyłanych przez PHP. Po poście wyżej zgaduję, że powinienem się tym też zająć. Jestem też ciekaw co daje w opisanym przez Ciebie przypadku wysyłka maili via SMTP. W końcu jeśli ktoś zainfekuje skrypt lub będzie w nim błąd to przed wysyłką maili to go nie powstrzyma.

Odnośnik do komentarza
Udostępnij na innych stronach

Bardzo ciężko będzie dojść co jest powodem takiego zachowania lecz nie twierdzę że nie jest to możliwe. By nakierować ciebie podałem link do "DO" , tylko dogłębna analiza konfiguracji poparta przejrzeniem logów systemowych da tobie pośrednią odpowiedź na zaistniałą sytuację. Istotną sprawa jest to że głównym elementem jest postfix, wszelkie pozostałe "klocki" są wywoływane do odpowiedzi tylko gdy postfix posiada dla nich zadania do wykonania. Natomiast każdy z tych elementów ma odpowiednie prawa i własny plik konfiguracyjny który wystarczy że będzie zawierał nieodpowiednią zawartość wypluje to w logach. Napisałeś że powód problemu to Spamassasin lub Clamav.  To nie one są raczej powodem, jak napisałem na początku tylko sam Postfix wskazuje kto co i kiedy ma wykonać a wygląda że nakazuje wykonać coś dwa razy o ile dobrze zrozumiałem.

Brak filtrowania czy skanowanie jest zbędne bo wiadomości jakie wychodzą od ciebie dotyczą rejestracji na forum , czy nowego postu. Takich treści się nie skanuje i nie weryfikuje ponieważ możesz doprowadzić do sytuacji że np  Spamassasin zablokuje ci wiadomość wychodzącą ze względu na link w treści (wynik konfiguracji). 

Odnośnie wyższości wysyłania powiadomień via PHP czy SMTP temat jest dość długi by tak w kilku słowach wyjaśnić. Poczta via PHP ma to do siebie że przy niewłaściwym wykorzystaniu może powodować zagrożenie ale inaczej wygląda poziom zagrożenie kiedy możesz wywołać funkcję sendmail z "poziomu przeglądarki" a inaczej kiedy wysłanie wiadomości działa na zasadzie kodu który wymaga autoryzacji z pliku do którego dostęp z zewnątrz jest zabroniony - login i hasło do konkretnego adresu email. By uprościć jeszcze bardziej z naciskiem na tz"spam" to SMTP wymaga autoryzacji z konta na serwerze pocztowym by wysłać wiadomość do innego serwera pocztowego. Jeśli serwer pocztowy jest skonfigurowany poprawnie, twoje wiadomości nie zostaną oznaczone jako spam, natomiast poczta wysłana za pomocą funkcji sendmaila nie ma uwierzytelniania i prawie zawsze zostanie oznaczony jako spam pomimo że jest podpisana.

  • Lubię 1
Odnośnik do komentarza
Udostępnij na innych stronach

10 minut temu, SiXwishlist napisał:

natomiast poczta wysłana za pomocą funkcji sendmaila nie ma uwierzytelniania i prawie zawsze zostanie oznaczony jako spam pomimo że jest podpisana.

W sumie racja, zapomniałem o tym szczególe. Co do niebezpieczeństwa to domyślam się o jaki szczególny przypadek Ci chyba chodzi. Faktycznie w przypadku tragicznie napisanych skryptów wysyłanie maili przez uwierzytelnienie może uratować tyłek.

Pisząc, że to wina spamassasina lub clamav nie wyraziłem się precyzyjnie. Chodziło mi o to, że to w momencie powrotu maili od tych skanerów ponownie stosowany jest non_smtpd_milter, tylko, że wcześniej był już wywołany smtpd_milter. Z logów wychodzi, że przy powrocie wiadomości z spamassasina (który odsyła je przez sendmaila) wywoływane są filtry non_smptd. Czyli tak jak napisałeś problem będzie leżał w konfiguracji postfixa.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Korzystając z forum, wyrażasz zgodę na: Warunki użytkowania, Regulamin, Polityka prywatności.