5. Mekanizma Tanımları

Bu bölümde iki tür mekanizma tanımlanmaktadır.

Temel mekanizmalar dil çerçevesi dahilinde destek verir. Belli bir yetkilendirme şeması türü belirtmezler.

tümü
dahili

Tasarlanmış gönderici mekanizmaları, posta gönderimi için <alan>'ı kullanmaya izin verilmiş veya verilmemiş bir <ip> adresi kümesini tasarlamakta kullanılır.

a
mx
ptr
ip4
ip6
mevcut

Aşağıdaki uzlaşımlar <ip> ile herhangi bir noktadaki IP adresi arasında bir karşılaştırma yapacak tüm mekanizmalara uygulanır:

yönergede bir CIDR uzunluğu belirtilmemişse, <ip> ve IP adresi eşitlik için karşılaştırılır. (Burada CIDR, "sınıfsız alanlar arası yönlendirme" anlamına gelen "Classless Inter-Domain Routing" kısaltmasıdır.)

Bir CIDR uzunluğu belirtilmişse, <ip> ve IP adresinin sadece belirtilen sayıda yüksek biti eşitlik için karşılaştırılır.

Bir mekanizma <ip> ile karşılaştırmak için konak adreslerini alırken, <ip> bir IPv4 adresi ise A kayıtlarını alır, bir IPv6 adresi ise AAAA kayıtlarını alır. SMTP bağlantısı IPv6 üzerinden bile olsa, bir IPv4 eşlemli IPv6 adresi ([RFC3513]'ün 2.5.5. bölümüne bakınız) yine de bir IPv4 adresi sayılmalıdır *ZORUNLU*.

Birçok mekanizma DNS'den alınan bilgiye bel bağlar. Bu DNS sorguları için, aksi belirtilmedikçe, eğer DNS sunucusu bir hata döndürüyorsa (0 ve 3 dışında bir RCODE) veya sorgu zamanaşımına uğruyorsa, mekanizma "TempError" verir. Eğer sunucu "alan mevcut değil" (RCODE 3) diyorsa, sanki hata alınmamış (RCODE 0) gibi mekanizmanın değerlendirilmesi sürer ve sıfır yanıt kaydedilir.

5.1. "all"

tümü             = "all"

"all" mekanizması daima eşleşen bir sınamadır. Bir kayıttakı en sağdaki mekanizma açık bir öntanım sağlayacakmış gibi kullanılır.

Örnek:

v=spf1 a mx -all

"all"dan sonra gelen mekanizmalar asla sınanmaz. Bir "all" mekanizmasi varsa, hiçbir "redirect" değiştiricisinin (Yönlendirilmiş Sorgu (redirect)) etkisi yoktur.

5.2. "include"

dahili          = "include"  ":" alan-belirtimi

"include" mekanizması check_host() işlevinin ardışık değerlendirilmesini tetikler. alan-belirtimi Makrolar bölümündeki gibi yorumlanır ve check_host() işlevi, sonuçlanan dizgeyi <alan> olarak değerlendirir. <ip> ve <gönderici> bağımsız değişkenleri o an ki check_host() değerlendirmesindekiyle aynı kalır.

Önemine ve niteliğine bakarak, bu mekanizma için "include" ismi yetersiz kalmıştır. Atıf yapılan SPF kaydı ilk kayıtta harfiyen içerilmiş gibi davranılacağı yerde, sadece atıf yapılan SPF kaydının değerlendirilen sonucu kullanılır. Örneğin, atıf yapılan alandaki bir "all" yönergesinin değerlendirilmesi işlemin tamamını sonlandırmaz ve sonucun bir bütün olarak "Fail" olmasını gerekli kılmaz. (Bu mekanizma için "if-pass", "on-pass", vb. bir isim daha uygun olurdu.)

"include" mekanizması, çok sayıda yönetimsel olarak bağımsız alanı tek bir alanda tasarlamayı mümkün kılar. Örneğin, sözde alan "example.net" yönetimsel olarak bağımsız alanlar olan example.com ve example.org sunucularını kullanarak posta gönderebilir.

Example.net şöyle bir kayıt içerirse,

IN TXT "v=spf1 include:example.com include:example.org -all"

bu kayıt, check_host() işlevini bir "Pass" sonucu için example.com ve example.org'un kayıtlarını sınamaya yöneltir. Sadece, konak bu alanların ikisinde de izinli değilse sonuç "Fail" olurdu.

check_host() işlevinin ardışık değerlendirmesinin sonucunda bu mekanizmanın davranış tarzı:

+--------------------------------+-------------------------------+
| Ardışık check_host() sonucunun | "include" mekanizması bunlara |
| bunlar olması için:            | sebep olmalıdır:              |
+--------------------------------+-------------------------------+
| Pass                           | eşleşir                       |
|                                |                               |
| Fail                           | eşleşmez                      |
|                                |                               |
| SoftFail                       | eşleşmez                      |
|                                |                               |
| Neutral                        | eşleşmez                      |
|                                |                               |
| TempError                      | TempError verir               |
|                                |                               |
| PermError                      | PermError verir               |
|                                |                               |
| None                           | PermError verir               |
+--------------------------------+-------------------------------+

"include" mekanizması yönetimsel sınırları çaprazlamak için düşünülmüştür. "include" mekanizması çok sayıda alanın aynı konak kümesini paylaşmak üzere birleştirilmesi için kullanılması olasılığına rağmen, alanlar mümkün olduğunca "redirect"'leri kullanmaya, tek bir yönetimsel alan içinde "include"'ların sayısını azaltmaya teşvik edildiler. Örneğin, example.com ve example.org aynı öğe tarafından yönetiliyor ve eğer her iki alan "mx:example.com" konaklarına izin veriyorsa, example.org için "include:example.com" belirtmek mümkün olurdu, ama "redirect=example.com" hatta "mx:example.com" belirtmek tercih edilmektedir.

5.3. "a"

Eğer <ip>, <hedef-ismi>nin IP adreslerinden biriyse bu mekanizma eşleşir.

A                = "a"      [ ":" alan-belirtimi ] [ çifte-cidr-uzun ]

<hedef-ismi> üzerinde bir adres sorgusu yapılır ve dönen adresler <ip> ile karşılaştırılır. Eğer adreslerden biri eşleşirse, mekanizma eşlemiş olur.

5.4. "mx"

Eğer <ip>, alan adının MX konaklarından birine aitse bu mekanizma eşleşir.

MX               = "mx"     [ ":" alan-belirtimi ] [ çifte-cidr-uzun ]

check_host() işlevi önce <hedef-ismi> üzerinde bir MX sorgusu ve dönen her MX ismi üzerinde bir adres sorgusu yapar. Dönen adresler <ip> ile karşılaştırılır. Eğer adreslerden biri eşleşirse, mekanizma eşlemiş olur. Hizmet reddi (DoS) saldırısına dönüşmemesi için "mx" mekanizmasının değerlendirilmesi sırasında 10 taneden fazla MX ismi sorgusu yapılmamalıdır *ZORUNLU* (bkz, Güvenlik Değerlendirmeleri).

Örtük MX'ler hakkında

Eğer <hedef-ismi> hiç MX kaydı içermiyorsa, check_host() işlevi hedefin tek bir MX'i varmış gibi yapmamalı *ZORUNLU* ve <hedef-ismi>'ne doğrudan bir A sorgusu yöneltmemelidir *ZORUNLU*. Bu davranış standart "örtük MX" kuralını bozar ([RFC2821]'in Adres Çözümleme ve Posta Yönetimi bölümüne bakınız). Böyle bir davranış isteniyorsa, kaydı tasarlayanın bir "a" yönergesi belirtmesi gerekir.

5.5. "ptr"

Bu mekanizma, DNS'nin <ip> için tersine eşleşmesi olup olmadığını yani alan içindeki belli bir alan adını gösterip göstermediğini sınar.

PTR              = "ptr"    [ ":" alan-belirtimi ]

Önce, <ip>'nin ismi şu yordamla aranır: <ip> için, eğer adres bir IPv4 adresi ise "in-addr.arpa." içinde, IPv6 adresi ise "ip6.arpa." içinde ilgili PTR kaydını aramak suretiyle bir DNS tersine eşleşme sorgusu uygulanır. Dönen her kayıt için, alan adının IP adresi <ip> ile karşılaştırılır. Hizmet reddi (DoS) saldırısına dönüşmemesi için "ptr" mekanizmasının değerlendirilmesi sırasında 10 taneden fazla PTR sorgusu yapılmamalıdır *ZORUNLU* (bkz, Güvenlik Değerlendirmeleri). Eğer adreslerden biri eşleşirse, mekanizma eşlemiş olur. Şu sözde kod içinde:

gönderen_alan_adları := ptr_sorgusu (gönderen_konak_ip_adresi);
Eğer gönderen_alan_adı_sayısı > 10 ise
   gönderen_alan_adı_sayısı := 10;
gönderen_alan_adı_sayısı isim için {
   ip_adresleri := a_sorgusu (isim);
   Eğer gönderen_alan_ip_adresi == ip_adresleri'nden biri ise {
       doğrulanmış_gönderen_alan_adları += isim;
   }
}

Tüm doğrulanmış alan adlarına, <hedef-ismi> alanı ile eşleşiyor mu diye bakılır. Eğer bir eşleşme bulunursa, bu mekanizma eşleşmiş olur. Eğer doğrulanmış hiç alan adı yoksa ya da doğrulanmış olup da <hedef-ismi> ile eşleşen biri yoksa, bu mekanizma eşleşmemiş olur. Eğer PTR sorgusu sırasında bir DNS hatası oluşursa, bu mekanizma eşleşmemiş olur. Bir A sorgusu yaparken bir DNS hatası oluşursa, alan ismi atlanır ve arama devam eder.

Sözde kod:

doğrulanmış_gönderen_alan_adları içindeki her ad için {
  Eğer ad <alan-belirtimi> ile bitiyorsa, eşleşme döndür;
  Eğer ad <alan-belirtimi> ile aynıysa, eşleşme döndür;
}
eşleşmeme döndür;

Eğer <hedef-ismi>, doğrulanmış alan adlarından birinin atasıysa ya da onlardan biri ile aynıysa bu mekanizma eşleşir. Örneğin, "posta.iyi-misal.çom" adı "iyi-misal.çom" alanı altındadır ama "posta.berbat-misal.çom" değildir.

Bilginize

Yavaş olduğundan bu mekanizmanın kullanımı teşvik edilmemektedir. DNS hataları bakımından diğer mekanizmalar kadar güvenilir değildir ve arpa isim sunucularına ağır bir yük getirir. Eğer kullanılırsa, alanın konakları için doğru PTR kayıtları bulunmalı ve "ptr" mekanizması sınanması gereken son mekanizmalardan biri olmalıdır.

5.6. "ip4" ve "ip6"

Bu mekanizma, <ip>, belirtilen IP ağında mıymış acaba diye bakar.

IP4              = "ip4"      ":" ip4-ağı   [ ip4-cidr-uzun ]
IP6              = "ip6"      ":" ip6-ağı   [ ip6-cidr-uzun ]

ip4-cidr-uzun    = "/" 1*RAKAM
ip6-cidr-uzun    = "/" 1*RAKAM
çifte-cidr-uzun  = [ ip4-cidr-uzun ] [ "/" ip6-cidr-uzun ]

ip4-network      = dörtlü "." dörtlü "." dörtlü "." dörtlü
dörtlü             = RAKAM                 ; 0-9
                   / %x31-39 RAKAM       ; 10-99
                   / "1" 2RAKAM          ; 100-199
                   / "2" %x30-34 RAKAM   ; 200-249
                   / "25" %x30-35        ; 250-255
                   ; bilinen noktalı dörtlü gösterim.  192.0.2.0 gibi
ip6-ağı      = <[RFC3513], 2.2. bölüme göre>
                   ; örn, 2001:DB8::CD30

<ip> belirtilen ağ (IP bloğu) ile karşılaştırılır. Eğer CIDR uzunluğunun yüksek seviyeli bitleri eşleşiyorsa (Türkçesi, <ip> belirtilen IP bloğunun üyesi ise) mekanizma eşleşir.

Eğer ip4-cidr-uzun verilmemişse "/32" olduğu, ip6-cidr-uzun verilmemişse "/128" olduğu varsayılır. CIDR gösterimi yerine IP parçalarının kullanımına, örneğin 192.0.2.0/24 yerine 192.0.2 belirtilmesine izin verilmez.

5.7. "exists"

Bu mekanizma, bir DNS A kaydı sorgusu için kullanılmak üzere keyfi bir alan adı oluşturmakta kullanılır. Neye izin verildiğini saptamak için posta zarfının keyfi parçalarının oluşturduğu karmaşık şemaları mümkün kılar.

exists           = "exists"   ":" alan-belirtimi

alan-belirtimiMakrolar bölümüne göre yorumlanır. Sonuçlanan alan adı DNS A kaydı sorgusu için kullanılır. Eğer bir A kaydı dönerse bu mekanizma eşleşmiş olur. Bağlantı türü IPv6 bile olsa, DNS sorgu türü A'dır.

Alanlar bu mekanizmayı keyfi karmaşık sorguları belirtmek için kullanırlar. Örneğin, example.com'un şöyle bir kaydı olsun:

v=spf1 exists:%{ir}.%{l1r+-}._spf.%{d} -all

<hedef-ismi> "1.2.0.192.someuser._spf.example.com" olarak yorumlanabilirdi. Bu, kullanıcı ve istemci IP adresi seviyesinde ayrıntılı kararlar verilmesini mümkün kılar.

Bu mekanizma mevcut antispam DNS karalistelerinin (DNSBL) kullandığı sınama tarzını taklit eden sorguları etkinleştirir.