Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
Prochaine révisionLes deux révisions suivantes
tech:hypervisor-01 [04/03/2021 13:26] LibertAdmintech:hypervisor-01 [20/04/2021 15:54] – [Sauvegardes] LibertAdmin
Ligne 85: Ligne 85:
  address 192.168.10.1  address 192.168.10.1
  netmask 255.255.255.0  netmask 255.255.255.0
 +</code>
 +
 +
 +==== Routage et filtrage avec iptables ====
 +
 +Nous avons dû ensuite router et rediriger tout ça avec iptables afin de communiquer depuis l'extérieur avec le réseau des VM en 192.168.10.0/24 et filtrer les connexions entrantes, c'est le point le plus important.
 +
 +L'idée est de rediriger le requêtes d'Internet vers les bonnes VM et de pouvoir administrer à distance de façon graphique avec virt-manager l'ensemble des VM.
 +Le paquet ''iptables-persistent'' doit avoir été installé pour conserver les modifications du pare-feu entre chaque redémarrage.
 +Le port SSH a été masqué.
 +
 +Il est bien sûr extrêmement important de sécuriser SSH : interdire le login root avec mot de passe, utiliser de bons algorithmes de chiffrement, changer le port, n'autoriser qu'une IP distante (ou mieux, ne rien autoriser depuis internet et utiliser un VPN) et mettre en place un faux serveur SSH pour que les attaquants perdent leur temps à essayer de se connecter, sans vous faire perdre le vôtre (et ajouter un Fail2Ban évidemment). La recette reste secrète, désolé ! ;-)
 +
 +Les règles concernant le réseau d'administration n'apparaissent pas non plus ici.
 +
 +<code bash>
 +root@hypervisor-01 ~ # cat /etc/iptables/rules.v4
 +# Router le Web vers le proxy Nginx :
 +-A PREROUTING -d 159.69.59.13/32 -p tcp -m tcp --syn -m multiport --dports 80,443 -j DNAT --to-destination 192.168.10.2
 +# Router le mail envoi/réception vers le serveur mail :
 +-A PREROUTING -d 159.69.59.13/32 -p tcp -m tcp --syn -m multiport --dports 587,993,25 -j DNAT --to-destination 192.168.10.7
 +# Router le 9000 vers le serveur peertube :
 +-A PREROUTING -d 159.69.59.13/32 -p tcp -m tcp --syn -m multiport --dports 9000 -j DNAT --to-destination 192.168.10.8
 +# Router le 4443 et les 10000-20000  tcp/udp vers le serveur jitsi :
 +-A PREROUTING -d 159.69.59.13/32 -p tcp -m tcp --syn -m multiport --dports 10000:20000 -j DNAT --to-destination 192.168.10.10
 +-A PREROUTING -d 159.69.59.13/32 -p udp -m udp       -m multiport --dports 10000:20000 -j DNAT --to-destination 192.168.10.10
 +-A PREROUTING -d 159.69.59.13/32 -p tcp -m tcp --syn -m multiport --dports 4443        -j DNAT --to-destination 192.168.10.10
 +# Ne pas appliquer le masquerading sur le broadcast/multicast :
 +-A POSTROUTING -s 192.168.10.0/24 -d 224.0.0.0/24 -j RETURN
 +-A POSTROUTING -s 192.168.10.0/24 -d 255.255.255.255/32 -j RETURN
 +# Masquerading sur tous les ports dans le sens sortant (VM -> Internet)
 +-A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
 +-A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
 +-A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j MASQUERADE
 +
 +# Accepter le trafic basique : ICMP, boucle locale et connexions établies, en entrée :
 +-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
 +-A INPUT -i lo -j ACCEPT
 +-A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
 +# Accepter le SSH :
 +-A INPUT -p tcp -m tcp --syn -m conntrack --ctstate NEW --dport XXXX -j ACCEPT
 +# Accepter Spice et VNC (console virtuelle de virt-manager) :
 +-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5900 -j ACCEPT
 +-A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5900 -j ACCEPT
 +-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5901 -j ACCEPT
 +-A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5901 -j ACCEPT
 +-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5902 -j ACCEPT
 +-A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5902 -j ACCEPT
 +-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5903 -j ACCEPT
 +-A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5903 -j ACCEPT
 +-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5904 -j ACCEPT
 +-A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5904 -j ACCEPT
 +-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5905 -j ACCEPT
 +-A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5905 -j ACCEPT
 +-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5906 -j ACCEPT
 +-A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5906 -j ACCEPT
 +-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5907 -j ACCEPT
 +-A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5907 -j ACCEPT
 +-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5908 -j ACCEPT
 +-A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5908 -j ACCEPT
 +-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5909 -j ACCEPT
 +-A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5909 -j ACCEPT
 +-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5910 -j ACCEPT
 +-A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5910 -j ACCEPT
 +-A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5911 -j ACCEPT
 +-A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5911 -j ACCEPT
 +# Accepter les requêtes DNS (port 53) depuis les VM :
 +-A INPUT -i br2 -p udp -m udp -m multiport --dports 53 -j ACCEPT
 +-A INPUT -i br2 -p tcp -m tcp -m multiport --dports 53 -j ACCEPT
 +# Bloquer les requêtes rpcbind/portmap en entrée depuis l'extérieur:
 +-A INPUT -i br2 -p tcp -m multiport --dport 2049 -j ACCEPT
 +-A INPUT -i br2 -p tcp -m multiport --dport 111 -j ACCEPT
 +-A INPUT -p tcp -s 127.0.0.1 --dport 111 -j ACCEPT
 +-A INPUT -p udp --dport 111 -j DROP
 +-A INPUT -p tcp --dport 111 -j DROP
 +
 +# On refuse tout le reste :
 +-A INPUT -m conntrack --ctstate INVALID -j DROP
 +-A INPUT -p tcp -m tcp -j REJECT --reject-with tcp-reset
 +-A INPUT -j REJECT --reject-with icmp-port-unreachable
 +
 +# Accepter les connexions établies sur le LAN :
 +-A FORWARD -d 192.168.10.0/24 -o br2 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
 +# Accepter le trafic sortant depuis le LAN :
 +-A FORWARD -s 192.168.10.0/24 -i br2 -j ACCEPT
 +# Accepter le trafic interne entre les VM :
 +-A FORWARD -i br2 -o br2 -j ACCEPT
 +# Accepter les paquets redirigés vers des ports particuliers pour le Web vers le proxy :
 +-A FORWARD -d 192.168.10.2/32 -o br2 -p tcp -m tcp --syn -m conntrack --ctstate NEW -m multiport --dports 80,443 -j ACCEPT
 +# Accepter les paquets redirigés vers des ports particuliers pour le mail vers le serveur mail :
 +-A FORWARD -d 192.168.10.7/32 -o br2 -p tcp -m tcp --syn -m conntrack --ctstate NEW -m multiport --dports 587,993,25 -j ACCEPT
 +# Accepter les paquets redirigés vers des ports particuliers pour peertube service 9000 vers le serveur video :
 +-A FORWARD -d 192.168.10.8/32 -o br2 -p tcp -m tcp --syn -m conntrack --ctstate NEW -m multiport --dports 9000 -j ACCEPT
 +# Accepter les paquets redirigés vers des ports particuliers pour funkwhale service 5000 vers le serveur video :
 +-A FORWARD -d 192.168.10.9/32 -o br2 -p tcp -m tcp --syn -m conntrack --ctstate NEW -m multiport --dports 5000 -j ACCEPT
 +# Accepter les paquets redirigés vers des ports particuliers pour jitsi meet service tcp 10000-20000 vers le serveur visio :
 +-A FORWARD -d 192.168.10.10/32 -o br2 -p tcp -m tcp --syn -m conntrack --ctstate NEW -m multiport --dports 10000:20000 -j ACCEPT
 +# Accepter les paquets redirigés vers des ports particuliers pour jitsi meet service udp 10000-20000 vers le serveur visio :
 +-A FORWARD -d 192.168.10.10/32 -o br2 -p udp -m udp       -m conntrack --ctstate NEW -m multiport --dports 10000:20000 -j ACCEPT
 +# Accepter les paquets redirigés vers des ports particuliers pour jitsi meet service tcp 4443 vers le serveur visio :
 +-A FORWARD -d 192.168.10.10/32 -o br2 -p tcp -m tcp --syn -m conntrack --ctstate NEW -m multiport --dports 4443 -j ACCEPT
 +
 +# Rejeter tout le reste :
 +-A FORWARD -i br2 -j REJECT --reject-with icmp-port-unreachable
 +-A FORWARD -o br2 -j REJECT --reject-with icmp-port-unreachable
 </code> </code>
  
Ligne 1016: Ligne 1121:
 </code> </code>
  
-==== Routage et filtrage avec iptables ====+==== Stockage ZFS ====
  
-Nous avons dû ensuite router et rediriger tout ça avec iptables afin de communiquer depuis l'extérieur avec le réseau des VM en 192.168.10.0/24 et filtrer les connexions entrantes, c'est le point le plus important. 
- 
-L'idée est de rediriger le requêtes d'Internet vers les bonnes VM et de pouvoir administrer à distance de façon graphique avec virt-manager l'ensemble des VM. 
-Le paquet ''iptables-persistent'' doit avoir été installé pour conserver les modifications du pare-feu entre chaque redémarrage. 
-Le port SSH a été masqué. 
- 
-Il est bien sûr extrêmement important de sécuriser SSH : interdire le login root avec mot de passe, utiliser de bons algorithmes de chiffrement, changer le port, n'autoriser qu'une IP distante (ou mieux, ne rien autoriser depuis internet et utiliser un VPN) et mettre en place un faux serveur SSH pour que les attaquants perdent leur temps à essayer de se connecter, sans vous faire perdre le vôtre (et ajouter un Fail2Ban évidemment). La recette reste secrète, désolé ! ;-) 
- 
-Les règles concernant le réseau d'administration n'apparaissent pas non plus ici. 
- 
-<code bash> 
-root@hypervisor-01 ~ # cat /etc/iptables/rules.v4 
-# Router le Web vers le proxy Nginx : 
--A PREROUTING -d 159.69.59.13/32 -p tcp -m tcp --syn -m multiport --dports 80,443 -j DNAT --to-destination 192.168.10.2 
-# Router le mail envoi/réception vers le serveur mail : 
--A PREROUTING -d 159.69.59.13/32 -p tcp -m tcp --syn -m multiport --dports 587,993,25 -j DNAT --to-destination 192.168.10.7 
-# Router le 9000 vers le serveur peertube : 
--A PREROUTING -d 159.69.59.13/32 -p tcp -m tcp --syn -m multiport --dports 9000 -j DNAT --to-destination 192.168.10.8 
-# Router le 4443 et les 10000-20000  tcp/udp vers le serveur jitsi : 
--A PREROUTING -d 159.69.59.13/32 -p tcp -m tcp --syn -m multiport --dports 10000:20000 -j DNAT --to-destination 192.168.10.10 
--A PREROUTING -d 159.69.59.13/32 -p udp -m udp       -m multiport --dports 10000:20000 -j DNAT --to-destination 192.168.10.10 
--A PREROUTING -d 159.69.59.13/32 -p tcp -m tcp --syn -m multiport --dports 4443        -j DNAT --to-destination 192.168.10.10 
-# Ne pas appliquer le masquerading sur le broadcast/multicast : 
--A POSTROUTING -s 192.168.10.0/24 -d 224.0.0.0/24 -j RETURN 
--A POSTROUTING -s 192.168.10.0/24 -d 255.255.255.255/32 -j RETURN 
-# Masquerading sur tous les ports dans le sens sortant (VM -> Internet) 
--A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535 
--A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -p udp -j MASQUERADE --to-ports 1024-65535 
--A POSTROUTING -s 192.168.10.0/24 ! -d 192.168.10.0/24 -j MASQUERADE 
- 
-# Accepter le trafic basique : ICMP, boucle locale et connexions établies, en entrée : 
--A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 
--A INPUT -i lo -j ACCEPT 
--A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT 
-# Accepter le SSH : 
--A INPUT -p tcp -m tcp --syn -m conntrack --ctstate NEW --dport XXXX -j ACCEPT 
-# Accepter Spice et VNC (console virtuelle de virt-manager) : 
--A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5900 -j ACCEPT 
--A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5900 -j ACCEPT 
--A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5901 -j ACCEPT 
--A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5901 -j ACCEPT 
--A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5902 -j ACCEPT 
--A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5902 -j ACCEPT 
--A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5903 -j ACCEPT 
--A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5903 -j ACCEPT 
--A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5904 -j ACCEPT 
--A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5904 -j ACCEPT 
--A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5905 -j ACCEPT 
--A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5905 -j ACCEPT 
--A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5906 -j ACCEPT 
--A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5906 -j ACCEPT 
--A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5907 -j ACCEPT 
--A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5907 -j ACCEPT 
--A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5908 -j ACCEPT 
--A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5908 -j ACCEPT 
--A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5909 -j ACCEPT 
--A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5909 -j ACCEPT 
--A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5910 -j ACCEPT 
--A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5910 -j ACCEPT 
--A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --dport 5911 -j ACCEPT 
--A INPUT -p udp -m udp -m conntrack --ctstate NEW --dport 5911 -j ACCEPT 
-# Accepter les requêtes DNS (port 53) depuis les VM : 
--A INPUT -i br2 -p udp -m udp -m multiport --dports 53 -j ACCEPT 
--A INPUT -i br2 -p tcp -m tcp -m multiport --dports 53 -j ACCEPT 
-# Bloquer les requêtes rpcbind/portmap en entrée depuis l'extérieur: 
--A INPUT -i br2 -p tcp -m multiport --dport 2049 -j ACCEPT 
--A INPUT -i br2 -p tcp -m multiport --dport 111 -j ACCEPT 
--A INPUT -p tcp -s 127.0.0.1 --dport 111 -j ACCEPT 
--A INPUT -p udp --dport 111 -j DROP 
--A INPUT -p tcp --dport 111 -j DROP 
- 
-# On refuse tout le reste : 
--A INPUT -m conntrack --ctstate INVALID -j DROP 
--A INPUT -p tcp -m tcp -j REJECT --reject-with tcp-reset 
--A INPUT -j REJECT --reject-with icmp-port-unreachable 
- 
-# Accepter les connexions établies sur le LAN : 
--A FORWARD -d 192.168.10.0/24 -o br2 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 
-# Accepter le trafic sortant depuis le LAN : 
--A FORWARD -s 192.168.10.0/24 -i br2 -j ACCEPT 
-# Accepter le trafic interne entre les VM : 
--A FORWARD -i br2 -o br2 -j ACCEPT 
-# Accepter les paquets redirigés vers des ports particuliers pour le Web vers le proxy : 
--A FORWARD -d 192.168.10.2/32 -o br2 -p tcp -m tcp --syn -m conntrack --ctstate NEW -m multiport --dports 80,443 -j ACCEPT 
-# Accepter les paquets redirigés vers des ports particuliers pour le mail vers le serveur mail : 
--A FORWARD -d 192.168.10.7/32 -o br2 -p tcp -m tcp --syn -m conntrack --ctstate NEW -m multiport --dports 587,993,25 -j ACCEPT 
-# Accepter les paquets redirigés vers des ports particuliers pour peertube service 9000 vers le serveur video : 
--A FORWARD -d 192.168.10.8/32 -o br2 -p tcp -m tcp --syn -m conntrack --ctstate NEW -m multiport --dports 9000 -j ACCEPT 
-# Accepter les paquets redirigés vers des ports particuliers pour funkwhale service 5000 vers le serveur video : 
--A FORWARD -d 192.168.10.9/32 -o br2 -p tcp -m tcp --syn -m conntrack --ctstate NEW -m multiport --dports 5000 -j ACCEPT 
-# Accepter les paquets redirigés vers des ports particuliers pour jitsi meet service tcp 10000-20000 vers le serveur visio : 
--A FORWARD -d 192.168.10.10/32 -o br2 -p tcp -m tcp --syn -m conntrack --ctstate NEW -m multiport --dports 10000:20000 -j ACCEPT 
-# Accepter les paquets redirigés vers des ports particuliers pour jitsi meet service udp 10000-20000 vers le serveur visio : 
--A FORWARD -d 192.168.10.10/32 -o br2 -p udp -m udp       -m conntrack --ctstate NEW -m multiport --dports 10000:20000 -j ACCEPT 
-# Accepter les paquets redirigés vers des ports particuliers pour jitsi meet service tcp 4443 vers le serveur visio : 
--A FORWARD -d 192.168.10.10/32 -o br2 -p tcp -m tcp --syn -m conntrack --ctstate NEW -m multiport --dports 4443 -j ACCEPT 
- 
-# Rejeter tout le reste : 
--A FORWARD -i br2 -j REJECT --reject-with icmp-port-unreachable 
--A FORWARD -o br2 -j REJECT --reject-with icmp-port-unreachable 
-</code> 
- 
-==== Stockage ZFS ==== 
 Un « pool » sur les 2 gros disques mécaniques a été créé en miroir (RAID1). Si vous vous demandez pourquoi nous n'avons pas créé de RAIDZ*, RAID5, RAID10, etc., vous pouvez jeter un coup d'oeil à [[https://jrs-s.net/2015/02/06/zfs-you-should-use-mirror-vdevs-not-raidz/|ce très bon article]]. Un « pool » sur les 2 gros disques mécaniques a été créé en miroir (RAID1). Si vous vous demandez pourquoi nous n'avons pas créé de RAIDZ*, RAID5, RAID10, etc., vous pouvez jeter un coup d'oeil à [[https://jrs-s.net/2015/02/06/zfs-you-should-use-mirror-vdevs-not-raidz/|ce très bon article]].
  
Ligne 1175: Ligne 1177:
  
 ==== Sauvegardes ==== ==== Sauvegardes ====
-Toujours sauvegarder ! Nous avons mis en place des snapshots ZFS que nous répliquons en France via SSH sur un autre pool ZFS en miroir. Les donnés sont donc techniquement répliquées 3 fois (4 disque sur deux sites géographiques différents). En utilisant les snapshots différentiels et incrémentiels, cela devient très rapide à faire.+Toujours sauvegarder ! Nous avons mis en place des snapshots ZFS que nous répliquons en France, dans le Tarn au domicile de l'administrateur, via SSH sur un autre pool ZFS en miroir. Les donnés sont donc techniquement répliquées 3 fois (4 disques sur deux sites géographiques différents). En utilisant les snapshots différentiels et incrémentiels, cela devient très rapide à faire.
  
 Nous aimerions pouvoir chiffrer les données nativement, une fois que ZFS 2.0 aura atterri dans Debian stable. Pour le moment, seul Nextcloud permet de chiffrer le stockage nativement. Nous aimerions pouvoir chiffrer les données nativement, une fois que ZFS 2.0 aura atterri dans Debian stable. Pour le moment, seul Nextcloud permet de chiffrer le stockage nativement.