Thanks Wido, Let's see what the others think of it.
-- Sent from the Delta quadrant using Borg technology! Nux! www.nux.ro ----- Original Message ----- > From: "Wido den Hollander" <w...@widodh.nl> > To: dev@cloudstack.apache.org > Sent: Wednesday, 6 January, 2016 16:30:57 > Subject: Re: KVM: Security grouping through libvirt instead of Python > On 06-01-16 16:42, Nux! wrote: >> Ok, as long as compatibility is maintained, then awesome! >> > > Yes > >> BTW, I might be going too far, but would this allow us to "live" change the >> SGs >> of an instance? >> Until very recently this was not possible at all, but last week the folks >> from >> Exoscale added a patch[1] that allows one to change the SGs of an instance, >> however the instance must be stopped/started. >> > > Seems like it. If we create a specific filter for each instance running > on that host we can re-define the filter at any moment as long as the > name and UUID stays the same. > > Security Group Rules -> Libvirt XML > > That way you can simply re-generate the XML and thus switch security > group while the Instance is running. > > Wido > >> >> [1] https://github.com/apache/cloudstack/pull/1297 >> >> -- >> Sent from the Delta quadrant using Borg technology! >> >> Nux! >> www.nux.ro >> >> ----- Original Message ----- >>> From: "Wido den Hollander" <w...@widodh.nl> >>> To: dev@cloudstack.apache.org >>> Sent: Wednesday, 6 January, 2016 15:37:39 >>> Subject: Re: KVM: Security grouping through libvirt instead of Python >> >>> On 06-01-16 16:20, Nux! wrote: >>>> That's great! Fine by me then, but we need to be careful and not mess up >>>> the SG >>>> bits for XenServer. >>>> >>>> I think they are sharing the same python scripts right now. >>>> >>> >>> No reason to delete the Python script from the Git repo. For KVM we can >>> however switch to using libvirt and just generate XMLs and call the API >>> functions. >>> >>> Wido >>> >>>> -- >>>> Sent from the Delta quadrant using Borg technology! >>>> >>>> Nux! >>>> www.nux.ro >>>> >>>> ----- Original Message ----- >>>>> From: "Wido den Hollander" <w...@widodh.nl> >>>>> To: dev@cloudstack.apache.org >>>>> Sent: Wednesday, 6 January, 2016 14:38:17 >>>>> Subject: Re: KVM: Security grouping through libvirt instead of Python >>>> >>>>> On 06-01-16 13:12, Nux! wrote: >>>>>> Hi Wido, >>>>>> >>>>>> +1 for using more libvirt and less custom stuff, but what do we do about >>>>>> XenServer? SG is supported with it as well and there is no libvirt there. >>>>>> Would this be a different implementation just for KVM? >>>>>> >>>>> >>>>> Yes. For KVM we control almost everything through libvirt. Moving >>>>> Security Grouping there would be a good thing. >>>>> >>>>> I never do anything with Xen, so I have no clue there. >>>>> >>>>>> In addition, I have the following in production and it's not clear if it >>>>>> would >>>>>> continue to work with libvirt filters - my hunch is that it will not >>>>>> since it >>>>>> involves multiple, different src IPs. >>>>>> >>>>>> 1 - additional IPs on instance >>>>>> 2 - subnets routed via instance IPs (I usually assign them on loopback >>>>>> on the >>>>>> VM) >>>>>> >>>>> >>>>> No problem at all. Just tested this: >>>>> >>>>> <rule action='return' direction='out' priority='500'> >>>>> <ip srcipaddr='192.168.100.101'/> >>>>> </rule> >>>>> <rule action='return' direction='out' priority='501'> >>>>> <ip srcipaddr='192.168.100.201'/> >>>>> </rule> >>>>> <rule action='return' direction='out' priority='502'> >>>>> <ip srcipaddr='10.0.0.0' srcipmask='24'/> >>>>> </rule> >>>>> >>>>> <rule action='drop' direction='out' priority='1000'/> >>>>> >>>>> So this VM had this config: >>>>> >>>>> auto ens7 >>>>> iface ens7 inet static >>>>> address 192.168.100.101 >>>>> netmask 255.255.255.0 >>>>> >>>>> auto ens7:0 >>>>> iface ens7:0 inet static >>>>> address 192.168.100.201 >>>>> netmask 255.255.255.0 >>>>> >>>>> auto dummy0 >>>>> iface dummy0 inet static >>>>> address 10.0.0.1 >>>>> netmask 255.255.255.0 >>>>> >>>>> From my other host I could reach all IPs just fine: >>>>> >>>>> $ ip route add 10.0.0.0/24 via 192.168.100.101 >>>>> >>>>> Trying to use any other IP than listed in the filter would be dropped. >>>>> >>>>> So it can support multiple IPs and routed subnets as well. The latter >>>>> would be required for IPv6 with DHCPv6+Prefix Delegation. >>>>> >>>>> Wido >>>>> >>>>>> Lucian >>>>>> >>>>>> -- >>>>>> Sent from the Delta quadrant using Borg technology! >>>>>> >>>>>> Nux! >>>>>> www.nux.ro >>>>>> >>>>>> ----- Original Message ----- >>>>>>> From: "Wido den Hollander" <w...@widodh.nl> >>>>>>> To: dev@cloudstack.apache.org >>>>>>> Sent: Wednesday, 6 January, 2016 10:02:31 >>>>>>> Subject: KVM: Security grouping through libvirt instead of Python >>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> A while back I opened CLOUDSTACK-1164 [0] since I think that we should >>>>>>> use as much features of libvirt as possible. >>>>>>> >>>>>>> libvirt supports network filtering [1] which basically controls >>>>>>> ebtables, iptables and ip6tables (IPv6 support!). >>>>>>> >>>>>>> Using a XML definition you can create a filter and than use this filter >>>>>>> for a interface. >>>>>>> >>>>>>> I created a simple setup to test: >>>>>>> - Can I prevent MAC spoofing? >>>>>>> - Can I prevent IP spoofing? >>>>>>> - Can I reload a filter without stopping my VM >>>>>>> >>>>>>> All the questions were answered by "Yes", so I figured it was useful to >>>>>>> share this information. >>>>>>> >>>>>>> On my laptop running Ubuntu 14.04 and libvirt 1.2.2 I created two VMs: >>>>>>> - One NIC with NAT for Internet access (no filter) >>>>>>> - One NIC on a isolated bridge >>>>>>> >>>>>>> On the second NIC I assigned 192.168.100.1 and .2. >>>>>>> >>>>>>> VM network_filter_1 got a filter assigned: >>>>>>> >>>>>>> <interface type='network'> >>>>>>> <mac address='52:54:00:c1:b9:5b'/> >>>>>>> <source network='filternetwork'/> >>>>>>> <model type='virtio'/> >>>>>>> <filterref filter='network_filter_1'/> >>>>>>> </interface> >>>>>>> >>>>>>> I created a filter called 'network_filter_1' >>>>>>> >>>>>>> <filter name='network_filter_1' chain='ipv4'> >>>>>>> <uuid>64b80046-9a9d-40c2-8782-ed5878146262</uuid> >>>>>>> >>>>>>> <rule action='drop' direction='out'> >>>>>>> <mac match='no' srcmacaddr='52:54:00:c1:b9:5b'/> >>>>>>> </rule> >>>>>>> >>>>>>> <rule action='drop' direction='out'> >>>>>>> <ip match='no' srcipaddr='192.168.100.1'/> >>>>>>> </rule> >>>>>>> >>>>>>> <rule action='accept' direction='in'> >>>>>>> <tcp dstportstart='22'/> >>>>>>> </rule> >>>>>>> >>>>>>> <rule action='accept' direction='in'> >>>>>>> <tcp dstportstart='80'/> >>>>>>> </rule> >>>>>>> >>>>>>> <rule action='accept' direction='in'> >>>>>>> <tcp dstportstart='443'/> >>>>>>> </rule> >>>>>>> >>>>>>> <rule action='drop' direction='in'> >>>>>>> <all/> >>>>>>> </rule> >>>>>>> </filter> >>>>>>> >>>>>>> libvirt can auto-detect the MAC and IP, but since we already know that >>>>>>> information I didn't think I needed to test that. >>>>>>> >>>>>>> $ virsh nwfilter-define filter.xml >>>>>>> $ virsh define network_filter_1.xml >>>>>>> $ virsh start network_filter_1 >>>>>>> >>>>>>> The result was simple. Using any different IP then 192.168.100.1 failed >>>>>>> and connections to ports not being 22, 80 or 443 failed. >>>>>>> >>>>>>> Changes to filters were simple as well. Edit filter.xml and run: >>>>>>> >>>>>>> $ virsh nwfilter-define filter.xml >>>>>>> >>>>>>> Those changes were applied without stopping the VM. Done within 1 >>>>>>> second. >>>>>>> >>>>>>> I think it is worth the effort to use this instead of using >>>>>>> 'security_group.py'. >>>>>>> >>>>>>> On KVM we can always perform MAC address filtering and when security >>>>>>> grouping in shared or basic networking is used we can use libvirt to >>>>>>> filter all the traffic. >>>>>>> >>>>>>> Less code we have to maintain and I prefer using libvirt over our custom >>>>>>> Python code. >>>>>>> >>>>>>> This is not a functional spec yet, but I just wanted to get this >>>>>>> information out there and share what I found. >>>>>>> >>>>>>> Looking at the libvirt docs I can't find anything which it can't do >>>>>>> which our security groups currently can. It already fully supports IPv6 >>>>>>> which we don't. >>>>>>> >>>>>>> CloudStack would only need to generate the proper XML documents and >>>>>>> that's all. >>>>>>> >>>>>>> Wido >>>>>>> >>>>>>> [0]: https://issues.apache.org/jira/browse/CLOUDSTACK-1164 > >>>>>> [1]: http://libvirt.org/formatnwfilter.html