跳转到: 导航, 搜索

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 |              |
 +-------------+-----------+---------+-------------+--------------+

如果您正在使用安全组引用,建议您测试您的模板,以确保生成的网络规则符合预期。

联系方式 / 参考文献