Freeradius üzerinde PEAP ve LDAP ayarları

Ali Orhun Akkirman - Jun 19 '22 - - Dev Community

Freeradius üzerinde PEAP kullanarak LDAP üzerindeki kullanıcılarla giriş yapılabilmesine yönelik düzenli bir içeriğin olmadığını fark ettim. Aslında geçmiş zamanlı Ubuntu üzerinde çeşitli yazılar olmasına rağmen özellikle CentOS ve RPM tabanlı sistemlerde hiç bulamadığımı söylemek isterim. Bu belge boyunca için CentOS 7 ve benzerleri üzerinde örnekler yapacağımı belirtmek isterim.

Belge süresince yapacaklarımızı anlatırsam, Öncelikle LDAP kaynağına (örneğin Aktif Dizin) kendimizi dahil ediyoruz. Sonrasında başka bir yazıda bahsettiğim sertifikaları hazırlıyoruz. Sonrasında freeradius üzerinde ayarları tamamlıyoruz.

Sunucumuzu domaine ekleyelim

Bu adım için önelikle freeradius paketinin yüklenmesi ile başlayabiliriz.

yum install freeradius freeradius-ldap
Enter fullscreen mode Exit fullscreen mode

Daha sonrasında domaine eklenme konusunda domainin adresini /etc/resolv.conf dosyası içerisinde "nameserver IPADRES" olarak ekledikten sonra gerekli paketleri kurabiliriz.

yum install samba winbind krb5-workstation samba-winbind-clients
Enter fullscreen mode Exit fullscreen mode

Paketler yüklendikten sonra samba ayarlarını yapmak gerekmektedir. /etc/samba/smb.conf dosyası içeriğini aşağıdaki gibi yapmanız gerekmektedir.

Bu dosya içinde sadece ACIKLAB yazan yerleri domain workgrup adı, ACIKLAB.LAB yazan yerleri de kendi domaininize göre düzenlemeniz gerekiyor. 4 yerde domain, 1 yerde workgrup bulunduğunu belirtmek isterim.

[global]
        workgroup = ACIKLAB
        security = ads
        realm = ACIKLAB.LAB
        domain master=no
        local master=no
        preferred master=no
        load printers=no
        printing=bsd
        printcap name=/dev/null
        disable spoolss=yes

        idmap config * : backend = tdb
        idmap config * : range = 300000-301000

        idmap config ACIKLAB.LAB:backend = ad
        idmap config ACIKLAB.LAB:schema_mode = rfc2307
        idmap config ACIKLAB.LAB:range = 500-200000

        winbind enum users=yes
        winbind enum groups=yes
        winbind use default domain=yes 
        winbind nested groups=yes
        winbind refresh tickets=yes
        winbind offline logon=yes
        template shell=/bin/false
        client use spnego=yes
        client ntlmv2 auth=yes
        encrypt passwords=yes
        restrict anonymous=2
        log file=/var/log/samba/samba.log
        log level=2
        dcerpc endpoint servers=remote
        ntlm auth = mschapv2-and-ntlmv2-only
Enter fullscreen mode Exit fullscreen mode

Bu ayarı yaptıktan sonra aşağıdaki komut ile servisleri yeniden başlatıp domainde bildiğiniz bir kullanıcının çekilip çekilemediğini kontrol etmeniz gerekmektedir.

systemctl restart smb 
kinit administrator@ACIK.LAB 
net ads join -k
systemctl restart winbind
wbinfo -i ali
Enter fullscreen mode Exit fullscreen mode

Eğer bir sorun yoksa ilk ve en önemli aşamayı geçtiğimizi söyleyebilirim. AYrıca kerberos ile ilgili dosya hakkında bilginiz varsa o kısmı kendinize göre doldurmanızı da önermekteyim ama çok detaya girmemek için bu başlığa girmiyorum.

Kısaca bir test yapılması istenirse aşağıdaki komut ile operation completed successfully mesajını almak da arada güzel olabilir:

ntlm_auth --request-nt-key --domain=ACIKLAB.LAB --username=ali --password=Passw0rd
Enter fullscreen mode Exit fullscreen mode

Unutulmaması gereken ve CentOS için çok kaynak bulamadığım en önemli adım da aşağıdaki komutların da uygulanması. Ubuntu'da farklı isimlerde oluşturulduğu için dokümanlarda bu kısım karışmaktadır.

usermod -a -G wbpriv radiusd
chown root:wbpriv /var/lib/samba/winbindd_privileged/
Enter fullscreen mode Exit fullscreen mode

Sertifikaların hazırlanması

Bu kısım da oldukça önemli bir kısım olup ayrı bir dosyada bahsettim. Fakat bu kısımda var olan bir sertifika otoritesini kullanmaya yönelik başka bir yazı da hazırlayacağım.

https://dev.to/aciklab/freeradius-uzerinde-sertifika-olusturulmasi-nm

PEAP için modların ayarlanması

PEAP için en önemli kullanacağımız 3 mod bulunmakta. ldap, mschap ve eap modları.

LDAP modu

LDAP modu "/etc/raddb/mods-enabled/ldap" adresinde olup eğer oluşturulmamışsa siz oluşturabilirsiniz. İçeriği aşağıdaki gibi olmalıdır.

ldap {
        server = 'ldaps://192.168.1.180'
        identity = "cn=administrator,cn=Users,dc=aciklab,dc=lab"
        password = "Passw0rd"
        basedn = "cn=Users,dc=aciklab,dc=lab"
        base_filter = "(objectclass=user)"
#       filter = "(&(sAMAccountName=%{Stripped-User-Name:-%{User-Name}})(memberOf:1.2.840.113556.1.4.1941:=CN=wireless_corp,OU=Networks,DC=aciklab,DC=lab))"
        ldap_connections_number = 5
        timeout = 4
        timelimit = 3
        net_timeout = 1
        dictionary_mapping = ${confdir}/ldap.attrmap
        keepalive {
                idle = 60
                probes = 3
                interval = 3
        }
}
Enter fullscreen mode Exit fullscreen mode

Bu dosyada en önemli kısım server adresini düzgünce yazmak, identity ve parolasını doğru şekilde yazmaktır. Ve tabi ki basedn ve base_filter da temel kullanım olarak düzenlenmelidir. Bu konuları bilmiyorsanız LDAP ile ilgili çeşitli yazılarımızı inceleyebilirsiniz.

MSCHAP modu

MSCHAP modu "/etc/raddb/mods-enabled/mschap" adresinde olup eğer oluşturulmamışsa siz oluşturabilirsiniz. İçeriği aşağıdaki gibi olmalıdır.

mschap {
        use_mppe = yes
        require_encryption = yes
        require_strong = yes
        with_ntdomain_hack = yes 
        ntlm_auth = "/usr/bin/ntlm_auth --allow-mschapv2 --request-nt-key --domain=ACIKLAB.LAB --username=%{%{Stripped-User-Name}:-%{%{User-Name}:-None}} --challenge=%{%{mschap:Challenge}:-00} --nt-response=%{%{mschap:NT-Response}:-00}"

}
Enter fullscreen mode Exit fullscreen mode

Bu kısımdaki en önemli nokta da samba-winbind-clients paketi ile birlikte gelen ntlm_auth'in domain parametresindeki ACIKLAB.LAB'ı kendi domaininizle değiştirmenizdir.

EAP modu

EAP modu "/etc/raddb/mods-enabled/eap" adresinde olup eğer oluşturulmamışsa siz oluşturabilirsiniz. İçeriği aşağıdaki gibi olmalıdır.

EAP'ın PEAP algoritmasını kullanacağımız için süreç aşağıdaki gibi olmalıdır. "private_key_password" kısmı sertifikalarınızı oluştururken girdiğiniz parola olması gerekmektedir. Diğer kısımlar için sertifika adreslerinde bir oynama yapmadıysanız aynı kalmasında bir bahsur bulunmamaktadır.

eap {
        default_eap_type = peap 
        timer_expire     = 60
        ignore_unknown_eap_types = no
        cisco_accounting_username_bug = no
        max_sessions = 4096

        tls {
                certdir = ${confdir}/certs
                cadir = ${confdir}/certs
                private_key_password = birbir
                private_key_file = ${certdir}/server.pem
                certificate_file = ${certdir}/server.pem
                ca_file = ${cadir}/ca.pem
                dh_file = ${certdir}/dh
                random_file = /dev/urandom
                ca_path = ${cadir}
                cipher_list = "ECDH+AESGCM:DH+AESGCM:ECDH+AES256:ECDH+AES128:!aNULL:!MD5"
                #make_cert_command = "${certdir}/bootstrap"
                ecdh_curve = "prime256v1"
        }

        peap {
                default_eap_type = mschapv2
                copy_request_to_tunnel = no
                use_tunneled_reply = no
                virtual_server = "inner-tunnel"
        }

        mschapv2 {
        }
}
Enter fullscreen mode Exit fullscreen mode

