Kubernetes集群中的NetworkPolicy能够控制某些外部网站允许或禁止被某些命名空间下的服务访问,但是NetworkPolicy的方式对网络隔离比较粗粒度,对应用安全、业务安全的保护不够到位。您可以使用ASM零安全体系,动态配置授权策略,实现对命名空间下服务访问外部网站进行授权控制,从而降低风险。以demo-frontend命名空间和aliyun.com网站为例,本文介绍如何限制demo-frontend命名空间下的全部服务去访问外部网站aliyun.com。
前提条件
已添加集群到ASM实例。具体操作,请参见添加集群到ASM实例。
已创建demo-frontend命名空间,并为命名空间注入Sidecar代理。具体操作,请参见管理全局命名空间。
步骤一:创建测试服务
在demo-frontend命名空间下创建sleep服务。
使用以下内容,创建sleep.yaml。
执行以下命令,创建sleep服务。
kubectl apply -f sleep.yaml -n demo-frontend
验证测试服务是否注入Sidecar成功。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择
。在容器组页面上方,命名空间选择demo-frontend,单击sleep服务的容器组名称。
在容器页签下可以看到istio-proxy容器,说明sleep服务注入Sidecar成功。
步骤二:创建出口网关
服务网格内的服务访问网格外的网站时,可以通过出口网关管控流量。配置出口网关的授权策略后,还可以设置条件来控制是否允许访问外部网站。本文设置出口网关的名称为egressgateway。具体操作,请参见创建出口网关。
步骤三:设置外部服务的访问策略
默认对外部服务的访问策略为允许访问全部外部服务。为了实现对特定的外部网站进行访问控制,您需要设置外部服务访问策略为REGISTRY_ONLY,未注册为ServiceEntry的外部服务将无法被服务网格中的服务访问。
设置外部服务的访问策略。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在全局页签,单击外部服务访问策略,配置对外部服务的访问策略OutboundTrafficPolicy为REGISTRY_ONLY,然后单击更新设置。
将外部服务注册到ServiceEntry中。
在网格详情页面左侧导航栏,选择 ,然后在右侧页面,单击使用YAML创建。
设置命名空间为istio-system,将以下内容复制到文本框中,单击创建。
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: aliyuncom-ext namespace: istio-system spec: hosts: - www.aliyun.com location: MESH_EXTERNAL ports: - name: http number: 80 protocol: HTTP - name: tls number: 443 protocol: TLS resolution: DNS
步骤四:创建流量策略
创建网关规则、目标规则和虚拟服务,使demo-frontend命名空间下的流量路由到出口网关,再由出口网关路由到外部网站。
使用以下YAML,在istio-system命名空间创建网关规则。具体操作,请参见管理网关规则。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: istio-egressgateway namespace: istio-system spec: selector: istio: egressgateway servers: - port: number: 80 name: http protocol: HTTPS tls: mode: ISTIO_MUTUAL hosts: - '*'
mode
设置为ISTIO_MUTUAL
,表示启用双向TLS服务认证,即网格内服务访问外部网站需要TLS服务认证。使用以下YAML,在demo-frontend命名空间创建目标规则。具体操作,请管理目标规则。
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: target-egress-gateway namespace: demo-frontend spec: host: istio-egressgateway.istio-system.svc.cluster.local subsets: - name: target-egress-gateway-mTLS trafficPolicy: loadBalancer: simple: ROUND_ROBIN tls: mode: ISTIO_MUTUAL
mode
设置为ISTIO_MUTUAL
,表示启用双向TLS服务认证,即外部网站访问网格内服务需要TLS服务认证。使用以下内容,在demo-frontend命名空间创建虚拟服务。具体操作,请参见管理虚拟服务。
http
设置了两条匹配规则:第一条设置
gateways
为mesh
,表示作用范围为demo-frontend命名空间下的Sidecar代理,将demo-frontend命名空间下的流量路由到出口网关。第二条设置
gateways
为istio-system/istio-egressgateway
,表示将出口网关的流量路由到注册的外部服务。
步骤五:创建授权策略
在demo-frontend命名空间下创建授权策略,作用在出口网关egressgateway上,拒绝来自demo-frontend命名空间的访问。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 ,然后单击创建。
在创建页面,配置相关信息,然后单击创建。
配置项
说明
名称
输入授权策略的名称。
策略类型
设置为拒绝。
ASM网关
在网关生效页签,设置ASM网关为egressgateway。
请求匹配规则
在添加请求来源区域,打开命名空间(Namespaces)开关,设置值为demo-frontend。
步骤六:验证限制demo-frontend命名空间中的服务访问外部网站是否成功
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择
。在容器组页面上方,命名空间选择demo-frontend,然后在操作列,单击sleep容器对应的 。
执行以下命令,访问外部网站aliyun.com。
curl -I http://www.aliyun.com
预期输出:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 12 Oct 2023 07:14:09 GMT server: envoy x-envoy-upstream-service-time: 4
返回
403
错误,说明demo-frontend命名空间下的服务访问外部网站aliyun.com失败。限制demo-frontend命名空间中的服务访问外部网站成功。