2022

 

Merhaba,

FreeBSD üzerinde kurulu PHP+Nginx web sunucumda tarih ile alakalı bazı sorunlar olduğunu farkettim. Şöyle ki sunucumda yapılan işlemlerde UTC+3 değil UTC+0 zaman dilimi kullanılıyor ve tüm işlemler 3 saat geriden yapılıyordu.

Durumdan emin olmak için bir test yapmak istedim. Saati veren bir PHP Scripti sunucumda çalıştırdım ve gerçekten de PHP işlemlerinde saat bilgisinin hatalı olduğunu farkettim. Kullandığım script ve verdiği çıktıyı aşağıya ekliyorum.

 

 

Kullandığım script;

    <?php echo "Saat " . date("h:i:sa"); ?>

Bu scriptin verdiği saat bilgisi şöyle;

    Saat 06:38:19am

Oysa sistem saati o anda;

    # date
    Thu Sep  1 09:38:20 +03 2022

 Sistem saati UTC+3 olduğu halde PHP Scriptleri UTC+0  olarak sonuç veriyor. Bu durumu düzeltmek için php.ini dosyasında ufak bir değişiklik yapmamız gerekiyor. FreeBSD üzerinde standart PHP kurulumunda php.ini dosyasının yolu /usr/local/etc/php.ini olarak belirleniyor. Bu dosyayı açıp içerisindeki şu satırı bulunuz;

    ;date.timezone =

Bu satırın başındaki ; işaretini kaldırıp şu değeri verelim;

    date.timezone = Europe/Istanbul

Burada ters slash işaretine dikkat edelim, normal slash konulursa ayar doğru çalışmıyor. Dosyayı kaydedip çıkarak kuruluma göre web sunucumuzu veya PHP-FPM'i yeniden başlatıp sonucu kontrol edelim. Yukarıdaki scripti çağırdığımızda saat doğru geliyor ise PHP için time-zone ayarımızı başarı ile yapmışız demektir.

Proxmox VE ile ilgili deneyimlediğim bir işlemi daha buraya yazmak istedim. Proxmox VE sürümü ben kurulum yaptığımda 7.1 idi ve sonrasında 7.2 sürümü kullanıma sunuldu. 7.2 sürümü ile gelen değişimlere şu adrese göz atarak bakabilirsiniz (Proxmox Virtual Environment 7.2 released) Ben de 7.1 olan sürümümü güncelleyerek 7.2 yapmak istedim ve bu konuda biraz araştırma yaptım. Proxmox VE yazılımını ücretsiz olarak kullanıyorsanız bu güncellemeyi yapabilmek için bazı işlemler yapmanız gerekmekte. Proxmox VE depoları ile ilgili detaylı bilgi için https://pve.proxmox.com/wiki/Package_Repositories adresini ziyaret edebilirsiniz.  
 
Burada önemli bir UYARI! Proxmox VE yazılımını üye olmadan kullandığımız için Proxmox VE No-Subscription deposunu kullanacağız ve bu depo "production" ortamları için önerilmiyor. Çünkü bu depodaki paketler yeterince test edilmemiş ve doğrulanmamış olabiliyor. Ben bu riski minimize etmek için işleme başlamadan önce tüm sanal makinelerimin yedeğini aldım ve öncesinde test amaçlı kurduğum başka bir Proxmox VE üzerinde güncelleme işlemi yapıp sorun olmadığını teyit ettim. Siz de kendinizce önlemler alınız.
 
Gelelim yapılması gerekenlere. Aslında çok zor ve uzun bir işlem değil. Öncelikle pve-no-subscription deposunu elle eklememiz lazım. Bunun için ssh ile sunucumuza bağlanıp nano ile şu yoldaki dosyayı açalım;
# nano /etc/apt/sources.list

Açtığımız dosyanın sonuna şu satırları ekleyelim;

# PVE pve-no-subscription repository provided by proxmox.com,
# NOT recommended for production use
deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription

ctrl+x ve Yes ile dosyada yaptığımız değişimi kaydedip çıkalım. Bundan sonra vermemiz gereken komutlar;

