113 lines
3.1 KiB
Text
113 lines
3.1 KiB
Text
|
title: How to build an OpenStack alternative: Step 2, secure the network
|
||
|
---
|
||
|
pub_date: 2020-01-12
|
||
|
---
|
||
|
author: ungleich virtualisation team
|
||
|
---
|
||
|
twitter_handle: ungleich
|
||
|
---
|
||
|
_hidden: no
|
||
|
---
|
||
|
_discoverable: no
|
||
|
---
|
||
|
abstract:
|
||
|
Let's secure the VM network
|
||
|
---
|
||
|
body:
|
||
|
|
||
|
In the second step of building an OpenStack alternative we have a look
|
||
|
on how to secure the network.
|
||
|
|
||
|
In the first step we described [how to setup a
|
||
|
protoype](how-to-build-an-openstack-alternative-step-1).
|
||
|
|
||
|
Note: the name of our OpenStack alternative is
|
||
|
**uncloud**.
|
||
|
|
||
|
## Securing the network - of what?
|
||
|
|
||
|
Users should be able to do what they want and not limited in their
|
||
|
actions. On the other hand, users should be unable to disturb other
|
||
|
users.
|
||
|
|
||
|
## General policy: no firewall
|
||
|
|
||
|
So for most of the user created traffic there should not be a firewall
|
||
|
rule on the virtualisation stack. Users should be free to configure
|
||
|
their own policies on the VM.
|
||
|
|
||
|
## Network types
|
||
|
|
||
|
Before applying any security mechanism, we have to think about what
|
||
|
kind of networks can exist in a cloud environment. We see two types of
|
||
|
networks:
|
||
|
|
||
|
* shared networks - more than one customer is in this network
|
||
|
* private networks - only one customer has access in this network
|
||
|
|
||
|
## Filtering IP address management packets
|
||
|
|
||
|
So when we share a network, we don't want one customer to be able to
|
||
|
assign IP addresses to other customers. Instead IP addresses should
|
||
|
only be assigned from the operator.
|
||
|
|
||
|
This means that we need to prevent rogue
|
||
|
|
||
|
* [Router advertisements (IPv6)](https://en.wikipedia.org/wiki/Neighbor_Discovery_Protocol)
|
||
|
* [DHCPv6](https://en.wikipedia.org/wiki/DHCPv6) server answers
|
||
|
* [DHCPv4](https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol) server answers
|
||
|
|
||
|
In our prototype we are using [nftables instead of
|
||
|
iptables](https://ungleich.ch/en-us/cms/blog/2018/08/18/iptables-vs-nftables/)
|
||
|
for firewalling, but the rules can be translated from one to another
|
||
|
firewall system.
|
||
|
|
||
|
To drop router advertisements, we can use the following rule:
|
||
|
|
||
|
```
|
||
|
icmpv6 type nd-router-advert drop
|
||
|
```
|
||
|
|
||
|
To drop DHCPv6 server answers we can use
|
||
|
|
||
|
```
|
||
|
ip6 version 6 udp sport 547 drop
|
||
|
```
|
||
|
|
||
|
And finally to prevent DHCPv4 server anwers, we use
|
||
|
|
||
|
```
|
||
|
ip version 4 udp sport 67 drop
|
||
|
```
|
||
|
|
||
|
Note: while uncloud does not use IPv4 or DHCPv4 to the VMs, a rogue
|
||
|
DHCPv4 server might still trick other VMs into assigning themself an
|
||
|
IPv4 address. So we also need to block this one.
|
||
|
|
||
|
## Filtering MAC and IP spoofing
|
||
|
|
||
|
A VM should not be able to spoof the
|
||
|
[MAC address](https://en.wikipedia.org/wiki/MAC_address) or
|
||
|
IP address of another machine. We can achieve this by adding a chain
|
||
|
specific for each VM network interface:
|
||
|
|
||
|
```
|
||
|
chain vm1 {
|
||
|
ether saddr != 02:00:f0:a9:c4:4e drop
|
||
|
ip6 saddr != 2a0a:e5c1:111:888:0:f0ff:fea9:c44e drop
|
||
|
}
|
||
|
```
|
||
|
|
||
|
This way any incorrect mac address and any incorrect IPv6 source
|
||
|
address will be blocked. If a customer requested a network for the VM
|
||
|
(/64 or /48 for instance), it can easily be prepended to the vm1 specific
|
||
|
chain:
|
||
|
|
||
|
```
|
||
|
chain vm1 {
|
||
|
ip6 saddr 2a0a:e5c1:111:cafe::/64 accept
|
||
|
ether saddr != 02:00:f0:a9:c4:4e drop
|
||
|
ip6 saddr != 2a0a:e5c1:111:888:0:f0ff:fea9:c44e drop
|
||
|
}
|
||
|
```
|