Freeradius üzerinde PEAP ve LDAP ayarları
Tags: freeradius, peap, eap, ldap
Published: 2022-06-19 18:15:04

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](https://dev.to/aciklab/freeradius-uzerinde-sertifika-olusturulmasi-nm
) 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.

```bash
yum install freeradius freeradius-ldap
```

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

```bash
yum install samba winbind krb5-workstation samba-winbind-clients
```

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
```

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.

```bash
systemctl restart smb 
kinit administrator@ACIK.LAB 
net ads join -k
systemctl restart winbind
wbinfo -i ali
```

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:

```bash
ntlm_auth --request-nt-key --domain=ACIKLAB.LAB --username=ali --password=Passw0rd
```

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.

```bash
usermod -a -G wbpriv radiusd
chown root:wbpriv /var/lib/samba/winbindd_privileged/
```

# 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
        }
}
```

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}"

}
```

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 {
        }
}
```
 
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"
```				

# 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
        }
}
```

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
                }
        }
}
```

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
}
```

# 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:

```bash
radiusd -XXX
```

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:

```bash
systemctl restart radiusd
systemctl status radiusd
```

# 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