Portail captif Fortigate + Squid

Configuration du Fortigate

Interface d'administration

On crée une interface physique, et un réseau, d'administration du Wifi : port3 nommée admin_wifi  10.18.0.1/255.255.255.0

C'est le réseau d'adresses des bornes elles-même.

On coche dans les Administrative Access : PING et CAPWAP, ce qui va créer automatiquement une interface virtuelle pour le réseau des clients Wifi.

Le serveur DHCP de cette interface est paramétré de (start) 10.18.0.200 à 10.18.0.254 (end), masque 255.255.255.0

Default Gateway = same as interface IP

Le DNS pointe vers forwarder 192.168.100.50

NPT = same as system

Interface virtuelle du réseau client

L'interface virtuelle créée est renommée en "WIFI IUT" et on lui donne l'adresse 10.8.0.1/255.255.0.0

NOTE : on donne dans notre DNS le nom portail-wifi.iut-rodez.fr à l'adresse 10.8.0.1

Administrative Access = PING seulement

Le serveur DHCP est paramétré de (start) 10.8.0.2 à (end) 10.8.255.254, masque 255.255.0.0

Default Gateway = same as interface IP

Le DNS pointe vers forwarder 192.168.100.50

NPT = same as system

Dans le menu "Advanced", on ajoute quelques options délivrées par le DHCP. La plupart des valeurs de ces options doivent être écrites en hexadécimal, il convient donc de faire une traduction de ASCII vers hexa au préalable. SNS utilise cet outil : http://www.asciitohex.com/

options ajoutées:

  • option code = 15, valeur = iut-rodez.fr  (domain)    donne le domaine DNS par défaut dans lequel se trouve le client, peut-être utilisé pour tenter de résoudre "wpad.iut-rodez.fr" en mode "détection automatique"
  • option code = 119, valeur = 096975742d726f64657a026672 (domain search), cette valeur hexa correspond à  iut-rodez.fr, donne le domaine de recherche par défaut, même explication que précédemment
  • option code = 252, valeur = 687474703a2f2f777061642e6975742d726f64657a2e66722f777061642e646174 (proxy auto discovery), cette valeur correspond à http://wpad.iut-rodez.fr/wpad.dat qui est l'URL d'autoconfiguration du paralètre proxy du client quand celui-ci est capable de lire cette option et qu'il est en mode "détection automatique"

Le but est de configurer tous les clients pour qu'ils pointent vers un proxy web nommé wificache.iut-rodez.fr à l'extérieur du réseau captif, proxy fils de cache.iut-rodez.fr le proxy principal. Comme le portail captif ne sait intercepter que les ports 80 et 443, wificache est configuré pour écouter sur son port 80 et pour relayer son trafic vers le port 8080 de cache.iut-rodez.fr. Le fichier de configuration des clients est donc simple :

  • si la destination est portail-wifi.iut-rodez.fr, accès direct
  • sinon le proxy est wificache.iut-rodez.fr

SSID = IUT-RODEZ qui est le SSID public présenté par les bornes

Security Mode = Captive Portal

Portal Type = Authentication

Authentication Portal = Local

User Groups = Wifi_Group.     Wifi_Group est un groupe créé par nous dans le menu "User and Device", il contient le serveur serads01.iut.local qui est le serveur d'authentification AD. La conf LDAP récupère tout DC=IUT, DC=LOCAL

Customize Portal Messages : la page de login et de loigin failed sont customisée aux couleurs de l'IUT, voir plus loin

Redirect after captive portal : specific URL = http://warning.iut-rodez.fr/wifi/ , page web sur laquelle on affiche un message d'avertissement sur les usages autorisés sur le réseau Wifi de l'IUT

NOTE : on ne redirige pas sur la requête initiale parce que, vu qu'on dirige le trafic vers le port 80 d'un proxy hors du réseau wifi (requête émise au proxy : "GET http://lemonde.fr" au lieu de "GET /" au serveur du Monde), l'URL est mal re-écrite par le portail : http://lemonde.frhttp//lemonde.fr au lieu de http://lemonde.fr

On coche "Broadcast SSID" et "Block Intra-SSID Traffic" pour diffuser de le SSID et empêcher les flux d'un client à un autre.

