云原生技术专题 | 解密2023年云原生的安全优化升级,告别高危漏洞、与数据泄露说“再见”(安全管控篇)

news2024/11/28 0:42:44

背景介绍

2023年,我们见证了科技领域的蓬勃发展,每一次技术革新都为我们带来了广阔的发展前景。作为后端开发者,我们深受其影响,不断迈向未来。
随着数字化浪潮的席卷,各种架构设计理念相互交汇,共同塑造了一个充满竞争和创新的技术时代。微服务、云原生、Serverless、事件驱动、中台、容灾等多样化的架构思想,都在竞相定义未来技术的标准。然而,哪种将成为引领时代的主流趋势,仍是一个未知数。尽管如此,种种迹象表明,云原生的主题正在逐渐深入人心。让我们一起分析和探讨云原生技术和架构安全体系的升级和改良,以期发现新的技术趋势和见解。

云计算的下一站,就是云原生,IT架构的下一站,就是云原生架构

云原生

也许一些读者对云原生的概念仍感到陌生或存有疑问,让我们先来简要介绍一下云原生技术及其架构的主要功能和作用。

云原生是什么

云原生是一种行为方式和设计理念,其本质在于提高云上资源利用率和应用交付效率的行为或方式都可以被归纳为云原生。

云原生的目标

云原生技术帮助组织在公有云、私有云和混合云等新型动态环境中构建和运行可弹性扩展的应用。通过云原生,可以构建容错性强、易于管理和便于监控的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统进行频繁且可预测的重大变更。

在这里,我们用一个图来勾勒一下,从而加深一下大家的对于云原生技术的印象,如下图所示:

云原生的4大基本要素

云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。但是对于声明式API而言,它的作用主要作为功能层面,因此暂时没有把他归并为云原生的基本要素当中。

特别是Kubernetes开启了云原生的序幕,服务网格 Istio 的出现,引领了后 Kubernetes 时代的微服务,serverless 的再次兴起,使得云原生从基础设施层不断向应用架构层挺进,我们正处于一个云原生的新时代。

好的!通过上面的内容相信您已经对云原生及其技术有了一定的了解。不再赘述有关云原生的基础内容,如果您感兴趣,可以阅读相关的云原生官方指南。接下来我们直接进入主题。

云原生的安全探索

Kubernetes被认为是目前最广泛和最重要的开源容器编排系统,主要用于自动部署、扩展和管理容器化应用程序。

然而,Kubernetes集群的安全问题可能非常复杂,并经常被滥用,尤其是由于错误的配置可能带来潜在威胁。因此我们将总结和归纳具体的安全配置,希望可以帮助大家建立更安全的Kubernetes体系,主要集中一下几个方向,如图所示。

K8s Pod安全

Pod是Kubernetes 中最小的可部署单元,由一个或多个容器组成。通常情况下,Pod是网络行为者在利用容器时的初始执行环境。因此,应加固Pod以增加利用难度,并限制成功入侵的影响,接下来我们主要会从一下这几个方面进行入手分析说明。

管控容器访问用户

通常情况下,许多容器服务会以特权的root用户身份运行,这可能导致应用程序在容器内被授予了不必要的特权,从而造成了安全问题以及容器资源被破坏。

解决方案:采用非root容器和无root容器引擎,使用构建的容器,以非root用户身份运行应用程序,可以防止使用root权限执行,从而限制容器受损的影响。

非root容器

容器引擎允许容器以非root用户和非root组成员身份运行应用程序。通常情况下,这种非默认设置是在构建容器镜像的时候配置的,我们采用一个Dockerfile文件进行设定。

非root用户指的是在操作系统中没有超级用户(root)权限的用户。

非root应用的Dockerfile

下面是一个示例 Dockerfile,它演示了以非 root 用户身份运行一个应用的情况。

FROM ubuntu:latest
# 升级和安装 make 工具
RUN apt update && apt install -y make
# 从名为 temp 的文件夹复制源代码,并使用 make 工具构建应用程序。
COPY ./temp /temp
RUN make /temp
# 创建新用户(test)和用户组(teG),然后切换到用户上下文。
RUN useradd test && groupadd teG
USER test:teG
# 设置容器的默认入口
CMD /temp/app
副作用或影响

采用对运行时环境产生重大影响,因此应该对应用程序进行全面测试,以确保其兼容性。

无root容器引擎为容器本身就是支持非root用户进行访问和运行容器应用,与非root相比,少了很多兼容以及权限限制问题,也就是非root用户的影响和副作用问题,本质就是加入了一个权限控制安全层,保护了容器本身不会被root权限进行过严重的破坏,但是由于无root模式,本人并没有进行测试和验证,再次只是基于大家一个方案和考量。

管控容器文件系统

默认情况下,容器被允许在自己的上下文中以无限制的方式执行。这意味着在容器中获得执行权限的网络行为者可以创建文件、下载脚本并修改应用程序。

解决方案:Kubernetes提供了一种方法来锁定容器的文件系统,以减少许多潜在的安全风险。

只读文件系统的部署yml文件
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: app
    name: app
  spec:
    selector:
      matchLabels:
        app: app
    template:
      metadata:
        labels:
          app: app
          name: app
      spec:
        containers:
        - command: ["sleep"]
          args: ["999"]
          image: ubuntu:latest
          name: web
          securityContext:
            readOnlyRootFilesystem: true #使容器的文件系统成为只读
          volumeMounts:
            - mountPath: /writeable/location/file #创建一个可写卷
              name: volName
        volumes:
        - emptyDir: {}
          name: volName

上面的配置实现了一个具有可写目录的不可变容器。

副作用或影响

影响合法的容器应用程序,并可能导致崩溃或异常行为。为了防止损害合法的应用程序,Kubernetes管理员可以为应用程序需要写访问的特定目录挂载二级读 / 写文件系统。

网络隔离

针对容器用户和资源的管理方案可以显著降低资源相关的容器风险,并加强管控。接下来,我们将针对网络隔离进行严格把控,以确保对外部通信的严格管理。

集群网络策略

集群网络是Kubernetes的核心概念,包括容器、Pod、服务和外部服务之间的通信。因此,必须考虑网络优化。

默认情况下,很少使用网络策略来隔离资源,以防止集群在横向移动或升级时受到破坏。为了限制网络参与者在集群内的横向移动和升级,资源隔离和加密是有效的方法,总体归纳为一下三种:

网络策略和防火墙

网络策略用于控制Pod、命名空间和外部IP地址之间的流量。

默认情况下,Pod和命名空间没有应用网络策略,这导致流入和流出Pod网络的流量没有限制。通过应用网络策略到Pod或Pod命名空间,可以实现对 Pod 的隔离。

注意:如果Pod选择了网络策略,它将拒绝任何与该策略对象不允许的连接。

隔离流量控制

创建网络策略,需要一个支持 NetworkPolicy API 的网络插件。使用podSelector 和 / 或namespaceSelector选项来选择 Pod。

在这里我们可以简单举一个网络策略案例:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-access
  namespace: testRule #这可以是任何一个命名空间
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
    - from:
      - podSelector:
        matchLabels:
          access: "true"

tips:通常情况下,使用选择Pod的默认策略来拒绝所有入口和出口流量,并确保任何未选择的Pod被隔离,额外的策略可以放松这些允许连接的限制。

命名空间

上面提到了命名空间namespace,那我们就来简单的介绍一下命名空间吧。

命名空间是将集群资源划分给多个人、团队或应用程序的一种方式。

默认情况下,命名空间不会自动隔离。然而,命名空间确实为范围分配了标签,这可以通过 RBAC 和网络策略来指定授权规则。除了网络隔离外,资源策略还可以限制存储和计算资源,从而更好地控制命名空间中的 Pod。

下面是K8s自带的三个命名空间:

  • kube-system:用于存放 Kubernetes 组件的命名空间,例如 kube-proxy、kube-dns 和 kube-scheduler 等。这些组件对集群的正常运行至关重要。

  • kube-public:用于存放公有资源的命名空间,这些资源可以被整个集群中的所有用户访问。例如,集群级的配置信息和公共服务的凭证。

  • default:用于存放用户资源的命名空间,这是集群中大多数应用程序和服务所在的命名空间。如果没有显式地指定命名空间,新创建的资源将被放置在 default 命名空间中。

创建一个命名空间。
kubectl create namespace <insert-namespace-name-here>

要使用 YAML 文件创建命名空间,创建一个名为 my-namespace.yaml 的新文件,内容如下:

apiVersion: v1
kind: Namespace
metadata:
  name: <insert-namespace-name-here>
结合命名空间进行资源策略管控

上面介绍了网络策略,通过它可以对网络请求流量进行管控,从而降低系统安全风险。命名空间的隔离机制可以建立资源隔离的控制。然而,实际场景中命名空间的隔离并不是命名空间本身的能力,而是通过绑定资源策略来实现的。

我们的方案是通过LimitRange和ResourceQuota限制命名空间或节点的资源使用的策略。

LimitRange管控机制

我们通过使用LimitRange策略用于限制特定命名空间中每个 Pod 或容器的单个资源。它可以通过强制执行最大计算和存储资源来控制资源的使用。

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu_control
spec:
  limits
  - default:
      cpu: 1
    defaultRequest:
      cpu: 0.5
    max:
      cpu: 2
    min:
      cpu: 0.5
    type: Container

每个命名空间只能创建LimitRange 约束,在其范围内,每个容器可以指定一个 LimitRange,其中包含默认的资源请求和限制,以及最小和最大的请求。LimitRange可以应用于命名空间,使用:

kubectl apply -f <example-LimitRange>.yaml --namespace=<Enter-Namespace>

在应用了这个 LimitRange 配置的例子后,如果没有指定,命名空间中创建的所有容器都会被分配到默认的CPU 请求和限制。命名空间中的所有容器的CPU请求必须大于或等于最小值,小于或等于最大 CPU 值,否则容器将不会被实例化。

ResourceQuotas管控机制

ResourceQuotas是对整个命名空间的资源使用总量的限制,例如对 CPU 和内存使用总量的限制。如果用户试图创建一个违反LimitRange或ResourceQuota策略的 Pod,则 Pod 创建失败。

针对于我自己常用的情况下的资源配额分配(内存请求、内存限制、CPU 请求和 CPU 限制)

apiVersion: v1
kind: ResourceQuota
metadata:
  name:  cpu-mem-resourcequota
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    limits.memory: 2Gi
  • 容器的总内存请求不应超过 1 GiB
  • 容器的总内存限制不应超过 2 GiB
  • 容器的CPU请求总量不应超过 1 个 CPU
  • 容器的总CPU限制不应超过 2 个 CPU

应用这个ResourceQuota

kubectl apply -f example-cpu-mem-resourcequota.yaml -- namespace=<insert-namespace-here>
确保控制平面的安全(建议)

控制平面是 Kubernetes 的核心,因此Kubernetes API 服务器不应该暴露在互联网或不信任的网络中,故此确保控制平面的安全而言,我没有别的可说的,直接阻止外界对于访问就行了。

毕竟它也用不到,但是内部通信即使用了默认策略也必须可以互相通信,否则控制平台,就没有意义了,因此网络策略可以应用于 kube-system 命名空间,以限制互联网对 kube-system 的访问。

流量和敏感数据进行加密

分发证书给节点,以确保安全通信

在 Kubernetes 集群中,所有流量(包括组件、节点和控制平面之间的流量)都使用TLS 1.2或1.3加密。加密可以在安装过程中进行设置,也可以在安装后使用 TLS 引导创建证书并分发给节点。

敏感信息的控制访问

Secret提高了访问控制

Kubernetes应该使用Secret维护敏感信息,如密码、OAuth 令牌和SSH密钥。YAML文件、容器镜像或环境变量中存储密码或令牌相比,任何有API权限的人都可以检索到。

Kubernetes将Secret存储为未加密的base64编码字符串,将敏感信息存储在Secret中可以通过对secret资源应用RBAC策略来限制访问,从而提高了访问控制。

认证授权

哈哈,先休息一下,消化一下上面的内容,等待姊妹篇在学习。

日志审计

哈哈,先休息一下,消化一下上面的内容,等待姊妹篇在学习。


个人感悟

未来十年,云计算将无处不在,像水电煤一样成为数字经济时代的基础设施,云原生让云计算变得标准、开放、简单高效、触手可及。如何更好地拥抱云计算、拥抱云原生架构、用技术加速创新,将成为企业数字化转型升级成功的关键。

本章内容,暂时总结分析到这里,希望大家等待我的姊妹篇:【云原生技术专题 | 解密2023年云原生的安全优化升级,告别高危漏洞、与数据泄露说“再见”(信息审计篇)】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1357011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工作流自动化:它是什么,常见示例以及如何实现

由于您的组织旨在留住顶尖人才和高价值客户&#xff0c;因此您需要不断为这两个团队提供一流的体验。 就客户而言&#xff0c;它可以实时解决他们的问题和疑虑&#xff0c;并以深思熟虑、可操作的洞察力主动与他们联系&#xff1b;而且&#xff0c;对于员工来说&#xff0c;它可…

微服务之间互相调用出现的错误

场景&#xff1a; 微服务A调用微服务B的接口&#xff0c;微服务B的接口请求方式是get类型&#xff0c;传递的参数是JSON格式。 错误&#xff1a; 1、postman&#xff1a;springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserial…

java数据结构与算法刷题-----LeetCode70. 爬楼梯

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

Android Framework | Linux 基础知识:入门指南

Android Framework | Linux 基础知识&#xff1a;入门指南 进行Android Framework开发需要具备基本的Linux基本知识&#xff0c;下面是一份Linux基础知识入门指南&#xff0c;希望对你有所帮助&#xff01; 1. 简介 Linux 是一种免费、开源的操作系统&#xff0c;它是由芬兰…

分布式之任务调度Elastic-Job学习一

1 E-Job 1.1 任务调度高级需求 Quartz 的不足&#xff1a; 1、 作业只能通过 DB 抢占随机负载&#xff0c;无法协调 2、 任务不能分片——单个任务数据太多了跑不完&#xff0c;消耗线程&#xff0c;负载不均 3、 作业日志可视化监控、统计 1.2 发展历史 E-Job 是怎么来的&…

第11课 实现桌面与摄像头叠加

在上一节&#xff0c;我们实现了桌面捕获功能&#xff0c;并成功把桌面图像和麦克风声音发送给对方。在实际应用中&#xff0c;有时候会需要把桌面与摄像头图像叠加在一起发送&#xff0c;这节课我们就来看下如何实现这一功能。 1.备份与修改 备份demo10并修改demo10为demo11…

Python 快速合并PDF表格转换输出CSV文件

单位的刷脸考勤机后台系统做得比较差&#xff0c;只能导出每个部门的出勤统计表pdf&#xff0c;格式如下&#xff1a; 近期领导要看所有部门的考勤数据&#xff0c;于是动手快速写了个合并pdf并输出csv文件的脚本。 安装模块 pypdf2&#xff0c;pdfplumber&#xff0c;前者用…

切换node.js不同版本

切换node.js不同版本 因新项目用到vite4创建项目&#xff0c;输入命令后报错&#xff0c;经查询得知是node版本过低导致&#xff0c;所以需要升级node版本&#xff0c;但是又有老的项目需要维护&#xff0c;因此需要多个版本的node使用需求。 流程&#xff1a; 卸载原有的node…

金和OA c6 uploadfileeditorsave接口存在任意文件上传漏洞

产品简介 金和网络是专业信息化服务商&#xff0c;为城市监管部门提供了互联网监管解决方案&#xff0c;为企事业单位提供组织协同OA系统升开发平台&#xff0c;电子政务一体化平台智慧电商平合等服务 漏洞概述 金和-c6 uploadfileeditorsave 任意文件上传&#xff0c;攻击者…

MySQL基础篇(四)多表查询

一、多表关系 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种&#xff1a; &#…

Hi5 2.0 虚拟手与追踪器(Tracker)的位置修正

问题描述 使用环境与工具&#xff1a;Unity 2022.3.4fc1&#xff0c;steam VR(2.7.3)&#xff0c;steamvrSDK&#xff08;1.14.15&#xff09;&#xff0c;HTC vive pro专业版&#xff0c;Hi5 2.0数据手套 首先按照Hi5 2.0的使用说明&#xff08;可参考&#xff1a;HI5 2.0 交…

【数据结构—二叉树的链式结构实现】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、二叉树的存储结构 二、二叉树链式结构的实现 2.1手动构建一课树 2.2二叉树的遍历 三、二叉树链式结构的实现 3.1前序遍历(递归) 3.2中序遍历(递归) 3.3后序…

多线程常用信号:ManualResetEvent,AutoResetEvent

1.了解信号 在这两个信号中: 1.Set方法可以将信号置为发送状态&#xff1b; 释放信号&#xff0c;所有等待信号的线程都将获得信号&#xff0c;开始执行WaitOne()后面的语句&#xff1b; 将事件状态设置为中&#xff0c;终止状态许一个或多个的等待线程继续 2.Reset方法将信号置…

【MFC】计算机图形学实验:熟悉开发环境及工具(代码)

实验内容&#xff1a; 【MFC】计算机图形学实验1&#xff1a;熟悉开发环境及工具_绘制多义线mfc-CSDN博客 画笔和字体只给出两处代码&#xff1a; //创建刷子&#xff0c;设置填充色为黑色 CBrush NewBrush; NewBrush.CreateSolidBrush(RGB(0, 0, 0)); pDC->SelectObjec…

静态网页设计——校园官网(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 使用技术&#xff1a;HTMLCSSJS 主要内容&#xff1a;对学校官网的结构进行模仿&#xff0c;对布局进行模仿。 主要内容 1、首页 首页以多个div对页面进行分割和布局…

Apache Camel笔记

Apache Camel笔记 1. Apache Camel概念 Apache Camel是一个轻量级的应用集成开发框架&#xff0c;专注于简化集成应用的开发。它基于Enterprise Integration Patterns&#xff08;企业集成模式&#xff0c;简称EIP&#xff09;的设计理念&#xff0c;提供了灵活的路由和中介机制…

03、Kafka ------ CMAK(Kafka 图形界面管理工具) 下载、安装、启动

目录 CMAK&#xff08;Kafka 图形界面管理工具&#xff09;下载安装启动打开 cmak 图形界面 CMAK&#xff08;Kafka 图形界面管理工具&#xff09; Kafka本身并没有提供Web管理工具&#xff0c;而是推荐使用bin目录下各种工具命令来管理Kafka&#xff0c; 这些工具命令其实用起…

玻色量子正式获准设立博士后科研工作站!即日起正式开启招聘!

​2023年11月21日&#xff0c;北京市人力资源和社会保障局在亦庄成功举办了“凝聚中国式现代化进程中的博士后力量推进会暨第二届全国博士后创新创业大赛北京赛区总结”。为加强博士后工作对提高企业创新能力的支持力度&#xff0c;推动产学研深度融合&#xff0c;经专家评议、…

Flyweight享元/共享模式(对象性能)

Flyweight 链接&#xff1a;享元模式实例代码 解析 目的 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中&#xff0c;从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时&#xff0c;让外部客户程序仍然…

全国计算机等级考试| 二级Python | 真题及解析(7)

一、选择题 1.python中,表达式5%2 = ( )。 A.2.5 B.2 C.1 D.0 2.已知字符串a="python",则a[ 1 : 3 ]的值为( ) A."pyth" B."pyt" C."py" D…