# apt update && apt dist-upgrade

Bu komutların sonunda sistem güncellenmiş olacak. Güncelleme bittikten sonra tüm sanal makinelerinizi durdurup Proxmox VE sunucunuzu yeniden başlatın;

# reboot
Sunucunuz yeniden başladığında Proxmox VE sürüm bilgisini kontrol edin. İyi çalışmalar..

 

Bu dökümanda; Let's Encrypt Wilcard Sertifikasını, DNS sunucu olarak tinydns kullanan bir sistem yöneticisinin nasıl kolayca alabileceğini ve akabinde sertifika yenilenmesinde işi nasıl otomatize edebileceğini kendi deneyimim üzerinden aktarmaya çalışacağım.

 Let's Encrypt nedir, ne işe yarar, nasıl çalışır sorularına bu yazıda çok yer vermek istemiyorum. Eğer Let's Encrypt nedir, nasıl çalışır konusunda bilginiz yetersiz ise öncelikle o konuda biraz araştırma yapmanız yerinde olacaktır.

Let's Encrypt'in sertifika oluşturma için bir kaç "challange" metodu olduğunu biliyorsunuz. Wildcard tipi sertifikalar için bir kısıtlama söz konusu ve bu tip sertifika alabilmek için DNS challange metodunu kullanmak mecburi. Bu metod çok kabaca şöyle çalışıyor; Let's Encrypt sertifika oluşturma aşamasında, txt tipinde bir kayıt üretip bunu DNS sunucunuzdan yayınlamanızı istiyor. Siz DNS kaydını girip sertifika işlemine devam ettiğinizde Let's Encrypt size ilettiği txt kaydının alan adınızda olup olmadığını sorguluyor ve sorgu başarılı olur ise wildcard sertifika üretme işlemi başarı ile gerçekleşiyor. Buradaki amaç elbette sertifika üretmek istediğiniz alan adının gerçekten sahibi olup olmadığını otomatik bir şekilde kontrol etmek. Let's Encrypt süreçleri otomatik hale getirip insan müdahalesini gerektirmeyen bir yapıya sahip.

Bu işlem için Let's Encrypt üzerinde kullanılabilecek plug-in yazılımları mevcut. DNS hizmetini aldığınız büyük oyuncular için işlemi otomatikleştiren plug-in bulabiliyorsunuz. Ancak kendi tinydns sunucusunu çalıştıran benim gibiler için bir kaç düzenleme yapmak gerekiyor. Neyse ki tinydns'in esnek ve basit yapısı nedeni ile bu gayet kolay. Nasıl yapıldığına geçelim.

Öncelikle yaptığım her şey FreeBSD üzerinde bunu belirteyim. GNU/Linux üzerinde de çok yakın bir şekilde aynı yolu izleyebilirsiniz. Bazı dosya yolları ve komutlar farklılık gösterebilir.

Let's Encrypt dosyalarının bulunduğu /usr/local/etc/letsencrypt dizinine girelim. Bu dizinde cli.ini adında bir ayar dosyası göreceksiniz. Bu dosyayı aşağıdaki gibi düzenleyelim;

manual
server = https://acme-v02.api.letsencrypt.org/directory
rsa-key-size = 4096
preferred-challenges = dns
manual-auth-hook = /usr/local/etc/letsencrypt/certbot-dns-auth.sh
manual-cleanup-hook = /usr/local/etc/letsencrypt/certbot-dns-auth-cleanup.sh

certbot yazılımı bize çok rahatlık sağlayan manual-auth-hook ve manual-cleanup-hook tanımlama şansını veriyor. Bu tanımlamalar sayesinde certbot içerisinden shell scriptlerimizi çağırarak sertifika üretimi öncesinde ve sonrasında bazı işlemler yapabiliyoruz. Sertifika oluşturma öncesinde tinydns sunucumuza Let's Encrypt tarafından gönderilen txt kaydını giren shell scripti görelim,

# cat /usr/local/etc/letsencrypt/certbot-dns-auth.sh
#!/usr/local/bin/bash