Device Management : coche "Detect and Identify Devices"

Policy

  • Il faut laisser les clients captifs accéder au résolveur : WIFI-IUT -> Server

zzz_wifii_client (10.8.0.0/16) -> forwarder en DNS

  • Il faut laisser les clients télécharger sans authentification du portail le fichier de configuration wpad.dat depuis cache.iut-rodez.fr : WIFI-IUT -> DMZ

zzz_wifi_client -> cache en HTTP 

cette règle doit être écrite avant (au dessus) les autres, on note son ID (475). On édite ensuite cette règle via le CLI de la console pour permettre le trafic sans capture du portail :

config firewall policy

edit 475

set captive-portal-exempt enable

next

end

  • Il faut laisser les clients captifs atteindre le proxy wificache après authentification : WIFI-IUT -> DMZ
zzz_wifi_client -> wificache en HTTP


Configuration console du Wifi

#Passage du contrôleur en Country code FRANCE : 

config wireless-controller setting

 set country FR

end 

#Redirection http vers https :

config user setting

 set auth-secure-http enable

end

#Sélection du certificat wifi, si on veut utiliser le certificat Fortinet au lieu de *.iut-rodez.fr

config user setting

    set auth-cert Fortinet_Wifi

end

#URL de redirection du portail captif :

config firewall auth-portal

   set portal-addr "portail-wifi.iut-rodez.fr"

end

#Activer/désactiver la page de keepalive après la connexion :

config system global

   set auth-keepalive enable

end

Certificat *.iut-rodez.fr et AD

Renouvellement des certificats

*.iut-rodez :

On charge un wildcard délivré par Renater pour *.iut-rodez.fr sur le Fortigate.

Menu System / Certificates :

Import CA (remote ?) Certificates = on donne le nom du certificat (star_iut-rodez_fr) et de la chaîne de certification. Le certificat est chargé dans la zone "Certificates"

AD :

On charge un certificat AD pour serads01.iut.local

Import CA Certificates. Le certificat est chargé depuis le PC local sous le nom CA_Cert_x x est un nombre incrémenté à chaque chargement, ex : CA_Cert_3

Affectation des certificats

*.iut-rodez.fr :

Dans le menu User / Authentication / Settings, on précise que le certificat *.iut-rodez.fr doit être utilisé pour l'authentification :

Protocol support : on coche tout

Certificate : star_iut-rodez_fr

AD :

Dans le menu User/ Authentication /LDAP Server pour serads01.iut.local :

name : serads01.iut.local

IP : 10.5.0.4

port :  636

common name identifier : cn

DN : DC=iut,DC=local

Bind type regular : DN = CN=ldapcas,CN=Users,DC=iut,DC=local

Secure connection : LDAPS

Certificate : Cert_CA_3


WPAD

Les clients captifs  configurés en détection automatique vont récupérer par le DHCP, soit l'URL de configuration "http://wpad.iut-rodez.fr/wpad.dat", soit le domaine de recherche et alors essayer de résoudre "wpad.iut-rodez.fr" et d'atteindre ensuite "http://wpad.iut-rodez.fr/wpad.dat".

Il faut donc que cette ressource soit accessible directement par les clients captifs  (voir Policy ci-dessus) et il faut que ce fichier donne la bonne configuration du proxy pour le réseau captif, à savoir d'utiliser wificache.iut-rodez.fr sur le port 80 sauf dans le cas où la requête est adressée directement au portail : portail-wifi.iut-rodez.fr

Configuration Apache sur cache.iut-rodez.fr

wpad.iut-rodez.fr est un CNAME de cache.iut-rodez.fr. On configure donc Apache pour qu'il délivre un fichier dédié nommé wpad-wifi2.dat (ou proxy-wifi2.pac) quand la requête arrive du réseau captif :

