NGINX'te Parola ile Erişimi Kısıtlama ve Güvenliği Artırma

16/12/2023 |
Loading...

Giriş: Bu eğitimde, NGINX sunucu bloklarını ve location direktiflerini yapılandırarak web sitenizin güvenliğini nasıl artıracağınızı öğreneceksiniz. Belirli istemci IP adreslerini nasıl engelleyeceğinizi, coğrafi konumlara göre erişimi nasıl kısıtlayacağınızı (coğrafi tabanlı kısıtlama) ve HTTP Temel Kimlik Doğrulaması kullanarak parola tabanlı kimlik doğrulamayı nasıl uygulayacağınızı keşfedeceksiniz. Bu önlemler, web sunucunuz için ek koruma sağlarken, belirli web sayfalarına erişimi kontrol etmenize de olanak tanır.

Ön Koşullar:

  • Sudo ayrıcalıklarına sahip bir Ubuntu sunucusu
  • Sunucunuzda yüklü NGINX
  • NGINX ve yapılandırması hakkında temel anlayış

Not: Parola tabanlı kısıtlama için, sunucunuzda HTTPS'nin etkinleştirilmiş olması önerilir. HTTPS'yi kurmak için bu eğitimi takip edebilirsiniz.

Biçimlendirme Kuralları:

  • Bazı yapılandırma örneklerinde, atlanan kısımları belirtmek için üç nokta (...) kullanılabilir.
  • "Sunucu" terimi, NGINX yüklü Ubuntu sunucunuzu ifade ederken, "sunucu bloğu" terimi şuna benzeyen NGINX yapılandırma bloğunu ifade eder:
server { ... }

Yapılandırma Yerleri: NGINX'in yapılandırma dosyalarını nerede sakladığının farkında olmalısınız:

  • /etc/nginx, tüm yapılandırma dosyalarının yerleştirildiği NGINX yapılandırma dizinidir.
  • /etc/nginx/nginx.conf, NGINX'in yapılandırmasını okumaya başladığı ana NGINX yapılandırma dosyasıdır.
  • /etc/nginx/sites-enabled, HTTP(S) sunucu yapılandırma dosyalarınızı yerleştirebileceğiniz yerdir. NGINX başlatıldıktan veya yeniden yüklendikten sonra, bu dizindeki tüm dosyalar NGINX tarafından yüklenir.
  • /etc/nginx/sites-available, HTTP(S) sunucu yapılandırma dosyalarınızı yerleştirebileceğiniz yerdir, ancak /etc/nginx/sites-enabled dizininde bir sembolik bağlantı oluşturmadığınız sürece NGINX tarafından yüklenmezler.

Günlük Dosyaları: NGINX iki varsayılan günlük dosyası oluşturur:

  • /var/log/nginx/access.log: Tüm istekleri kaydeder.
  • /var/log/nginx/error.log: Hata durumlarını ve durum bilgilerini kaydeder.

Yeniden Yükleme Hatası: NGINX yapılandırmanızı sudo systemctl reload nginx ile yeniden yüklerken bir hata ile karşılaşırsanız, sudo nginx -t komutunu çalıştırarak belirli hatayı görüntüleyebilirsiniz.

Adım 1 - Sunucu Bloğu Dosyasını Bulma

Kısıtlamaları yapılandırmak için, alan adınıza karşılık gelen sunucu bloğu dosyasını bulmanız gerekir. Sunucu bloğu dosyalarını listelemek için aşağıdaki komutu kullanın:

ls -al /etc/nginx/sites-available/

example.com adresine yanıt veren bir sunucu bloğuna kısıtlama eklemek istediğinizi varsayarsak, server_name example.com; satırına sahip sunucu bloğunu bulun. Örneğin:

server { ... server_name example.com; ... }

listen direktifinin, kısıtlamak istediğiniz portla eşleştiğinden emin olun (örneğin, HTTP için listen 80;).

Adım 2 - Erişime İzin Vermek veya Reddetmek için IP Adreslerini Kullanma

NGINX, istemci IP adreslerine göre erişimi kontrol etmek için allow ve deny direktiflerini sağlar. Test etmek için kendi IP adresiniz de dahil olmak üzere belirli IP adreslerine erişimi engelleyebilirsiniz.

Adım 2.1 - Genel IP Adresinizi Bulma Kendi IP adresinizi engellemek için öncelikle genel IP adresinizi belirlemeniz gerekir. Aşağıdaki komutu çalıştırın:

curl -4 https://2ip.io

Çıktı olarak genel IP adresinizi alacaksınız (örneğin, 15.1.1.1). Komut başarısız olursa, IP adresinizi bir Google araması ile bulabilirsiniz.

Adım 2.2 - Erişimi Engelleme IP adresinizi engellemek için, sunucu bloğunuzdaki uygun location bağlamına aşağıdaki satırı ekleyin, 15.1.1.1'i genel IP'nizle değiştirin:

deny 15.1.1.1);

İşte bir yapılandırma parçacığı örneği:

server { listen 80; server_name example.com; location / { deny 15.1.1.1) } }

Bu değişikliği yaptıktan sonra, yapılandırmayı uygulamak için NGINX'i yeniden yükleyin:

sudo systemctl reload nginx

Şimdi, web sitenize IP adresinizden erişmek için aynı komutu çalıştırırsanız:

curl -4 --head http://example.com

Erişimin reddedildiğini belirten bir HTTP 403 Yasak hatası almalısınız.

Not: Birden fazla allow ve deny direktifi belirtebilirsiniz. Eşleşen ilk direktif uygulanacaktır. Örneğin:

allow 15.1.1.1; allow 15.1.1.2; deny all;

Bu örnekte, 15.1.1.1 ve 15.1.1.2 için erişime izin verilirken, diğer tüm IP adresleri reddedilir.

Adım 3 - Erişime İzin Vermek veya Reddetmek için Geo Modülünü Kullanma

NGINX'in geo modülü, IP veritabanlarını kullanarak coğrafi konumlara göre erişimi kontrol etmenin esnek bir yolunu sunar. Bu özelliği etkinleştirmek için:

  1. libnginx-mod-http-geoip2 paketini yükleyin:
sudo apt update && sudo apt install libnginx-mod-http-geoip2
  1. /etc/nginx/nginx.conf dosyasının aşağıdaki satırı içerdiğinden emin olun:
include /etc/nginx/modules-enabled/*.conf;
  1. GeoIP2 uyumlu bir IP veritabanı indirin. Sağlanan komutu kullanabilir veya MaxMind web sitesinde bir hesap oluşturup GeoLite2 Ülke veritabanını indirebilirsiniz:
cd /etc/nginx && sudo curl --fail -LO https://github.com/P3TERX/GeoLite.mmdb/releases/latest/download/GeoLite2-Country.mmdb
  1. NGINX yapılandırmanızı, GeoIP2 direktiflerini içerecek şekilde düzenleyin:
geoip2 /etc/nginx/GeoLite2-Country.mmdb { $user_country country iso_code; } map $user_country $not_allowed { CA 1; # Kanada US 1; # Amerika Birleşik Devletleri default 0; # Diğer tüm ülkelere izin ver } server { listen 80; server_name example.com; location / { if ($not_allowed) { return 403 "Erişiminize izin verilmiyor."; } } }

Bu örnekte, Kanada (CA) ve Amerika Birleşik Devletleri'nden (US) gelen kullanıcılar için erişim reddedilirken, diğer tüm ülkelerden gelenlere izin verilir.

Değişiklikleri uygulamak için NGINX'i yeniden yükleyin:

sudo systemctl reload nginx

Adım 4 - Parola Tabanlı Kimlik Doğrulama (HTTP Temel Kimlik Doğrulama)

Kullanıcı adı ve parolaya göre erişimi kısıtlamak için HTTP Temel Kimlik Doğrulaması kullanabilirsiniz. Sunucunuzda HTTPS'nin etkin olduğundan emin olun.

  1. Kullanıcı adlarını ve hashlenmiş parolaları saklamak için bir dosya oluşturun:
sudo touch /etc/nginx/users
  1. Aşağıdaki komutu kullanarak kullanıcı ekleyin (user ve password yerine istediğiniz kullanıcı adını ve parolayı yazın):
python3 -c 'from subprocess import *; import sys; print("Username: ", end="", file=sys.stderr); user = input(); passwd = run(["openssl", "passwd", "-6"], encoding="utf-8", stdout=PIPE).stdout.strip(); print("Username or password is empty. Try again!", file=sys.stderr) if user == "" or passwd == "" else print(user + ":" + passwd)' | sudo tee -a /etc/nginx/users

Bu komut, /etc/nginx/users dosyasına bir kullanıcı ekler ve kullanıcı adını ve hashlenmiş parolayı user:password çiftleri olarak çıktılar. Parola, sunucuda düz metin olarak saklanmaz.

  1. Sunucu bloğu yapılandırmanızı, HTTP Temel Kimlik Doğrulamasını içerecek şekilde değiştirin:
server { server_name example.com; location / { } auth_basic "Protected area!"; auth_basic_user_file /etc/nginx/users; listen 443 ssl; # Certbot tarafından yönetilir ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # Certbot tarafından yönetilir ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # Certbot tarafından yönetilir include /etc/letsencrypt/options-ssl-

Özel Teklifler ve Promosyonlar Edinin!

En son teklifler, indirimler ve özel promosyonlardan haberdar olun.

Update cookies preferences