• Web (HTTP) Servis Yönetimi | LKD #3

    SSL sertifikaları web sitelerine istemcilerin güvenle giriş ve veri aktarımı yapmasını olanak sağlayan aracılardır. SSL temelde iki temel işlevi yerine getirir.

    • Şifreleme
    • Kimlik doğrulama

    Bu işlevleri yerine getirecek SSL sertifikalarının güvenilir sertifika otoriteleri tarafından imzalanması gerekir. Bu bir nevi kefil olma işlemidir. Sertifika otoritelerinin güvenilir olup olmadığına da pratikte web tarayıcılar karar verirler.

    Süreç nasıl işliyor?

    1. İstek Oluşturulur: Sunucu tarafında bir sertifika imzalama isteği (CSR) üretilir.
    2. Otoriteye Gönderim: Bu istek doğrulanmak üzere otoriteye iletilir.
    3. İmzalama: Otorite, kendi anahtarıyla isteği imzalayıp sunucuya geri verir.
    4. Güncelleme: SSL sertifikası sunucuya yüklenerek aktif edilir.

    SSL sertifikaları otoriteler tarafından çok çok fazla ücretlere yenilenebiliyor, yani yenilenebiliyordu. Günümüzde çoğu web sitesi Let’s Encrypt‘in sunduğu SSL hizmeti sayesinde ücretsiz olarak sertifika alıp güncelleyebiliyorlar.

    Let’s Encrypt siteyi doğrulamak için iki basit yöntem kullanıyor.

    • Web sitesinde kendilerinin oluşturduğu bir html sayfasını yayınlayıp sitenin size ait olduğunu doğrulamanız
    • DNS kaydına sitenin size ait olduğunu doğrulayan bir ifade bırakmanız.

    Kullandığı yöntemlerle de günümüzdek sertifika otoritelerinin büyük bir bölümüne kıyasla çok daha yüksek bir güvenlik sağlayabiliyor.

    Let’s Encrypt ürettiği sertifikaları 90 günlük olarak sağlıyor, 90 günün sonunda otomatik olarak yenilemenize imkan sağlıyor (bu da sertifika otoritelerinin sağlamadığı bir hizmettir). Diğer sertifika otoritelerinden alınan sertifikaların ise belirlenen süre sonunda kullanıcı tarafından elle yeniden doğrulanması ve sisteme manuel olarak tanımlanması gerekmekte :/

    HostName Değişimi

    Web sunucularını yönetirken IP adreslerini kullanmak yerine doğrudan isimlerle çalışmayı tercih edebiliriz. Bu işlemi tek komutla gerçekleştirebiliriz.

    Hostname’i değiştirmek için,

    bash
    user@linux:~$ hostnamectl set-hostname vermek_istediginiz_isim

    komutunu yazıyoruz ardından doğrulamak için,

    bash
    user@linux:~$ hostname -f

    komutunu girip doğru şekilde uygulandığını görüyoruz.

    Bu adresi kullanabilmek için /etc/hosts dosyasına da aşağıdaki düzenlemeyi yapmamız gerekiyor.

    Not: Döngüsel ip (127.0.0.1) ‘i kapattım. Sebebi hata almamdı 🙁 Şöyle ki, aynı hostname birden fazla ip adresi ile çakışmamalıymış, bu bize hata getirirmiş…

    Ayrıca bu işlemi yaptıktan sonra sistemi yeniden başlatmakta fayda var. Çünkü kimi uygulamalar hostname kullanarak çalışıyor olabilir, tek tek hangi uygulama kullanıyor araması yapmaktansa sistemi yeniden başlatıp doğru değerlerle çalışmalarını sağlayabiliriz.

    Sistemi yeniden başlatmasak da hostname güncellenmiş olacaktır.

    SSL Sertifikalarının Üretimi

    2 farklı sistemde ve 2 farklı web sunucusunda toplamda 4 adet SSL sertifikasının nasıl üretildiğine bakalım ve aradaki farkları inceleyelim.

    • Debian Apache
    • Debian Nginx
    • Rocky Apache
    • Rocky Nginx

    Debian Apache2 SSL

    İlk aşamada kullanacağımız openssl paketlerinin bulunup bulunmadığına bakalım.

    bash
    user@linux:~$ which openssl

    Benim sistemimde ” /usr/bin/openssl “‘de bulunuyordu. Bulunmasaydı,

    bash
    user@linux:~$ sudo apt install openssl -y

    İlk önce openssl’i kullanarak key’i üretelim. Alan adlarına /etc/hosts dosyasına yazdığımız alan adımızı gireceğiz. Key’i üretmeden önce /etc/apache2/certs adında bir dizin oluşturup oraya gidelim. Çünkü az sonra gireceğimiz komut bulunduğu dizinde crt ve key üretecektir.

    bash
    user@linux:~$ openssl req -x509 -nodes -newkey rsa:2048 -keyout verdigimiz_alan_adi.key -out verdigimiz_alan_adi.crt

    İlgili dizine gidip kontrol edelim.

    Şimdi ürettiğimiz sertifikayı sitemize uygulamak için ” /etc/apache2/sites-available “dizinine gidip ” 000-default.conf ” dosyasında değişiklikleri yapalım.

    Bu işlemden sonra dosyayı kaydedip kapatalım. Bir hata yaptık mı kontrol etmek için,

    bash
    user@linux:~$ apache2ctl -t

    Syntax OK ” çıktısını aldıysak devam edebiliriz. Portları dinleyelim.

    bash
    user@linux:~$ ss -tulnp

    En alt satırda 443’ün de dinlendiğini görüyoruz, sitemizi kontrol edelim.

    Başarılı şekilde SSL sertifikamız sitemize uygulandı.

    Rocky Apache2 SSL

    Sertifikayı üretmek için gerekli paketleri indirelim.

    bash
    user@rocky:~$ sudo dnf install mod_ssl -y

    Ardından paketleri listeleyelim.

    bash
    user@rocky:~$ rpm -ql mod_ssl

    Sertifikamızı doğrulamak için,

    bash
    user@rocky:~$ curl https://localhost

    Bu uyarı sertifikanın dünyaca tanınan bir otorite tarafından değil, bizim tarafımızdan oluşturulduğunu gösterir mahiyette bir uyarı.

    Biz oluşturduğumuz SSL sertifikasını web sitesine uygulamakta başarılı olduk.

    Biz Debian dağıtımında Rocky’e nazaran daha fazla uğraştık bunun sebebi, Rocky sunucularında sscg aracı sayesinde çok hızlı bir şekilde sunucuyla birlikte SSL sertifikası üretebiliyor olmamızdır.

    Rocky Nginx SSL

    Burada farklı olarak işimizi kolaylaştırmak için bir Apache2 paketi olan mod_ssl’i kuracağız.

    bash
    user@rocky:~$ sudo dnf install mod_ssl -y

    Kurduktan sonra inen paketleri listelediğimizde /usr/libexec/httpd-ssl-gencerts inceliyoruz ve otomatik olarak SSL sertifikaları üretmemize yarayan bir script olduğunun farkına varıyoruz.

    Scriptini çalıştırmadan önce içerisine bir göz atalım, oluşturacağı key ve crt dosyalarını nereye koyuyormuş ona bakalım.

    Burada gördüğümüz üzere,

    • crt dosyası, /etc/pki/tls/certs/localhost.crt
    • key dosyası, /etc/pki/tls/private/localhost.key

    konumlarında bulunuyorlar.

    Scripti çalıştıralım.

    bash
    user@rocky:~$ sudo /usr/libexec/httpd-ssl-gencerts

    Sonrasında nginx.conf dosyamızın içine gidip SSL ayarlarını aktif edelim.

    bash
    user@rocky:~$ sudo systemctl stop firewalld

    Not: Firewall açık kalmış olabilir. Hata almamak için kapatıyoruz.

    Curl kullanarak veya tarayıcı üzerinden denemesini yaptığımızda, başarılı bir şekilde SSL sertifikamızı uyguladığımızı görüyoruz.

    Debian Nginx SSL

    Openssl’in kurulu olup olmadığını kontrol edelim.

    bash
    user@linux:~$ which openssl

    Benim sistemimde kuruluydu.

    /etc/nginx altında certs adında bir dizin oluşturuyoruz. Ardından oraya gidiyoruz.

    openssl ile sertifikayı üretiyoruz.

    bash
    user@linux:~$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mehmet.myguest.org.key -out mehmet.myguest.org.crt

    /sites-available/default dosyasını açıp değişiklikleri uygulayalım,

    return 301 https://$host$request_uri; satırıyla yapılacak tüm bağlantıları https’e yönlendirdik. Bu da http://site ile yapılacak bağlantıların da https olacağını gösterir.

    curl ile denemeyi yaptığımızda,

    301’i gördük.

    Başarıyla ürettiğimiz tüm SSL sertifikalarını da sitelerimize uygulamış olduk.

    Virtual Hosting

    Aynı IP üzerinde birden fazla hosting barındırabiliriz buna da ” virtual hosting ” deriz. Bunu oluşturmak için ilk önce Debian Apache makinemizde /etc/httpd/conf.d yolu altında iki adet virtual host dosyası oluşturuyorum.

    kamp.linux.org.tr.conf
    linux.org.tr.conf

    Ardından /var/www/kamp ve /var/www/linux’a gidip burada varlığını belirttiğimiz dosyaları oluşturalım.

    /var/www/kamp/index.html

    Merhaba kamp

    /var/www/linux/index.html

    Merhaba linux

    Bunları da tamamladıktan sonra /etc/hosts dosyasına gidip sanal hostlarımızı kaydedelim.

    Curl ile deneyelim,

    Virtual hosting yapılandırmasını başarıyla tamamladık.

    Bazı detaylar,

    • IP adresi ile curl atmaya çalıştığımızda,

    gördüğümüz üzere ilk eklediğimiz .conf dosyasının host’u çalışıyor.

    Konumuzla çok alakası yok ancak bilgisayar dns çözümlemesi yaparken neden önce /etc/hosts dosyasına bakar sorusunun cevabı,

    burada yer alan /etc/nsswitch.conf dosyasıdır.

    Devamını okumak için…