Ubuntu 22.04’te Fail2Ban ile SSH Nasıl Korunur
Adım 1 — Fail2ban Kurulumu
Fail2ban, Ubuntu’nun yazılım havuzlarında mevcuttur. Paket listelerinizi güncellemek ve Fail2ban’ı kurmak için root olmayan bir kullanıcı olarak aşağıdaki komutları çalıştırarak başlayın:
sudo apt update
sudo apt install fail2ban
Fail2ban, kurulduktan sonra otomatik olarak bir arka plan hizmeti kuracaktır. Ancak, varsayılan ayarlarından bazıları istenmeyen etkilere neden olabileceğinden, varsayılan olarak devre dışıdır. systemctl
Bunu şu komutu kullanarak doğrulayabilirsiniz :
systemctl status fail2ban.service
Output○ fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled
Active: inactive (dead)
Docs: man:fail2ban(1)
Fail2ban’ı hemen etkinleştirebilirsiniz, ancak önce bazı özelliklerini gözden geçireceksiniz.
Adım 2 – Fail2ban’ı Yapılandırma
fail2ban hizmeti, yapılandırma dosyalarını /etc/fail2ban
dizinde tutar. adlı varsayılanları olan bir dosya var jail.conf
. Bu dizine gidin ve aşağıdakileri kullanarak bu dosyanın ilk 20 satırını yazdırın head -20
:
cd /etc/fail2ban
head -20 jail.conf
Output#
# WARNING: heavily refactored in 0.9.0 release. Please review and
# customize settings for your setup.
#
# Changes: in most of the cases you should not modify this
# file, but provide customizations in jail.local file,
# or separate .conf files under jail.d/ directory, e.g.:
#
# HOW TO ACTIVATE JAILS:
#
# YOU SHOULD NOT MODIFY THIS FILE.
#
# It will probably be overwritten or improved in a distribution update.
#
# Provide customizations in a jail.local file or a jail.d/customisation.local.
# For example to change the default bantime for all jails and to enable the
# ssh-iptables jail the following (uncommented) would appear in the .local file.
# See man 5 jail.conf for details.
#
# [DEFAULT]
Göreceğiniz gibi, bu dosyanın ilk birkaç satırı yorumlanmıştır#
– ayarlar olarak değil belge olarak okunacaklarını belirten karakterlerle başlarlar . Ayrıca göreceğiniz gibi, bu yorumlar sizi bu dosyayı doğrudan değiştirmemeye yönlendiriyor. Bunun yerine iki seçeneğiniz vardır: ya dizindeki birden çok dosyada Fail2ban için bireysel profiller oluşturun ya jail.d/
da tüm yerel ayarlarınızı bir jail.local
dosyada oluşturun ve toplayın. Dosya jail.conf
, Fail2ban’ın kendisi güncellendiğinden periyodik olarak güncellenecektir ve herhangi bir geçersiz kılma oluşturmadığınız varsayılan ayarların kaynağı olarak kullanılacaktır.
Bu eğitimde, oluşturacaksınız jail.local
. Bunu kopyalayarak yapabilirsiniz jail.conf
:
sudo cp jail.conf jail.local
Artık yapılandırma değişiklikleri yapmaya başlayabilirsiniz. Dosyayı nano
veya favori metin düzenleyicinizde açın:
sudo nano jail.local
Dosyada gezinirken, bu öğretici güncellemek isteyebileceğiniz bazı seçenekleri gözden geçirecektir. [DEFAULT]
Dosyanın üst kısmına yakın bölümün altında bulunan ayarlar , Fail2ban tarafından desteklenen tüm servislere uygulanacaktır. [sshd]
Dosyanın başka bir yerinde, varsayılanların üzerine uygulanacak hizmete özel ayarları içeren diğer hizmetler için ve diğer hizmetler için başlıklar vardır ./etc/fail2ban/jail.local
[DEFAULT]
. . .
bantime = 10m
. . .
Parametre bantime
, bir istemcinin doğru bir şekilde kimlik doğrulaması yapamadığında ne kadar süreyle yasaklanacağını belirler. Bu saniye cinsinden ölçülür. Varsayılan olarak, bu 10 dakikaya ayarlanmıştır. /etc/fail2ban/jail.local
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .
Sonraki iki parametre findtime
ve maxretry
. Bunlar, bir müşterinin yasaklanması gereken gayri meşru bir kullanıcı olduğu tespit edilen koşulları belirlemek için birlikte çalışır.
Değişken , bir istemcinin yasaklanmadan önce maxretry
tarafından tanımlanan bir zaman penceresi içinde kimlik doğrulaması yapması gereken deneme sayısını ayarlar . findtime
Varsayılan ayarlarla fail2ban hizmeti, 10 dakikalık bir pencere içinde 5 kez başarısız bir şekilde oturum açmaya çalışan bir istemciyi yasaklayacaktır. /etc/fail2ban/jail.local
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .
Fail2ban harekete geçtiğinde e-posta uyarıları almanız gerekiyorsa destemail
, sendername
, ve mta
ayarlarını değerlendirmelisiniz. Parametre destemail
, yasak mesajlarını alması gereken e-posta adresini ayarlar. E sendername
-postadaki “Kimden” alanının değerini ayarlar. Parametre mta
, posta göndermek için hangi posta hizmetinin kullanılacağını yapılandırır. Varsayılan olarak bu , ancak Postfix veya başka bir posta çözümünü sendmail
kullanmak isteyebilirsiniz. /etc/fail2ban/jail.local
[DEFAULT]
. . .
action = $(action_)s
. . .
Bu parametre, bir ban oluşturmak istediğinde Fail2ban’ın yapacağı eylemi yapılandırır. Değer action_
, bu parametreden kısa bir süre önce dosyada tanımlanır. Varsayılan eylem, güvenlik duvarı yapılandırmanızı, sorunlu ana bilgisayardan gelen trafiği yasaklama süresi geçene kadar reddedecek şekilde güncellemektir.
Varsayılan olarak sağlanan ve yukarıdakiyle değiştirebileceğiniz başka action_
komut dosyaları da vardır: $(action_)
/etc/fail2ban/jail.local
…
# ban & send an e-mail with whois report to the destemail.
action_mw = %(action_)s
%(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(action_)s
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
# See the IMPORTANT note in action.d/xarf-login-attack for when to use this action
#
# ban & send a xarf e-mail to abuse contact of IP address and include relevant log lines
# to the destemail.
action_xarf = %(action_)s
xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
# ban IP on CloudFlare & send an e-mail with whois report and relevant log lines
# to the destemail.
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…
Örneğin, action_mw
eylemde bulunur ve bir e-posta action_mwl
gönderir, eylemde bulunur, bir e-posta gönderir ve günlüğe kaydetmeyi içerir ve suçluyu orada yasaklamak için hesabınızla ilişkili Cloudflare action_cf_mwl
API’sine bir güncelleme göndermenin yanı sıra yukarıdakilerin hepsini yapar .
Bireysel Hapishane Ayarları
Sonraki, yapılandırma dosyasının bireysel hizmetlerle ilgilenen kısmıdır. Bunlar, gibi bölüm başlıklarıyla belirtilir [sshd]
.
enabled = true
Bu bölümlerin her biri , diğer ayarlarıyla birlikte başlığın altına bir satır eklenerek ayrı ayrı etkinleştirilmelidir. /etc/fail2ban/jail.local
[jail_to_enable]
. . .
enabled = true
. . .
Varsayılan olarak, SSH hizmeti etkindir ve diğerleri devre dışıdır. . Burada ayarlanan diğer bazı ayarlar, filter
bir günlükteki bir satırın başarısız bir kimlik doğrulamasını gösterip göstermediğine karar vermek için kullanılacak olan ve logpath
fail2ban’a söz konusu hizmet için günlüklerin nerede bulunduğunu söyleyen ayarlardır.
Değer filter
aslında /etc/fail2ban/filter.d
dizinde bulunan ve .conf
uzantısı kaldırılmış bir dosyaya yapılan bir referanstır. Bu dosyalar , günlükteki bir satırın başarısız bir kimlik doğrulama girişimi olup olmadığını belirleyen normal ifadeler (metin ayrıştırma için ortak bir kısayol) içerir. Bu dosyaları bu kılavuzda derinlemesine ele almayacağız çünkü bunlar oldukça karmaşıktır ve önceden tanımlanmış ayarlar uygun satırlarla uyumludur.
Ancak, o dizine bakarak ne tür filtrelerin mevcut olduğunu görebilirsiniz:
ls /etc/fail2ban/filter.d
Kullanmakta olduğunuz bir hizmetle ilgili görünen bir dosya görürseniz, onu bir metin düzenleyici ile açmalısınız. Dosyaların çoğu oldukça iyi yorumlanmıştır ve en azından betiğin ne tür koşullara karşı korunmak için tasarlandığını söyleyebilmelisiniz. Bu filtrelerin çoğu, istenirse dosyada jail.conf
etkinleştirebileceğimiz uygun (devre dışı) bölümlere sahiptir. jail.local
Örneğin, Nginx kullanarak bir web sitesine hizmet ettiğinizi düşünün ve sitenizin parola korumalı bir bölümünün oturum açma girişimleriyle çarpıldığını fark edin. fail2ban’a nginx-http-auth.conf
dosya içinde bu durumu kontrol etmek için dosyayı kullanmasını söyleyebilirsiniz /var/log/nginx/error.log
.
[nginx-http-auth]
Bu aslında dosyanızda adı verilen bir bölümde zaten kurulmuştur /etc/fail2ban/jail.conf
. enabled
Sadece parametreyi eklemeniz gerekir: etc/fail2ban/jail.local
. . .
[nginx-http-auth]
enabled = true . . .
Düzenlemeyi bitirdiğinizde dosyayı kaydedin ve kapatın. Bu noktada Fail2ban hizmetinizi bundan sonra otomatik olarak çalışacak şekilde etkinleştirebilirsiniz. İlk önce şunu çalıştırın systemctl enable
:
sudo systemctl enable fail2ban
Ardından, ilk kez şununla manuel olarak başlatın systemctl start
:
sudo systemctl start fail2ban
Şununla çalıştığını doğrulayabilirsiniz systemctl status
:
sudo systemctl status fail2ban
Output● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab>
Active: active (running) since Mon 2022-06-27 19:25:15 UTC; 3s ago
Docs: man:fail2ban(1)
Main PID: 39396 (fail2ban-server)
Tasks: 5 (limit: 1119)
Memory: 12.9M
CPU: 278ms
CGroup: /system.slice/fail2ban.service
└─39396 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Jun 27 19:25:15 fail2ban22 systemd[1]: Started Fail2Ban Service.
Jun 27 19:25:15 fail2ban22 fail2ban-server[39396]: Server ready
Bir sonraki adımda Fail2ban’ı çalışırken göstereceksiniz.
Adım 3 — Yasaklama Politikalarını Test Etme (İsteğe Bağlı)
Gelecekte Fail2ban sunucunuzda oturum açmanıza gerek kalmayacak olan başka bir sunucudan, ikinci sunucuyu yasaklayarak kuralları test edebilirsiniz. İkinci sunucunuza giriş yaptıktan sonra Fail2ban sunucusuna SSH yapmayı deneyin. Var olmayan bir ad kullanarak bağlanmayı deneyebilirsiniz:
ssh blah@your_server
Parola istemine rastgele karakterler girin. Bunu birkaç kez tekrarlayın. Bir noktada, aldığınız hatanın olarak değişmesi Permission denied
gerekir Connection refused
. Bu, ikinci sunucunuzun Fail2ban sunucusundan yasaklandığını gösterir.
Fail2ban sunucunuzda çıktınızı kontrol ederek yeni kuralı görebilirsiniz iptables
. iptables
sunucunuzdaki düşük seviyeli bağlantı noktası ve güvenlik duvarı kurallarıyla etkileşim kurmak için bir komuttur. DigitalOcean’ın ilk sunucu kurulumu kılavuzunu izlediyseniz, ufw
güvenlik duvarı kurallarını daha yüksek düzeyde yönetmek için kullanacaksınız. Çalıştırmak , önceden oluşturulmuş iptables -S
tüm güvenlik duvarı kurallarını size gösterecektir : ufw
sudo iptables -S
Output-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N f2b-sshd
-N ufw-after-forward
-N ufw-after-input
-N ufw-after-logging-forward
-N ufw-after-logging-input
-N ufw-after-logging-output
-N ufw-after-output
-N ufw-before-forward
-N ufw-before-input
-N ufw-before-logging-forward
-N ufw-before-logging-input
-N ufw-before-logging-output
…
iptables -S
to öğesinin çıktısını grep
dize için bu kurallar içinde aramak için yönlendirirseniz f2b
, fail2ban tarafından eklenen kuralları görebilirsiniz:
sudo iptables -S | grep f2b
Output-N f2b-sshd
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A f2b-sshd -s 134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -j RETURN
İçerdiği satır REJECT --reject-with icmp-port-unreachable
Fail2ban tarafından eklenmiş olacak ve ikinci sunucunuzun IP adresini yansıtmalıdır.