美文网首页
第16章 网络安全组加固 对与错

第16章 网络安全组加固 对与错

作者: 漫长的白日梦技术大佬 | 来源:发表于2022-09-16 12:49 被阅读0次

    阿里云容器产品K8s版本(ACK)是基于阿里云IaaS层云资源创建的。IaaS层资源包括云服务器(ECS)、专有网络(VPC)、弹性伸缩(ESS)等。以这些资源为基础,ACK产品实现了K8s集群的节点、网络、自动伸缩等组件或功能。

    一般来说,用户对ACK产品有很高的管理权限,包括集群扩容、创建服务等。同时,用户可以绕过ACK产品,直接修改集群底层云资源。如释放ECS、删除SLB。如果不清楚浙西诶需改可能产生的影响,则既有可能损坏集群功能。

    本章以ACK产品中安全组的配置管理为核心,深入讨论安全组在集群中扮演的角色、在网络链路中所处的位置,以及非法修改安全组会产生的各类问题。本章内容是用于专有集群和托管集群。

    16.1 安全组扮演的角色

    阿里云ACK产品有两种基本形态,专有集群和托管集群。这两种形态的最大差别,就是用户对Master的管理权限。对安全组来说,两种形态的集群略有差别。

    专有集群使用资源编排(ROS)模板搭建集群的主框架。其中专有网络是整个集群运行的局域网,云服务器构成集群的节点,安全组构成集群节点的出入防火墙。集群使用弹性伸缩实现动态扩缩容功能,NAT网关作为集群的网络出口,SLB和EIP实现集群API Server的入口。

    托管集群与专有集群类似,同样使用资源编排模板搭建集群的主框架。在托管集群中,云服务器、专有网络、SLB、EIP、安全组等扮演的角色专有集群类似。与专有集群不同的是,托管集群的Master系统组件以Pod的形式运行在管控集群里,这就是K8s管理K8s的概念。

    因为托管集群在用户的VPC里,而管控集群在阿里云管控账号的VPC里,所以这样的架构需要解决的一个核心问题,就是跨账号、跨VPC通信问题。

    为了解决这个问题,此处用到类似传送门的技术。托管集群会在集群VPC里创建两个弹性网卡,这两个弹性网卡可以像普通云服务器一样通信。但是这两个网卡被挂载到托管集群的API Server Pod上,这就解决了跨VPC通信问题。

    16.2 安全组与集群网络

    上一节总结了两种形态ACK集群的组成原理,以及安全组在集群中所处的位置。简单来说,安全组就是管理网络出入流量的防火墙。

    安全组规则对出方向的数据包基于目的地址来做限制,而对入方向的数据包则基于源地址来做限制。ACK集群内部的通信对象包括集群节点和部署在集群上的容器组,而外部通信对象可以是任意外网地址。

    云服务器没有太多特殊的地方,只是简单地链接在VPC局域网内的ECS上,而容器组Pod链接在基于Veth网口对。虚拟网桥、VPC路由表所搭建的和VPC相互独立的虚拟三层网络上。

    总结一下,有两种通信实体和三种通信方式,共6种通信场景,如下表所示。

    钱三种场景如图16-1所示,以节点为实体通信之一。第一种场景是接线与其上的Pod通信,这种场景和安全组无关;第二种场景是节点与其他节点或Pod通信,与安全组无关,在这种场景下,因为节点在相同VPC下,且Pod访问Pod网段以外的地址都会经过SNAT;第三种场景是节点与VPC之外的实体通信,这种情况下出入方向通信都与安全组有关。

    另外三种场景如图16-2所示,以容器组Pod为通信实体之一。第四种场景是Pod在节点内部与Pod和ECS通信,这种场景和安全组无关;第五种场景是Pod跨节点与其他节点或Pod通信,这种场景下,如果源地址和目的地址都是Pod,则需要安全组入规则方向,其他情况与场景二(节点与其他节点或Pod通信,与安全组无关)类似;第六种场景是Pod与VPC之外的实体通信,这与场景三(节点与VPC之外的实体通信,这种情况下出入方向通信都与安全组有关)类似。

    虽然以上场景有些复杂,但是经过总结后发现,与安全组有关的通信,从根本上说只有两种情况:一种是Pod之间跨节点通信,另一种是节点或Pod与外网互访。这里的外网可以是公网,也可以是集群互联互通的IDC(Internet Data Center,互联网数据心)或其他VPC。

    16.3 怎么管理安全组规则

    配置ACK集群的安全组,只需考虑两种情况,一种是Pod之间跨节点通信,一种是集群和外网互访。

    ACK集群在创建之初,默认添加了Pod网段放行入规则,与此同时,保持出规则对所有地址全开放。这使得Pod之间互访没有问题,同时Pod或节点可以随意访问集群以外的网络。

    而在默认规则的基础上对集群安全组的配置管理,其实就是在不影响集群功能的情况下,收紧Pod或节点访问外网的能力,和放松集群集群以外网络对集群的访问限制。

    分三个场景分析,怎样在默认规则的基础上进一步管理集群的安全组规则。

    -限制集群访问外网

    -IDC与集群互访

    -使用新的安全组管理部分节点

    16.3.1 限制集群访问外网

    为了限制集群访问外网的同时不影响集群本身的功能,配置需满足3个条件:

    -不能限制出方向Pod网段

    -不能限制集群访问阿里云云服务器的内网地址段100.64.0.0/10

    -不能限制集群访问一部分阿里云云服务的公网地址,例如:

    ecs.cn-hangzhou.aliyuncs.com

    第1、2挑是为了群宝集群可以通过内网访问DNS或者OSS这类服务,第3条是因为集群在实现部分功能的时候,会通过公网地址访问云服务。

    16.3.2 IDC与集群互访

    对于IDC与集群互访这种场景,假设IDC和集群VPC之间已经通过底层的网络产品打通,IDC内部机器和集群节点或者Pod之间,可以通过地址找到对方。那么在这种情况下,只需要在确保出方向规则放行IDC机器网段的情况下,对入规则配置放行IDC机器地址段即可。

    16.3.3 使用新的安全组管理节点

    有时候,用户需要新增一些安全组来管理集群节点。比较典型的用法包括把集群节点同时加入到多个安全组里,以及把集群节点分配给多个安全组管理。

    但是,如果把节点加入到多个安全组里,那么这些安全组会依据优先级,从高到低依次匹配规则,这会给配置管理增加复杂度。而把节点分配给多个安全组管理,则会出现脑裂(partition)问题,需要通过安全组之间授权或者增加规则的方式,确保集群节点之间互通。

    16.4 典型问题与解决方案

    介绍一些典型的与安全组错误配置有关系的问题和解决方案

    16.4.1 使用多个安全组管理集群节点

    托管集群默认把节点ECS和管控ENI(弹性网卡)放在同一个安全组里,根据安全组的特性,这保证了ENI和ECS的网卡之间在VPC网络平面上的互通。如果把节点从集群默认安全组移除并纳入其他安全组的管理中心,就会导致集群管控ENI和节点ECS之间无法通信。

    这个问题导致的现象比较常见的有,使用kubectl exec命令无法进入Pod终端做管理,使用kubectl logs命令无法查看Pod日志等。其中,kubectl exec命令所返回的报错比较清楚,即从API Server连接对应节点10250端口超时,这个端口的监听者就是kubectl。

    [root@]# kubectl exec  -ti -n kube-system nginx-ingress-controller-xxxxxxx-xxxx sh

    Error from server: erroe dialing backend: dial tcp 192.168.0.xxx:10250: i/o timeout

    解决方案有三种:

    -将集群节点重新加入集群创建的安全组

    -让节点所在的安全组和集群创建的安全组之间互相授权

    -在两个安全组里使用规则让节点ECS和管控ENI的地址段互相放行

    16.4.2 限制集群访问公网或运营商级NAT保留地址

    专有或托管集群的系统组件(如cloud controller manager、metrics server、cluster auto scaler等)使用公网地址或运营商级NAT保留地址(100.64.0.0/10)访问阿里云云产品,这些产品包括但不限于负载均衡、弹性伸缩(ESS)、对象存储(OSS)。如果安全组限制了集群访问这些地址,则会导致系统组件功能受损。

    问题常见导致现象为,在创建服务的时候,Cloud Controller Manager无法访问集群节点Metadata并获取Token值。集群节点以及其上的系统组件通过节点绑定的授权角色访问云资源,如访问不到Token,会导致权限问题。另一个是集群无法从阿里云镜像仓库下载容器镜像,导致Pod无法创建。

    报错:failed to pull image...

    此问题的解决方案是,在限制集群出方向的时候,确保运营商级NAT保留地址100.64.0.0/10网段以及阿里云云服务公网地址被放行。其中运营商保留地址比较容易处理,云服务公网地址比较难处理,原因有2个,一个是集群会访问多个云服务地址且这些云服务的公网地址有可能会更改,另一个是这些云服务可能使用DNS负载均衡,所以需要多次解析浙西而服务的URL找出所有IP地址并放行。

    16.4.3 容器组跨节点通信异常

    集群创建的时候,会在安全组添加容器组网段入方向放行规则。有了这个规则,即使容器组网段和VPC网段不一样,容器组在跨节点通信的时候,也不会受到安全组的限制。如果这个默认规则被移除,那么容器组跨节点通信会失败,进而使得多种集群基础功能受损。

    这个问题导致的现象比较常见的是,容器组DNS解析失败、容器组访问集群内部其他服务异常等。在容器组网段规则被移除之后,从磁盘控制器里访问阿里云主页则无法解析域名,telnetCoreDNS的地址不通。地址之所以可以访问,是因为安全组默认方向了所有ICMP数据。

    此问题的解决方案比较简单,就是重新把容器组地址段加入安全组。这类问题的难点在于,其引起的问题非常多,现象千奇百怪,所以从问题的现场定位到容器组跨节点通信,是解决问题的关键一步。

    16.5 总结

    ACK产品安全组配置管理的三个重点,分别是集群的外网控制访问、集群容器组之间跨节点访问,以及集群使用多个安全组管理。

    相关文章

      网友评论

          本文标题:第16章 网络安全组加固 对与错

          本文链接:https://www.haomeiwen.com/subject/cwsjortx.html