Table of Contents

Configurazione Gateway per eduroam

Ai LNF e' stata implementata la rete wireless eduroam per l'accesso ai servizi informatici dedicato alla comunita' internazionale della ricerca (education roaming).

La soluzione tecnica prevede l'annuncio di una rete WL con SSID eduroam su VLAN dedicata a cui e' attribuita una network IP privata "di classe C". E' stata creata una macchina virtuale (SL 6.1) con 2 interfacce LAN che svolge le funzioni di Gateway tra la rete WL eduroam e la rete internet pubblica.

schema

In particolare il gateway svolge le funzioni di DHCP server, Router IP, Firewall/NAT, Radius Server.

Radius Server

Questo documento fornisce una guida per l'installazione e la configurazione di un radius server locale per l'autorizzazione alla connessione sulla rete wireless eduroam. Seguendo le indicazioni si potra' costruire un server radius in grado di demandare (via proxy) tutte le autenticazioni di tipo EAP-TTLS e PEAP, ma anche in grado di autenticare autonomamente tutte le richieste di tipo EAP-TLS (purche' l'utente si presenti con un certificato personale rilasciato da una delle CA della lista TACAR di eduroam).

radiusd.conf

impostare la variabile prefix (ove e' installato il s/w freeradius)

prefix = /usr/custom/freeradius

definire l'owner del processo radiusd (root e' sconsigliato per motivi di sicurezza), e ricordarsi di cambiare l'owner anche ai file presenti in ${prefix}/etc/raddb/

user = radiusd
group = radiusd

impostare opportunamente la sezione log:

log {
     ...
     destination = syslog
     ...
     syslog_facility = local6
     ...
}

eap.conf

eap {
       ...     
       default_eap_type = ttls
       ...
       tls {
              ...
              certdir = ${confdir}/certs
              cadir = ${confdir}/certs
              ...
              ##private_key_password = whatever
              ## Inserire i nomi dei files rispettivamente della chiave privata e del certificato x509 (rilasciato dalla CA INFN) 
              private_key_file = ${certdir}/myradius-cainfn-key.pem
              certificate_file = ${certdir}/myradius-cainfn-cert.pem
              ...
              ## inserire il file contenente tutti i certificati della lista https://www.tacar.org/cert/list/
              ## Attenzione!: per potersi autenticare con i certificati TERENA e' necessario aggiungere anche i certificati 
              ## di COMODO (root CA) e UTN-USERFirst-Client-Authentication-and-Email (Intermediate CA) [Vedi file allcacert allegato]
              CA_file = ${cadir}/allcacerts.pem
              ...
              fragment_size = 1200
              check_cert_cn = %{User-Name}
              ...
       }
       ...
       ttls {
              ...
              ##default_eap_type = md5
              ...
              copy_request_to_tunnel = yes
              ...
              use_tunneled_reply = yes
              ...
              virtual_server = "inner-tunnel"
              ...
       }
       ...
       peap {
              ...
              default_eap_type = mschapv2
              ...
              copy_request_to_tunnel = yes
              ...
              use_tunneled_reply = yes
              ...
              virtual_server = "inner-tunnel"
              ...
       }
       ...
}

Allegato: allcacert.pem

proxy.conf

home_server localhost {
      ...
      secret = mysecret1
      ...
}
...
realm LOCAL {
      #  If we do not specify a server pool, the realm is LOCAL, and
      #  requests are not proxied to it.
}
...
realm NULL {
      authhost        = LOCAL
      accthost        = LOCAL
      nostrip
}
...
realm lnf.infn.it {
      type            = radius
      authhost        = radius.lnf.infn.it:1812
      accthost        = radius.lnf.infn.it:1813
      secret          = mysecret2
      nostrip
}
...
home_server radius-garr-1 {
      type            = auth+acct
      ipaddr          = radius.garr.net
      port            = 1812
      secret          = mysecret3
      status_check    = status-server
}
home_server radius-garr-2 {
      type            = auth+acct
      ipaddr          = radius2.garr.net
      port            = 1812
      secret          = mysecret3
      status_check    = status-server
}
home_server_pool EDUROAM {
      type            = fail-over
      home_server     = radius-garr-1
      home_server     = radius-garr-2
}
realm DEFAULT {
      pool            = EDUROAM
      nostrip
}
...

clients.conf

client localhost {
      ...
      secret = mysecret
      ...
}
...
#
# Definizione relativa al server stesso (edugw)
#
client edugw.lnf.infn.it {
      secret          = mysecret
      shortname       = edugw
      nastype         = other
}
#
# Definizione relativa al radius server di autenticazione dei LNF (radius.lnf.infn.it)
# a cui vengono demandate via proxy tutte le richieste di autenticazione relative al dominio lnf
#
client radius.lnf.infn.it {
      secret          = mysecret
      shortname       = radius
      nastype         = other
}
#
# Definizione (eventuale) del server di monitoring (Nagios)
#
client 193.206.84.50 {
      secret          = mysecret
      shortname       = nagios
      nastype         = other
}
#
# Definizione del server proxy del GARR (DEFAULT GARR)
#
client 192.84.145.15 {
      secret          = mysecret2
      shortname       = eduroam
      nastype         = other
}
#
# Definizione del Wireless LAN Controller WLC4400 AP Ports IP
#
client 172.16.14.18 {
      secret          = mysecret
      shortname       = wlc4400
      nastype         = cisco
}
client 172.16.14.19 {
      secret          = mysecret
      shortname       = wlc4400ap
      nastype         = cisco
}
#
# Elenco degli aironet dei LNF ordinati per IP Address (o N. di edificio)
#
client 172.16.1.2 {
      secret          = mysecret
      shortname       = ed1ap1
      nastype         = cisco
}
...
etc
...

