Kubernetes-保障集群内节点和网络安全

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 13.1.在pod中使用宿主节点的Linux命名空间13.1.1.在pod中使用宿主节点的网络命名空间   在pod的yaml文件中就设置spec.hostNetwork: true    这个时候pod使用宿主机的网络,如果设置了端口,则使用宿主机的端口。

13.1.在pod中使用宿主节点的Linux命名空间
13.1.1.在pod中使用宿主节点的网络命名空间
  在pod的yaml文件中就设置spec.hostNetwork: true

   这个时候pod使用宿主机的网络,如果设置了端口,则使用宿主机的端口。

apiVersion: v1
kind: pod
metadata:
    name: pod-host-yaohong
spec:
    hostNetwork: true  //使用宿主节点的网络命名空间
    containers: 
    - image: luksa/kubia
      command: ["/bin/sleep", "9999"]

13.1.2.绑定宿主节点上的端口而不使用宿主节点的网络命名空间
  在pod的yaml文件中就设置spec.containers.ports字段来设置
   在ports字段中可以使用
  containerPorts设置通过pod 的ip访问的端口
  container.hostPort设置通过所在节点的端口访问

apiVersion: v1
kind: pod
metadata:
    name: kubia-hostport-yaohong
spec:
    containers: 
    - image: luksa/kubia
    - name: kubia
      ports:
      - containerport: 8080 //该容器通过pod IP访问该端口
        hostport: 9000  //该容器可以通过它所在节点9000端口访问
        protocol: Tcp

13.1.3.使用宿主节点的PID与IPC
   PID是进程ID,PPID是父进程ID。

  在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方法。

apiVersion: v1
kind: pod
metadata:
    name: pod-with-host-pid-and-ipc-yaohong
spec:
    hostPID: true //你希望这个pod使用宿主节点的PID命名空间
    hostIPC: true //你希望pod使用宿主节点的IPC命名空间
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]

13.2.配置节点的安全上下文
13.2.1.使用指定用户运行容器
  查看某个pod运行的用户

$ kubectl -n kube-system exec coredns-7b8dbb87dd-6ll7z id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)

  容器的运行用户再DockerFile中指定,如果没有指定则为root

  指定pod的运行的用户方法如下

apiVersion: v1
kind: pod
metadata:
    name: pod-as-user
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        runAsUser: 405   //你需要指定的用户ID,而不是用户名

13.2.2.阻止容器以root用户运行
  runAsNonRoot来设置

apiVersion: v1
kind: pod
metadata:
    name: pod-as-user
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        runAsNonRoot: true   //这个容器只允许以非root用户运行

13.2.3.使用特权模式运行pod
  为了获得宿主机内核完整的权限,该pod需要在特权模式下运行。需要添加privileged参数为true。

apiVersion: v1
kind: pod
metadata:
    name: pod-as-privileged
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        privileged: true   //这个容器将在特权模式下运行

13.2.4.为容器单独添加内核功能

apiVersion: v1
kind: pod
metadata:
    name: pod-as-capability
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        capabilities:    //该参数用于pod添加或者禁用某项内核功能
          add:
          - SYS_TIME      //添加修改系统时间参数

13.2.5.在容器中禁止使用内核功能

apiVersion: v1
kind: pod
metadata:
    name: pod-as-capability
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        capabilities:    //该参数用于pod添加或者禁用某项内核功能
          drop:
          - CHOWN      //禁用容器修改文件的所有者

13.2.6.阻止对容器根文件系统的写入
  securityContext.readyOnlyFilesystem设置为true来实现阻止对容器根文件系统的写入。

apiVersion: v1
kind: pod
metadata:
    name: pod-with-readonly-filesystem
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
         readyOnlyFilesystem: true  //这个容器的根文件系统不允许写入
      volumeMounts:
      - name: my-volume
        mountPath: /volume    //volume写入是允许的,因为这个目录挂载一个存储卷
        readOnly: false

13.3.限制pod使用安全相关的特性
13.3.1.PodSecurityPolicy资源介绍
  PodSecurityPolicy是一种集群级别(无命名空间)的资源,它定义了用户能否在pod中使用各种安全相关的特性。

13.3.2.了解runAsUser、fsGroups和supplementalGroup策略