/etc/apache2/sites-enabled/000-default :

        <Directory /var/www/>
                AddType application/x-ns-proxy-autoconfig .dat
                AddType application/x-ns-proxy-autoconfig .pac
                RewriteEngine On
                RewriteBase /
                RewriteCond %{REMOTE_ADDR} ^10\.10\.0\.2$
                RewriteRule ^proxy\.pac$ proxy.outside.pac
                RewriteCond %{REMOTE_ADDR} ^10\.10\.0\.2$
                RewriteRule ^wpad\.dat$ wpad-wifi.dat
                RewriteCond %{REMOTE_ADDR} ^10\.8\..*
                RewriteRule ^proxy\.pac$ proxy-wifi2.pac
                RewriteCond %{REMOTE_ADDR} ^10\.8\..*
                RewriteRule ^wpad\.dat$ wpad-wifi2.dat
                RewriteCond %{REMOTE_ADDR} !^10\..*
                RewriteCond %{REMOTE_ADDR} !^192\.168\..*
                RewriteRule ^proxy\.pac$ proxy.outside.pac
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
                # RewriteRule ^wpad.dat$ proxy.pac
        </Directory>

/var/www/wpad-wifi2.dat  (idem pour /var/www/proxy-wifi2.pac)

function FindProxyForURL(url, host) {
  if (isInNet(dnsResolve(host), "10.8.0.1", "255.255.255.255")) {
        return "DIRECT";
  }
  return "PROXY wificache.iut-rodez.fr:80";
}

Wificache.iut-rodez.fr

Squid3 est installé sur la machine wificache.iut-rodez.fr située dans la DMZ. On configure Squid pour qu'il écoute sur le port 80 et qu'il relaie directement les requêtes à cache.iut-rodez.fr

/etc/squid3/squid.conf

acl reseau_captif src 10.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
cache_peer cache.iut-rodez.fr parent 8080 0 no-query  proxy-only  no-digest
never_direct allow all

http_access allow reseau_captif
cache deny all

http_access deny all
icp_access deny all
htcp_access deny all
forwarded_for on
http_port 80
https_port 443
access_log /var/log/squid3/access.log squid

forwarded_for on

Cache.iut-rodez.fr

On configure Squid et Squidguard pour accepter les requêtes arrivant de Wificache.

/etc/squid3/squid.conf

#tcp_outgoing_address 193.54.203.150
dns_v4_first on

acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
acl ftp proto FTP
always_direct allow ftp

# définition des ACL de l'IUT
acl wificache src 193.54.203.150/32
acl reseau_admin src 192.168.0.0/16
acl reseau_etudiant src 10.0.0.0/8
acl ut1_db dstdomain "/etc/squid3/ut1_db.lst"
acl ubuntu dstdomain .ubuntu.com
acl debian dstdomain .debian.org
acl centos dstdomain .centos.org
acl microsoft dstdomain .microsoft.com
acl nsatc dstdomain .nsatc.net
acl local dstdomain .iut.local
acl rdz dstdomain .iut.rdz
acl iut dstdomain .iut-rodez.fr

http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

# application des ACL de l'IUT
http_access allow localhost
http_access allow wificache
http_access allow reseau_admin
http_access allow reseau_etudiant
cache deny ubuntu
cache deny debian
cache deny centos
cache deny local
cache deny microsoft
cache deny nsatc
cache deny rdz
cache deny iut
always_direct allow ubuntu
always_direct allow debian
always_direct allow centos
always_direct allow local
always_direct allow microsoft
always_direct allow nsatc
always_direct allow rdz
always_direct allow iut

http_access deny all
icp_access deny all
htcp_access deny all

http_port 8080
access_log /var/log/squid3/access.log squid
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern .               0       20%     4320
visible_hostname cache.iut-rodez.fr
icp_port 3130
coredump_dir /var/spool/squid3

# Tuning pour truffade
cache_dir ufs /var/spool/squid3 4096 256 256
maximum_object_size 50 MB
maximum_object_size_in_memory 32 KB
cache_swap_low 96
cache_swap_high 98
cache_mem 682 Mb
append_domain .iut-rodez.fr

# utilisation de SquidGuard
redirect_program /usr/bin/squidGuard
redirect_children 30

cache_peer 193.49.48.244 parent 3128 3130 no-query no-digest no-netdb-exchange
never_direct allow all

# suppression des entêtes forwarded_for
# forwarded_for delete

# changement du format de log
emulate_httpd_log on


/etc/squid/squidGuard.conf

dbhome /var/lib/squidguard/db
logdir /var/log/squid

# définition des dérogations
dest derogations { domainlist   db.iut/derogations/domains
                   urllist      db.iut/derogations/urls }
dest cache { urllist db.iut/cache/urls  }
# définitions des groupes d'interdiction
dest adult { domainlist      adult/domains
             urllist         adult/urls
             domainlist      porn/domains
             urllist         porn/urls
             log             pornaccesses }
dest haine { domainlist         aggressive/domains
             urllist            aggressive/urls
             domainlist         agressif/domains
             urllist            agressif/urls
             log                hateaccesses }
dest telechargement { domainlist        filehosting/domains
                      urllist           filehosting/urls
                      log               filehostingaccesses }
dest manga { domainlist         manga/domains
             urllist            manga/urls
             log                mangaaccesses }
dest hacking { domainlist       hacking/domains
               urllist          hacking/urls
               log              hackingaccesses }
dest jeu { domainlist           games/domains
           urllist              games/urls
           log                  gameaccesses }
dest controle { domainlist      remote-control/domains
                urllist         remote-control/urls
                log             remoteaccesses }
dest tricheur { domainlist      tricheur/domains
                urllist         tricheur/urls
                log             tricherraccesses }
dest warez { domainlist         warez/domains
             urllist            warez/urls
             domainlist         malware/domains
             urllist            malware/urls
             log                warezaccesses }
dest blog {  domainlist         blog/domains
             urllist            blog/urls
             log                blogaccesses }
dest audio-video { domainlist           audio-video/domains
                   urllist              audio-video/urls
                   log          videoaccesses }
dest proxies { domainlist       redirector/domains
               urllist          redirector/urls
               urllist          redirector/usage
               domainlist       proxy/domains
               urllist          proxy/urls
               urllist          proxy/usage
               log              proxyaccesses }
# groupe spécifique pour ajouts d'interdictions propres à l'IUT
dest custom_iut { domainlist    db.iut/iut/domains
                  urllist       db.iut/iut/urls
                  log           iutaccesses }
# définition des profils
src a102   { iplist   salles/a102 }
src a103   { iplist   salles/a103 }
src a104   { iplist   salles/a104 }
src a105   { iplist   salles/a105 }
src a200   { iplist   salles/a200 }
src a201   { iplist   salles/a201 }
src a202   { iplist   salles/a202 }
src a203   { iplist   salles/a203 }
src a205   { iplist   salles/a205 }
src a300   { iplist   salles/a300 }
src a304   { iplist   salles/a304 }
src a307   { iplist   salles/a307 }
src a306   { iplist   salles/a306 }
src b501   { iplist   salles/b501 }
src vm_neo { iplist   salles/vm_neo }
src test   { iplist   salles/test }
src personnels { ip   192.168.0.0/255.255.0.0 }
src persoadult { ip   192.168.0.0/255.255.0.0 }
src etudiants { ip   10.0.0.0/255.0.0.0 }
src wificache { ip 193.54.203.150/255.255.255.255 }
# ACL
acl {
        a102    { pass cache none
                  redirect http://cache.iut-rodez.fr/warnings/ferme.php?ip=%a&src=%s&tgt=%t&url=%u }
        a103    { pass none
                  redirect http://cache.iut-rodez.fr/warnings/ferme.php?ip=%a&src=%s&tgt=%t&url=%u }
        a104    { pass none
                  redirect http://cache.iut-rodez.fr/warnings/ferme.php?ip=%a&src=%s&tgt=%t&url=%u }
        a105    { pass none
                  redirect http://cache.iut-rodez.fr/warnings/ferme.php?ip=%a&src=%s&tgt=%t&url=%u }
        a200    { pass cache none
                  redirect http://cache.iut-rodez.fr/warnings/ferme.php?ip=%a&src=%s&tgt=%t&url=%u }
        a201    { pass cache none
                  redirect http://cache.iut-rodez.fr/warnings/ferme.php?ip=%a&src=%s&tgt=%t&url=%u }
        a202    { pass cache none
                  redirect http://cache.iut-rodez.fr/warnings/ferme.php?ip=%a&src=%s&tgt=%t&url=%u }
        a203    { pass cache none
                  redirect http://cache.iut-rodez.fr/warnings/ferme.php?ip=%a&src=%s&tgt=%t&url=%u }
        a205    { pass cache none
                  redirect http://cache.iut-rodez.fr/warnings/ferme.php?ip=%a&src=%s&tgt=%t&url=%u }
        a300    { pass cache none
                  redirect http://cache.iut-rodez.fr/warnings/ferme.php?ip=%a&src=%s&tgt=%t&url=%u }
        a304    { pass cache none
                  redirect http://cache.iut-rodez.fr/warnings/ferme.php?ip=%a&src=%s&tgt=%t&url=%u }
        a307    { pass none
                  redirect http://cache.iut-rodez.fr/warnings/ferme.php?ip=%a&src=%s&tgt=%t&url=%u }
        b501    { pass cache none
                  redirect http://cache.iut-rodez.fr/warnings/ferme.php?ip=%a&src=%s&tgt=%t&url=%u }
        test    { pass cache none
                  redirect http://cache.iut-rodez.fr/warnings/ferme.php?ip=%a&src=%s&tgt=%t&url=%u }
        etudiants {
               pass  derogations  !in-addr !adult !haine !controle !hacking !jeu !tricheur !warez !telechargement !proxies $
               redirect http://cache.iut-rodez.fr/warnings/interdit.php?ip=%a&src=%s&tgt=%t&url=%u
        }
        wificache {
               pass  derogations  !in-addr !adult !haine !controle !hacking !jeu !tricheur !warez !telechargement !proxies $
               redirect http://cache.iut-rodez.fr/warnings/interdit.php?ip=%a&src=%s&tgt=%t&url=%u
        }

        personnels {
               pass  derogations !haine !warez  !controle !telechargement !proxies !adult
               redirect http://cache.iut-rodez.fr/warnings/interdit.php?ip=%a&src=%s&tgt=%t&url=%u
        }
        vm_neo {
                pass !audio-video
                redirect http://cache.iut-rodez.fr/warnings/video.php
        }
        default {
                pass cache none
                redirect http://cache.iut-rodez.fr/warnings/interdit.php?ip=%a&src=%s&tgt=%t&url=%u
        }
}

Mécanisme

Le client "accroche" le réseau Wifi de l'IUT par son SSID. Il émet une requête DHCP.

Le portail lui attribue une adresse IP et lui livre, par les options DHCP, le domaine de recherche, le domaine courant (iut-rodez.fr) et l'URL d'auto-configuration de proxy (http://wpad.iut-rodez.fr/wpad.dat).

S'il est bien réglé en mode "détection automatique", le client essaie soit de résoudre wpad.iut-rodez.fr puis de télécharger le fichier http://wpad.iut-rodez.fr/wpad.dat, soit de le télécharger directement s'il se base sur l'URL reçue. Le portail est configuré pour laisser passer cette requête sans authentification. Le client s'auto-configure donc pour utiliser le proxy wificache.iut-rodez.fr:80 dans tous les cas sauf pour accéder à la page d'authentification du portail. Le proxy écoute sur le port 80 parce que le portail ne sait intercepter que les requêtes http sur les ports 80 et 443.

Le client émet ensuite une première requête utilisateur http/https vers le port 80 du proxy. Le portail ne sait intercepter que les requêtes GET mais pas les requêtes CONNECT. Donc si la première requête est une requête https (donc CONNECT puisqu'elle est adressée au proxy), elle est simplement ignorée et il ne se passe rien de plus. Dès que le client émet une première requête GET (donc http) vers le port 80 du proxy, le portail redirige le client vers le formulaire d'authentification sur https://portail-wifi.iut-rodez.fr:1023/  (note : le certificat associé est le wildcard *.iut-rodez.fr chargé sur le Fortigate)

Une fois le client authentifié il est redirigé vers la page http://warning.iut-rodez.fr/wifi/ qui est un avertissement sur les règles d'usage du WIFI dans l'établissement. Il atteint cette page comme n'importe quelle autre, c'est à dire en passant par le proxy wificache.iut-rodez.fr

En fait, dès lors, tout le trafic Web du client est dirigé vers le port 80 de wificache.iut-rodez.fr qui le relaie simplement à cache.iut-rodez.fr qui applique les règles SquidGuard relatives à son ACL wificache.



Comments