Тази статия е продължение на Пощенски сървър с iRedMail и PHPMyAdmin До тук имаме: ● инсталиран сървър за електронна поща ● инсталиран и настроен PHPMyAdmin Задачата е: ● да включим удостоверяване за защита на сървъра ● да се защитим от подправяне на сървъра Да поясним какво значат понятията от заглавието. DKIM - служи за потвърждение на това, че изпращача е реален. За повече инфо ТУК SPF - служи за защита от подправяне на домейна. За повече инфо ТУК DMARK - служи за създаване на правила за обработка на получените писмата, не преминали удостоверяването. За повече инфо ТУК За тези които владеят руски: ТУК
Подправянето на изпращача на имейл е действието на преструване, че контролирате имейл адреса на някой друг. Това е често срещан проблем при фишинга . Често измамниците изпращат имейли с адрес на изпращача something@paypal.com и се надяват, че получателят ще им се довери. Всъщност SMTP не се интересува кой адрес на подател изпращате. Много доставчици на пощенски услуги налагат да изпращате имейли само с вашия собствен имейл адрес. Но някои не го правят. А на спамерите и измамниците очевидно не им пука. Спуфинг случай без DKIM: И така, преди приблизително десет години беше замислен нов метод, който добавяше криптографски подпис към заглавката на имейл, който получателят можеше да провери, за да провери автентичността на подателя и целостта на имейла. Подписът се създава с помощта на частен ключ, който има само изпращащият имейл сървър. След това може да бъде проверен от получателя чрез изтегляне на съответния публичен ключ от DNS зоната на изпращащия домейн и извършване на проверка на подписа. Това работи много подобно на PGP или S/MIME подписване – само на ниво домейн. Вашият пощенски сървър може автоматично да подписва всички изходящи имейли. Методът, който се използва днес, се нарича Domain Keys Identified Mail – или накратко: DKIM . Да вземем пример. Току-що изпратих имейл от GMail до личния си имейл акаунт на собствения си имейл сървър. Google използва DKIM подписване, така че имейлът получи тази допълнителна заглавка от пощенските сървъри на Google: След инсталирането на iRedMail, по подразбиране получавате готов DKIM ключ. Можете да го намерите във файла /root/iRedMail-1.7.2//iRedMail.tips или като изпълните командата в конзолата.
amavisd showkeys head: cannot open '/etc/mailname' for reading: No such file or directory head: cannot open '/etc/mailname' for reading: No such file or directory ; key#1 2048 bits, s=dkim, d=tachko.com, /var/lib/dkim/tachko.com.pem dkim._domainkey.tachko.com. 3600 TXT ( "v=DKIM1; p=" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzM5b8RQwAaF348lsC5vk" "8eI07BUk4VqaTHgh3CTDhS5+p4GI4XFQiuzSO/dBbzdpfCmYQSpBPi2NqQ6i65+X" "NVbP3V1IoSzrfOzrlwOqD7KhsqGU8UZhemUeLshD8qph74N7Kjb+6dHC1iENd6W9" "XtcvsIn3NbuxyDGCaUBTZ4sj6CUmpnewiLW87vUP3RaGZlOkaDL1fCwNfpvCp+xn" "jnz6oUUv1J/BN+oy+qpNRh3ZXw3EYsnlQO59APsj/kwi71TjsfUBxHC6QwgoQHxS" "4n1WdJ+uct8uV2DiUNEse9YuJTDZgKdf1zML2zGNNz3vfc+00j7Zjz1wsTE5Zlcv" "xQIDAQAB")
Нещата които са важни са в червено. В отделен текстов файл копираме това което е в червено.
dkim._domainkey.tachko.com "v=DKIM1; p=" "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzM5b8RQwAaF348lsC5vk" "8eI07BUk4VqaTHgh3CTDhS5+p4GI4XFQiuzSO/dBbzdpfCmYQSpBPi2NqQ6i65+X" "NVbP3V1IoSzrfOzrlwOqD7KhsqGU8UZhemUeLshD8qph74N7Kjb+6dHC1iENd6W9" "XtcvsIn3NbuxyDGCaUBTZ4sj6CUmpnewiLW87vUP3RaGZlOkaDL1fCwNfpvCp+xn" "jnz6oUUv1J/BN+oy+qpNRh3ZXw3EYsnlQO59APsj/kwi71TjsfUBxHC6QwgoQHxS" "4n1WdJ+uct8uV2DiUNEse9YuJTDZgKdf1zML2zGNNz3vfc+00j7Zjz1wsTE5Zlcv" "xQIDAQAB")
Имаме кавички в началото на реда и в края. Те трябва да се махнат. Също така имаме шпации в началото на реда, те също трябва да се махнат. В края на стринга имаме затваряща скоба. Тя също трябва да се махне. Трябва да се получи:
dkim._domainkey.tachko.com v=DKIM1; p= MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzM5b8RQwAaF348lsC5vk 8eI07BUk4VqaTHgh3CTDhS5+p4GI4XFQiuzSO/dBbzdpfCmYQSpBPi2NqQ6i65+X NVbP3V1IoSzrfOzrlwOqD7KhsqGU8UZhemUeLshD8qph74N7Kjb+6dHC1iENd6W9 XtcvsIn3NbuxyDGCaUBTZ4sj6CUmpnewiLW87vUP3RaGZlOkaDL1fCwNfpvCp+xn jnz6oUUv1J/BN+oy+qpNRh3ZXw3EYsnlQO59APsj/kwi71TjsfUBxHC6QwgoQHxS 4n1WdJ+uct8uV2DiUNEse9YuJTDZgKdf1zML2zGNNz3vfc+00j7Zjz1wsTE5Zlcv xQIDAQAB
Това не е крайния резултат. Внимателно четете надолу! Създаваме TXT запис в DNS-а. Обръщам внимание, така след p= ще се получи шпация. Това ще е грешка ако я оставите.
Name dkim._domainkey.tachko.com Text data v=DKIM1; p= MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzM5b8RQwAaF348lsC5vk 8eI07BUk4VqaTHgh3CTDhS5+p4GI4XFQiuzSO/dBbzdpfCmYQSpBPi2NqQ6i65+X NVbP3V1IoSzrfOzrlwOqD7KhsqGU8UZhemUeLshD8qph74N7Kjb+6dHC1iENd6W9 XtcvsIn3NbuxyDGCaUBTZ4sj6CUmpnewiLW87vUP3RaGZlOkaDL1fCwNfpvCp+xn jnz6oUUv1J/BN+oy+qpNRh3ZXw3EYsnlQO59APsj/kwi71TjsfUBxHC6QwgoQHxS 4n1WdJ+uct8uV2DiUNEse9YuJTDZgKdf1zML2zGNNz3vfc+00j7Zjz1wsTE5Zlcv xQIDAQAB TTL (Time to live) 1 hour (3600)
Внимание !!! Ако така запишете файла то след p= MIB..... ще се получи шпация. Това е грешка, тя трябва да се обере. В крайна сметка трябва да се получи следното (Това е вярното съдържание):
Name dkim._domainkey.tachko.com Text data v=DKIM1; =DKIM1; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzM5b8RQwAaF348lsC5vk 8eI07BUk4VqaTHgh3CTDhS5+p4GI4XFQiuzSO/dBbzdpfCmYQSpBPi2NqQ6i65+X NVbP3V1IoSzrfOzrlwOqD7KhsqGU8UZhemUeLshD8qph74N7Kjb+6dHC1iENd6W9 XtcvsIn3NbuxyDGCaUBTZ4sj6CUmpnewiLW87vUP3RaGZlOkaDL1fCwNfpvCp+xn jnz6oUUv1J/BN+oy+qpNRh3ZXw3EYsnlQO59APsj/kwi71TjsfUBxHC6QwgoQHxS 4n1WdJ+uct8uV2DiUNEse9YuJTDZgKdf1zML2zGNNz3vfc+00j7Zjz1wsTE5Zlcv xQIDAQAB TTL (Time to live) 1 hour (3600)
Можем да тестваме конфигурацията.
amavisd testkeys head: cannot open '/etc/mailname' for reading: No such file or directory head: cannot open '/etc/mailname' for reading: No such file or directory TESTING#1 tachko.com: dkim._domainkey.tachko.com => pass
Имаме грешка защото се опитва да прочете системното име на хоста от файла /etc/mailname, а то липсва (липсва такъв файл). Най-бързото решение е да се създаде файла ръчно, като в него се запише Fully Qualified Domain Name (FQDN) или просто името на хоста:
hostname -f | tee /etc/mailname systemctl restart postfix systemctl restart amavis amavisd testkeys TESTING#1 tachko.com: dkim._domainkey.tachko.com => pass
Вече всичко е наред.
Name tachko.com Text data v=spf1 a mx ip4:185.163.245.186 ~all TTL (Time to live) 1 hour (3600)
Name _dmarc.tachko.com Text data v=DMARC1; p=none; fo=1; rua=mailto:dmarc@tachko.com; ruf=mailto:dmarc@tachko.com ### Най-прост вариант на text data v=DMARC1; p=quarantine; adkim=r; aspf=r; pct=100 TTL (Time to live) 1 hour (3600)
DMARC разчита в голяма степен на SPF и DKIM записи, моля, уверете се, че сте публикували правилни и актуални SPF и DKIM записи. v=DMARC1 - идентифицира версията на DMARC протокола, DMARC1налична е само в момента и v=DMARC1трябва да се появи първа в DMARC запис. adkim - определя режим на подравняване за DKIM. Налични са 2 опции: r - режим на релаксация ( adkim=r) s - строг режим ( adkim=s) aspf - определя режим на подравняване за SPF. Налични са 2 опции: r - режим на релаксация ( aspf=r) s - строг режим ( aspf=s) p - Указва политиката за организационния домейн. Тя казва на сървъра получател какво да прави, ако полученият имейл не премине проверката на механизма DMARC. Налични са 3 опции: none( p=none): - Собственикът на домейна не изисква да се предприемат конкретни действия относно доставката на съобщения. quarantine( p=quarantine): - Собственикът на домейна желае имейлите, които не преминат проверката на механизма DMARC, да бъдат третирани от получателите на поща като подозрителни. В зависимост от възможностите на получателя на поща, това може да означава „поставяне в папката за спам“, „маркиране като подозрително“ или „поставяне на имейла под карантина някъде“, може би и друго. reject( p=reject): - Собственикът на домейна желае получателите на поща да отхвърлят имейли, които не преминат проверката на механизма DMARC по време на SMTP транзакцията. Внимание !!! - p=reject Силно се препоръчва, ако сте сигурни, че всички ваши имейли се изпращат от сървъра(ите), посочен(и) в SPF записа, или имат правилен DKIM подпис . - Съгласно RFC 7489 , етикетите "v" и "p" ТРЯБВА да присъстват и ТРЯБВА да се появяват в този ред. Затова, моля, винаги поставяйте етикета "p" веднага след етикета "v". Например, v=DMARC1; p=reject; aspf=s; ...е добре, но не и v=DMARC1; aspf=s; p=reject; .... sp - определя политика за всички поддомейни. Това е по избор. Наличните опции са същите като p. rua - определя транспортен механизъм за предоставяне на обобщена обратна връзка. В момента mailto: се поддържа само . Това е по избор. ruf - указва транспортен механизъм, чрез който да се докладва специфична за съобщението информация за неуспех. В момента mailto: се поддържа само . Това е по избор.
| HOSTNAME | TYPE | TTL | DATA |
| tachko.com | A | 3600 | 109.160.80.230 |
| mail.tachko.com | A | 3600 | 185.163.245.186 |
| www.tachko.com | A | 3600 | 109.160.80.230 |
| tachko.com | MX | 3600 | 10 post.tachko.com |
| tachko.com | TXT | 3600 | v=spf1 a mx ip4:185.163.245.186 ~all |
| autoconfig.tachko.com | MX | 3600 | 10 post.tachko.com |
| autodiscover.tachko.com | MX | 3600 | 10 post.tachko.com |
| _dmarc.tachko.com | TXT | 3600 | v=DMARC1; p=quarantine; adkim=r; aspf=r; pct=100 |
| dkim._domainkey.tachko.com | TXT | 3600 | v=DKIM1; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzM5b8RQwAaF348lsC5vk 8eI07BUk4VqaTHgh3CTDhS5+p4GI4XFQiuzSO/dBbzdpfCmYQSpBPi2NqQ6i65+X NVbP3V1IoSzrfOzrlwOqD7KhsqGU8UZhemUeLshD8qph74N7Kjb+6dHC1iENd6W9 XtcvsIn3NbuxyDGCaUBTZ4sj6CUmpnewiLW87vUP3RaGZlOka" "DL1fCwNfpvCp+xn jnz6oUUv1J/BN+oy+qpNRh3ZXw3EYsnlQO59APsj/kwi71TjsfUBxHC6QwgoQHxS 4n1WdJ+uct8uV2DiUNEse9YuJTDZgKdf1zML2zGNNz3vfc+00j7Zjz1wsTE5Zlcv xQIDAQAB |
Проверяваме DKIM записа.
dig -t txt dkim._domainkey.tachko.com ; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> -t txt dkim._domainkey.tachko.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59218 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;dkim._domainkey.tachko.com. IN TXT ;; ANSWER SECTION: dkim._domainkey.tachko.com. 3592 IN TXT "v=DKIM1; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzM5b8RQwAaF348lsC5vk 8eI07BUk4VqaTHgh3CTDhS5+p4GI4XFQiuzSO/dBbzdpfCmYQSpBPi2NqQ6i65+X NVbP3V1IoSzrfOzrlwOqD7KhsqGU8UZhemUeLshD8qph74N7Kjb+6dHC1iENd6W9 XtcvsIn3NbuxyDGCaUBTZ4sj6CUmpnewiLW87vUP3RaGZlOka" "DL1fCwNfpvCp+xn jnz6oUUv1J/BN+oy+qpNRh3ZXw3EYsnlQO59APsj/kwi71TjsfUBxHC6QwgoQHxS 4n1WdJ+uct8uV2DiUNEse9YuJTDZgKdf1zML2zGNNz3vfc+00j7Zjz1wsTE5Zlcv xQIDAQAB" ;; Query time: 52 msec ;; SERVER: 1.1.1.1#53(1.1.1.1) (UDP) ;; WHEN: Tue May 20 20:44:19 UTC 2025 ;; MSG SIZE rcvd: 478 nslookup -type=txt dkim._domainkey.tachko.com Server: 1.1.1.1 Address: 1.1.1.1#53 Non-authoritative answer: dkim._domainkey.tachko.com text = "v=DKIM1; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzM5b8RQwAaF348lsC5vk 8eI07BUk4VqaTHgh3CTDhS5+p4GI4XFQiuzSO/dBbzdpfCmYQSpBPi2NqQ6i65+X NVbP3V1IoSzrfOzrlwOqD7KhsqGU8UZhemUeLshD8qph74N7Kjb+6dHC1iENd6W9 XtcvsIn3NbuxyDGCaUBTZ4sj6CUmpnewiLW87vUP3RaGZlOka" "DL1fCwNfpvCp+xn jnz6oUUv1J/BN+oy+qpNRh3ZXw3EYsnlQO59APsj/kwi71TjsfUBxHC6QwgoQHxS 4n1WdJ+uct8uV2DiUNEse9YuJTDZgKdf1zML2zGNNz3vfc+00j7Zjz1wsTE5Zlcv xQIDAQAB" Authoritative answers can be found from:
Да проверим и SPF записа.
dig -t txt tachko.com ; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> -t txt tachko.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63453 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;tachko.com. IN TXT ;; ANSWER SECTION: tachko.com. 3600 IN TXT "v=spf1 ip4:185.163.245.186 mx ~all" ;; Query time: 68 msec ;; SERVER: 1.1.1.1#53(1.1.1.1) (UDP) ;; WHEN: Tue May 20 20:48:55 UTC 2025 ;; MSG SIZE rcvd: 86 nslookup -type=txt tachko.com Server: 1.1.1.1 Address: 1.1.1.1#53 Non-authoritative answer: tachko.com text = "v=spf1 ip4:185.163.245.186 mx ~all" Authoritative answers can be found from:
Последно да проверим DMARC записа.
dig -t txt _dmarc.tachko.com ; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> -t txt _dmarc.tachko.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6461 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;_dmarc.tachko.com. IN TXT ;; ANSWER SECTION: _dmarc.tachko.com. 3600 IN TXT "v=DMARC1; p=none; pct=100; rua=mailto:postmaster@tachko.com; sp=none; aspf=r" ;; Query time: 37 msec ;; SERVER: 1.1.1.1#53(1.1.1.1) (UDP) ;; WHEN: Tue May 20 20:52:30 UTC 2025 ;; MSG SIZE rcvd: 135 nslookup -type=txt _dmarc.tachko.com Server: 1.1.1.1 Address: 1.1.1.1#53 Non-authoritative answer: _dmarc.tachko.com text = "v=DMARC1; p=none; pct=100; rua=mailto:postmaster@tachko.com; sp=none; aspf=r" Authoritative answers can be found from:
Ще ползваме сайта https://www.mail-tester.com.

Предлага да изпратим писмо от нашия пощенски акаунт до: test-rye00yysi@srv1.mail-tester.com Създаваме писмо До: test-rye00yysi@srv1.mail-tester.com Заглавие: Тестово писмо Съдържание: Изпращам тестово писмо

След като писмото се изпрати се връщаме на: https://www.mail-tester.com

Натискаме бутона След това проверете своя резултат.

Изчакваме докато мине проверката.

Това е крайния резултат. Резултата е непълен, защото нямам обратната DNS проверка. С това приключваме темата.