İçindekiler
Zimbra zmprov Komutlarında ERROR: service.PERM_DENIED Hatası
Bu yazıda, Zimbra sunucusunda tüm zmprov komutlarında alınan aşağıdaki hatanın nasıl çözüldüğünü adım adım anlatıyorum:
ERROR: service.PERM_DENIED (permission denied: Error in Authentication)
Sorun, Zimbra’nın dahili LDAP admin hesabı olan:
uid=zimbra,cn=admins,cn=zimbra
hesabının parola senkronizasyonunun bozulması ve/veya hesabın LDAP tarafında doğru şekilde authenticate olamaması nedeniyle oluştu.
Bu çözüm sürecinde yapılan işlemler şunlardır:
localconfigiçindeki LDAP bilgileri kontrol edildi.uid=zimbra,cn=admins,cn=zimbrahesabı ile LDAP bind testi yapıldı.ldap_bind: Invalid credentials (49)hatası tespit edildi.- Dahili Zimbra LDAP admin hesabı
activedurumuna alındı. zmldappasswdilezimbra_ldap_passwordyeniden senkronlandı.- İşlem sırasında alınan ara hatalar tek tek giderildi.
- Son olarak
zmprovkomutları tekrar çalışır hale geldi.
Alınan Ana Hata
Zimbra üzerinde zmprov komutları çalıştırıldığında aşağıdaki hata alınıyordu:
ERROR: service.PERM_DENIED (permission denied: Error in Authentication)
Bu hata, zmprov komutlarının Zimbra’nın dahili authentication mekanizması üzerinden LDAP’a doğru şekilde bağlanamadığını gösteriyordu.
İlk olarak zimbra kullanıcısına geçildi:
su - zimbra
Ardından LDAP ve Zimbra internal admin bilgileri kontrol edildi:
zmlocalconfig -s | egrep 'zimbra_ldap_user|zimbra_ldap_userdn|zimbra_ldap_password|ldap_root_password|ldap_host|ldap_port'
Örnek çıktı şu şekildeydi:
ldap_host = mail.example.com
ldap_port = 389
ldap_root_password = ********
zimbra_ldap_password = ********
zimbra_ldap_user = zimbra
zimbra_ldap_userdn = uid=zimbra,cn=admins,cn=zimbra
Bu noktada önemli olan değerler şunlardı:
ldap_host
ldap_port
ldap_root_password
zimbra_ldap_password
zimbra_ldap_userdn
Özellikle şu DN kritik öneme sahipti:
uid=zimbra,cn=admins,cn=zimbra
Çünkü zmprov normal çalışırken Zimbra bu dahili LDAP admin hesabını kullanır.
İlk Teşhis: LDAP Bind Testi
Sorunun gerçekten LDAP authentication kaynaklı olup olmadığını anlamak için ldapwhoami testi yapıldı.
zimbra kullanıcısı ile aşağıdaki değişkenler alındı:
ZLPASS=$(zmlocalconfig -s -m nokey zimbra_ldap_password)
LDAP_HOST=$(zmlocalconfig -m nokey ldap_host)
LDAP_PORT=$(zmlocalconfig -m nokey ldap_port)
Ardından parola geçici bir dosyaya yazıldı:
echo "$ZLPASS" > /tmp/zimbra_ldap_pw
chmod 600 /tmp/zimbra_ldap_pw
LDAP bind testi çalıştırıldı:
/opt/zimbra/common/bin/ldapwhoami -x \
-H ldap://${LDAP_HOST}:${LDAP_PORT} \
-D "uid=zimbra,cn=admins,cn=zimbra" \
-y /tmp/zimbra_ldap_pw
Bu test sonucunda aşağıdaki hata alındı:
ldap_bind: Invalid credentials (49)
Bu sonuç teşhis açısından kritikti.
Anlamı şuydu:
localconfig içindeki zimbra_ldap_password, LDAP içindeki uid=zimbra,cn=admins,cn=zimbra hesabının gerçek parolasıyla uyuşmuyordu.
Yani sorun artık netleşmişti:
Zimbra internal LDAP admin hesabı authenticate olamıyor.
Root LDAP Bilgileri ile Müdahale Hazırlığı
Sorunu düzeltmek için root LDAP parolası ve LDAP host bilgileri root shell içinde tekrar tanımlandı.
Root kullanıcısına geçildi:
exit
Root olarak şu değişkenler alındı:
LDAP_HOST=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_host')
LDAP_PORT=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_port')
ROOTPASS=$(su - zimbra -c 'zmlocalconfig -s -m nokey ldap_root_password')
LDAP URI kontrol edildi:
echo "LDAP URI: ldap://${LDAP_HOST}:${LDAP_PORT}"
Beklenen çıktı:
LDAP URI: ldap://mail.example.com:389
Bu kontrol önemlidir. Çünkü daha önce değişkenler root shell içinde tanımlı olmadığı için şu hata alınmıştı:
Could not parse LDAP URI(s)=ldap://: (5)
Bu hatanın sebebi şuydu:
LDAP_HOST ve LDAP_PORT değişkenleri boştu.
Doğru kullanım root shell içinde değişkenleri yeniden almaktır:
LDAP_HOST=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_host')
LDAP_PORT=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_port')
Olası Hata: Could not parse LDAP URI(s)=ldap://: (5)
Eğer aşağıdaki hata alınırsa:
Could not parse LDAP URI(s)=ldap://: (5)
sebep büyük ihtimalle şudur:
LDAP_HOST veya LDAP_PORT değişkeni boş kalmıştır.
Kontrol için:
echo "LDAP URI: ldap://${LDAP_HOST}:${LDAP_PORT}"
Eğer çıktı şu şekildeyse:
LDAP URI: ldap://:
değişkenler tanımlı değildir.
Çözüm:
LDAP_HOST=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_host')
LDAP_PORT=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_port')
ROOTPASS=$(su - zimbra -c 'zmlocalconfig -s -m nokey ldap_root_password')
Sonra tekrar kontrol edilir:
echo "LDAP URI: ldap://${LDAP_HOST}:${LDAP_PORT}"
Beklenen:
LDAP URI: ldap://mail.example.com:389
Olası Hata: /tmp/ldap_root_pw: Permission denied
Root parolasını /tmp/ldap_root_pw dosyasına yazarken şu hata alındı:
-bash: /tmp/ldap_root_pw: Permission denied
Bu hata, /tmp/ldap_root_pw dosyasının daha önce farklı kullanıcı ile oluşturulmuş olması nedeniyle oluştu.
Çözüm olarak /tmp yerine root kullanıcısının kendi dizini kullanıldı.
Root olarak:
rm -f /tmp/ldap_root_pw /tmp/zimbra_ldap_pw
printf '%s' "$ROOTPASS" > /root/ldap_root_pw
chmod 600 /root/ldap_root_pw
Bu işlemden sonra root LDAP bind veya LDAP modify işlemleri için /root/ldap_root_pw kullanılabilir hale geldi.
Dahili Zimbra LDAP Admin Hesabını Active Yapmak
uid=zimbra,cn=admins,cn=zimbra hesabının durumunu düzeltmek için LDIF dosyası oluşturuldu.
Root olarak:
cat > /root/unlock-zimbra-admin.ldif <<'EOF'
dn: uid=zimbra,cn=admins,cn=zimbra
changetype: modify
replace: zimbraAccountStatus
zimbraAccountStatus: active
EOF
Ardından LDAP modify komutu çalıştırıldı:
/opt/zimbra/common/bin/ldapmodify -x \
-H "ldap://${LDAP_HOST}:${LDAP_PORT}" \
-D "cn=config" \
-y /root/ldap_root_pw \
-f /root/unlock-zimbra-admin.ldif
Başarılı çıktı:
modifying entry "uid=zimbra,cn=admins,cn=zimbra"
Bu çıktı, dahili Zimbra LDAP admin hesabının durumunun active yapıldığını gösterir.
zimbra_ldap_password Değerini Yeniden Senkronlama
Hesap durumu düzeltildikten sonra zimbra_ldap_password yeniden oluşturuldu ve LDAP ile local config senkronlandı.
zimbra kullanıcısına geçildi:
su - zimbra
Yeni parola üretildi:
NEWPASS=$(openssl rand -base64 32)
Ardından zmldappasswd çalıştırıldı:
zmldappasswd "$NEWPASS"
Başarılı çıktı:
Updating local config and LDAP
Bu çıktı, Zimbra’nın local config tarafındaki LDAP parolası ile LDAP içindeki ilgili hesabın parolasının senkronlandığını gösterir.
Bu işlemden sonra tekrar zimbra_ldap_password alınır:
ZLPASS=$(zmlocalconfig -s -m nokey zimbra_ldap_password)
LDAP_HOST=$(zmlocalconfig -m nokey ldap_host)
LDAP_PORT=$(zmlocalconfig -m nokey ldap_port)
Olası Hata: /home/zimbra/zimbra_ldap_pw: No such file or directory
Parola dosyası /home/zimbra altına yazılmak istendiğinde şu hata alındı:
-bash: /home/zimbra/zimbra_ldap_pw: No such file or directory
chmod: cannot access '/home/zimbra/zimbra_ldap_pw': No such file or directory
Sebep:
Zimbra kullanıcısının home dizini /home/zimbra değildi.
Bu nedenle doğru path olarak /opt/zimbra kullanıldı.
Kontrol için:
echo "$HOME"
pwd
Ardından dosya /opt/zimbra altına yazılabilir:
printf '%s' "$ZLPASS" > /opt/zimbra/zimbra_ldap_pw
chmod 600 /opt/zimbra/zimbra_ldap_pw
Olası Hata: Server is unwilling to perform (53)
LDAP bind testinde şu hata alındı:
ldap_bind: Server is unwilling to perform (53)
additional info: unauthenticated bind (DN with no password) disallowed
Bu hata, parola dosyasının boş olduğunu gösterdi.
Bu durumun sebebi, komutun root shell içinde çalıştırılması ancak $ZLPASS değişkeninin root ortamında tanımlı olmamasıydı.
Yani şu komut root altında çalıştırıldığında:
printf '%s' "$ZLPASS" > /opt/zimbra/zimbra_ldap_pw
$ZLPASS boş olduğu için dosyaya parola yazılmadı.
Bu nedenle LDAP, DN verilmiş ama parola verilmemiş bir bind denemesi olarak algıladı.
Çözüm olarak değişkenler root shell içinde tekrar alındı:
rm -f /opt/zimbra/zimbra_ldap_pw /root/zimbra_ldap_pw
ZLPASS=$(su - zimbra -c 'zmlocalconfig -s -m nokey zimbra_ldap_password')
LDAP_HOST=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_host')
LDAP_PORT=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_port')
Parola dosyası root dizinine yazıldı:
printf '%s' "$ZLPASS" > /root/zimbra_ldap_pw
chmod 600 /root/zimbra_ldap_pw
Dosyanın boş olmadığını kontrol etmek için:
wc -c /root/zimbra_ldap_pw
Burada çıktı 0 olmamalıdır.
Ardından LDAP bind testi tekrar çalıştırıldı:
/opt/zimbra/common/bin/ldapwhoami -x \
-H "ldap://${LDAP_HOST}:${LDAP_PORT}" \
-D "uid=zimbra,cn=admins,cn=zimbra" \
-y /root/zimbra_ldap_pw
Beklenen başarılı çıktı:
dn:uid=zimbra,cn=admins,cn=zimbra
Nihai Test: zmprov Komutlarını Kontrol Etmek
LDAP bind başarılı olduktan sonra Zimbra servisleri yeniden başlatıldı:
su - zimbra
zmcontrol restart
Ardından zmprov testi yapıldı:
zmprov gaaa
Bu komut artık service.PERM_DENIED hatası vermeden çalışmalıdır.
Alternatif test olarak LDAP modu da denenebilir:
zmprov -l gaaa
Bu işlemden sonra zmprov komutları tekrar çalışır hale geldi.
Süreçte Alınan Hatalar ve Çözümleri
1. ERROR: service.PERM_DENIED
Ana hata:
ERROR: service.PERM_DENIED (permission denied: Error in Authentication)
Sebep:
Zimbra internal LDAP admin hesabı authenticate olamıyordu.
Çözüm:
ldapwhoami testi yapıldı.
uid=zimbra,cn=admins,cn=zimbra hesabı active yapıldı.
zmldappasswd ile zimbra_ldap_password yeniden senkronlandı.
zmcontrol restart sonrası zmprov tekrar test edildi.
2. ldap_bind: Invalid credentials (49)
Hata:
ldap_bind: Invalid credentials (49)
Sebep:
localconfig içindeki zimbra_ldap_password ile LDAP içindeki gerçek parola uyuşmuyordu.
Çözüm:
NEWPASS=$(openssl rand -base64 32)
zmldappasswd "$NEWPASS"
3. Could not parse LDAP URI(s)=ldap://: (5)
Hata:
Could not parse LDAP URI(s)=ldap://: (5)
Sebep:
LDAP_HOST ve LDAP_PORT root shell içinde boştu.
Çözüm:
LDAP_HOST=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_host')
LDAP_PORT=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_port')
ROOTPASS=$(su - zimbra -c 'zmlocalconfig -s -m nokey ldap_root_password')
4. /tmp/ldap_root_pw: Permission denied
Hata:
-bash: /tmp/ldap_root_pw: Permission denied
Sebep:
/tmp/ldap_root_pw dosyası daha önce farklı kullanıcı ile oluşturulmuştu.
Çözüm:
rm -f /tmp/ldap_root_pw /tmp/zimbra_ldap_pw
printf '%s' "$ROOTPASS" > /root/ldap_root_pw
chmod 600 /root/ldap_root_pw

