云原生技术专题 | 解密2023年云原生的安全优化升级,告别高危漏洞、与数据泄露说“再见”(安全管控篇)
背景介绍
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: appname: appspec:selector:matchLabels:app: apptemplate:metadata:labels:app: appname: appspec:containers:- command: ["sleep"]args: ["999"]image: ubuntu:latestname: websecurityContext:readOnlyRootFilesystem: true #使容器的文件系统成为只读volumeMounts:- mountPath: /writeable/location/file #创建一个可写卷name: volNamevolumes:- 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-accessnamespace: testRule #这可以是任何一个命名空间
spec:podSelector:matchLabels:app: nginxingress:- 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: 1defaultRequest:cpu: 0.5max:cpu: 2min:cpu: 0.5type: 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: 1Gilimits.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年云原生的安全优化升级,告别高危漏洞、与数据泄露说“再见”(信息审计篇)】
相关文章:
云原生技术专题 | 解密2023年云原生的安全优化升级,告别高危漏洞、与数据泄露说“再见”(安全管控篇)
背景介绍 2023年,我们见证了科技领域的蓬勃发展,每一次技术革新都为我们带来了广阔的发展前景。作为后端开发者,我们深受其影响,不断迈向未来。 随着数字化浪潮的席卷,各种架构设计理念相互交汇,共同塑造了…...
如何启用Windows电脑的内置Administrator账户
前言 不知道从什么时候开始,新电脑或者新系统开机之后都会出现一个界面让你创建一个账户,但这个账户有可能是本地账户(Windows10)还有强制你登录微软账户的(Windows11)。 好像曾经熟悉的电脑Administrator…...
智慧工厂:科技与制造融合创新之路
随着科技的迅猛发展,智慧工厂成为制造业领域的热门话题。智慧工厂利用先进的技术和智能化系统,以提高生产效率、降低成本、增强产品质量和灵活性为目标,正在引领着未来制造业的发展。 智慧工厂的核心是数字化和自动化生产,相较于传…...
SCADE—产品级安全关键系统的MBD开发套件
产品概述 随着新能源三电、智能驾驶等新技术的应用,汽车中衍生出很多安全关键零部件,如BMS、VCU、MCU、ADAS等,相应的软件在汽车中的比重越来越大,并且安全性、可靠性要求也越来越高。ANSYS主要针对安全关键零部件的嵌入式产品级软…...
PyTorch|保存与加载自己的模型
训练好一个模型之后,我们往往要对其进行保存,除非下次用时想再次训练一遍。 下面以一个简单的回归任务来详细讲解模型的保存和加载。 来看这样一组数据: xtorch.linspace(-1,1,50)xx.view(50,1)yx.pow(2)0.3*torch.rand(50).view(50,1) 画…...
javaScript:Math工具类方法
1 Math工具类方法: >和其他的类的不同,Math并不是一个构造函数,也就是无法通过new来创建Math的实例 >Math表示的数学,在Math对象中存储了一组数学运算相关的常量的和方法 >这些常量和方法可以直接通过Math来访问 >比如Math.P…...
ffmpeg转码新技能
ffmpeg转码新技能 mp3转wavmp4转gif mp3转wav 今天发现之前用ffmpeg转码不好使了。今天发现一个ffmpeg转码新的用法非常简单 ffmpeg -i 0104.mp3 -f wav 0104.wav mp4转gif 同学求助将mp4转gif。我先用剪影把mp4的多余黑边去除。然后用ffmpeg将mp4转出了gif ffmpeg -i shu…...
Docker学习笔记(一):Docker命令总结
Docker命令总结 一、Docker介绍1.1 镜像与容器区别 二、Docker命令 一、Docker介绍 Docker是一个开源的应用容器引擎,它允许开发者在几乎任何环境中运行应用程序,而无需担心运行环境的问题。Docker的核心概念是容器,它可以将应用程序及其依赖…...
JavaWeb——后端案例
五、案例 1. 开发规范—Restful REST(Representational State Transfer),表述性状态转换,是一种软件架构风格 注: REST是风格,是约定方式,不是规定,可以打破描述模块的功能通常使…...
【CSS】浅学一下filter
目录 1、基本概念 2、用法 3、应用案例 更加智能的阴影效果: 元素、网页置灰 元素强调、高亮 毛玻璃效果 调整网页sepia 褐色值可以实现护眼效果 1、基本概念 CSS filter 属性将模糊或颜色偏移等图形效果(对比度、亮度、饱和度、模糊等等&#…...
Commander One for Mac:强大的双窗格文件管理器,让你的工作效率倍增!
Commander One for Mac是一款功能强大的文件管理工具,具有以下主要功能: 双窗格设计:主界面分为两个窗格,用户可以在左侧窗格中导航和浏览文件系统的目录结构,在右侧窗格中查看文件和文件夹的内容。文件操作ÿ…...
leetcode09-机器人能否返回原点
题目链接: https://leetcode.cn/problems/robot-return-to-origin/?envTypestudy-plan-v2&envIdprogramming-skills 思路: 循环遍历,模拟即可 代码: class Solution {public boolean judgeCircle(String moves) {int n m…...
sublim安装Autoprefixer插件
有时候在写css样式的时候,分不清哪些属性需要前缀,哪些不需要写前缀,sublime text这款编辑器下安装autoprefixer这款插件可以省去很多问题,写起来也很方便。1 确保系统已经安装node.js 可直接去官网上下载并安装,我的系…...
虚拟机Linux硬盘扩容
扩容前(20G): 扩容后(60G): 步骤: 1. 点击 虚拟机 -> 设置 -> 硬件 -> 硬盘(SCSI) -> 扩展(E)... -> 输入想要扩容大大小 -> 扩展(E) 2. 运行虚拟机,查看根目录属于那个文件系统,我的是 /dev/sda1…...
设计模式④ :分开考虑
一、前言 有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写"抄书"系列。本系列大部分内容都是来源于《 图解设计模式》(【日】结城浩 著)。该系列文章可随意转载。 …...
独占锁ReentrantLock的原理
类图结构 ReentrantLock是可重入的独占锁,同时只能有一个线程可以获取该锁,其他获取该锁的线程会被阻塞而被放入该锁的AQS阻塞队列里面。 首先看下ReentrantLock的类图以便对它的实现有个大致了解。 从类图可以看到,ReentrantLock最终还是使…...
影响代理IP稳定性的因素有哪些?
代理IP作为一种网络服务,在生活中扮演着各种各样的角色。它们可以用于保护隐私、突破访问限制、提高网络安全性等。代理IP的稳定性受到多种因素的影响,下面和大家探讨一下影响代理IP稳定性的因素。 1、网络环境:代理IP所处的网络环境对它的稳…...
使用Docker-compose快速构建Nacos服务
在微服务架构中,服务的注册与发现扮演着至关重要的角色。Nacos(Naming and Configuration Service)是阿里巴巴开源的服务注册与发现组件,致力于支持动态配置管理和服务发现。最近,一位朋友表达了对搭建一套Nacos开发环…...
【Python】不一样的Ansible(一)
不一样的Ansible——进阶学习 前言正文概念Ansible CorePlugins和Modules 插件插件类型编写自定义插件基本要求插件选项文档标准编写插件 添加一个本地插件注册为内置插件指定插件目录 其他一些技巧更改Strategy 结语 前言 Ansible 是一个极其简单的 IT 自动化引擎,…...
分布式图文详解!
分布式理论 1. 说说CAP原则? CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)这3个基本…...
Unity SRP 管线【第五讲:自定义烘培光照】
文章目录 一、自定义烘培光照1. 烘培光照贴图2. 获取光照贴图3. 获取物体在光照贴图上的UV坐标4. 采样光照贴图 二、自定义光照探针三、 Light Probe Proxy Volumes(LPPV)四、Meta Pass五、 自发光烘培 一、自定义烘培光照 细节内容详见catlikecoding.c…...
CentOS快速安装Mysql5.7(Alibaba Cloud Linux兼容)
1、安装 在线下载 http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 下载rpm安装包 [roottheo bin]# cd /usr/local [roottheo local]# wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm安装rpm [roottheo local]# rpm -iv…...
【css】快速实现鼠标悬浮变色效果
<div class"nav-item"><div class"ic-img"></div><div>切换</div> </div>.nav-item {width: 100rem;height: 45rem;line-height: 45rem;display: flex;text-align: center;justify-content: center;align-items: cent…...
21. Mysql 事件或定时任务,解放双手,轻松实现自动化
文章目录 概念常见操作事件调度器操作查看事件创建事件删除事件启动与关闭事件 精选示例构造实时数据定时统计数据 总结参考资料 概念 Mysql 事件是一种在特定时间点自动执行的数据库操作,也可以称呼为定时任务,它可以自动执行更新数据、插入数据、删除…...
Apache Doris 2.0.2 安装步骤 Centos8
Linux 操作系统版本需求 Linux 系统版本当前系统版本CentOS7.1 及以上CentOS8Ubuntu16.04 及以上- 软件需求 软件版本当前版本Java1.81.8.0_391GCC4.8.2 及以上gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4) 1、查看操作系统版本 方法 1:使用命令行 打开终端或…...
Java学习苦旅(二十五)——哈希表
本篇博客将详细讲解哈希表。 文章目录 哈希表概念冲突概念避免冲突哈希函数设计常见哈希函数 负载因子调节解决冲突闭散列开散列(哈希桶) 和java类集的关系 结尾 哈希表 概念 顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关…...
性能分析与调优: Linux 实现 CPU剖析与火焰图
目录 一、实验 1.环境 2.CPU 剖析 3.CPU火焰图 一、实验 1.环境 (1)主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测GUIgrafana192.168.204.19agent 监测 主机 node_exporter192…...
leetcode动态规划问题总结 Python
目录 一、基础理论 二、例题 1. 青蛙跳台阶 2. 解密数字 3. 最长不含重复字符的子字符串 4. 连续子数组的最大和 5. 最长递增子序列 6. 最长回文字符串 7. 机器人路径条数 8. 礼物的最大价值 一、基础理论 动态规划其实是一种空间换时间的基于历史数据的递推算法&…...
strtok函数的介绍
_str指被分解的字符串 delim指分隔符字符串 返回类型是指针 strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符…...
CF1909_C. Heavy Intervals题解
CF1909_C. Heavy Intervals题解 题目传送门(Problem - C - CodeforcesCodeforces. Programming competitions and contests, programming communityhttps://codeforces.com/contest/1909/problem/C)。 题目翻译如下:(图片来源&a…...
关于二手书的网站开发ppt/百度sem运营
很多企业都会使用Linux系统,审计Linux系统日志可以提供有关网络事件的重要信息。高效查看Linux系统日志对工作而言十分重要,以下是常用命令# uname -a # 查看内核/操作系统/CPU信息# cat /etc/issue# cat /etc/redhat-release # 查看操作系统版本# cat /…...
道真县城乡建设局网站/市场营销策划方案书
没有绝对的天才,只有持续不断的付出。对于我们每一个平凡人来说,改变命运只能依靠努力幸运,但如果你不够幸运,那就只能拉高努力的占比。 2021年4月,我有幸成为了字节跳动的一名高级测试工程师,正如标题所说…...
郑州手机网站制作公司/搜索引擎论文3000字
高校运动会管理系统设计与实现摘 要21世纪时信息化的时代,几乎任何一个行业都离不开计算机,将计算机运用于学校的学生运动会管理也是十分常见的。过去使用手工的管理方式对高校运动会进行管理,造成了管理繁琐、难以维护等问题,如今…...
h56wcom什么网站/微信营销方案
ios::sync_with_stdio(false); cin.tie(0);C中,cin和cout要与stdio同步,中间会有一个缓冲,所以导致cin,cout语句输入输出缓慢,这时就可以用这个语句,取消cin,cout与stdio的同步,说白…...
遵义做网站多少钱/颜色广告
解决方法 左上角file->project structure->modules->->import module->选择项目目录...
网站建设中招聘页面源码/网站内搜索
JavATE 0.6发布,一个Java领域驱动设计(DDD)框架。 0.6新特性: >> 支持Spring; >> 自定义命令的执行; >> 命令的撤销 JavATE并不完全是一个Java web框架,JavATE本身就基于现有…...