Dovecot ACL ile Posta Kutusu İzin Yönetimi

Kurumsal mail ortamlarında en sık karşılaşılan problemlerden biri şu: Bir çalışan izne çıkıyor, müdürü o kişinin maillerini okumak istiyor. Ya da bir departman, ortak bir posta kutusunu birlikte yönetmek zorunda. Tam bu noktada Dovecot ACL devreye giriyor. ACL (Access Control List) mekanizması, posta kutusu izinlerini granüler düzeyde yönetmenizi sağlayan, doğru kurulduğunda hayat kurtaran bir özellik.

Dovecot ACL Nedir ve Neden Önemlidir?

Dovecot’un ACL sistemi, RFC 4314 standardını (IMAP ACL Extension) temel alır. Bu standard, her IMAP klasörüne kullanıcı bazlı izinler tanımlamanıza olanak tanır. “Kim ne yapabilir?” sorusunun cevabını klasör düzeyinde verebilirsiniz.

Gerçek dünyada buna en çok ihtiyaç duyduğunuz senaryolar şunlardır:

  • Shared mailbox yönetimi: Birden fazla kişinin [email protected] adresine erişmesi gerekiyor
  • Vekalet (delegation): Yöneticinin sekreterinin, müdürün maillerini okuyup yanıtlaması
  • Departman klasörleri: Muhasebe ekibinin ortak bir klasörü paylaşması
  • Audit amaçlı erişim: IT yöneticisinin belirli bir hesabı izlemesi gerekiyor

Dovecot iki farklı ACL backend sunar. vfile backend, ACL kurallarını dosya sisteminde saklar. dict backend ise veritabanı tabanlı çalışır. Çoğu kurulum için vfile yeterlidir ve yönetimi daha basittir. Bu yazıda vfile üzerinden gideceğiz.

Kurulum ve Temel Yapılandırma

Dovecot ACL eklentisi çoğu dağıtımda dovecot-core paketiyle birlikte gelir. Ancak etkinleştirmek için birkaç adım gerekiyor.

Önce mevcut Dovecot kurulumunuzda ACL eklentisinin mevcut olup olmadığını kontrol edin:

dovecot --build-options | grep acl
# veya
find /usr/lib/dovecot -name "*.so" | grep acl

Şimdi temel yapılandırmayı yapalım. Dovecot konfigürasyon yapısına göre /etc/dovecot/conf.d/ dizininde çalışacağız:

# /etc/dovecot/conf.d/20-imap.conf dosyasını düzenle
nano /etc/dovecot/conf.d/20-imap.conf
protocol imap {
  # Mevcut mail_plugins satırını bul ve acl ekle
  mail_plugins = $mail_plugins imap_acl
}

Ardından ACL eklentisinin global ayarlarını yapılandırın:

# /etc/dovecot/conf.d/90-acl.conf dosyası oluştur veya düzenle
nano /etc/dovecot/conf.d/90-acl.conf
plugin {
  # ACL eklentisini etkinleştir
  acl = vfile

  # Global ACL dosyası (opsiyonel, tum kullanicilar icin genel kurallar)
  acl_globals_only = no

  # Kullanici, baskasinin posta kutusunu paylasabilsin mi?
  acl_shared_dict = file:/var/lib/dovecot/shared-mailboxes.db
}

Mail location ayarınızın da ACL eklentisini kullandığından emin olun:

# /etc/dovecot/conf.d/10-mail.conf
mail_plugins = $mail_plugins acl

Yapılandırmayı test edip servisi yeniden başlatın:

dovecot -n | grep -i acl
systemctl restart dovecot
systemctl status dovecot

ACL İzin Hakları: Harfler Ne Anlama Geliyor?

Dovecot ACL, her izni tek bir harfle temsil eder. Bu harfleri anlamadan doğru kural yazmak mümkün değil.

  • l (lookup): Klasörün varlığından haberdar olma hakkı. Klasörü görebilir ama içine giremez.
  • r (read): Klasördeki mailleri okuma hakkı
  • w (write): Maillerden flag kaldırma/ekleme hakkı (Seen, Answered vb.)
  • s (write-seen): Seen flag’ini değiştirme hakkı
  • t (write-deleted): Deleted flag’ini değiştirme hakkı
  • i (insert): Klasöre mail ekleme hakkı (APPEND ve COPY için gerekli)
  • p (post): Mail teslim etme hakkı (SMTP delivery)
  • e (expunge): Silinmiş mailleri kalıcı olarak temizleme hakkı
  • k (create): Alt klasör oluşturma hakkı
  • x (delete): Alt klasör silme hakkı
  • a (admin): Bu klasörün ACL kurallarını değiştirme hakkı

Pratikte en sık kullandığınız kombinasyonlar şunlar olacak:

  • lrs: Salt okuma erişimi. Klasörü görür, mailleri okur, okundu işaretleyebilir.
  • lrswite: Tam erişim ama admin olmadan. Günlük operasyonlar için ideal.
  • lrswiteakx: Tam admin erişimi dahil her şey.

vfile Backend ile ACL Dosyaları

vfile backend, ACL kurallarını her posta kutusu dizininde dovecot-acl adlı bir dosyada saklar. Klasör yapısı Maildir formatındaysa, her klasörün kendi dovecot-acl dosyası olur.

Tipik bir ACL dosyasının formatı şöyle:

identifier type rights

Identifier için kullanabilecekleriniz:

  • user=ali: Belirli bir kullanıcı
  • group=muhasebe: Belirli bir grup
  • anyone: Herkes (dikkatli kullanın!)
  • authenticated: Kimlik doğrulaması yapmış herkes
  • owner: Posta kutusu sahibi

Şimdi pratik örneklere geçelim.

Senaryo 1: Sekreter, Müdürün Postalarına Erişiyor

En klasik senaryo. Müdür [email protected], sekreter [email protected]. Sekreter, müdürün INBOX’ını okuyabilmeli ve yanıtlayabilmeli.

Maildir yapısında müdürün posta kutusu genellikle /var/mail/vhosts/sirket.com/mudur/ yolundadır.

# Mudur'un INBOX ACL dosyasini olustur
cat > /var/mail/vhosts/sirket.com/mudur/dovecot-acl << 'EOF'
# Sahip her zaman tam yetkiye sahip
owner lrswiteakx
# Sekreter okuyabilir, yazabilir, silebilir ama admin degil
user=sekreter lrswite
EOF

Dosyanın sahibini doğru ayarlayın:

chown dovecot:dovecot /var/mail/vhosts/sirket.com/mudur/dovecot-acl
chmod 600 /var/mail/vhosts/sirket.com/mudur/dovecot-acl

Sekreter şimdi Thunderbird veya Outlook’ta “Başkasının klasörünü aç” seçeneğiyle müdürün INBOX’ına erişebilir. IMAP protokolünde bu GETACL ve SETACL komutlarıyla da yönetilebilir.

Senaryo 2: Ortak Departman Posta Kutusu

[email protected] adresine gelen mailleri hem [email protected] hem de [email protected] okuyup yanıtlayabilmeli.

# bilgi kullanicisinin INBOX ACL dosyasi
cat > /var/mail/vhosts/sirket.com/bilgi/dovecot-acl << 'EOF'
owner lrswiteakx
user=ali lrswite
user=ayse lrswite
EOF

Ancak bu yapıda bir sorun var: Ali ve Ayse, “bilgi” hesabını kendi mail istemcilerinden görmek için ne yapacak? Bunun için Dovecot’un namespace ve shared mailbox özelliğini kullanmak gerekiyor.

Shared Mailbox Namespace Yapılandırması

Paylaşımlı posta kutularının IMAP istemcilerinde görünmesi için namespace tanımı gerekiyor:

# /etc/dovecot/conf.d/10-mail.conf dosyasina ekle
namespace shared {
  type = shared
  separator = /
  prefix = shared/%%u/
  location = maildir:/var/mail/vhosts/%%d/%%n
  subscriptions = yes
  list = yes
}

Buradaki %%u tam kullanıcı adını (user@domain), %%d domain’i, %%n sadece kullanıcı adını temsil eder.

Shared mailbox veritabanı için gerekli dizini oluşturun:

mkdir -p /var/lib/dovecot
touch /var/lib/dovecot/shared-mailboxes.db
chown dovecot:dovecot /var/lib/dovecot/shared-mailboxes.db

Şimdi Ali, mail istemcisinde shared/[email protected]/INBOX klasörünü görebilecek. Ancak bu klasörün listede görünmesi için ACL’de l yetkisinin olması şart.

Senaryo 3: Grup Tabanlı ACL

Büyük kurulumlarda tek tek kullanıcı eklemek yerine grup bazlı yetkilendirme çok daha yönetilebilir. Dovecot, sistem gruplarını veya kendi grup mekanizmasını kullanabilir.

/etc/dovecot/conf.d/90-acl.conf dosyasına grup desteğini etkinleştirin:

plugin {
  acl = vfile
  acl_shared_dict = file:/var/lib/dovecot/shared-mailboxes.db
}