Bazı durumlar için güvenlik nedeniyle aşağıdaki satırların da eklenmesi önerilmektedir:

    tls_min_version = "1.0"
                tls_max_version = "1.2"
Enter fullscreen mode Exit fullscreen mode

Servis ayarlarının tamamlanması

Bu adım için "/etc/raddb/sites-enabled/" klasörü içerisinde bir dosyada, örneğin default isimli bir dosyada aşağıdaki gibi bir içerik tanımlanması gerekmektedir. Bu kısımda daha detaylı şeyler yapılabilir ama şimdilik detaya girmiyorum. Onun için "/etc/raddb/sites-enabled/default" dosyası içeriği için aşağıdaki gibi düzenleme yapılması gerekiyor:

    listen {
            type = auth
            ipaddr = *
            port = 1812
    }


authorize {
        preprocess
        auth_log
        suffix
        eap {
                ok = return
        }
        expiration
        logintime
}

authenticate {
        Auth-Type MS-CHAP {
                mschap
        }
        eap
}

session {
        radutmp
}

post-auth {
        Post-Auth-Type REJECT {
                attr_filter.access_reject
        }
}
Enter fullscreen mode Exit fullscreen mode

Ayrıca aynı yerde "/etc/raddb/sites-enabled/inner-tunnel" isimli dosyanın içeriği de aşağıdaki gibi yapılması gerekmektedir:

server inner-tunnel {
        authorize {
                mschap
                suffix
                update control {
                        Proxy-To-Realm := LOCAL 
                }
                eap {
                        ok = return
                }
                ldap
                expiration
                logintime
        }

        authenticate {
                Auth-Type MS-CHAP {
                        mschap
                }
                eap
        }

        session {
                radutmp
        }

        post-auth {
                Post-Auth-Type REJECT {
                        attr_filter.access_reject
                }
        }
}
Enter fullscreen mode Exit fullscreen mode

Bu iki dosyanın düzenlenmesi sonrasında artık temel olarak servisimizin ayarları tamamlanmıştır.

Radius servisini kimler kullanacak?

Radius servisini kimlerin kullanacağını belirlemek için /etc/raddb/clients.conf dosyası içerisinde muhtemelen en son satırları aşağıdaki gibi subnet aralığı ve secret anahtarı girilebilir. Bu anahtar normal koşullarda router üzerine girilecektir.

client 192.168.1.0/24 {
       secret          = bir
       shortname = istemci1
}
Enter fullscreen mode Exit fullscreen mode

Radius servisinin çalıştırılması

Radius servisini debug yapmak için ayaküstü işlem(process) olarak çalıştırmak için aşağıdaki komutu kullanabilirsiniz. Denemeniz bittiğinde kapatabilirsiniz ama kapattığınızda servisin çalışmayacağını unutmayın:

radiusd -XXX
Enter fullscreen mode Exit fullscreen mode

Bu şekilde başlattığınızda "Info: Ready to process requests" isimli bir logu görmezseniz yukarıda bir yerlerde hata logunu aratmanız gerekir. Bu mesajı görüyorsanız yapılandırmada bir hata bulunmamaktadır.

Ayrıca her şeyden eminseniz artık servis olarak da başlatabilirsiniz. Üstteki işlem ayakta ise sizi servis olarak başlatmayacağı için öncelikle işlemi durdurmanız gerekir. Sonrasında aşağıdaki komut ile servisi başlatabilirsiniz ve kontrol edebilirsiniz:

systemctl restart radiusd
systemctl status radiusd
Enter fullscreen mode Exit fullscreen mode

EAP ayarlarının test edilmesi

EAP ayarlarının test edilmesi için ise aşağıdaki dokümanı inceleyebilirsiniz:

https://dev.to/aciklab/eap-ayarlarinin-kontrol-edilmesi-41lp

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .