From 94b7386c9ece34ce0e7592c8cd4bf744b6e95c1b Mon Sep 17 00:00:00 2001 From: Wise <69072094+secondcappyhappy@users.noreply.github.com> Date: Tue, 5 Oct 2021 15:56:54 +0200 Subject: [PATCH 1/2] =?UTF-8?q?SSH=20G=C3=BCvenli=C4=9Fi=20Yaz=C4=B1s?= =?UTF-8?q?=C4=B1=20eklendi.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rehberler/ssh-guvenligi.md | 104 +++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 rehberler/ssh-guvenligi.md diff --git a/rehberler/ssh-guvenligi.md b/rehberler/ssh-guvenligi.md new file mode 100644 index 0000000..551e9b0 --- /dev/null +++ b/rehberler/ssh-guvenligi.md @@ -0,0 +1,104 @@ +# Linux Sunucularda SSH güvenliğini artırma + +Bugün sizlerle bir sunucu kiraladığınız zaman güvenli bir şekilde bağlanmamızı sağlayan SSH hizmetini nasıl daha güvenli ve dışarıdan gelecek kötü niyetli isteklerden uzak tutabiliriz bundan bahsedeceğim. Öncelikle süreci basit, önerilen ve ileri-seviye olarak üç farklı başlık altında anlatacağım. Başlık içerikleri kişisel gerekliliklere göre aşamalı düşünülmüştür. Başlıklar bir biri ile bağlantılı olmasına rağmen istenilen bir aşamada bırakılması sorun oluşturmayacaktır. + + +## Basit Güvenlik Önlemleri + +Öncelikle içinde bulunduğumuz Linux sürümünün paket yöneticisi ile güncellemeleri konsol üzerinden yüklememiz gerekmektedir. +``` +Ubuntu için: sudo apt update && sudo apt upgrade -y + +Fedora için: sudo yum update -y + +Arch Linux için: sudo pacman -Syyu +``` + +Güncellemeler yüklendikten sonra ise sunucunuzdaki (Benim olayımda Ubuntu) sshd servisini (ki bu servis dışarıdan ssh bağlantıları almanıza yarayan servistir) yapılandırmaya başlıyoruz. Öncelikle çok karıştırılması nedeniyle belirtmek gerekir ki ssh servisi ile sshd servisi farklı servislerdir. SSH servisi sunucunun başkaca bilgisayar veya sunuculara bağlanmasını yarayan servisken SSHD servisi başka bilgisayarların sizin sunucunuza bağlanmasını yani gelen bağlantıları karşılayan servistir. + +SSHD servisinin ayarlarının tutulduğu dosya genel itibariyle "/etc/ssh/sshd_config" konumunda bulunur. Bunu kendi kullandığımız metin editörlerinden istediğimiz biriyle ama sudo (yani yönetici) yetkilerine sahip bir kullanıcı ile açmamız gerekmektedir. + +Ubuntu üzerinden devam edecek olursak + +``` +sudo nano /etc/ssh/sshd_config # Ayar dosyasını açmaya yarayan komut +``` +Bulup değiştireceğimiz başlıklar + +``` +#ClientAliveInterval 0 >> Başındaki hashtag işaretini kaldırıyoruz ve "0" olan değeri 300 yapıyoruz. Bu komut bağlantı kullanılmadığı (idle konumunda kaldığı) zaman kaç sn sonra bağlantının otomatik kapatılacağını düzenler +#PermitEmptyPasswords no >> Başındaki hashtag işaretini kaldırıyoruz ve "no" olan değeri değiştirmiyoruz. Bu komut boş veya şifresiz kullanıcıların bağlanmasını engeller. Yani boş şifrelere izin vermez. +X11Forwarding yes >> Eğer başında hastag var ise kaldırıyoruz yok ise "yes" olan değeri no olarak değiştiriyoruz. Bu komut sunucu üzerinde GUI arayüzüne sahip uygulamaları çalıştırma kolaylığı sağlamasına rağmen suistimal edilmesi mümkün bir durum olduğundan kapatıyoruz. +#MaxAuthTries 6 >> Başındaki hashtag işaretini kaldırıyoruz ve "6" olan değeri 3 yapıyoruz. Bu komut şifrenizi kaç kez deneyebileceklerini düzenler. 6 sayısı gereksiz derece yüksek bir değer olup genel kabul 3 ve veya 4 olması yönündedir. +#Protocol 2 >> Eğer başında hastag var ise kaldırıyoruz, böyle bir kayıt hiç yok ise "Protocol 2" şeklindeki değeri ilk bulduğumuz boşluğa ekliyoruz. Bu komut SSH'ın sadece en yeni protokolü ile bağlantıların yapılmasını sağlayarak eski protokolün açıklıklarından sizi korur. +``` +Ayarları yaptıktan sonra kontrol etmek isterseniz: "sudo sshd -t" komutunu kullanabilirsiniz. Eğer bir hata mesajı görmez iseniz "sudo systemctl restart sshd" veya "sudo service sshd restart" komutu ile ayarları uygulayıp servisi baştan başlatabilirsiniz + +## Önerilen ayarlar +Bir önceki ayarlara ek olarak kullanıcı bazlı oturum açma, sadece güvenli anahtar kullanarak oturum açma ve Root kullanıcısı ile oturum açmayı kısıtlama gibi ek ayarlamalar yapacağız. Öncelikle yerel bilgisayarınızdaki kullanıcınız için bir gizli anahtar üretmeniz gerekiyor. Bunun için eğer linux tabanlı bir işletim sistemi kullanıyor iseniz + +``` +ssh-keygen -t rsa -b 4096 # yazdıktan sonra aşağıdaki sorulara cevap olarak istediğiniz şifreyi giriniz +>>>> Enter passphrase (empty for no passphrase): [Press enter key] +>>>> Enter same passphrase again: [Press enter key] + +veya + +ssh-keygen -t ecdsa -b 521 # Daha güvenli ve daha hızlı olan ekliptik anahtar üretir. Aşağıdaki sorulara cevap olarak istediğiniz şifreyi giriniz +>>>> Enter passphrase (empty for no passphrase): [Press enter key] +>>>> Enter same passphrase again: [Press enter key] +``` +Diğer sorulara Enter'a basarak cevap vermiş ve anahtar için belirli bir konum yazmamış iseniz anahtar çiftiniz (.pub= halka açık anahtar) / uzantısız olan gizli anahtar) /home/KULLANICI_ADINIZ/.ssh klasörüne kaydedilmiştir. Ürettiğiniz anahtarı sunucunuza tanıtmak için aşağıdaki kodu kullanabilirsiniz. + +``` +ssh-copy-id -i ~/.ssh/ANAHTAR_ISMINIZ.pub SUNUCUDAKI_KULLANICI_ADINIZ@SUNUCU_IP_ADRESI # yazdıktan sonra kullanıcınızın şifresini sorucak ve doğru girdiğiniz takdirde onay mesajı ile karşılaşacaksınız. +``` + +Kendi anahtarınızı ürettikten sonra sunucuya sadece anahtar ile erişmek için; +Bulup değiştireceğimiz başlıklar +``` +#PasswordAuthentication no >> Başındaki hashtag işaretini kaldırıyoruz ve "no" olan değeri no olarak bırakıyoruz. Bu komut sunucuya şifre ile bağlanmayı engeller. Kullanıcılar sadece ssh_keyleri ile bağlanabilirler. +PubkeyAuthentication yes >> Eğer var ise başındaki hastag işaretini kaldırıyoruz ve değeri yes olarak belirliyoruz. Bu komut az önce oluşturduğunuz gizli key ile oturum açmanıza izin veren komuttur. +#PermitRootLogin no >> Başındaki hashtag işaretini kaldırıyoruz ve "no" olan değeri no olarak bırakıyoruz. Bu komut ROOT kullanıcısının ki en yetkili kullanıcıdır sunucuya erişmesini engelliyor. Ancak başka bir kullanıcı ile erişip sonra ROOT kullancısına geçiş yapabilirsiniz. +AllowUsers KULLANICI_ADINIZ >> Eğer yok ise böyle bir kayıt ekliyoruz. Başka kullanıcıların sunucuya bağlanmasını ve/veya kullanıcı adı denemesi yapmasını engelliyor. +LoginGraceTime 20 >> Eğer yok ise böyle bir kayıt ekliyoruz ve değeri 20 olarak ayarlıyoruz. Oturum açmak için gereken süreyi saniye cinsinden belirliyor. Uzun süre oturum açma isteği ile sunucuyu meşgul etmelerini engelliyoruz. +ChallengeResponseAuthentication no >> Var ise başındaki hastag işaretini kaldırıyoruz ve değeri no olarak belirliyoruz. Bu komut diğer oturum açma yöntemlerini devre dışı bırakıyor. +KerberosAuthentication no >> Var ise başındaki hastag işaretini kaldırıyoruz ve değeri no olarak belirliyoruz. Bu komut diğer oturum açma yöntemlerini devre dışı bırakıyor. +GSSAPIAuthentication no >> Var ise başındaki hastag işaretini kaldırıyoruz ve değeri no olarak belirliyoruz. Bu komut diğer oturum açma yöntemlerini devre dışı bırakıyor. +``` +Ayarları yaptıktan sonra kontrol etmek isterseniz: "sudo sshd -t" komutunu kullanabilirsiniz. Eğer bir hata mesajı görmez iseniz "sudo systemctl restart sshd" veya "sudo service sshd restart" komutu ile ayarları uygulayıp servisi baştan başlatabilirsiniz + +## İleri Seviye Ayarlar +Öncelikle standart SSH bağlantı portu olan 22 yi değiştirip ardından SSH bağlantısı sırasında kullanılan şifreleme araçlarını daha da güçlü hale getireceğiz. Ardından sunucunu SSH hizmetinin loglarının (kayıt defteri kayıtlarının) nasıl tutulacağını belirleyeceğiz. + +Bulup değiştireceğimiz başlıklar +``` +#Port 22 >> Bunu bulup başındaki hastag işaretini kaldırıyoruz ve oraya başka hizmet tarafından kullanılmayan ve açık olan bir port numarasını yazıyoruz. Örneğin 2992 olabilir. +LogLevel INFO >> Bu ayarı bulup değiştiriyoruz yok ise ekliyoruz. Kayıt seviyesini belirlememize yarıyor. +AllowAgentForwarding no >> Bu ayarı bulup değiştiriyoruz yok ise ekliyoruz. Alternatif yönlendirme yöntemlerini devredışı bırakıyor. +AllowTcpForwarding no >> Bu ayarı bulup değiştiriyoruz yok ise ekliyoruz. Alternatif yönlendirme yöntemlerini devredışı bırakıyor. +PrintMotd no >> Bu ayarı bulup değiştiriyoruz yok ise ekliyoruz. Bağlantı kurulmadan önce sunucu ile ilgili bilgi sahibi olmalarını engellemek için. +PermitUserEnvironment no >> Bu ayarı bulup değiştiriyoruz yok ise ekliyoruz. +PermitTunnel no >> Bu ayarı bulup değiştiriyoruz yok ise ekliyoruz. +``` + +Daha da ileri giderek SSH bağlantısı sırasında kullanılan şifreleme algoritmalarını, doğrulama algoritmalarını, anahtar değişim algoritmalarını ve diğer algoritmaların hangilerinin öntanımlı olacağını belirliyoruz. + +Root kullanıcısı veya sudo yetkisine sahip bir kullanıcı ile aşağıdaki komutları sırasıyla çalıştırıyoruz. +``` +1] rm /etc/ssh/ssh_host_* +2] ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N "" +3] ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" +4] awk '$5 >= 3072' /etc/ssh/moduli > /etc/ssh/moduli.tmp +5] mv /etc/ssh/moduli.tmp /etc/ssh/moduli +6] sed -i 's/^\#HostKey \/etc\/ssh\/ssh_host_\(rsa\|ed25519\)_key$/HostKey \/etc\/ssh\/ssh_host_\1_key/g' /etc/ssh/sshd_config +7] echo -e "KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha256\nCiphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr\nMACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,umac-128-etm@openssh.com\nHostKeyAlgorithms ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,sk-ssh-ed25519@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-512,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com" > /etc/ssh/sshd_config.d/ssh-hardening.conf +``` + +Ayarları yaptıktan sonra "sudo sshd -t" ve ardından eğer bir hata mesajı görmez iseniz "sudo service sshd restart" komutu ile ayarları uygulayıp servisi baştan başlatın. Artık yeni belirlediğiniz port üzerinden ve sadece sizin gizli anahtarınız ile sunucuya bağlanabileceksiniz. Bağlanmak için ise; +``` +ssh -i ~/.ssh/ANAHTAR_ISMINIZ SUNUCUDAKI_KULLANICI_ADINIZ@SUNUCU_IP_ADRESI -p PORT_NUMARASI # komutunu kullanabilirsiniz. Gelen bildirimlere Enter deyip devam edebilirsiniz. +``` + +## Son +- Yazar ~Wise From cc8c26854622fef992210c579b9fe2bc2b1dc0a6 Mon Sep 17 00:00:00 2001 From: Wise <69072094+secondcappyhappy@users.noreply.github.com> Date: Wed, 6 Oct 2021 07:45:57 +0200 Subject: [PATCH 2/2] =?UTF-8?q?SSL=20Konfig=C3=BCrasyonu=20Rehberi=20eklen?= =?UTF-8?q?di.=20(#16)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add files via upload * SSL Konfigirasyonu yazısı eklendi. * Delete ssl-konfigirasyonu.md * SSL Konfigürasyonu rehberi eklendi. --- rehberler/ssl-konfigurasyonu.md | 126 ++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 rehberler/ssl-konfigurasyonu.md diff --git a/rehberler/ssl-konfigurasyonu.md b/rehberler/ssl-konfigurasyonu.md new file mode 100644 index 0000000..e50c478 --- /dev/null +++ b/rehberler/ssl-konfigurasyonu.md @@ -0,0 +1,126 @@ +# Linux Sunucularda SSL güvenliğini artırma + +Bugün sizlere mevcut sunucunuzda eğer bir websitesi ve/veya App serve ediyorsanız mutlaka ihtiyacınız olan SSL bağlantısından ve bununla bağlantılı olarak openssl kütüphanesinden bahsedeceğim. SSL (Secure Socket Layer) ve TLS (Transport Layer Security) sunucunuza bağlanmak isteyen kişileri siteniz ile güvenli şekilde iletişim kurmasına imkan sağlayan bir bağlantı şeklidir. Eskiden SSL v1-v3 arasında değişen sürümler mevcut ve siteler genelde bu SSL sürümlerini kullanırken artık SSL siteler tarafından terk edilmiş ve yerini daha güvenli olan TLS'ye bırakmıştır. Fakat yine de işin anlatımı kısmında ve config dosyalarını düzenlerken halen "ssl" kelimesini kullanmamız gerekecektir. Bunu ufak bir espiri ile de anlatmak gerekirse eğer bir uygulamanın 64 bit versiyonunu indirmek istediğiniz aman "amd_64" olarak neden geçtiğini hiç düşündünüz mü? Çünkü 64 bit'e ilk geçen AMD olduğu için buna bir saygı göstergesi ve/veya alışkanlık olarak amd_64 olarak kaldı bu isimlendirme. Aynı şekilde de şu an TLS kullanıyor olmamıza rağmen isimlendirme ve konfigürasyon parametreleri "SSL" olarak kaldı. + +Daha önceki yazımızda olduğu gibi süreci yine basit, önerilen ve ileri-seviye olarak üç farklı başlık altında anlatacağım. Başlık içerikleri kişisel gerekliliklere göre aşamalı düşünülmüştür. Başlıklar bir biri ile bağlantılı olmasına rağmen istenilen bir aşamada bırakılması sorun oluşturmayacaktır. + + +## Basit konfigürasyon + +Öncelikle içinde bulunduğumuz Linux sürümünün paket yöneticisi ile güncellemeleri konsol üzerinden yüklememiz gerekmektedir. +``` +Ubuntu için: sudo apt update && sudo apt upgrade -y + +Fedora için: sudo yum update -y + +Arch Linux için: sudo pacman -Syyu +``` + +Güncellemeler yüklendikten sonra ise sunucunuzdaki (Benim olayımda Ubuntu) nginx/apache servisini (ki bu servis dışarıdan gelen web bağlantılarını almanıza yarayan servistir) yapılandırmaya başlıyoruz. Nginx servisinin ayarlarının tutulduğu dosya genel itibariyle "/etc/nginx/nginx.conf" konumunda bulunur. Bunu kendi kullandığımız metin editörlerinden istediğimiz biriyle ama sudo (yani yönetici) yetkilerine sahip bir kullanıcı ile açmamız gerekmektedir. + +Ubuntu üzerinden devam edecek olursak (Tek Ip Tek Sunucu Yapılandırması) + +``` +sudo nano /etc/nginx/nginx.config # Ayar dosyasını açmaya yarayan komut +``` + +``` +Eklenecek (varsa değiştirilecek) başlıklar +listen 443 ssl http2; >> ipv4 üzerinden 443 portuna gelen istekleri http2 protokolü ile karşılayıp ssl bağlantısı kurmaya yarıyor. + +listen [::]:443 ssl http2; >> ipv6 üzerinden 443 portuna gelen istekleri http2 protokolü ile karşılayıp ssl bağlantısı kurmaya yarıyor. (Eğer ipv6 desteğiniz yok ise veya native olarak desteklemek istemiyorsanız kaldırabilirsiniz) + +server_name SUNUCU_ADINIZ; >> Eğer sunucu adınızı default olarak belirlemek istemiyorsanız bir Server Name Indicator belirleyebilirsiniz. Bu gelen tüm istekleri karşılamak yerine sadece sunucu adınıza gelen istekleri karşılamaya yarar. + +ssl_certificate /etc/letsencrypt/live/SUNUCU_ADINIZ/fullchain.pem; >> Eğer free ssl için Let's Encrypt kullanıyor iseniz default sertifika konumu burasıdır. Aksi halde kendi sertifika dosyanız ile değiştirin. + +ssl_certificate_key /etc/letsencrypt/live/SUNUCU_ADINIZ/privkey.pem; >> Eğer free ssl için Let's Encrypt kullanıyor iseniz default private key konumu burasıdır. Aksi halde kendi private key dosya konumunuz ile değiştirin. + +ssl_protocols TLSv1.3 TLSv1.2; >> Sadece en güncel ve en güvenilir TLS protokollerini kabul etmek için gerekli komut. + +ssl_prefer_server_ciphers on; >> Sunucu ile istemcinin konuşması sırasında "tamam nelerimiz var bakalım" diye konuştuklarını tahmin ettiğim :D kısımda sunucunun sadece kendi seçtiği şifreleme algoritmaları ile bu görüşmeyi devam ettireceğini söylemesine yarayan komut. Kısacası işine gelirse böyle işine gelmezse konuşmuyorum. + +ssl_ecdh_curve secp521r1:secp384r1; >> Ekliptik eğrileri kullanmamız gereken durumlarda hangi eğrileri tercih ettiğimizi bildiren komuttur. + +ssl_ciphers DH-RSA-AES256-SHA:DH-RSA-AES256-SHA256:DHE-RSA-AES256-GCM-SHA384:DH-RSA-AES256-GCM-SHA384:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDH-ECDSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:ECDH-RSA-AES256-SHA:AECDH-AES256-SHA:ECDHE-ECDSA-AES256-SHA384:ECDH-ECDSA-AES256-SHA384:ECDH-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDH-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDH-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-CCM:DHE-RSA-AES256-CCM8:ECDHE-ECDSA-AES256-CCM:ECDHE-ECDSA-AES256-CCM8:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305; >> En güvenilir bulduğum SSL algoritmalarının bir araya getirilerek sadece bunları kullanmasını sunucuya söyleyen kod. +``` +Tek tek araştırmak isteyenler için tüm cipherlar: "https://testssl.sh/openssl-iana.mapping.html" + +Ayarları yaptıktan sonra kontrol etmek isterseniz: "sudo nginx -t" komutunu kullanabilirsiniz. Eğer bir hata mesajı görmez iseniz "sudo systemctl restart nginx" veya "sudo service nginx restart" komutu ile ayarları uygulayıp servisi baştan başlatabilirsiniz + +## Önerilen ayarlar +Bir önceki ayarlara ek olarak performans özelinde bazı iyileştirmeler ve bunun yanı sıra sitenizin SSL test sitelerinde üst sıralara çıkmasını sağlayacak bazı ek konfigürasyonlar yapacağız. Bunun ardından ise sitenizin kullanıcı ile erişiminde faydalı olarak bazı başlıkları (header) ve sitenizin kaynaklarının üçüncü kişi siteler tarafından sömürülmemesi için bir takım iyileştirmeler yapacağız. + +``` +Eklenecek (varsa değiştirilecek) başlıklar +ssl_session_cache shared:TLS:2m; >> TLS bağlantılarının işçiler (nginx workers) arasında nasıl dağıtılacağını ve ne kadar süre ile bağlantıların ortak kullanılacağını belirten kod + +ssl_buffer_size 4k; >> SSL isteklerine cevap verirken ve handshake sonrası paket gönderimi yaparken paketlerin kaçlık konteynırlara bölüneceğini belirten kod. Daha düşük bir değer daha çok paket gönderilmesi ama daha az taşma (overhead) anlamına gelir. + +ssl_stapling on; >> OCSP zımbalama özelliğini aktif hale getirir + +ssl_stapling_verify on; OCSP zımbalamanın üst ve kök sunucularda dahil olmak üzere doğrulanması özelliğini açar. + +resolver 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001; >> Cloudlfare ile OCSP zımbalama doğrulamasının yapılmasını sağlar. Eğer IPV6 kullanmıyor veya native olarak desteklemek istemiyorsanız ipv6 adreslerini silebilirsiniz. + +add_header X-Content-Type-Options "nosniff" always; >> Tarayıcıların MIME içeriklerini anlamak için koklama (sniff) yapmasını engeleyen başlık değeridir. + +add_header X-Xss-Protection "1; mode=block" always; >> Olası bir XSS açığında kullanıcıların beyaz ekran görmesini sağlayarak açığı bir nebze de olsa engelleyen bir başlıktır. + +add_header X-Frame-Options "SAMEORIGIN" always; >> Herhangi bir şekilde i-frame vb bir kod ile sunucunuzun bir sayfasının başka bir sayfada gösterilmesini ve/veya alt-alta üst-üste yayımlanmasını engeller. Sadece siz kendi siteniz içerisinde kendi sitenizden bir pencere yayımlayabilirsiniz. + +add_header Referrer-Policy "no-referrer-when-downgrade" always; >> Daha alt güvenlik önlemine sahip bir siteye yönlendirme veya link verdiğinizde otomatik olarak referrer başlığı eklemez ve sitenizden trafik geldiği belli olmaz. + +add_header Content-Security-Policy "default-src 'self' https: data: 'unsafe-inline' 'unsafe-eval';" always; >> Sizin ve diğer kullanıcıların dışarıdan çağırabilecekleri isteklerin hangi koşullar altında çağrılabileceğini düzenleyen başlık. Ben default olarak https üzerinden gelen bazı kaynaklara güveniyorum. + +add_header Permissions-Policy "camera=(), fullscreen=(self), geolocation=(), microphone=(), payment=()" always; >> Tarayıcıya hangi izinleri isteyeceğinizi veya hangilerine hiç ihtiyacınız olmayacağını belirterek çeşitli zehirleme türleri (cache-poisoning veya js-poisoning) ile sizin siteniz üzerinden bilgi toplanmasını engeller. +``` +Ayarları yaptıktan sonra kontrol etmek isterseniz: "sudo nginx -t" komutunu kullanabilirsiniz. Eğer bir hata mesajı görmez iseniz "sudo systemctl restart nginx" veya "sudo service nginx restart" komutu ile ayarları uygulayıp servisi baştan başlatabilirsiniz. + +## İleri Seviye Ayarlar +Öncelikle sitenize sadece ssl üzerinden bağlanması gerektiğini gösterecek bir başlık ekleyeceğiz. Bu sayede sizin sitenize daha önce girmiş olanlar ve hali hazırda bu başlığı tarayıcısında mevcut olanlar istese bile sizin sitenize Non-SSL şekilde erişemeyecekler. Ardından ise HTTP oturumlarına kullanılması gereken SSL sertifikalarını zımbalayacağız ve önceki yöntemin yanından hangi sertifikalar ile bağlanması gerekeceğini de önceden belirtmiş olacağız. Bu sayede yetkili bir üst sertifika yöneticisi veya kök yöneticisi olsanız dahi sizin adınıza imzaladığı sertifika ile sizin sitenize bağlanamayacaklar. Zamaında Türkiyede yerleşik E-Tuğra Kök Sertifika sağlayıcısı *.google.com adresine bir sertifika imzaladı. Biraz araştırırsanız hangi dönemde meydana geldiğini ve nedenini (ne kadar kötü sonuçlara neden olabileceğini) fardekersiniz. Şimdi başlayalım son konfigürasyon kısmına. + +Öncelikle sitenizin SSL üzerinden hiçbir soruna neden olmaksızın erişilebiliyor olduğundan emin olun. Ardından nginx konfig dosyasına aşağıdaki başlıklardan isteğinize göre birini ekleyin. Ama dikkat edin sadece bir tanesini. + +``` +add_header Strict-Transport-Security "max-age=2592000;" always; >> Sitenize 30 gün boyunca sadece HTTPS üzerinden erişilebileceğini belirten başlık. (Alt alan adları dahil değil) + +add_header Strict-Transport-Security "max-age=2592000; includeSubDomains;" always; >> Sitenize alt alan adları da dahil olmak üzere 30 gün boyunca sadece HTTPS üzerinden erişilebileceğini belirten başlık. + +add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;" always; >> Sitenize alt alan adları da dahil olmak üzere 1 yıl boyunca sadece HTTPS üzerinden erişilebileceğini belirten başlık. + +add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; >> Sitenize alt alan adları da dahil olmak üzere 1 yıl boyunca sadece HTTPS üzerinden erişilebileceğini ve bu başlığın tarayıcıların önbelleğine alınması talimatını veren başlık. Ayrıca yeni çıkan tarayıcılar sitenize daha önce hiç girmese dahi bu başlıktan haberdar olacaktır. + +add_header Strict-Transport-Security "max-age=0; includeSubDomains"; >> HSTS özelliğini ve preload listesi üyeliğini tamamen kaldırmaya yarayan başlık. +``` + +Yukarıda belirtilen başlığı ekledikten sonra şimdi kullanmış olduğunuz ssl sertifikasının özetinin HTTP oturumuna zımbalanmasına geldi. Bu aşamada mevcut sertifikanızın bir özetini çıkarmamız, üst imzalayan yetkilinin sertifikasının özetini çıkarmamız ve en üst kök sertifika yetkilisi de dahil olmak üzere tüm zinciri tamamlayana kadar bu özet çıkarma sürecini devam ettirmemiz gerekiyor. Bu nedenle root kullanıcısı veya sudo yetkisine sahip bir kullanıcı ile aşağıdaki komutları sırasıyla çalıştırıyoruz. (Anlatım Let's Encrypt özelinde yapılmıştır.) + +``` +1] cat /etc/letsencrypt/live/SUNUCU_ADINIZ/cert.pem | openssl x509 -pubkey | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64 >> Bu komut sizin sitenize ait sertifikanın özetini çıkaracaktır. Sonuç değerini bir yere kopyalayın. +2] curl -s https://letsencrypt.org/certs/lets-encrypt-x4-cross-signed.pem | openssl x509 -pubkey | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64 >> Bu komut letsencrypt'e ait çoklu imzalı sertifikalardan bir tanesinin özetini çıkaracaktır. +3] curl -s https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem | openssl x509 -pubkey | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64 >> Bu komut letsencrypt'e ait çoklu imzalı sertifikalardan bir tanesinin özetini çıkaracaktır. +4] curl -s https://letsencrypt.org/certs/isrgrootx1.pem | openssl x509 -pubkey | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64 >> Bu komut letsencrypt'e ait kök (en üst) sertifikasının özetini çıkaracaktır. + +Nginx config dosyasına aşağıdaki değer eklenir +5] add_header Public-Key-Pins 'pin-sha256="ILK_SONUC"; pin-sha256="IKINCI_SONUC"; pin-sha256="UCUNCU_SONUC"; pin-sha256="DORDUNCU_SONUC"; max-age=2592000; includeSubDomains' always; >> Sitenize 30 gün boyunca sadece belirtilen sertifika ile bağlanılmasına izin verir. Max-age değerini isteğe bağlı olarak artırabilirsiniz. Sertifika geçerlilik süreniz 30 günden daha az kalmadan başlığı devredışı bırakmanız veya yeni sertifika edinmeniz ve beşinci değer olarak onu eklemeniz gerekmektedir. + +Bonus olarak sunucunuzun yapmasının çok uzun süreceği ama faydası çok olan bir komut daha göstermek istiyorum. +6] openssl dhparam -out /etc/nginx/dhparams.pem 4096 >> Bu komutu uygulaması 15dk ile 1 saat arasında sürebilir. + +İşlem bittikten sonra nginx konfig dosyasına aşağıdaki komutu eklemeniz gerekmektedir. +ssl_dhparam /etc/nginx/dhparam.pem; >> Diffie-Hellman anahtar değişim algoritması sırasında kullanılacak değerleri default değerler dışında az önce oluşturduğumuz gizli değerler ile değiştirmeye yarayan komut. +``` + +Ayarları yaptıktan sonra "sudo nginx -t" ve ardından eğer bir hata mesajı görmez iseniz "sudo service nginx restart" komutu ile ayarları uygulayıp servisi baştan başlatın. Artık sizin belirlediğiniz konfigürasyon ve şartlar ile bağlantı sağlanacaktır. Eğer öncesi/sonrası puanlama farkını görmek isterseniz aşağıdaki görsellere bakabilirsiniz veya kendi sitenizi "https://www.ssllabs.com/ssltest/index.html" adresinden test edebilirsiniz. + +İLK HALİ +![İlk Hali](https://i.ibb.co/N72VF2j/Ekran-Resmi-2021-10-05-12-08-48.png) + +SON DURUM +![Son Hali](https://i.ibb.co/TTyYH31/Ekran-Resmi-2021-10-05-12-05-51.png) + +Neden Cipher Strength %100 değil derseniz TLS 1.3 ile otomatik gelen ve biz istemesek de eklenen "TLS_AES_128_GCM_SHA256 (0x1301)" yüzünden şu an %100 yapmak mümkün değil. TLS 1.3'ü kapatırım o zaman gelmez diye düşünürseniz o zaman da başka yerden puanınız gidiyor maalesef. + +## Son +- Yazar ~Wise