Ardından bir departman klasörü için grup bazlı ACL:

# Muhasebe departmani posta kutusu
cat > /var/mail/vhosts/sirket.com/muhasebe/dovecot-acl << 'EOF'
owner lrswiteakx
# muhasebe grubundaki herkes okuyup yazabilir
group=muhasebe lrswite
# IT grubu sadece okuyabilir (audit amacli)
group=it lr
EOF

Sistem grupları dovecot tarafından tanınması için auth_username_format ve grup lookup ayarlarının doğru yapılandırılmış olması gerekir. Bu genellikle /etc/dovecot/conf.d/10-auth.conf ve ilgili auth-system.conf.ext dosyalarında halledilir.

Global ACL Dosyası ile Merkezi Yönetim

Her posta kutusu için ayrı ayrı ACL dosyası oluşturmak küçük kurulumlar için uygun olsa da büyük yapılarda merkezi yönetim şart. Global ACL dosyası tüm kullanıcılara uygulanır.

# /etc/dovecot/conf.d/90-acl.conf
plugin {
  acl = vfile:/etc/dovecot/dovecot-acl
  acl_shared_dict = file:/var/lib/dovecot/shared-mailboxes.db
}
# /etc/dovecot/dovecot-acl - Global ACL dosyasi
# Format: namespace pattern identifier rights

# Postmaster tum posta kutularini okuyabilir
* user=postmaster lrs

# Domain admin her seyi yapabilir
* [email protected] lrswiteakx

Bu yaklaşımda dikkatli olun. anyone veya authenticated ile geniş yetkiler vermek ciddi güvenlik açıklarına yol açar.

IMAP Komutlarıyla ACL Yönetimi

Dovecot ACL’yi doğrudan IMAP protokolü üzerinden de yönetebilirsiniz. Bu özellikle mail istemcisi entegrasyonu yaparken veya script tabanlı yönetim için kullanışlıdır.

OpenSSL veya telnet ile IMAP’e bağlanarak test yapabilirsiniz:

# STARTTLS ile IMAP baglan
openssl s_client -connect mail.sirket.com:993 -quiet

# Giris yap
a1 LOGIN [email protected] sifre

# INBOX ACL'lerini listele
a2 GETACL INBOX

# Sekreter'e yetki ver
a3 SETACL INBOX sekreter lrswite

# Sekreter'den yetki al
a4 DELETEACL INBOX sekreter

# Cikis
a5 LOGOUT
# Doveadm ile ACL yonetimi (cok daha pratik)
# Mevcut ACL'leri listele
doveadm acl get -u [email protected] INBOX

# ACL ekle
doveadm acl set -u [email protected] INBOX "user=sekreter" lrswite

# ACL sil
doveadm acl delete -u [email protected] INBOX "user=sekreter"

# Bir kullanicinin erisim sagladigi tum klasorleri listele
doveadm acl rights -u [email protected]

doveadm bu işlemler için en temiz araç. Production ortamında doğrudan IMAP komutları yerine doveadm kullanmanızı şiddetle tavsiye ederim.

ACL Debug ve Sorun Giderme

ACL çalışmıyor, kullanıcı erişemiyor, klasörler görünmüyor… Bu tip problemler için önce Dovecot loglarına bakın:

# Gercek zamanli log takibi
tail -f /var/log/dovecot.log | grep -i acl

# Mail log (authentication ve delivery hatalari)
tail -f /var/log/mail.log

# Debug modunu gecici olarak ac
# /etc/dovecot/conf.d/10-logging.conf
auth_debug = yes
auth_debug_passwords = no
mail_debug = yes

Sık karşılaşılan sorunlar ve çözümleri:

Sorun: Kullanıcı klasörü göremiyor

# ACL dosyasinda 'l' yetkisi var mi kontrol et
cat /var/mail/vhosts/sirket.com/hedef_kullanici/dovecot-acl

# Namespace ayarinin dogru oldugunu kontrol et
doveadm config -u [email protected] | grep namespace

Sorun: ACL dosyası var ama etki etmiyor

# Dovecot acl plugin yuklenmis mi kontrol et
doveadm config | grep mail_plugins

# ACL dosyasinin izinlerini kontrol et
ls -la /var/mail/vhosts/sirket.com/hedef_kullanici/dovecot-acl

# Dosya sahibi dogru mu?
stat /var/mail/vhosts/sirket.com/hedef_kullanici/dovecot-acl

Sorun: SETACL komutu hata veriyor

Genellikle acl_anyone parametresi veya admin yetkisi eksikliğinden kaynaklanır:

# /etc/dovecot/conf.d/90-acl.conf
plugin {
  acl = vfile
  # Kimliği dogrulanmis kullanicilara ACL degisikligine izin ver
  # (Dikkatli kullanin!)
  acl_anyone = allow
}

Postfix ile Entegrasyon: Paylaşımlı Kutulara Mail Teslimi

Sadece okuma erişimi değil, paylaşımlı posta kutularına doğrudan mail teslimi de yaygın bir ihtiyaç. Postfix tarafında virtual alias ile bu çözülür:

# /etc/postfix/virtual
[email protected]    [email protected], [email protected], [email protected]

Ancak bu her kullanıcıya ayrı kopya gönderir. Gerçek shared mailbox için sadece [email protected] kullanıcısına teslim edilmeli, diğerleri ACL ile erişmeli:

# /etc/postfix/virtual - Daha temiz yaklasim
[email protected]    bilgi

Bu şekilde mail sadece bilgi kullanıcısına düşer, Ali ve Ayse ACL üzerinden erişir. Duplication sorunu olmaz, tek kaynak of truth prensibine uyar.

Güvenlik Önerileri

ACL güçlü bir araç ama yanlış kullanıldığında ciddi güvenlik sorunlarına kapı aralar.

  • anyone yetkisini asla dikkatsizce kullanmayın: Tüm kullanıcılara erişim vermek demek kimlik doğrulaması yapmış herhangi bir kullanıcı demektir. Yanlış kişiler bile posta kutunuzu görebilir.
  • Admin yetkisini kısıtlayın: a (admin) yetkisi, kullanıcının o klasörün ACL kurallarını değiştirmesine izin verir. Bunu sadece gerçekten gerektiğinde verin.
  • Düzenli ACL audit yapın: Özellikle çalışan ayrılıklarından sonra ACL kurallarını temizleyin.
  • Global ACL dosyasını minimize tutun: Merkezi dosyada ne kadar az kural olursa, yanlışlıkla geniş erişim verme riski o kadar az olur.
# Tum kullanicilarin ACL durumunu duzenli audit icin script
#!/bin/bash
MAIL_BASE="/var/mail/vhosts/sirket.com"
for user_dir in $MAIL_BASE/*/; do
    user=$(basename $user_dir)
    acl_file="$user_dir/dovecot-acl"
    if [ -f "$acl_file" ]; then
        echo "=== $user ACL ==="
        cat "$acl_file"
        echo ""
    fi
done

Bu scripti cron ile aylık çalıştırıp çıktısını kaydedin. Kimin kime erişimi olduğunu periyodik olarak gözden geçirmek kurumsal güvenlik politikalarının bir parçası olmalı.

Maildir++ ve Cyrus Formatı İçin Notlar

Eğer Maildir yerine Cyrus IMAP formatı veya farklı bir depolama formatı kullanıyorsanız, ACL dosyalarının konumu değişebilir. Dovecot’un kendi mdbox veya sdbox formatında çalışıyorsanız:

# Mevcut mail location formatini kontrol et
doveadm config | grep mail_location

# mdbox icin ACL dosya konumu
# /var/mail/vhosts/sirket.com/kullanici/mailboxes/INBOX/dbox-Mails/dovecot-acl
# degil, metadata olarak saklanir

# Hangi formatta olursaniz olun doveadm her zaman calisir
doveadm acl get -u [email protected] INBOX

Sonuç

Dovecot ACL, doğru yapılandırıldığında kurumsal mail yönetiminin olmazsa olmaz parçası. Sekreter delegasyonundan departman paylaşımlı kutularına, audit erişiminden merkezi yönetim scriptlerine kadar pek çok senaryoyu temiz ve RFC uyumlu bir şekilde çözüyor.

Başlarken en pratik yaklaşım şu: Küçük başlayın. Önce tek bir senaryo için vfile backend ile bireysel kullanıcı bazlı ACL kuralı yazın, test edin, logları inceleyin. Sonra grup bazlı yapıya ve global ACL dosyasına geçin. doveadm acl komutları her aşamada en iyi arkadaşınız olacak, komut satırından hem okuma hem yazma işlemlerini hızlıca halledebilirsiniz.

Unutmayın, bir çalışan şirketten ayrıldığında ACL temizliği yapmayı ihmal etmeyin. Eski çalışanlar mail sistemine erişmeye devam edebilir, bu hem güvenlik hem de uyumluluk açısından ciddi risk oluşturur. Kullanıcı silme/devre dışı bırakma prosedürlerinize mutlaka “ACL audit” adımını ekleyin.

Yorum yapın