5. /home/zimbra/zimbra_ldap_pw: No such file or directory
Hata:
-bash: /home/zimbra/zimbra_ldap_pw: No such file or directory
Sebep:
Zimbra kullanıcısının home dizini /home/zimbra değildi.
Çözüm:
echo "$HOME"
pwd
Ardından doğru yol kullanıldı:
printf '%s' "$ZLPASS" > /opt/zimbra/zimbra_ldap_pw
chmod 600 /opt/zimbra/zimbra_ldap_pw
6. Server is unwilling to perform (53)
Hata:
ldap_bind: Server is unwilling to perform (53)
additional info: unauthenticated bind (DN with no password) disallowed
Sebep:
Parola dosyası boştu.
Root shell içinde ZLPASS değişkeni tanımlı değildi.
Çözüm:
ZLPASS=$(su - zimbra -c 'zmlocalconfig -s -m nokey zimbra_ldap_password')
LDAP_HOST=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_host')
LDAP_PORT=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_port')
printf '%s' "$ZLPASS" > /root/zimbra_ldap_pw
chmod 600 /root/zimbra_ldap_pw
wc -c /root/zimbra_ldap_pw
Sonra tekrar bind testi:
/opt/zimbra/common/bin/ldapwhoami -x \
-H "ldap://${LDAP_HOST}:${LDAP_PORT}" \
-D "uid=zimbra,cn=admins,cn=zimbra" \
-y /root/zimbra_ldap_pw
Uygulanan Tam Çözüm Akışı
Aşağıdaki akış, bu senaryoda problemi çözen komut sırasıdır.
1. Zimbra LDAP bilgilerini kontrol et
su - zimbra
zmlocalconfig -s | egrep 'zimbra_ldap_user|zimbra_ldap_userdn|zimbra_ldap_password|ldap_root_password|ldap_host|ldap_port'
2. uid=zimbra LDAP bind testini yap
ZLPASS=$(zmlocalconfig -s -m nokey zimbra_ldap_password)
LDAP_HOST=$(zmlocalconfig -m nokey ldap_host)
LDAP_PORT=$(zmlocalconfig -m nokey ldap_port)
echo "$ZLPASS" > /tmp/zimbra_ldap_pw
chmod 600 /tmp/zimbra_ldap_pw
/opt/zimbra/common/bin/ldapwhoami -x \
-H ldap://${LDAP_HOST}:${LDAP_PORT} \
-D "uid=zimbra,cn=admins,cn=zimbra" \
-y /tmp/zimbra_ldap_pw
Eğer çıktı şu ise:
ldap_bind: Invalid credentials (49)
parola senkronizasyonu bozulmuştur.
3. Root shell içinde LDAP değişkenlerini tekrar al
exit
LDAP_HOST=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_host')
LDAP_PORT=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_port')
ROOTPASS=$(su - zimbra -c 'zmlocalconfig -s -m nokey ldap_root_password')
echo "LDAP URI: ldap://${LDAP_HOST}:${LDAP_PORT}"
4. Root LDAP parola dosyasını oluştur
rm -f /tmp/ldap_root_pw /tmp/zimbra_ldap_pw
printf '%s' "$ROOTPASS" > /root/ldap_root_pw
chmod 600 /root/ldap_root_pw
5. uid=zimbra hesabını active yap
cat > /root/unlock-zimbra-admin.ldif <<'EOF'
dn: uid=zimbra,cn=admins,cn=zimbra
changetype: modify
replace: zimbraAccountStatus
zimbraAccountStatus: active
EOF
/opt/zimbra/common/bin/ldapmodify -x \
-H "ldap://${LDAP_HOST}:${LDAP_PORT}" \
-D "cn=config" \
-y /root/ldap_root_pw \
-f /root/unlock-zimbra-admin.ldif
Başarılı çıktı:
modifying entry "uid=zimbra,cn=admins,cn=zimbra"
6. zimbra_ldap_password değerini yeniden senkronla
su - zimbra
NEWPASS=$(openssl rand -base64 32)
zmldappasswd "$NEWPASS"
Başarılı çıktı:
Updating local config and LDAP
7. Bind testini tekrar yap
Root shell içinde:
ZLPASS=$(su - zimbra -c 'zmlocalconfig -s -m nokey zimbra_ldap_password')
LDAP_HOST=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_host')
LDAP_PORT=$(su - zimbra -c 'zmlocalconfig -m nokey ldap_port')
printf '%s' "$ZLPASS" > /root/zimbra_ldap_pw
chmod 600 /root/zimbra_ldap_pw
wc -c /root/zimbra_ldap_pw
Ardından:
/opt/zimbra/common/bin/ldapwhoami -x \
-H "ldap://${LDAP_HOST}:${LDAP_PORT}" \
-D "uid=zimbra,cn=admins,cn=zimbra" \
-y /root/zimbra_ldap_pw
Beklenen çıktı:
dn:uid=zimbra,cn=admins,cn=zimbra
8. Zimbra servislerini yeniden başlat
su - zimbra
zmcontrol restart
9. zmprov komutunu test et
zmprov gaaa
Alternatif test:
zmprov -l gaaa
Bu aşamadan sonra zmprov komutlarında alınan:
ERROR: service.PERM_DENIED (permission denied: Error in Authentication)
hatası giderilmiş oldu.
Güvenlik Notu
Bu işlem sırasında LDAP parolaları terminalde ve geçici dosyalarda kullanıldığı için işlem bittikten sonra geçici parola dosyaları silinmelidir.
rm -f /root/ldap_root_pw /root/zimbra_ldap_pw /root/unlock-zimbra-admin.ldif
rm -f /tmp/zimbra_ldap_pw /tmp/ldap_root_pw
Ayrıca parola değerleri herhangi bir dokümana, blog yazısına veya ekran görüntüsüne açık şekilde eklenmemelidir.
Bu senaryoda parola bilgisi görüntülendiği için zmldappasswd ile parola yeniden oluşturulmuş ve local config ile LDAP tarafı tekrar senkron hale getirilmiştir.
Sonuç
Zimbra üzerinde tüm zmprov komutlarında alınan:
ERROR: service.PERM_DENIED (permission denied: Error in Authentication)
hatasının nedeni, bu senaryoda Zimbra’nın dahili LDAP admin hesabının doğru şekilde authenticate olamamasıydı.
Teşhis sürecinde:
ldap_bind: Invalid credentials (49)
hatası görüldü.
Çözüm için:
uid=zimbra,cn=admins,cn=zimbra
hesabı LDAP üzerinde active hale getirildi, ardından:
zmldappasswd "$NEWPASS"
komutu ile zimbra_ldap_password yeniden senkronlandı.
Son olarak:
zmcontrol restart
zmprov gaaa
komutlarıyla servisler yeniden başlatıldı ve zmprov komutlarının tekrar çalıştığı doğrulandı.
Bu işlem sonucunda Zimbra zmprov service.PERM_DENIED hatası kalıcı olarak giderildi.