cd /etc/tinydns/root
cp -f data data-good
echo "'_acme-challenge.$CERTBOT_DOMAIN:$CERTBOT_VALIDATION:120" >> data
/usr/local/etc/letsencrypt/update.sh
# Sleep to make sure the change has time to propagate over to DNS
sleep 25

tinydns için benim kurulumunda root dizini /etc/tinydns/root yolunda, bu dizine geçip data dosyasını data-good olarak her ihtimale karşı yedekliyoruz. certbot tarafından gönderilen txt tipi kaydı data dosyasına yazıyoruz ve update.sh shell scriptini çağırıyoruz. Bu scripti de inceleyelim;

# cat /usr/local/etc/letsencrypt/update.sh
#!/bin/sh

make
rsync -avz -e ssh /etc/tinydns/root/data.cdb root@ikinci_tinydns_ip:/etc/tinydns/root
rsync -avz -e ssh /etc/tinydns/root/data root@ikinci_tinydns_ip:/etc/tinydns/root

make komutu ile data dosyasını cdb formatına çevirip rsync satırları ile varsa ikinci, üçüncü, vb. diğer sunucularımıza da bu değişimi gönderiyoruz. Böylece tüm tinydns sunucularımızda gerekli txt kaydı kaydedilmiş oldu. Bir sonraki aşamada /usr/local/etc/letsencrypt/certbot-dns-auth-cleanup.sh scripti çalışacak ve girilen txt kaydını DNS sunucumuzdan temizleyecek. Bu scriptin içeriği de:

# cat /usr/local/etc/letsencrypt/certbot-dns-auth-cleanup.sh
#!/usr/local/bin/bash

cd /etc/tinydns/root
sed '$d' data > tmp; mv -f tmp data
/usr/local/etc/letsencrypt/update.sh

Yine tinydns root dizinine geçip biraz önce eklediğimiz kaydı silerek update.sh scriptini yeniden çağırıyoruz.

Bu scriptlerin tümü başarı ile çalıştığında cerbot şu şekilde çıktı üretecek;

# certbot certonly -d '*.domain.com'
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for *.domain.com
Hook '--manual-auth-hook' for domain.com ran with output:
 /usr/local/bin/tinydns-data
 sending incremental file list
 data.cdb

 sent 1,970 bytes  received 137 bytes  1,404.67 bytes/sec
 total size is 11,671  speedup is 5.54
 sending incremental file list
 data

 sent 281 bytes  received 101 bytes  764.00 bytes/sec
 total size is 7,206  speedup is 18.86
Hook '--manual-cleanup-hook' for domain.com ran with output:
 /usr/local/bin/tinydns-data
 sending incremental file list
 data.cdb

 sent 1,848 bytes  received 137 bytes  3,970.00 bytes/sec
 total size is 11,551  speedup is 5.82
 sending incremental file list
 data

 sent 218 bytes  received 101 bytes  638.00 bytes/sec
 total size is 7,121  speedup is 22.32

Successfully received certificate.
Certificate is saved at: /usr/local/etc/letsencrypt/live/domain.com/fullchain.pem
Key is saved at:         /usr/local/etc/letsencrypt/live/domain.com/privkey.pem
This certificate expires on 2022-04-01.
These files will be updated when the certificate renews.

NEXT STEPS:
- The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Sertifikamız başarı ile oluştu. Yapılması gereken tek bir şey var. Let's Encrypt wildcard sertifikaları 3 ay geçerli oalcak şekilde veriyor. Bu nedenle 3 ayda bir bu sertifikaların yenilenmesi lazım. cli.ini dosyasında yaptığımız düzenleme sertifika yenilenirken de işe yarıyor. Tek yapmamız gereken bir cron işi oluşturmak ve her gün düzenli şekilde certbot'a sistemimizde yüklü sertifikaları denetletmek. Örnek bir cron işi;

0 1 * * * root /usr/local/bin/certbot renew >> /var/log/letsencrypt/renew.log --post-hook "service nginx restart"

Tebrikler, Let's Encrypt wildcard sertifikanızı güle güle kullanın..

Author Name

İletişim Formu

Ad

E-posta *

Mesaj *

Blogger tarafından desteklenmektedir.