OSSN/OSSN-0011
包含无效引用的 Heat 模板可能导致意外的网络访问
总结
编排模板可以创建安全组来定义网络访问规则。在创建这些规则时,有可能创建一个规则,允许来自另一个安全组的实例的入站网络访问。如果一个规则引用了一个不存在的安全组,则可能导致允许对该规则的所有主机进行入站访问。
受影响的服务 / 软件
Heat, nova-network, Havana
讨论
在 CloudFormation 兼容格式 (CFN) 编排模板中定义 AWS::EC2::SecurityGroup 类型的安全组时,可以使用对其他安全组的引用作为入站规则的来源。当这些规则在 OpenStack Havana 版本中由 Heat 评估时,对不存在的安全组的引用将被静默忽略。这将导致该规则使用 CidrIp 属性 0.0.0.0/0。这将允许任何主机对受影响的规则进行入站访问。这具有允许对实例进行意外网络访问的效果。
此问题仅在使用 Nova 进行网络配置 (nova-network) 时才会发生。Neutron 网络服务不受此问题影响。
OpenStack Icehouse 版本不受此问题影响。在 Icehouse 版本中,Heat 将检查模板中是否引用了不存在的安全组,并返回错误,导致安全组的创建失败。
建议的操作
如果您在 OpenStack Havana 版本中使用 Heat 和 Nova 进行网络配置 (nova-network),则应检查您的编排模板,以确保入站规则中对安全组的所有引用都是有效的。具体来说,您应该查看模板中 SourceSecurityGroupName 属性的使用情况,以确保所有引用的安全组都存在。
您应该特别注意的安全组引用不当使用情况是,在一个模板中定义多个安全组并在它们之间使用引用。在这种情况下,您需要确保使用 Ref 固有函数来指示您正在引用在同一模板中定义的安全组。以下是一个包含有效安全组引用的模板示例
"WikiDatabaseSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Enable HTTP access plus SSH access",
"SecurityGroupIngress" : [
{
"IpProtocol" : "icmp",
"FromPort" : "-1",
"ToPort" : "-1",
"CidrIp" : "10.1.1.0/24"
},
{
"IpProtocol" : "tcp",
"FromPort" : "80",
"ToPort" : "80",
"CidrIp" : "10.1.1.0/24"
},
{
"IpProtocol" : "tcp",
"FromPort" : "22",
"ToPort" : "22",
"CidrIp" : "10.1.1.0/24"
},
{
"IpProtocol" : "tcp",
"FromPort" : "3306",
"ToPort" : "3306",
"SourceSecurityGroupName" : {
"Ref": "WebServerSecurityGroup"
}
}
]
}
},
"WebServerSecurityGroup" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Enable HTTP access plus SSH access",
"SecurityGroupIngress" : [
{
"IpProtocol" : "icmp",
"FromPort" : "-1",
"ToPort" : "-1",
"CidrIp" : "10.1.1.0/24"
},
{
"IpProtocol" : "tcp",
"FromPort" : "80",
"ToPort" : "80",
"CidrIp" : "10.1.1.0/24"
},
{
"IpProtocol" : "tcp",
"FromPort" : "22",
"ToPort" : "22",
"CidrIp" : "10.1.1.0/24"
}
]
}
},
以下是一个对同一模板中定义的的安全组的无效引用示例
{
"IpProtocol" : "tcp",
"FromPort" : "3306",
"ToPort" : "3306",
"SourceSecurityGroupName" : "WebServerSecurityGroup" #INCORRECT!
}
上述无效引用将导致允许所有主机在端口 3306 上进行入站网络连接
IP Protocol | From Port | To Port | IP Range | Source Group | +-------------+-----------+---------+-------------+--------------+ | icmp | -1 | -1 | 10.1.1.0/24 | | | tcp | 80 | 80 | 10.1.1.0/24 | | | tcp | 22 | 22 | 10.1.1.0/24 | | | tcp | 3306 | 3306 | 0.0.0.0/0 | | +-------------+-----------+---------+-------------+--------------+
如果您正在使用安全组引用,建议您测试您的模板,以确保生成的网络规则符合预期。
联系方式 / 参考文献
- 作者:Nathan Kinder, Red Hat
- 此 OSSN:https://wiki.openstack.org/wiki/OSSN/OSSN-0011
- 原始 LaunchPad Bug:https://bugs.launchpad.net/heat/+bug/1291091
- OpenStack Security ML:openstack-security@lists.openstack.org
- OpenStack Security Group:https://launchpad.net/~openstack-ossg