Sécuriser les équipements IOT en Wifi

DNS-MENTEURS

pfsensenetgearnetgear

Cela fait quelques années que je fais de la domotique.
J'utilise Jeedom comme solution domotique, j'ai plus de 50 objets connectés.

Les équipements IOT sont en général moins bien sécurisés que les autres équipements connectés.
La sécurité par design n'est pas encore dans l'esprit des constructeurs ( pas tous )

Il n'est pas rare de voir des équipements dialoger au niveau réseau avec des serveurs américains ou chinois.
Les informations qu'ils envois ne sont pas controllées.

Il n'est pas rare non plus que les équipements connectés soient utilisés dans des attaques de Botnet

J'ai donc cherché un moyen d'isoler mes équipements Wifi à risque du reste de mon réseau.

Il n'y a guère d'autre solution que de créer des DMZ afin de les isoler.


Les équipements à ma dispositon:

  • 1 routeur PFSENSE ( Carte APU 2C4)
  • 1 Switch NetGear GS108
  • 1 Switch Unifi S8
  • 1 AP WIFI Unifi AC PRO
fs108 s8  
acpro
Voiçi le réseau cible : ( simplifié, car j'ai beaucoup d'autre équipements)

res

La cible à atteindre est de créer 2 réseaux WIFI

Pour cela pas de secret ,  il va falloir creer des VLANs et des DMZ

  • WIFI-MAISON ( Réseau LAN DATA - Full Access)  
  • WIFI-IOT ( Réseau DMZ-INTERNER - Accès filtré)

Pour cela j'ai dut revoir tout mon réseau, car de base en général un réseau domestique n'utilise pas la notion de VLAN.
Un suel VLAN  ( le 1 en général est utilisé de facon transparente)

Pour mon usage, j'ai décidé de ne plus utiliser le VLAN 1
Le VLAN 10 sera mon réseau LAN DATA
Le VLAN 200 ma DMZ- Interne

Je ne parlerai pas ici de la DMZ Publique que j'ai créer sur une interface dédiée de mon pfsense.

Le plan d'action est donc le suivant:
  1. Création de 2 VLAN ( et des interfaces associées) 
  2. Création des IP des interface  ( 10.0.0.254/24 pour le LAN  / 172.20.0./24 pour la dmz)
  3. Création d'étendue DHCP
  4. Tagg de ces 2 VLAN Depuis PFsense --> Switch Netgear --> Switch Unifi --> AP Unifi
  5. Paramétrage du Wifi Unifi pour diffuser des SSID sur des VLAN diffrérents


Coté PFSense

Création de 2 VLAN ( et des interfaces associées)

Je ne vais pas détailler toutes les actions mais les principales.

vlan

vlanpf

La ce qui est important à savoir
C'est que l'interface associée a vos VLAN ne doit porter aucune autre interface logique.

Sinon vous serez obliger de transmporter sur cette interface du vlan untag et du tagged, de qui n'est pas une bonne chose.
La bonne pratique est qu'un port d'interconnexion ne doit transporter que du VLAN Tagged

Par défaut pfsense associe l'interface logique WAN à votre interface physique sur le VLAN1 en untag.

Autrement dit  coté pfsense il faut supprimer votre interface logique LAN et la remplacer par un VLAN ( ici le 10)
Vous ne devez avoir que des VLAN sur votre interfaces

Rien ne vou sempeche de la rappeler LAN comme moi

En ayant que des VLAN sur votre interfaces Pfsense, impicitement Pfsense va tagger les 2 VLANs
en sortie de l'interface.

Mettre une IP Statique sur l'interface qui correspondra a votre plan d'adressage

Pour le LAN
ipinterlan

Pour la DMZ Interne

ipdmz
Pensez bien à mettre un /24 car sinon la partie DHCP ne sera pas accessible sous Pfsense.

Création des étendues DHCP.
dhcplan
dhcplan

Création d'une règle de Firewall temporaire.

Pour les tests créer une regle de firewall autorisant tout sur la DMZ.
Cela permettra de tester.
Vous fermerez tout plus tard.


rule dmz


Attention à partir de là quand vous validez : Vous perdez l'accès à votre pfsense depuis votre réseau local;
Normal les vlan arrive taggé vers le netgear, mais le netgear n'est pas encore a meme de les recevoir.

Je vous conseille de garder un accès WAN à votre pfsense (  a travers une partage 4g par exemple)
Cela vous permettre de toujours pouvoir agir sur le pfsense même si vous n'y avez plus accès à partir du LAN

Coté Switch Netgear GS108


Le port d'interco relié entre mon PFSENSE et mon netgear sera le 1
Sur le Switch Netgear --> Le port d'interco relié entre mon Sw netgear et mon Switch Unifi sera le 3

Création des VLAN sur le netgear
On voit bien le 10 et le 200

ngvlan

On Tag les ports qui nous interesse
On voit ici que j'ai taggé le VLAN 10 sur les ports 1 et 3
On voit ici que j'ai untag le VLAN 10 sur les autres ports (  port ou seront branché des equipements dans le VLAN 10 - LAN classique)

ngt10

On voit ici que j'ai taggé le VLAN 200 sur les ports 1 et 3
Rien sur les autres concernant le 200
ngt10

Il faut aussi mettre les PVID sur les ports
Le Pvid n'a pas d'importance sur les port taggé 1 et 3
Les autres ont le PVID 10
pvid

Comme je vous l'ai  dit j'ai décidé de remplacer le VLAN 1 historique
Par le VLAN 10
je vais donc mettre ce VLAN 10 comme VLAN de management du switchs

ngmgm


Voila le Netgear est paramétré
Attention vous risquez aussi de vous couper la patte sur le switch

Garder provisoirement un port dans le VLAN1 avant de changer le Management VLAN ID



Coté SwitchUnifi S8

La j'ai pas mal galéré , car autant l'interface Netgear me paraissait logique et old scholl.
Très proche des switchs que je manipule souvent ( avaya, cisco)

Autant le paramétrage  du switch unifi par le controleur est nouveau.

Il vous faut donc un controlleur Unifi installé ( a minima pour le paramétrage)
Je ne  décrit pas la découverte du switch et son provisionning qui est autimatique dans  Unifi.

 Même si le switch fonctionne en DHCP
Je vous conseille de le mettre en IP Fixe.
Cela évite de se couper la patte quand on taggera.

netuni

La partie VLAN se trouve dans Settings / Networks

unifivlan

unvl10

unvl200


Quand les Vlan sont crées, il faut les associer à des profiles:

unifiprofile

Un profile VLAN-DATA ( Associé au VLAN10)
Cela signifie en langage Switch UNTAG le VLAN 10
pr10

Un Profile VLAN-DMZ-INTERNE ( Associé au VLAN 200)
Cela signifie en langage Switch UNTAG le VLAN 200

pr200


Et un Profile Interco ( Regroupant les 2 VLAN 10 et 200) Mais cette fois en TAGGED
Cela signifie en langage Switch TAGGED VLAN 10 et 200

interco


Sur le Switch Unifi --> Le port d'interco relié entre mon Sw netgear et mon Switch Unifi sera le 1
Je vous rappelle que le port 3 du Netgear est relié au port 1 de UNIFI
Donc le port 1 de Unifi doit etre taggé des VLAN 10 et 200


Cela se passe sur le port 1 du switch:

taginterco

Et voilà votre port 1 utilise le profil Interco en taggant les VLAN 10 et 200

Comme le netgear j'ai décidé de mettre le VLAN Management du switch Unifi en VLAN10 ( Profile VLAN-DATA)

unifimgm


Voilà coté Tagging et réseau on est bon.
Attention j'ai du réinitialiser plusieurs fois le switch avant de trouver tout ces paramètres.
Je me suis coupé la patte plus d'une fois.

Soyez vigilant et poser votre schéma sur papier et mesurer les impacts de chaque manipulations.


Coté WIFI Unifi AC PRO



Si vou savez eut le courage de suivre, nous avons réussi à tagged les VLAN 10 et 200
Depuis le pfsense , en passant par le Switch Netgear, jusqu'au Switch Unifi

Tout est prêt pour pouvoir diffuser des Réseaux Wifi portant différent VLAN.


Création du WIFI-MAISON
Tout se passe dans Settings / Wireless Networks

Création d'un SSID nommé WIFI-MAISON
Utilisant le VLAN10
Je vous conseille une bonne clé WPA2 chiffrement AES

