Proxmox est une solution de virtualisation. Elle permet de créée des machines virtuelles de type KVM ou des conteneurs LXC.
Installation de Debian
Je ne vais pas m’étendre sur l’installation de Debian. Voici le partitionnement que je fais généralement. Je vous laisse l’adapter selon vos besoins :
- Primaire Ext4 /boot 1024
- Primaire SWAP 8192
- Primaire Ext4 / 51200
- Primaire Ext4 /proxmox le reste
Configuration de l’adresse IP du serveur :
Avant de modifier le fichier de configuration du réseau, nous allons le sauvegarder via la commande suivante :
1
|
# cp /etc/network/interfaces{,.ori}
|
Entrer la commande suivante pour l’éditer :
1
|
# vi /etc/network/interfaces
|
Modifier le contenu du fichier comme ci-dessous :
1
2
3
4
5
6
7
|
allow-hotplug eth0
iface eth0 inet static
address XXX.XXX.XXX.XXX
netmask XXX.XXX.XXX.XXX
network XXX.XXX.XXX.XXX
broadcast XXX.XXX.XXX.255
gateway XXX.XXX.XXX.XXX
|
Configuration des serveurs DNS :
Avant de modifier le fichier de configuration des serveurs DNS, nous allons le sauvegarder via la commande suivante :
1
|
# cp /etc/resolv.conf{,.ori}
|
Entrer la commande suivante pour l’éditer :
Ajouter la ligne suivante :
1
|
NameServer XXX.XXX.XXX.XXX, YYY.YYY.YYY.YYY
|
Redémarrage du service réseau pour prendre en compte les nouveaux paramètres :
1
2
|
# ifdown eth0
# ifup eth0
|
Mettre à jour le serveur
Entrer les commandes suivantes pour mettre à jour le serveur :
1
2
|
# apt update
# apt full-upgrade
|
Installer le serveur SSH
Entrer la commande suivante pour installer le serveur ssh « OpenSSH » :
1
|
# apt install openssh-server
|
Afin de compliquer la tâche des pirates potentiels, nous allons modifier le port d’écoute du serveur qui est par défaut le 22 par 1234. Avant de modifier le fichier de configuration du réseau, nous allons le sauvegarder via la commande suivante :
1
|
# cp /etc/ssh/sshd_config{,.ori}
|
Entrer la commande suivante pour modifier le fichier de configuration du serveur :
1
|
# vi /etc/ssh/sshd_config
|
Et on modifie la ligne (ligne 13) :
Par :
On va désactiver la possibilité de se connecter en root à l’aide d’une clé SSH par mesure de sécurité. Pour cela on modifie la ligne 32 :
On vérifie que l’on a pas fait d’erreur lors de la modification de la configuration :
Si la commande ne retourne rien, c’est qu’il n’y a pas d’erreurs. Donc, on peut, redémarrer le serveur SSH via la commande suivante pour prendre en compte la nouvelle configuration :
1
|
# systemctl restart ssh
|
Voilà ! Maintenant pour vous connecter à votre serveur via SSH (avec le compte utilisateur), vous devrez utiliser le port 1234. Afin de ne plus faire transiter en clair le mot de passe utilisateur, nous allons générer une clé SSH de type RSA et d’une longueur de 4096 bits sur notre postse client.Pour plus de sécurité vous pouvez définir un mot de passe qui sera associé à votre clé privé. Pour cela, on tape la commande suivante :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
4a:dd:0a:c6:35:4e:3f:ed:27:38:8c:74:44:4d:93:67 demo@a
The key’s randomart image is:
+--[ RSA 2048]----+
| .oo. |
| . o.E |
| + . o |
| . = = . |
| = S = . |
| o + = + |
| . o + o . |
| . o |
| |
+-----------------+
|
Maintenant que nous avons créé notre clé SSH, nous devons la copier, sur le serveur. Pour cela, on tape la commande suivante :
1
|
# ssh-copy-id -i ~/.ssh/id_rsa.pub -o IdentitiesOnly=yes -p 1234 user@host
|
Création des interfaces Bridge
Pour des questions de sécurité, il n’est pas recommandé d’exposer les machines virtuelles ou conteneurs directement sur l’interface relié à internet. Nous allons donc créer 3 bridges. Le premier sera associé à l’interface physique de la machine. Les deux autres serviront à la machine NAT-Router que l’on créera plus tard et qui permettra d’isoler les machines ou conteneurs d’internet. Afin de pouvoir les créer, nous devons installer le package « bridge-utils » qui fourni le binaire brctl. Pour cela, on tape la commande suivante :
1
|
# apt install bridge-utils
|
Maintenant, nous pouvons créer les 3 bridges. Pour cela, on tape la commande suivante :
1
2
3
|
# brctl addbr vmbr0
# brctl addbr vmbr1
# brctl addbr vmbr2
|
On vérifie que les bridges ont bien été créé à l’aide de la commande suivante :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
2: eno0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether d4:ae:52:c7:40:15 brd ff:ff:ff:ff:ff:ff
inet XXX.XXX.XXX.XXX/XX brd XXX.XXX.XXX.255 scope global eno0
valid_lft forever preferred_lft forever
inet6 fe80::d6ae:52ff:fec7:4015/64 scope link
valid_lft forever preferred_lft forever
3: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether d4:ae:52:c7:40:15 brd ff:ff:ff:ff:ff:ff
4: vmbr0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether d4:ae:52:c7:40:15 brd ff:ff:ff:ff:ff:ff
5: vmbr1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether fe:aa:81:16:e5:43 brd ff:ff:ff:ff:ff:ff
6: vmbr2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether fe:9c:d8:17:7a:56 brd ff:ff:ff:ff:ff:ff
|
Les briges étant créés, nous devons les ajouter à la configuration réseau. Pour cela, nous allons éditer la configuration via la commande suivante :
1
|
# vi /etc/network/interfaces
|
Voici le contenu du fichier une fois modifié :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
auto lo
iface lo inet loopback
#allow-hotplug eno1
iface eno1 inet manual
auto vmbr0
iface vmbr0 inet static
address XXX.XXX.XXX.XXX
netmask XXX.XXX.XXX.XXX
gateway XXX.XXX.XXX.XXX
bridge_ports eno1
bridge_stp off
bridge_fd 0
auto vmbr1
iface vmbr1 inet static
address 10.0.0.1
netmask 255.255.255.252
bridge_ports WAN
bridge_stp off
bridge_fd 0
auto vmbr2
iface vmbr2 inet static
address 192.168.0.1
netmask 255.255.255.0
bridge_ports LAN
bridge_stp off
bridge_fd 0
|
Mise en place d’un firewall
Par défaut, lorsque l’on installe une Debian, le firewall n’est pas configuré. Nous allons créer un script qui sera exécuté lorsque que l’interface sera monté. Pour cela, on tape les commandes suivantes :
1
2
|
# mkdir /root/scripts/
# vi /root/scripts/add_iptables_rules.sh
|
Voici le contenu du scripts :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
#!/bin/sh
##### Variables definitions #####
## Proxmox bridge holding Public IP
ProxPhyInt="vmbr0"
## Proxmox bridge on ProxVMBR1Net
ProxVMBR1="vmbr1"
## Network/Mask of ProxVMBR1Net
ProxVMBR1NET="10.0.0.0/30"
## Public IP => Set your own
PublicIP="XXX.XXX.XXX.XXX"
## Proxmox WAN Bridge IP
ProxVMBR1IP="10.0.0.1"
## Router WAN IP
RtrWANIP="10.0.0.2"
ProxWebIntPort="8006"
DNSPort="53"
HTTPPort="80"
NTPPort="123"
HTTPSPort="443"
SSHDPort="1234"
DNS1="XXX.XXX.XXX.XXX"
DNS2="XXX.XXX.XXX.XXX"
##### CLEAN ALL RULES & DROP IPV4 AND IPV6 PACKETS #####
## Delete all existing rules.
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -t nat -F
/sbin/iptables -t nat -X
/sbin/iptables -t mangle -F
/sbin/iptables -t mangle -X
/sbin/ip6tables -F
/sbin/ip6tables -X
/sbin/ip6tables -t nat -F
/sbin/ip6tables -t nat -X
/sbin/ip6tables -t mangle -F
/sbin/ip6tables -t mangle -X
## Block ALL IPV4 and IPV6 INPUT and OUTPUT
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/ip6tables -P INPUT DROP
/sbin/ip6tables -P OUTPUT DROP
/sbin/ip6tables -P FORWARD DROP
##### CHAINS #####
## Creating chains
/sbin/iptables -N TCP
/sbin/iptables -N UDP
/sbin/iptables -N udp-flood
## UDP = ACCEPT / SEND TO THIS CHAIN
/sbin/iptables -A INPUT -p udp -m conntrack --ctstate NEW -j UDP
## TCP = ACCEPT / SEND TO THIS CHAIN
/sbin/iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
##### GLOBAL RULES #####
## Allow localhost
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT
## Don't break the current/active connections
/sbin/iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
## Allow response to ping request
/sbin/iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
##### INPUT IPV4 RULES FOR ProxPhyInt #####
## Allow Proxmox SSH server
/sbin/iptables -A TCP -i $ProxPhyInt -d $PublicIP -p tcp --dport $SSHDPort -j ACCEPT
## Allow Proxmox WebUI
/sbin/iptables -A TCP -i $ProxPhyInt -d $PublicIP -p tcp --dport $ProxWebIntPort -j ACCEPT
## NTP Client
/sbin/iptables -A UDP -i $ProxPhyInt -d $PublicIP -p udp --sport $NTPPort -j ACCEPT
##### OUTPUT IPV4 RULES FOR ProxPhyInt #####
## Allow ping out
/sbin/iptables -A OUTPUT -p icmp -j ACCEPT
## Allow LAN to access internet
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $RtrWANIP -d $PublicIP -j ACCEPT
## Proxmox Host as CLIENT
## Allow SSH
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p tcp --dport $SSHDPort -j ACCEPT
## Allow DNS
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p udp --dport $DNSPort -d $DNS1,$DNS2 -j ACCEPT
## Allow HTTP/HTTPS
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p tcp --dport $HTTPPort -j ACCEPT
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p tcp --dport $HTTPSPort -j ACCEPT
## Allow NTP
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p udp --dport $NTPPort -j ACCEPT
## Proxmox Host as SERVER
## Allow SSH
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p tcp --sport $SSHDPort -j ACCEPT
## Allow PROXMOX WebUI
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p tcp --sport $ProxWebIntPort -j ACCEPT
## Allow NTP
/sbin/iptables -A OUTPUT -o $ProxPhyInt -s $PublicIP -p udp --sport $NTPPort -j ACCEPT
##### FORWARD IPV4 RULES #####
## Allow request forwarding from WAN to Router WAN interface
/sbin/iptables -A FORWARD -i $ProxPhyInt -d $RtrWANIP -o $ProxVMBR1 -p tcp -j ACCEPT
/sbin/iptables -A FORWARD -i $ProxPhyInt -d $RtrWANIP -o $ProxVMBR1 -p udp -j ACCEPT
## Allow request forwarding from LAN
/sbin/iptables -A FORWARD -i $ProxVMBR1 -s $ProxVMBR1NET -j ACCEPT
##### MASQUERADE MANDATORY #####
## Allow WAN network to use vmbr0 public adress to go out
/sbin/iptables -t nat -A POSTROUTING -s $ProxVMBR1NET -o $ProxPhyInt -j MASQUERADE
##### Redirect IPV4 (NAT) traffic from internet #####
## All tcp to Router WAN except 22 and 8006
/sbin/iptables -t nat -A PREROUTING -i $ProxPhyInt -p tcp --match multiport ! --dports $SSHDPort,$ProxWebIntPort -j DNAT --to $RtrWANIP
## All udp to Router WAN
/sbin/iptables -t nat -A PREROUTING -i $ProxPhyInt -p udp -j DNAT --to $RtrWANIP
##### INPUT IPV4 RULES FOR ProxVMBR1 #####
## SSH (Server)
/sbin/iptables -A TCP -i $ProxVMBR1 -d $ProxVMBR1IP -p tcp --dport $SSHDPort -j ACCEPT
## Proxmox WebUI (Server)
/sbin/iptables -A TCP -i $ProxVMBR1 -d $ProxVMBR1IP -p tcp --dport $ProxWebIntPort -j ACCEPT
##### OUTPUT IPV4 RULES FOR ProxVMBR1 #####
## Allow SSH server
/sbin/iptables -A OUTPUT -o $ProxVMBR1 -s $ProxVMBR1IP -p tcp --sport $SSHDPort -j ACCEPT
## Allow Proxmox WebUI
/sbin/iptables -A OUTPUT -o $ProxVMBR1 -s $ProxVMBR1IP -p tcp --sport $ProxWebIntPort -j ACCEPT
##### OUTPUT FLOOD PROTECTION #####
/sbin/iptables -A OUTPUT -p udp -j udp-flood
/sbin/iptables -A udp-flood -p udp -m limit --limit 10/s -j RETURN
/sbin/iptables -A udp-flood -j LOG --log-level 4 --log-prefix 'UDP-flood attempt: '
/sbin/iptables -A udp-flood -j DROP
/sbin/iptables -A OUTPUT -p udp -j DROP
|
Maintenant, on le rend exécutable via la commande suivante :
1
|
# chmod +x /root/scripts/add_iptables_rules.sh
|
Nous allons modifier la configuration réseau pour le script soit exécuter une fois que l’interface vmbr0 est monté. Pour cela, on tape la commande suivante :
1
|
# vi /etc/network/interfaces
|
Voici le contenu du fichier une fois modifié :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
auto lo
iface lo inet loopback
#allow-hotplug eno1
iface eno1 inet manual
auto vmbr0
iface vmbr0 inet static
address XXX.XXX.XXX.XXX
netmask XXX.XXX.XXX.XXX
gateway XXX.XXX.XXX.XXX
bridge_ports eno1
bridge_stp off
bridge_fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up /root/scripts/add_iptables_rules.sh
auto vmbr1
iface vmbr1 inet static
address 10.0.0.1
netmask 255.255.255.252
bridge_ports WAN
bridge_stp off
bridge_fd 0
auto vmbr2
iface vmbr2 inet static
address 192.168.0.1
netmask 255.255.255.0
bridge_ports LAN
bridge_stp off
bridge_fd 0
|
Vous pouvez maintenant redémarrer le serveur pour prendre en compte les modifications, via la commande suivante :