Web Siteniz

Zimbra zmprov ERROR: service.PERM_DENIED Hatası ve Kalıcı Çözümü

Yazar admin
28 dakika Okuma Süresi
A+A-
Sıfırla
Zimbra zmprov ERROR service.PERM_DENIED Hatası Kalıcı Çözümü

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:

  • localconfig içindeki LDAP bilgileri kontrol edildi.
  • uid=zimbra,cn=admins,cn=zimbra hesabı ile LDAP bind testi yapıldı.
  • ldap_bind: Invalid credentials (49) hatası tespit edildi.
  • Dahili Zimbra LDAP admin hesabı active durumuna alındı.
  • zmldappasswd ile zimbra_ldap_password yeniden senkronlandı.
  • İşlem sırasında alınan ara hatalar tek tek giderildi.
  • Son olarak zmprov komutları 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

Zimbra zmprov ERROR service.PERM_DENIED Hatası Kalıcı Çözümü
Zimbra zmprov ERROR service.PERM_DENIED Hatası Kalıcı Çözümü

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.

Ayrıca şunları da beğenebilirsiniz

Yorum Bırakın

* Bu formu kullanarak verilerinizin bu web sitesi tarafından saklanmasını ve işlenmesini kabul etmiş olursunuz.

Bu web sitesi deneyiminizi iyileştirmek için çerezler kullanır. Bunu kabul ettiğinizi varsayacağız, ancak isterseniz devre dışı bırakabilirsiniz. Kabul Et Devamı