wifimaison


réation d'un SSID nommé WIFI-IOT
Utilisant le VLAN200
Je vous conseille une bonne clé WPA2 chiffrement AES

wifiiot


Et voilà.
Si tout va bien, vos 2 SSID sont diffusés:

analy

Si on se connecte sur WIFI-MAISON
On tombe bien dans le VLAN 10
Pfsense nous a donné une IP en  10.0.0.0/24

wifi10


Si on se connecte sur WIFI-IOT
On tombe bien dans le VLAN 200
Pfsense nous a donné une IP en  172.20.0.0/24

wifi200



Voilà  a partir de là vous pouvez affiner vos règle de filtrage Firewall sur Pfsense sur la DMZ.
Exmple n'accepter que la DMZ n'accede qu'au LAN et pas Internet

block
Et commencer à voir des flux bloqués :)



C'est là ou le plus dur commence.
Arriver à identifier les flux minimum d'un équipement IOT

REVERSE PROXY - PFSENSE - JEEDOM

DNS-MENTEURS

Apacherpipfsensejeedom

J'utilise de plus en plus de service Web dans mon installation informatique personnelle.
Quelques usages dans l'ordre d'importance:

  1. Ma domotique avec l'excellent JEEDOM 
  2. Mes caméras
  3. Mon NAS sous Open Media Vault 
  4. Et pas mal d'autres choses
Quand on commence à avoir plusieurs services accessible depuis l'éxtérieur plusieurs problématiques se posent:

  • Comment acceder avec une seule adresse IP à plusieurs services en interne sur le même port ?  ( https 443 , http 80) 
  • Comment gérer la sécurité ? (  est ce bien sécurisé d'accéder en direct à vos services ? Jeedom ouvert en direct sur internet ? ) ( en cas d'intruision vérifier chaque log de chaque service )
  • Certains services ne sont pas sécurisable en https , est ce sérieux d'y accéder directement depuis l'extérieur sans intermédiaire ?? ( mettre un VPN  a chaque fois ???)
  • Comment gérer la performance ? des choses ne pourraient t'elle pas être compréssées ou mise en cache pour aller plus vite ?

Et bien tout cela, c'est le role du REVERSE PROXY
!rp
cf wikipedia

Le reverse proxy va vous permettre avec un seul équipement d'accéder à plusieurs services Web internes en en faisant qu'une seule redirection de port
Le reverse proxy va ajouter de la sécurité, car il va vous permettre de ne plus laisser vos services web accessible en fontal sur internet
Le reverse proxy va ajouter de la sécurité, car il va vous permettre de chiffrer les flux écoutables sur internet, même vers des services Web qui ne sont pas sécurisés
Le reverse proxy va ajouter de la performance car il va mettre en cache des éléments statiques et va même pouvoir compresser des flux.

Le reverse proxy sur mon réseau privée.

Quand j'ai réfléchi à comment implémenter mon Reverse proxy j'ai  voulu ajouter un peu de sécurité.
Je trouvait qu'un reverse proxy accessible depuis internet, avait plutot sa place dans une DMZ

En effet il est plus sur de positionner son RP dans une zone qui n'a pas un full accès à tout votre réseau.
Je voulais que le RP n'ai accès qu'aux services qu'il est censé "reverse proxifier"  
C'est à dire les ports 443 ou 80 de mes services internes

Voiçi le schéma simplfié de mon réseau focusé sur le RP

lan

J'ai la chance d'avoir choisi un PFSENSE comme routeur / Firewall 

De plus j'avais pensé les choses au départ.

Mon PFSENSE est installé sur un ALIX 2D13 ( 3 ports Ethernet)

alix

Je l'utilisais pour le WAN et le LAN, il me restait donc un port pour la DMZ

Coté Gandi:

il faudra bien sur créer les entrées DNS qui pointe vers l'ip publique de votre Box

Pour ma part cam et Maison

Coté PFSENSE:


on remarque que je n'utilise aucune IP dans mes Virtual Hosts.

Que des FQDN, le but et d'utiliser que la fonction DNS 

Je vais utiliser la technique du SPLIT DNS

Même FQDN mais résolu différement en fonction de la requête:

J'ai donc utilisé mon PFSENSE en tant que resolveurs DNS

Ce qui est très pratique, car je peux lui donner des noms qu"il resoudra avec une IP locale pour mes équipement interne.

1 - J'ai crée activé ma 3ème interface et je l'ai nommée DMZ
2 - Renseigner l'IP de cette interface : Ce sera la passerelle du reverse Proxy

pfsenseip

3 - J'ai utilise une reservation DHCP statique pour fournir l'IP au Raspberry

pfsensedhcp
4 - J'ai créer 2 entrée DNS dans mon resolveur PFSENSE ' cela marche aussi si vou sutilisez PFSENSE en Redirecteur)

cam.monfomaine.fr ---> Pour la caméra
maison.mondomaine.fr ---> Pour Jeedom

pfsensedns

Le Split DNS est simple voiçi uin schéma de ce qui va se passer.

schemadns




Pas besoin de paramétrer des règles de routage PFSense s'occupe de tout.

Il faut par contre paramétrer des règles de NAT et de Firewall


NAT :  Tous ce qui arrive sur le port 443 est natté vers le RP

pfsensenat

Firewall : On ouvre les accès du RP vers les port 443 de Jeedom et 80 de la caméra
On autorise ausi le RP à faire des requetes DNS vers PFSENSE

pfsensefirewall


Attention : PFSENSE m'avait créer une regle de NAT Unbound qui me remplacait l'ip source par l'ip de la DMZ
Du coup dans les logs du reverse proxy on ne voyais que l'ip de la passerelle, ce qui n'est pas pratique pour analyser

Bienn désactiver la regle qui dit Sque tout ce qui vient de l'interface DMZ soit natté par DMZ Adresse. ( dernière ligne)
nat unbound


Voilà coté PFSENSE

Installation du reverse Proxy:

J'ai choisi d'utiliser un équipement tiers : un Raspberry Pie 3

j'ai commencé par une installation classique de Rapian strech Lite ( pas besoin d'interface graphique)

https://www.raspberrypi.org/downloads/raspbian/

Je vous conseille d'utiliser d'Etcher : qui est très simple à prendre en main :

https://etcher.io/

Je ne détaille pas l'installation de raspian

Placer une IP Fixe sur le raspberry 

Renseigner comme passerelle, l'adresse IP du PFSENSE ( interface DMZ)

Renseigner le DNS qui sera le pfsense.

Une fois le raspian installé on se lance dans l'installation du RP:

je pars du principe que vous avez déjà généré un certificat SSL chez un registrar

Je vais détailler un peu ce que j'ai fait pour un Certificat Gandi.

Je passe très vite sur la création du certificat Gandi ; Tout est expliqué sur le site

1 - Achat du certificat Gandi
2 - Création du CSR à fournir à Gandi en ligne de commande

openssl req -nodes -newkey rsa:2048 -sha256 -keyout maison.key -out maison.csr
3 - Copie du CSR sur le site de gandi
4 - Achat du certificat
5 - Validation du Certificat par ajout d'enregistrement CNAME dans votre DNS
6 - Récupération des certificats

gandi

g

7 - Vous devez avoir 4 fichiers :

GandiStandardSSLCA2.pem  maison.crt  maison.csr  maison.key
8 - Copier ces fichiers dans par exemple :
/etc/ssl/

Pour ma part j"ai placé les fichiers de certificats dans /etc/ssl/
sudo apt-get install apache2
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_http


Le virtual host pour Jeedom

vi /etc/apache2/sites-available/rp.conf

<VirtualHost *:443>
ServerName maison.domaine.fr
SSLEngine on
SSLProxyEngine On
SSLCertificateFile /etc/ssl/maison.crt
SSLCertificateKeyFile /etc/ssl/maison.key
SSLCertificateChainFile /etc/ssl/GandiStandardSSLCA2.pem
SSLVerifyClient None

HostnameLookups off
ProxyRequests off
ProxyVia off
ProxyPass / https://maison.domaine.fr/
ProxyPassReverse / https://maison.domaine.fr/

<Proxy *>
Order allow,deny
allow from all
</Proxy>
ErrorLog ${APACHE_LOG_DIR}/rproxy_error.log
CustomLog ${APACHE_LOG_DIR}/rproxy_access.log combined
</VirtualHost>

Pour ma caméra même principe:

vi /etc/apache2/sites-available/zcam.conf
<VirtualHost *:443>
ServerName cam.domaine.fr
SSLEngine on
SSLProxyEngine On
#SSLProtocol All
SSLCertificateFile /etc/ssl/maison.crt
SSLCertificateKeyFile /etc/ssl/maison.key
SSLCertificateChainFile /etc/ssl/GandiStandardSSLCA2.pem
SSLVerifyClient None

HostnameLookups off
ProxyRequests off
ProxyVia off
ProxyPass / http://cam.domaine.fr/
ProxyPassReverse / http://cam.domaine.fr/
<Proxy *>
Order allow,deny
#Deny from all
allow from all
</Proxy>
LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/rproxy_error.log
CustomLog ${APACHE_LOG_DIR}/rproxy_access.log combined
</VirtualHost>

cd /etc/apaches/site-available
a2ensite rp.conf
a2ensite zcam.conf
/etc/init.d apache2 reload

Voila notre Reverse proxy est configuré



Si tout est OK  depuis l'extérieur on accéde bien à notre Jeedom et à notre Cam en passant
Par le Reverse Proxy

accesext

acces ext

Si tout est OK  depuis l'interne on accéde bien à notre Jeedom et à notre Cam en passant
en direct sur le lan ( DNS Résolu en local par pfsense)

Par contre vous aurez remarqué qu'une erreur de certificat est présent sur la cam

Ce qui est normal car j'utilise le même certificat dans les 2 virtual Hots 

Et ce certificat à été grée pour maison.mondomaine.fr et non cam.mondomaine.fr

Cela n'est pas grave, j'ai confiance en mon certificat, et le but est de chiffrer les flux vers ma 

caméra.


Remplacement d'une Box ADSL OVH par un routeur / Firewall PfSense.

nasmaison Remplacement d'une Box ADSL par un routeur / Firewall PfSense.

PfSense


Voilà quelques temps que j'ai un accès ADSL OVH.
J'ai comme la majorité des gens utilisé un bon moment leur routeur livré en standard.
OVH envoi à ses abonnés le Technicolor TG788vn

technicolor


Ce n'est pas un mauvais modem routeur, mais je trouve son interface particulièrement lourde et les fonctionnalités assez limités.
Si on veut faire des conf un peu touchy il faut tout de suite les faire en ligne de commande. ( Et cela ne fonctionne pas toujours)

Il me manquait des fonctionnalités agréables tels que:
  • VPN ( IPSEC, PPTP, OpenVPN)
  • Un vrai firewall
  • Des logs dignent de nom
  • Gestion des DMZ
  • ...

J'ai cherché un petit moment et mon choix s'est porté sur PfSense.

2 Problèmes majeurs se présentaient:
  1. Sur quoi installer PsSense
  2. Comment continuer à bénéficier de la téléphonie OVH sans leur Box !!!

Installation de PfSense

  • Plateforme matérielle:
Je voulais un système qui consomme peu, silencieux, avec 3 ports réseaux.
Mon choix s'est porté sur un Boitier Alix 2D13
J'ai trouvé ce boitier d'occasion sur le bon coin à 100€


alix 2D13
  • Processeur : 500 MHz AMD Geode LX800 
  • DRAM : 256 MB DDR DRAM 
  • Stockage : CompactFlash 4GB ( non fournie)
  • Alimentation : DC jack or passive POE, min. 7V to max. 20V 
  • Trois diodes en facade arrière 
  • Extension : 1 slots miniPCI slots, sur bus LPC
  • Connectivité : 3 ports Ethernet (Via VT6105M 10/100) dont un port PoE

  • Installation logicielle.
Préparation de la carte Compact Flash:

Il faut en premier lieu , installer le systeme PfSense sur la carte CF.
Pour cela nous allons utiliser les images disques fournies par PfSense

L'installation de PfSense est relativement rapide.
N'inséréz pas encore la carte CF dans la boitier Alix,

https://www.pfsense.org/download/mirror.php?section=downloads

On choisi la version 32 Bits/ Nano BSD / Port Série / 4GB ( dépend de votre CF)

psense download

Une fois l'image récupérée il suffit de la copier en mode Bloc sur votre carte.
Pour Cela rien de tel qu'un bon vieux dd

On branche la carte CF sur un lecteur de carte CF et on copie l'image sur la carte.


Depuis un Linux, la commande ressemble à ça

#zcat pfSense-2.1.5-RELEASE-4g-i386-nanobsd.img.gz | dd of=/dev/sdc bs=16k

Voilà l'image est copiée

Attention !!!
J'ai galéré une journée entière... sur ce point là
J'avais une erreur du type : Can't load kernel...
J'ai fini par essayer un autre lecteur de carte USB et là miracle plus d'erreur.
Je pense que mon lecteur de carte générique, écrivait des blocs corrompus..


On insère la CF dans le boitier Alix , on branche un cable DB9 sur le port série + un adaptateur USB série.

Au départ de base le boitier Alix est en 38400Baud

Paramétrez votre client console avec ces paramètres 3600 / 8 / 1

Démmarez le boitier

On appui sur S rapidement dès le boot du boitier, et on arrive sur le Bios.

Comme PfSense utilise une connexion série en 9600bps, il vaut mieux paramétrer le bios de la même maniere.

PC Engines ALIX.2 v0.99h
640 KB Base Memory
261120 KB Extended Memory
01F0 - no drive found !
BIOS setup:
*9* 9600 baud (2) 19200 baud (3) 38400 baud (5) 57600 baud (1) 115200 baud
*C* CHS mode (L) LBA mode (W) HDD wait (V) HDD slave (U) UDMA enable
(M) MFGPT workaround
(P) late PCI init
*R* Serial console enable
(E) PXE boot enable
(X) Xmodem upload
(Q) Quit
Save changes Y/N ?

il suffit d'appuyer sur 9 pour passer en 9600baud et sauvegarder avec Y

Pour information; Le bios 0.99h est conseillé pour utiliser pFsense et CF
SI il n'est pas dans cette version je vous invite à le mettre à jour : https://doc.pfsense.org/index.php/ALIX_BIOS_Update_Procedure

Si tout c'est bien passé, en démarrant votre boitier, PfSense devrait booter:

boot-pfsense

L'installation est assez intuitive.
Elle va vous demander de choisir vos interfaces WAN / LAN
FreeBSD détecte vos carte réseau et leur donne un nom; En général ce nom dépend du construteur de la carte.

Pour moi les cartes du boitier Alix sont vr1, vr2, vr3
Asigner une adresse IP à votre carte LAN

Brancher la patte Lan de votre boitier Alix sur votre réseau Local

ET vous pouvez maintenant vous y connecter depuis l'interface Web
Pour ma part je n'ai pas paramétré l'interface WAN au départ car je souhaitais faire du PPPOE


  • Mon schéma réseau CIBLE:
lan maison

Voiçi le schéma de mon réseau complet à la maison.

Seule la partie Modem/Routeur est nouvelle
Je remplace ma Box ADSL par un Modem + PfSense sur boitier ALIX

Je branche mon modem sur la patte Wan de l'Alix et mon réseau local sur la patte LAN.

Et c'est parti pour l'interface Web.

web

Il ne reste plus qu'à paramétrer l'interface WAN en PPPOE - Avec login et mot de passe
Pour info pour OVH j'ai placé le MTU à 1456

pppoe


PfSense est connecté et à pris mon IP Publique.

JE vous laisse faire les paramétrages qui vous conviennent.
DNS, DHCP, NAT, Rules etc...


La téléphonie:

L'incovénient quand on utilise pas la Box OVH est qu'on ne bénéficie plus de la téléphonie.
Je voulais faire du SIP, mais OVH ne fournit pas les identifiants SIP...

Par contre ils ont eut l'intelligence de proposer des équipements préconfigurés SIP.
J'ai donc opté pour le boitier Cisco SPA112
spa112

Ce boitier permet de relier 2 téléphone analogiques.
Il s'occupe de la partie SIP
Il suffit donc de le relier sur le réseau local ( pour ma part je l'ai laissé en DHCP)

Pour info, chez OVH, il faut activer l'équipement dans votre manager afin que les appels soient bien renvoyé sur le boitier.
Comme OVH vous l'envoi préconfiguré, il n'y a rien à faire de plus.