In alternativa alla definizione dell'elenco dei client ad uno ad uno, dovrebbe essere possibile anche inserire tutta una network (soluzione non testata):

client 172.16.0.0/16 {
      secret          = mysecret
      shortname       = accesspoint
      nastype         = cisco
}

modules/logger-accept e modules/logger-reject

exec logger-accept {
      wait = yes
      #radiuspid = "%{exec:/bin/cat ${pidfile}}"
      outlog = "Access Accepted in Post-Auth session for user [%{User-Name}] [Issuer: %{TLS-Client-Cert-Issuer} - Subject: %{TLS-Client-Cert-Subject}]"
      program = "/usr/bin/logger -p local6.info -t radiusd[$pid$] ${outlog}"
      input_pairs = request
      output_pairs = reply
      #packet_type = Access-Accept
      shell_escape = yes
}
exec logger-reject {
      wait = yes
      #radiuspid = "%{exec:/bin/cat ${pidfile}}"
      outlog = "Access Rejected in Post-Auth session for user [%{User-Name}] due to local policy [Issuer: %{TLS-Client-Cert-Issuer} - Subject: %{TLS-Client-Cert-Subject}]"
      program = "/usr/bin/logger -p local6.info -t radiusd[$pid$] ${outlog}"
      input_pairs = request
      output_pairs = reply
      #packet_type = Access-Accept
      shell_escape = yes
}

sites-enabled/default

...
authorize {
      ...
      eap
      ...
      files
      ...
}
...
Authenticate {
      ...
      eap
      ...
}
...
post-auth {
      ...
#       update reply {
#              Reply-Message += "%{TLS-Cert-Serial}"
#              Reply-Message += "%{TLS-Cert-Expiration}"
#              Reply-Message += "%{TLS-Cert-Subject}"
#              Reply-Message += "%{TLS-Cert-Issuer}"
#              Reply-Message += "%{TLS-Cert-Common-Name}"
#
#              Reply-Message += "%{TLS-Client-Cert-Serial}"
#              Reply-Message += "%{TLS-Client-Cert-Expiration}"
#              Reply-Message += "%{TLS-Client-Cert-Subject}"
#              Reply-Message += "%{TLS-Client-Cert-Issuer}"
#              Reply-Message += "%{TLS-Client-Cert-Common-Name}"
#       }
      if ( TLS-Client-Cert-Subject !~ /^$/ ) {
           # accetta tutti i certificati tranne quello rilasciato dalla CA INFN (per via della policy della CA)
           if ( TLS-Client-Cert-Issuer == "/C=IT/O=INFN/CN=INFN CA" ) {
                logger-reject
                reject
           }
           else {
                logger-accept
           }
      }
}

sites-enabled/inner-tunnel

Il server inner-tunnel viene chiamato in causa nel caso di richiesta di autenticazione passata all'interno di un tunnel (PEAP o EAP-TTLS)

server inner-tunnel {
  ...
  authorize {
      ...
      eap {
              ok = return
      }
      ...
      files
      ...
      if ( "%{outer.request:User-Name}" != "%{User-Name}" ) {
         fail
      }
  }
  ...
  Authenticate {
      ...
      eap
      ...
  }
  ...
}

users

test                            Auth-Type := Local, Cleartext-Password := "mypassword"

#

Start del server radius

chown -R radiusd:radiusd *
chmod -R u+rw,g+r,o+r *
chmod -R g-r,o-r certs/*
/usr/custom/freeradius/sbin/radiusd -X

oppure (piu' verboso):

/usr/custom/freeradius/sbin/radiusd -Xxx
/etc/init.d/radiusd start
chkconfig --add radiusd
chkconfig --level 35 radiusd on
/usr/custom/freeradius/bin/radtest test mypassword localhost 10 mysecret

(verificare il file di log /var/log/messages)

DHCP Server

Il server edugw e' abilitato anche come DHCP server per distribuire gli indirizzi IP ai nodi wireless connessi al SSID eduroam (sulla VLAN 202). Una delle due interfacce (qualla connessa alla VLAN 202) ha indirizzo 192.168.202.1/24 e assegna gli indirizzi ai client DHCP nel range 192.168.202.2-192.168.202.254

/etc/init.d/dhcpd start
chkconfig --add dhcpd
chkconfig --level 35 dhcpd on

Router IP

Il server edugw svolge le funzioni di router dei pacchetti IP dalla rete Wireless (SSID eduroam, VLAN 202, network 192.168.202.0/24) alla rete pubblica. L'interfaccia pubblica ha indirizzo IP 193.205.228.102/30 ed e' configurata come punto-punto verso il router di frontiera connesso al GARR.

# Controls IP packet forwarding
net.ipv4.ip_forward = 1
sysctl -p

Firewall/NAT

Il server edugw svolge la funzione di NAT server per la traslazione degli indirizzi privati dei nodi connessi in Wireless al SSID eduroam. Tale funzione viene abilitata tramite comandi iptables. Lo stesso iptables e' utilizzato anche per alcune attivita' di filtro e controllo delle connessioni IP (Firewall).

#
# Source NAT to one IP  
#
  iptables -t nat -A POSTROUTING -j LOG --log-level info --log-prefix " NAT: " -m state --state NEW
  iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 193.205.228.102
/etc/sysconfig/iptables.acl
ctrk:3:respawn:/usr/custom/scripts/conntracklogger.pl 2>&1

Claudio Soprano 2012/03/14 19:01

Massimo Pistoni 2012/03/14 19:01