Kubernetes NetworkPolicy:打造更安全的容器运行环境

article/2025/11/5 13:39:37

常见的应用可以分为两大类:Job和Service。Job比较简单,就是一个普通的任务,完成之后就退出,一般不需要暴露对外服务的网络监听端口。Service是指长期运行的进程,监听某个网络端口,其他服务可以通过网络连过来。生产环境里,将服务暴露在网络上存在安全风险:必须限制只有信任的用户才能访问服务。我们肯定不希望未授权的用户能调用某个删除数据的接口,把DB里的数据删光。访问控制可以在应用层做,客户端访问服务时,带上身份校验信息,服务端校验客户身份,判断客户是否有权限完成请求的操作,如果有权限,执行客户端请求,否则返回一个拒绝信息。访问控制还可以在网络层做,只允许受信的网络段访问服务。两种方式各有优劣,应用层可以做到更细粒度的权限控制,但需要开发,并且要求能客户端/服务器在通信协议上支持鉴权。网络层鉴权不依赖具体应用,还有一个额外的好处是能防DDoS。今天的主题NetworkPolicy,就是一种网络层的访问控制机制。

传统上,通常使用防火墙实现网络层的访问控制,比如iptables rule,部署应用之后,通过iptables设置运行的ip白名单。在使用Kubernetes之后,由于Pod是动态分配到机器上,而且在运行过程中随时可能迁移到其他机器,显然不适合继续使用手工配置iptables的方式。好在Kubernetes考虑到这个需求,提供了Network Policy,通过Network Policy,我们不仅能限制哪些Pod能被哪些来源访问,甚至还能控制Pod能访问哪些外部服务。Kubernetes中的Network Policy只定义了规范,并没有提供实现,而是把实现留给了网络插件。阿里云容器服务的Terway支持Network Policy,接下来我们基于Terway介绍几个使用Network Policy的场景。

创建Terway集群

首先,我们要创建一个使用Terway的集群,也就是在创建集群的时候,网络插件选Terway。

Screen_Shot_2018_09_14_at_2_38_47_PM

等待一会,集群创建好。这是我刚刚创建好的集群,名字就叫terway

Screen_Shot_2018_09_14_at_2_39_35_PM

为了操作方便,我们直接用命令行的方式,先下载kubeconfig文件,保存到本地的$HOME/.kube/config

场景1: 限制服务只能被带有特定label的应用访问

首先部署一个nginx,两个实例,附带一个service

~ % kubectl run nginx --image=nginx
deployment.apps "nginx" created
~ % kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
nginx-65899c769f-c9s8z   1/1       Running   0          24s
~ % kubectl expose deployment nginx --port=80
service "nginx" exposed
~ % kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   172.19.0.1      <none>        443/TCP   21h
nginx        ClusterIP   172.19.32.113   <none>        80/TCP    20s

现在,起一个新应用,访问刚刚创建nginx service

~ % kubectl run busybox --rm -ti --image=busybox /bin/shIf you don't see a command prompt, try pressing enter.
/ # wget nginx
Connecting to nginx (172.19.32.113:80)
index.html           100% |***************************************************************************************************************************************************|   612  0:00:00 ETA
/ #

看上去没问题,网络是通的。接下来我们设置一个Network Policy,只允许带有label access=true的应用访问nginx,其他都不行。开一个新终端

~ % cat policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:name: access-nginx
spec:podSelector:matchLabels:run: nginxingress:- from:- podSelector:matchLabels:access: "true"
~ % kubectl apply -f policy.yaml
networkpolicy.networking.k8s.io "access-nginx" created

回到运行busybox的终端,再执行一次wget nginx

/ # wget nginx
Connecting to nginx (172.19.32.113:80)^C
/ #

可以看到,在设置完Policy之后,之前启动的busybox已经不能访问nginx了。我们重新启动一个带有label access=true的busybox

~ % kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ # wget nginx
Connecting to nginx (172.19.32.113:80)
index.html           100% |***************************************************************************************************************************************************|   612  0:00:00 ETA
/ #

成功!

场景2: 限制能够访问暴露了公网SLB服务的来源IP

给上个场景中的nginx再创建一个LoadBalance类型的service,LoadBalance类型的service会创建一个SLB

~ % cat nginx-service.yaml
apiVersion: v1
kind: Service
metadata:labels:run: nginxname: nginx-slb
spec:externalTrafficPolicy: Localports:- port: 80protocol: TCPtargetPort: 80selector:run: nginxtype: LoadBalancer
~ % kubectl apply -f nginx-service.yaml
service "nginx-slb" created
~ % kubectl get svc nginx-slb
NAME        TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
nginx-slb   LoadBalancer   172.19.89.136   47.95.180.200   80:31967/TCP   17s

我们创建了LoadBalance类型的service,SLB的IP是 47.95.180.200,先从本地请求一下试试:

~ % wget 47.95.180.200
--2018-09-14 08:07:23--  http://47.95.180.200/
Connecting to 47.95.180.200:80... ^C
~ %

网络不通,因为刚才我们设置了nginx只允许带有label access=true的应用访问,现在是我们从外部访问Kubernetes,根本不是Pod,更不要说设置label了。怎么办?

方案是修改之前创建的Network Policy,增加一个允许访问的来源IP段。把自己本地的IP地址加到白名单里去。先拿到自己的IP地址

~ % curl myip.ipip.net
当前 IP:1.2.3.4  来自于:中国 浙江 #我的实际IP不是这个,根据自己的实际情况处理。

然后编辑policy.yaml,把IP地址加进去。有些网络的出口IP有多个,所以这里加上了一个/24的段。100.64.0.0/10必须要带上,SLB健康检查地址在这个段里,不加上的话SLB健康检查会出错。

~ % cat policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:name: access-nginx
spec:podSelector:matchLabels:run: nginxingress:- from:- podSelector:matchLabels:access: "true"- ipBlock:cidr: 100.64.0.0/10- ipBlock:cidr: 1.2.3.0/24
~ % kubectl apply -f policy.yaml
networkpolicy.networking.k8s.io "access-nginx" configured

好了,再访问一次

~ % wget 47.95.180.200
--2018-09-14 08:15:03--  http://47.95.180.200/
Connecting to 47.95.180.200:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 612 [text/html]
Saving to: 'index.html'index.html                                       100%[=========================================================================================================>]     612  --.-KB/s    in 0s2018-09-14 08:15:03 (67.6 MB/s) - 'index.html' saved [612/612]

网络又通了,完美!

场景3: 限制一个Pod只能访问www.aliyun.com

除了限制当前应用能被谁访问,有时候还要限制应用能访问谁,有时候我们要运行第三方应用,不希望这些应用访问到不该访问的网络。通过Network Policy,也能实现这个需求。

Network Policy只能通过IP地址配置规则,首先我们通过dig获取www.aliyun.com的地址

~ % dig +short www.aliyun.com
www-jp-de-intl-adns.aliyun.com.
www-jp-de-intl-adns.aliyun.com.gds.alibabadns.com.
v6wagbridge.aliyun.com.
v6wagbridge.aliyun.com.gds.alibabadns.com.
140.205.34.3
106.11.93.21
140.205.32.4
140.205.230.13

这样就拿到了域名解析到的IP列表。然后编写如下的Network Policy规则:

~ % cat busybox-policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:name: busybox-policy
spec:podSelector:matchLabels:run: busyboxegress:- to:- ipBlock:cidr: 140.205.230.13/32- ipBlock:cidr: 140.205.34.3/32- ipBlock:cidr: 106.11.93.21/32- ipBlock:cidr: 140.205.32.4/32- to:- ipBlock:cidr: 0.0.0.0/0ports:- protocol: UDPport: 53~ % kubectl apply -f busybox-policy.yaml
networkpolicy.networking.k8s.io "busybox-policy" configured

