Selamlar Millet bu yazımda sizlere Ubuntu 24.04 üzerinde kurulu olan FreeRADIUS ile 2FA için gerekli ayarlamaları yapacağım. FreeRADIUS‘un exec özelliğinden yararlanarak Script çalıştırarak bu işlemi yapacağım arkadaşlar.
Sistemimde kullanmak adına PFsense, FreeRADIUS için Ubuntu 24.04 ve Windows AD var ve bunların kurulumları, updateleri yapıldı. AD içerisinde de sistemdostu.local adında bir Domain‘im var.
PFSense : 192.168.1.25
FreeRadius : 192.168.1.26
Windows AD : 192.168.1.27
– İlk olarak cihazımıza FreeRadius ve diğer özellikler için programlarımızı kurarız :
> sudo apt install freeradius freeradius-utils samba winbind libnss-winbind libpam-winbind libpam-google-authenticator oathtool -y
Yukarıda yaptığım kurulumları açıklamam gerekirse;
freeradius : Bu şekilde başlayanlar Radius programını kurmak için yükleniyor.
winbind : Olanlar ise Script içerisinde domain sorguları yapılası için yükleniyor.
libpam-google-authenticator : Google Authenticator programı için Token üretiyor.
oathtool : ise tokenları doğrulayan programdır.
– Gerekli olan Domain sorgularımızı düzgünce yapmak için Ubuntu FreeRADIUS cihazımızın DNS ayarlarını ve Samba ayarlarını düzenleyerek Domain‘imize alacağız. Bunun için aşağıdaki ayarlamaları yapacağız ve FQDN, DNS gibi alanları düzenleyeceğiz.
> sudo nano /etc/systemd/resolved.conf
[Resolve]
DNS=192.168.1.27
FallbackDNS=8.8.8.8
Domains=sistemdostu.local
> sudo hostnamectl set-hostname freeradius.sistemdostu.local
> nano /etc/hosts
127.0.0.1 localhost
127.0.1.1 freeradius.sistemdostu.local freeradius
192.168.1.26 freeradius.sistemdostu.local freeradius
> reboot
yukarıdaki işlemleri yaptıysanız cihazınıza restart atabilirsiniz.
Domain’e alma işlemi öncesi smb.conf dosyamızı düzenliyoruz ve ardından net ads ile domain ortamına dahil ediyoruz.
smb.conf düzenlemesinde ise workgroup alanını buluyor ve o kısmı değiştirdikten sonra alt tarafındaki yazıları elle siz ekliyorsunuz. idmap kısmında da winbind ile başlayan kısımları elle ekliyorsunuz.
> nano /etc/samba/smb.conf
# Change this to the workgroup/NT-domain name your Samba server will part of
workgroup = sistemdostu
security = ads
realm = sistemdostu.local
encrypt passwords = yes
ntlm auth = yes
# Some defaults for winbind (make sure you're not using the ranges
# for something else.)
idmap config * : backend = tdb
idmap config * : range = 10000-20000
winbind use default domain = yes
winbind offline logon = false
; idmap config YOURDOMAINHERE : backend = tdb
; idmap config YOURDOMAINHERE : range = 100000-999999
template shell = /bin/bash
Domain‘e alma işlemleri aşağıdaki komutlarla yapılıyor. Join dahil ederken, Leave düşürüyor.
> sudo net ads join -U Administrator
> sudo net ads leave -U Administrator
Daha sonra restart atıyoruz ki herhangi bir sorun var mı yok mu kontrol edebilelim diye.
> systemctl daemon-reload
> sudo systemctl restart smbd nmbd winbind
– Script ayarlamaları yapıyoruz : Bu alanda oluşturduk ve aşağıdaki bash komutlarını kullanarak içerisini doldurduk.
Script‘i /etc/freeradius altında oluşturuyorum ki freerad kullanıcısına izin verdiğimizde başka sorunlara takılmasın ve rahatca çalıştırabilsin diye. Sonrasında nano ile adını yazıyoruz ve aşağıdaki #!/bin/bash komutlarını ekliyoruz.
> nano /etc/freeradius/script.sh
#!/bin/bash
# Kullanıcı adı, şifre ve TOTP'yi al
USERNAME="$1"
FULL_PASSWORD="$2"
PASSWORD=${FULL_PASSWORD:0:-6}
TOTP=${FULL_PASSWORD: -6}
echo "User-Name = $USERNAME"
echo "Cleartext-Password = $PASSWORD" # RADIUS'un tanıdığı standart bir öznitelik
echo "Reply-Message += 'TOTP: $TOTP'" # OTP bilgisini mesaj olarak ekleyin
# LDAP sunucu bilgileri
LDAP_SERVER="ldap://192.168.1.27"
LDAP_BASE_DN="dc=sistemdostu,dc=local"
BIND_DN="administrator@sistemdostu.local"
BIND_PW="sis123.,"
# Winbind ile AD Kimlik Doğrulaması
# Kullanıcı adı geçerli mi kontrol et
wbinfo -u | grep -w "$USERNAME" > /dev/null 2>&1
if [[ $? -ne 0 ]]; then
echo "Kullanıcı adı geçersiz veya bulunamadı"
exit 1
fi
# Şifre doğrulaması (ntlm_auth ile)
if ! ntlm_auth --username="$USERNAME" --password="$PASSWORD" > /dev/null 2>&1; then
echo "Şifre geçersiz"
exit 1
fi
# LDAP bağlantısının kontrolü
ldapwhoami -x -D "$BIND_DN" -w "$BIND_PW" -H "$LDAP_SERVER" > /dev/null 2>&1
if [[ $? -ne 0 ]]; then
echo "LDAP bağlantısı başarısız"
exit 1
fi
# TOTP doğrulaması
# Kullanıcıya özgü google-authenticator dosyasındaki secret'ı oku
SECRET_FILE="/var/lib/freeradius/google-authenticator/$USERNAME"
if [[ ! -f "$SECRET_FILE" ]]; then
echo "Kullanıcı için TOTP secret dosyası bulunamadı"
exit 1
fi
# secret dosyasından sadece base32 kodlanmış secret'ı al
SECRET=$(head -n 1 /var/lib/freeradius/google-authenticator/$USERNAME)
# TOTP doğrulaması
if ! oathtool --totp -b "$SECRET" | grep -w "$TOTP" > /dev/null; then
echo "TOTP doğrulaması başarısız"
exit 1
fi
# Başarılı doğrulama sonucu
#echo "Başarıyla doğrulandı"
echo "Reply-Message += 'Başarıyla doğrulandı'"
exit 0
– Şimdi ise FreeRadius tarafında Exec module etkinleştireceğiz. Script‘imizin lokasyon bilgisini ve adını burada kullanacağız.
> ls /etc/freeradius/3.0/mods-enabled/exec
> ln -s /etc/freeradius/3.0/mods-available/exec ls /etc/freeradius/3.0/mods-enabled/
ls komutumuz ile kontrol sağlıyoruz. Eğer alanda exec module yok ise ln -s komudunu kullanarak link oluşturuyorsunuz. Bu sayede module aktifleşmiş oluyor.
> nano /etc/freeradius/3.0/mods-available/exec
exec my_exec_module {
wait = yes
input_pairs = request
program = "/etc/freeradius/script.sh %{User-Name} %{User-Password}"
output_pairs = reply
shell_escape = yes
timeout = 10
}
Sonrasında Exec dosyasının içerisine girip yukarıdaki düzenlemeleri yapıyorsunuz. Kaydedip kapatıyorsunuz. bu module içerisinde exec yazan kısma dokunmuyoruz altına yeni alana ekliyoruz.
Conf. dosyasını biraz açıklamam gerekirse :
exec my_exec_module : Bu module’ün adıdır ve FreeRADIUS yapılandırmasında bu ismi kullanarak işlem yaptıracağız.
wait : script’in sonucunu beklemesi için kullanılır.
input_pairs = request : ile parametrelerin script’e envoirement olarak gönderilmesini sağlar.
program : çalıştırılacak script’in yolu ve parametreleri belirtilir.
output_pairs = reply : Script’in çıktısını FreeRADIUS’a reply olarak gönderir.
shell_escape = yes : değişkenlerdeki özel karakterleri escape eder.
timeout = 10 : script’in çalışması için max süreyi belirler.
– Exec Modülünü RADIUS İşleyişine Dahil Et :
> nano /etc/freeradius/3.0/sites-enabled/default
authorize bloğuna my_exec_module ve altındaki komutları ekleyin:
authorize {
my_exec_module
update control {
Auth-Type := Accept
}
authentication bloğunda ise PAP conf. altına my_exec_module alanını ekleyin:
authenticate {
Auth-Type PAP {
pap
}
Auth-Type my_exec_module {
my_exec_module
}
Tüm alanları yaptıktan sonra dosyamızı kaydedip çıkıyoruz.
– FreeRadius yapılandırmasını test ediyoruz ki herhangi bir sorun var mı yok mu görelim diye:
> systemctl stop freeradius
> freeradius -X
– Kullanıcılarımıza ayrı ayrı Google Authenticator için QR oluşturacağız : Bunun için freerad kullanıcısının rahatca çalışabilmesi için oluşturulan klasörlere aşağıdaki yetkiler tanımlayacağız. Komutları kullanabilirsiniz.
> sudo mkdir -p /var/lib/freeradius/google-authenticator
> sudo chown -R freerad:freerad /var/lib/freeradius/google-authenticator
> sudo chmod -R 700 /var/lib/freeradius/google-authenticator
Google Authenticator için aşağıdaki komut ile kullanıcı bazlı tokenlar oluşturacağız. Burada telefonunuzda Google Authenticator programı olmalı.
> sudo -u freerad google-authenticator -s /var/lib/freeradius/google-authenticator/semih
– Script işlemleri : Aşağıdaki komutlarım ile script çalıştırılırken sıkıntı olmaması adına gerekli izinler ayarlanmaktadır.
> sudo chown freerad:freerad /etc/freeradius/script.sh
> sudo chmod +x /etc/freeradius/script.sh
> sudo chmod 777 /etc/freeradius/script.sh
– AD bağlantısında sorun var mı diye kontrol etmek isterseniz aşağıdaki komutları kullanabilirsiniz :
> wbinfo -a semih%sis123., // Kullanıcı adı ve Password doğrulaması yapar.
> wbinfo -u
> ntlm_auth --username=semih --password=sis123.,
– Script test etmek içinse :
> ./script.sh semih sis123.,236602
kullanıcı adını yazdıktan sonra password+token yazıyoruz birleşik bir şekilde.
– Aynı şekilde local olarak Radtest yapıyoruz ve orada da FreeRadius‘ta hata var mı diye anlıyoruz.
> radtest semih sis123.,832712 localhost 18122 testing123
– FreeRADIUS‘a bağlanacak cihazlara izin vermemiz lazım. PFSense‘den VPN bağlantısında 2FA yapmak için kullanacaksanız bunu aşağıdaki dosyada PFSense izin vermeniz lazım.
> nano /etc/freeradius/3.0/clients.conf
client pfsense {
ipaddr = 192.168.1.25
secret = sis123
require_message_authenticator = no
}
– Her şeyi denediniz her şey ok tamam diyorsunuz. Ama ne olur ne olmaz siz Debug mod‘da çalışan Freeradius kapatıp bir tekrar açın. Restart atın yani ne olur ne olmaz.
> freeradius -X
Bu kısımdan sonra arkadaşlar test ettik, çalıştığını gördük zaten. Artık sistemlerinizde hangi alana dahil etmek isterseniz oraya ekleyin FreeRADIUS cihazınızı ve ayarlamalarınızı sağlayın.
Benim yazılarımın içerisinde PFSense OpenVPN conf. için iki adet yazı var birincisine buraya tıklayarak ve ikincisine buraya tıklayarak ulaşabilirsiniz. FreeRADIUS yazılarımdan da PFSense eklediğim yazıma buraya tıklayarak ulaşabilir ve PFSense işlemlerinide yapabilirsiniz.
Yazı çok uzun olduğundan sonrasında PFSense Authentication Servers eklemesi ve VPN kurulum ayarları gibi konuları önceden yazdığım için link olarak verdim oraları kontrol edebilir ve bana destek olmak için web sitemde daha çok gezebilirsiniz. 😀
Umarım yararlı olmuştur ve fikirlerinizi gerçekten çok merak ediyorum yorumlar alanından bana yazın, sorun, tartışalım. Destek vermek isterseniz de Youtube, Instagram ve TikTok üzerinden SistemDostu kanallarıma abone olabilirsiniz. Kolaylıklar dilerim.