1.虚拟机安全组规则一致性检查
1.根据虚拟机id找到使用的port id。
2.根据port id找到port所在计算节点名字。
3.根据port id找到port所属安全组id。
4.根据安全组id查询对应的安全组规则。
5.Ssh到计算节点,根据port id查询对应的iptables规则。
6.自动分析安全组规则与iptables规则是否一致。
2.client中安全组相关接口
安全组作用范围是在虚拟机上,更具体来说是作用在虚拟机的端口而不是网络上。
neutron-diagnose vm_sg_rule [-h] [-f {json,shell,table,value,yaml}]
[-c COLUMN] [--max-width <integer>]
[--print-empty] [--noindent]
[--prefix PREFIX]
[--port]
<instance>
Instance:默认参数,需输入使用该安全组的虚拟机id,
--port:可选参数,list类型,虚拟机网卡id;如设置为空,则默认检测所有网卡安全组规则。
3.数据提取
0.通过nova interface-list vm-id 查询到该虚拟机所管理的所有port-id,依次判断
1.通过neutron port-show port-id 查询该port的binding:host_id属性,获得该port所在计算节;
2.通过neutron port-show port-id 查询该port的securitsy_groups id.
3.通过neutron security-group-show group-id 查询该安全组的security_group_rules,将该数据存入列表里面,列表里面都是字典类型
4.通过sshclient到步骤1中port所属计算节点,分别查询4个iptable表所属的iptable规则(包括raw mangle filter nat),将规则依次存入列表;最终构建一个字典类型
5.对port关联的数据库中安全组规则和port所在节点安全组规则进行分析。
4.数据比对分析
4.1 分析port所关联的安全组规则设置的合理性,以default安全组为基本依据;
在没有任何安全组规则前提下,虚拟机进出流量默认是禁止的。安全组中添加的规则都是放行的,通过选择性的放行来控制进出虚拟机的。以默认安全组(default)为例,其实现默认放行出虚拟机所有流量,放行入虚拟机的来自于规则中远端安全组的所有流量,保证最基础的虚拟机入出链路连通。
合理性检查如下:
1. 检查虚拟机默认出规则是否存在(目前只考虑iPv4),若默认出规则缺失,则抛出规则检查异常,打印目前出规则信息;若默认出规则存在,则出方向规则正常,跳入检查入规则;
2. 检查虚拟机默认入规则是否存在,若默认入规则缺失,则抛出入规则检查异常,打印目前入规则信息;若默认如规则存在,则入方向规则正常;进一步判断所有入规则中,是否存在放行所有入规则,若有,则提示放行所有入规则;
4.2 分析port所关联的安全组规则设置的一致性
底层规则正确性检查如下:
1.涉及port相关的默认入规则是否添加
具体参考5中的iptables规则分析:进入虚拟机的流量,需要检查的默认规则如下:
-A neutron-openvswi-FORWARD -m physdev --physdev-out tap18fcd66b-80 --physdev-is-bridged -m comment --comment "Direct traffic from the VM interface to the security group chain." -j neutron-openvswi-sg-chain
-A neutron-openvswi-sg-chain -m physdev --physdev-out tap18fcd66b-80 --physdev-is-bridged -m comment --comment "Jump to the VM specific chain." -j neutron-openvswi-i18fcd66b-8
-----经过qbr bridge转发并通过tap进入虚拟机的包
-A neutron-openvswi-i18fcd66b-8 -m state --state RELATED,ESTABLISHED -m comment --comment "Direct packets associated with a known session to the RETURN chain." -j RETURN
1.根据虚拟机id找到使用的port id。
2.根据port id找到port所在计算节点名字。
3.根据port id找到port所属安全组id。
4.根据安全组id查询对应的安全组规则。
5.Ssh到计算节点,根据port id查询对应的iptables规则。
6.自动分析安全组规则与iptables规则是否一致。
2.client中安全组相关接口
安全组作用范围是在虚拟机上,更具体来说是作用在虚拟机的端口而不是网络上。
neutron-diagnose vm_sg_rule [-h] [-f {json,shell,table,value,yaml}]
[-c COLUMN] [--max-width <integer>]
[--print-empty] [--noindent]
[--prefix PREFIX]
[--port]
<instance>
Instance:默认参数,需输入使用该安全组的虚拟机id,
--port:可选参数,list类型,虚拟机网卡id;如设置为空,则默认检测所有网卡安全组规则。
3.数据提取
0.通过nova interface-list vm-id 查询到该虚拟机所管理的所有port-id,依次判断
1.通过neutron port-show port-id 查询该port的binding:host_id属性,获得该port所在计算节;
2.通过neutron port-show port-id 查询该port的securitsy_groups id.
3.通过neutron security-group-show group-id 查询该安全组的security_group_rules,将该数据存入列表里面,列表里面都是字典类型
4.通过sshclient到步骤1中port所属计算节点,分别查询4个iptable表所属的iptable规则(包括raw mangle filter nat),将规则依次存入列表;最终构建一个字典类型
5.对port关联的数据库中安全组规则和port所在节点安全组规则进行分析。
4.数据比对分析
4.1 分析port所关联的安全组规则设置的合理性,以default安全组为基本依据;
在没有任何安全组规则前提下,虚拟机进出流量默认是禁止的。安全组中添加的规则都是放行的,通过选择性的放行来控制进出虚拟机的。以默认安全组(default)为例,其实现默认放行出虚拟机所有流量,放行入虚拟机的来自于规则中远端安全组的所有流量,保证最基础的虚拟机入出链路连通。
合理性检查如下:
1. 检查虚拟机默认出规则是否存在(目前只考虑iPv4),若默认出规则缺失,则抛出规则检查异常,打印目前出规则信息;若默认出规则存在,则出方向规则正常,跳入检查入规则;
2. 检查虚拟机默认入规则是否存在,若默认入规则缺失,则抛出入规则检查异常,打印目前入规则信息;若默认如规则存在,则入方向规则正常;进一步判断所有入规则中,是否存在放行所有入规则,若有,则提示放行所有入规则;
4.2 分析port所关联的安全组规则设置的一致性
底层规则正确性检查如下:
1.涉及port相关的默认入规则是否添加
具体参考5中的iptables规则分析:进入虚拟机的流量,需要检查的默认规则如下:
-A neutron-openvswi-FORWARD -m physdev --physdev-out tap18fcd66b-80 --physdev-is-bridged -m comment --comment "Direct traffic from the VM interface to the security group chain." -j neutron-openvswi-sg-chain
-A neutron-openvswi-sg-chain -m physdev --physdev-out tap18fcd66b-80 --physdev-is-bridged -m comment --comment "Jump to the VM specific chain." -j neutron-openvswi-i18fcd66b-8
-----经过qbr bridge转发并通过tap进入虚拟机的包
-A neutron-openvswi-i18fcd66b-8 -m state --state RELATED,ESTABLISHED -m comment --comment "Direct packets associated with a known session to the RETURN chain." -j RETURN