在这个规则里,我们配置了egress规则,也就是出网规则,限制应用对外访问。允许UDP请求,否则没法做DNS解析。

验证一下

~ % kubectl run busybox --rm -ti --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ # wget www.aliyun.com
Connecting to www.aliyun.com (106.11.93.21:80)
Connecting to www.aliyun.com (140.205.230.13:443)
wget: note: TLS certificate validation not implemented
index.html           100% |***************************************************************************************************************************************************|  526k  0:00:00 ETA
/ #

http://chatgpt.dhexx.cn/article/0S6dKZM6.shtml

相关文章

Drupal远程代码执行漏洞(CVE-2018-7600)

目录 一. 漏洞原理 二. 影响版本 三. 漏洞环境搭建 四. 漏洞复现 一. 漏洞原理 Drupal是一个开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;全球超过100万个网站&#xff08;包括政府&#xff0c;电子零售&#xff0c;企业组织&#xff0c;金融机构等&#xff0…

记一次从盲SSRF到RCE

公粽号&#xff1a;黒掌 一个专注于分享网络安全、黑客圈热点、黑客工具技术区博主&#xff01; 一 前言 发现此漏洞的漏洞赏金计划不允许公开披露&#xff0c;因此我不会直接使用涉及的系统名称。该项目是发布在Hackerone时间最长漏洞奖金最大的项目之一, Hackerone上有很多关…

002.光流传感器(ADNS0380版)使用说明

先放广告&#xff0c;以下是光流传感器购买地址&#xff08;全网最低价并且唯一提供代码支持的&#xff09;&#xff1a; https://item.taobao.com/item.htm?spma230r.1.14.63.j2eDn3&id541014211123&ns1&abbucket12#detail 如果模块直接使用在APM飞控上请看下文标…

003.关于光流传感器(ADNS3080)调焦问题

关于光流传感器使用官方网址如下&#xff1a; http://ardupilot.org/copter/docs/common-mouse-based-optical-flow-sensor-adns3080.html 微信公众号&#xff1a;嵌入式大玩家 更多精彩文章我将第一时间在微信公众号里面分享&#xff0c;如果不想错过,可以关注我的微信公众号。…

腾讯笔试题——逆序对

这题花了我非常多时间&#xff0c;ac率从10&#xff05; --> 50&#xff05; --> 60&#xff05; --> 70&#xff05; --> 80&#xff05; --> 100&#xff05; &#xff0c;被这题疯狂支配几个小时&#xff01; 最关键没有详细的题解可以参考&#xff0c;大数据…

2020秋招腾讯后台笔试题(一)

点击上方蓝字设为星标 下面开始今天的学习&#xff5e; 这是2020届腾讯秋招的笔试题&#xff0c;其实就是19年九月份的题目&#xff0c;总共五道题&#xff0c;这篇文章写说两道题&#xff0c;都是有关于栈的应用的 01 压缩算法 小Q想要给他的朋友发送一个神秘字符串&#xff0…

腾讯笔试-1

1、什么是运维&#xff1f;什么是游戏运维&#xff1f;1&#xff09;运维是指大型组织已经建立好的网络软硬件的维护&#xff0c;就是要保证业务的上线与运作的正常&#xff0c;在他运转的过程中&#xff0c;对他进行维护&#xff0c;他集合了网络、系统、数据库、开发、安全、…

腾讯 C++ 笔试/面试题及答案

星标/置顶 公众号&#x1f447;&#xff0c;硬核文章第一时间送达&#xff01; 链接 | https://zhuanlan.zhihu.com/p/274473971 题很多&#xff0c;先上题后上答案&#xff0c;便于大家思考 问题点&#xff1a; 1、C和C的特点与区别&#xff1f; 2、C的多态 3、虚函数实现 4、…

腾讯2020校园招聘笔试

输入1&#xff1a; 2 2 1 1 1 1 输出1&#xff1a; 0 输入2&#xff1a; 2 2 1 2 2 1 输出2&#xff1a; 2 import java.util.Scanner; public class Main { public static void main(String[] args) {// TODO Auto-generated method stubScanner scnew Scanner(Syste…

腾讯笔试题20210321

一、链表树 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言 2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言 524288K 64bit IO Format: %lld 题目描述 在牛牛所在的世界&#xff0c;链表是一种二叉树。 这是牛牛第一次见到链表树&#xff0c;他感到十分好奇&a…

腾讯2021批笔试题解

总结&#xff1a;一套算是正常的笔试…算是让大家有点思考了…都没那么一眼秒&#xff08;除了强烈谴责某T5最短路板子。我还差点没看到这题hhh&#xff08;&#xff08; &#xff08;另一套题的T5&#xff09; T5 题目大意&#xff1a;给出n个红球&#xff0c;n个黑球&#x…

腾讯笔试题精选一

1.32位机上根据下面的代码&#xff0c;问哪些说法是正确的&#xff1f;&#xff08;&#xff09; signed char a 0xe0 unsigned int b a; unsigned char c a; A. a>0 && c>0 为真 B.a c 为真 C.b的十六进制表示是&#xff1a;0xfffffe0 D.上面都不对 sig…

腾讯笔试题_20220424

前言 笔试一共五道编程题&#xff0c;满分是100分&#xff0c;时间是两个小时&#xff0c;可以跳题&#xff0c;使用的平台是牛客网&#xff0c;允许跳出界面使用本地IDE。 题目一&#xff1a;构建数字 给定n个长度均为m的数字字符串&#xff0c;从上往下构建成m个新的数&am…

笔试面试(1)腾讯2014校园招聘软件开发类笔试试题

把基本经典的书籍认真看看,那些笔试面试的都不是什么问题。但是,专门的突击和训练还是很有必要的。 好的offer是可以通过充分的准备刷到的。 我们就从各大公司的套题开始刷起吧,中间再穿插一些专题。 今天先看看腾讯的2014年校招的软开笔试题。 考试时长:120分钟 一 不定项…

腾讯近三年软件测试工程师面试笔试题目精选(包含答案)

目录 1、什么是兼容性测试?兼容性测试侧重哪些方面? 2、我现在有个程序&#xff0c;发现在 Windows 上运行得很慢&#xff0c;怎么判别是程序存在问题 还是软硬件系统存在问题? 3、测试的策略有哪些? 4、正交表测试用例设计方法的特点是什么? 5、描述使用 bugzilla 缺…

Dev ChartControl 显示设置百分比

**Dev ChartControl 显示设置百分比**//Y轴设置成百分数显示((XYDiagram)Chart.Diagram).AxisY.Label.TextPattern "{V:0%}";//显示的值为百分数 for (int j 0; j < Chart.Series.Count; j){Series march Chart.Series[j];march.CrosshairLabel…

DevExpress——ChartControl知多少(C#)

目前在做的这个项目后端是使用.NET框架在做,前端是借助DevExpress框架做开发,由于是基于Winform的页面实现,于是DevExpress提供了全套的Winform的解决方案,弥补了Winform本身的工具箱不全且不再维护的弊端。DevExpress提供的表图控件叫做ChartControl,在其上面可以完成图表…

Dev中的ChartControl的Y轴显示单位

1.点击Y轴,打开属性 2.找到Title属性,设置其中的 Alignment(单位文本显示的位置) Font(文本字体大小) Text(文本内容) TextColor(文本颜色) Visibility(可见性) 设置完成后即可在图中看到设置效果

DEV控件之ChartControl用法 z

一、总体概述 这个控件包含3层&#xff0c;最外面的chartControl层、中间的XYDiagram层、最里面的Series层。功能非常强大&#xff0c;但同时使用起来也相对复杂&#xff0c;需要各个层之间相互协调设置才能达到自己想要的效果。 二、chartControl层 像DEV的其它控件一样&#…