runAsUser:
  runle: MustRunAs
  ranges:
  - min: 2             //添加一个max=min的range,来指定一个ID为2的user
    max: 2
  fsGroup:
    rule: MustRunAs
    ranges:
    - min: 2
      max: 10         //添加多个区间id的限制,为2-10 或者20-30
    - min: 20
      max: 30 
  supplementalGroups:
    rule: MustRunAs
    ranges:
    - min: 2
      max: 10
    - min: 20
      max: 30

13.3.3.配置允许、默认添加、禁止使用的内核功能
  三个字段会影响容器的使用

  allowedCapabilities:指定容器可以添加的内核功能
  defaultAddCapabilities:为所有容器添加的内核功能
  requiredDropCapabilities:禁止容器中的内核功能

apiVersion: v1
kind: PodSecurityPolicy
spec:
  allowedCapabilities:
  - SYS_TIME                 //允许容器添加SYS_time功能
  defaultAddCapabilities:
  - CHOWN                    //为每个容器自动添加CHOWN功能
  requiredDropCapabilities:
  - SYS_ADMIN                //要求容器禁用SYS_ADMIN和SYS_MODULE功能
13.4.隔离pod网络

13.4.1.在一个命名空间中使用网络隔离
  podSelector进行对一个命名空间下的pod进行隔离

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: postgres-netpolicy
spec:
  podSelector:         //这个策略确保了对具有app=databases标签的pod的访问安全性
    matchLabels:
      app: database
  ingress:
  - from:
    - podSelector:    //它只允许来自具有app=webserver标签的pod的访问
      matchLabels:
        app: webserver
    ports:
    - port: 5432      //允许对这个端口的访问

13.4.2.在 不同的kubernetes命名空间之间进行网络隔离
  namespaceSelector进行对不同命名空间间进行网络隔离

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: postgres-netpolicy
spec:
  podSelector:         //这个策略确保了对具有app=databases标签的pod的访问安全性
    matchLabels:
      app: database
  ingress:
  - from:
    - namespaceSelector:    //只允许tenant: manning标签的命名空间中运行的pod进行互相访问
      matchLabels:
        tenant: manning   
    ports:
    - port: 5432      //允许对这个端口的访问

13.4.3.使用CIDR网络隔离

ingress:
  - from:
    - ipBlock:
        cidr: 192.168.1.0/24    //指明允许访问的ip段

13.4.4.限制pod对外访问流量
  使用egress进行限制

spec:
  podSelector:         //这个策略确保了对具有app=databases标签的pod的访问安全性
    matchLabels:
      app: database
  egress:              //限制pod的出网流量
  - to:
    - podSelector:
        matchLables:   //database的pod只能与有app: webserver的pod进行通信
          app: webserver

  

13.1.在pod中使用宿主节点的Linux命名空间
13.1.1.在pod中使用宿主节点的网络命名空间
  在pod的yaml文件中就设置spec.hostNetwork: true

   这个时候pod使用宿主机的网络,如果设置了端口,则使用宿主机的端口。

apiVersion: v1
kind: pod
metadata:
    name: pod-host-yaohong
spec:
    hostNetwork: true  //使用宿主节点的网络命名空间
    containers: 
    - image: luksa/kubia
      command: ["/bin/sleep", "9999"]

13.1.2.绑定宿主节点上的端口而不使用宿主节点的网络命名空间
  在pod的yaml文件中就设置spec.containers.ports字段来设置

   在ports字段中可以使用

  containerPorts设置通过pod 的ip访问的端口

  container.hostPort设置通过所在节点的端口访问

apiVersion: v1
kind: pod
metadata:
    name: kubia-hostport-yaohong
spec:
    containers: 
    - image: luksa/kubia
    - name: kubia
      ports:
      - containerport: 8080 //该容器通过pod IP访问该端口
        hostport: 9000  //该容器可以通过它所在节点9000端口访问
        protocol: Tcp

13.1.3.使用宿主节点的PID与IPC
   PID是进程ID,PPID是父进程ID。

  在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方法。

apiVersion: v1
kind: pod
metadata:
    name: pod-with-host-pid-and-ipc-yaohong
spec:
    hostPID: true //你希望这个pod使用宿主节点的PID命名空间
    hostIPC: true //你希望pod使用宿主节点的IPC命名空间
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]

 

13.2.配置节点的安全上下文
13.2.1.使用指定用户运行容器
  查看某个pod运行的用户

$ kubectl -n kube-system exec coredns-7b8dbb87dd-6ll7z id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)

  容器的运行用户再DockerFile中指定,如果没有指定则为root

  指定pod的运行的用户方法如下

apiVersion: v1
kind: pod
metadata:
    name: pod-as-user
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        runAsUser: 405   //你需要指定的用户ID,而不是用户名

13.2.2.阻止容器以root用户运行
  runAsNonRoot来设置

apiVersion: v1
kind: pod
metadata:
    name: pod-as-user
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        runAsNonRoot: true   //这个容器只允许以非root用户运行

13.2.3.使用特权模式运行pod
  为了获得宿主机内核完整的权限,该pod需要在特权模式下运行。需要添加privileged参数为true。

apiVersion: v1
kind: pod
metadata:
    name: pod-as-privileged
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        privileged: true   //这个容器将在特权模式下运行

13.2.4.为容器单独添加内核功能

apiVersion: v1
kind: pod
metadata:
    name: pod-as-capability
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        capabilities:    //该参数用于pod添加或者禁用某项内核功能
          add:
          - SYS_TIME      //添加修改系统时间参数

13.2.5.在容器中禁止使用内核功能

apiVersion: v1
kind: pod
metadata:
    name: pod-as-capability
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
        capabilities:    //该参数用于pod添加或者禁用某项内核功能
          drop:
          - CHOWN      //禁用容器修改文件的所有者

13.2.6.阻止对容器根文件系统的写入
  securityContext.readyOnlyFilesystem设置为true来实现阻止对容器根文件系统的写入。

apiVersion: v1
kind: pod
metadata:
    name: pod-with-readonly-filesystem
spec:
    containers:
    - name: main
      image: alpine
      command: ["/bin/sleep", "99999"]
      securityContext:
         readyOnlyFilesystem: true  //这个容器的根文件系统不允许写入
      volumeMounts:
      - name: my-volume
        mountPath: /volume    //volume写入是允许的,因为这个目录挂载一个存储卷
        readOnly: false

13.3.限制pod使用安全相关的特性
13.3.1.PodSecurityPolicy资源介绍
  PodSecurityPolicy是一种集群级别(无命名空间)的资源,它定义了用户能否在pod中使用各种安全相关的特性。

13.3.2.了解runAsUser、fsGroups和supplementalGroup策略

runAsUser:
  runle: MustRunAs
  ranges:
  - min: 2             //添加一个max=min的range,来指定一个ID为2的user
    max: 2
  fsGroup:
    rule: MustRunAs
    ranges:
    - min: 2
      max: 10         //添加多个区间id的限制,为2-10 或者20-30
    - min: 20
      max: 30 
  supplementalGroups:
    rule: MustRunAs
    ranges:
    - min: 2
      max: 10
    - min: 20
      max: 30

13.3.3.配置允许、默认添加、禁止使用的内核功能
  三个字段会影响容器的使用

  allowedCapabilities:指定容器可以添加的内核功能
  defaultAddCapabilities:为所有容器添加的内核功能
  requiredDropCapabilities:禁止容器中的内核功能

apiVersion: v1
kind: PodSecurityPolicy
spec:
  allowedCapabilities:
  - SYS_TIME                 //允许容器添加SYS_time功能
  defaultAddCapabilities:
  - CHOWN                    //为每个容器自动添加CHOWN功能
  requiredDropCapabilities:
  - SYS_ADMIN                //要求容器禁用SYS_ADMIN和SYS_MODULE功能

13.4.隔离pod网络
13.4.1.在一个命名空间中使用网络隔离
  podSelector进行对一个命名空间下的pod进行隔离

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: postgres-netpolicy
spec:
  podSelector:         //这个策略确保了对具有app=databases标签的pod的访问安全性
    matchLabels:
      app: database
  ingress:
  - from:
    - podSelector:    //它只允许来自具有app=webserver标签的pod的访问
      matchLabels:
        app: webserver
    ports:
    - port: 5432      //允许对这个端口的访问

13.4.2.在 不同的kubernetes命名空间之间进行网络隔离
  namespaceSelector进行对不同命名空间间进行网络隔离

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: postgres-netpolicy
spec:
  podSelector:         //这个策略确保了对具有app=databases标签的pod的访问安全性
    matchLabels:
      app: database
  ingress:
  - from:
    - namespaceSelector:    //只允许tenant: manning标签的命名空间中运行的pod进行互相访问
      matchLabels:
        tenant: manning   
    ports:
    - port: 5432      //允许对这个端口的访问

13.4.3.使用CIDR网络隔离

ingress:
  - from:
    - ipBlock:
        cidr: 192.168.1.0/24    //指明允许访问的ip段

13.4.4.限制pod对外访问流量
  使用egress进行限制

spec:
  podSelector:         //这个策略确保了对具有app=databases标签的pod的访问安全性
    matchLabels:
      app: database
  egress:              //限制pod的出网流量
  - to:
    - podSelector:
        matchLables:   //database的pod只能与有app: webserver的pod进行通信
          app: webserver

  

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
15天前
|
安全 算法 网络安全
网络安全与信息安全:构建数字世界的坚固防线在数字化浪潮席卷全球的今天,网络安全与信息安全已成为维系社会秩序、保障个人隐私和企业机密的关键防线。本文旨在深入探讨网络安全漏洞的本质、加密技术的前沿进展以及提升公众安全意识的重要性,通过一系列生动的案例和实用的建议,为读者揭示如何在日益复杂的网络环境中保护自己的数字资产。
本文聚焦于网络安全与信息安全领域的核心议题,包括网络安全漏洞的识别与防御、加密技术的应用与发展,以及公众安全意识的培养策略。通过分析近年来典型的网络安全事件,文章揭示了漏洞产生的深层原因,阐述了加密技术如何作为守护数据安全的利器,并强调了提高全社会网络安全素养的紧迫性。旨在为读者提供一套全面而实用的网络安全知识体系,助力构建更加安全的数字生活环境。
|
4天前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
51 17
|
2天前
|
SQL 安全 算法
网络安全与信息安全:构建数字世界的防线在数字化浪潮席卷全球的今天,网络安全与信息安全已成为维系社会秩序、保障个人隐私与企业机密的重要基石。本文旨在深入探讨网络安全漏洞的本质、加密技术的前沿进展以及提升安全意识的有效策略,为读者揭示数字时代下信息保护的核心要义。
本文聚焦网络安全与信息安全领域,详细剖析了网络安全漏洞的形成机理、常见类型及其潜在危害,强调了及时检测与修复的重要性。同时,文章系统介绍了对称加密、非对称加密及哈希算法等主流加密技术的原理、应用场景及优缺点,展现了加密技术在保障数据安全中的核心地位。此外,针对社会普遍存在的安全意识薄弱问题,提出了一系列切实可行的提升措施,如定期安全培训、强化密码管理、警惕钓鱼攻击等,旨在引导公众树立全面的网络安全观,共同构筑数字世界的安全防线。
|
8天前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
|
1天前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
10 1
|
1天前
|
负载均衡 应用服务中间件 nginx
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
基于Ubuntu-22.04安装K8s-v1.28.2实验(二)使用kube-vip实现集群VIP访问
7 1
|
6天前
|
Kubernetes Cloud Native Ubuntu
云原生之旅:Kubernetes集群搭建与应用部署
【8月更文挑战第65天】本文将带你进入云原生的世界,通过一步步指导如何在本地环境中搭建Kubernetes集群,并部署一个简单的应用。我们将使用Minikube和Docker作为工具,探索云原生技术的魅力所在。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和实践技巧。
|
10天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
|
16天前
|
存储 安全 算法
网络安全与信息安全:构建数字世界的坚固防线在数字化浪潮席卷全球的今天,网络安全与信息安全已成为维系社会秩序、保障个人隐私与企业机密的关键防线。本文旨在深入探讨网络安全漏洞的成因与影响,解析加密技术如何筑起数据安全的屏障,并强调提升公众安全意识的重要性,共同绘制一幅数字时代安全防护的蓝图。
本文聚焦网络安全与信息安全领域,通过剖析网络安全漏洞的多样形态及其背后成因,揭示其对个人、企业乃至国家安全的潜在威胁。随后,详细阐述了加密技术的原理、分类及应用,展现其在保护数据安全方面的核心作用。最后,强调了提升全民网络安全意识的紧迫性,提出具体策略与建议,旨在构建一个更加安全、可靠的数字环境。
|
1天前
|
Kubernetes 容器
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
9 0