add new unpublished blog article
This commit is contained in:
		
					parent
					
						
							
								2f1d043281
							
						
					
				
			
			
				commit
				
					
						a45317ab02
					
				
			
		
					 2 changed files with 117 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -0,0 +1,112 @@
 | 
			
		|||
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
 | 
			
		||||
    }
 | 
			
		||||
```
 | 
			
		||||
| 
						 | 
				
			
			@ -1 +1,6 @@
 | 
			
		|||
- how to secure the network
 | 
			
		||||
- rate limiting
 | 
			
		||||
- automating
 | 
			
		||||
- trigger / postgres / etcd
 | 
			
		||||
- metadata!
 | 
			
		||||
- building vm images!
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue