00:02
各位同学大家好,今天呢,我们一块儿要学习的是secret secret作为cos当中管理和存储敏感信息的这么一个资源,是吧,他解决了什么问题,就借今天这个机会呢,咱们一块儿来深入的聊一下。本次呢,我们分为6步走,首先我们要了解什么是secret,深入解析其核心的作用,说白了就是他干了什么事,解决了什么问题。第二,主要类型,Secret有哪些类型,以及这些类型有什么区别和对应的场景又分别是什么?第三,创建方法。我们要学习通过CTL命令行快速创建,以及通过编写规范的压文件来定义secret。第4,应用方式,掌握将secret作为环境变量直接注入,以及挂载为数据卷供容器读取文件的两种核心应用途径。
01:08
第5,实战案例。通过一个真实的业务部署场景,从创建、配置再到访问,完整的理解的端到端的实践流程。第6,总结提升的安全性,生命周期管理效率,以及规避权限的风险关键技巧和行业通用规范。首先我们来看一下什么是secret secret就像是一个嗯中央保险库,为敏感信息提供了一个安全集中的存储场所,而非散落在各处的标签。在早期飞云的一个部署的一个时代当中啊,我们会把一些个敏感数据,就比方说API密钥,用户名儿密码,嗯链接都会打到这个镜像里边儿,就导致拉取这个镜像的人呢,都可以看到我们这个里边儿的一些个配置情况,对吧?这样的话就会导致你敏感信息的一个暴露。但是呢,在我们引用cus以后,就产生的一种解决方案,就是引入secret对象,把敏感信息全部存储到secret当中。
02:20
然后呢,你的这个代码数,如果说需要这些敏感信息的话,我们可以通过变量注入的方式,也可以通过呃,数据院挂载的方式去供你这个应用代码去使用,相当于是做了一个解耦,敏感数据是敏感数据,业务代码是业务代码,这两个是完全独立的,好吧,Cos呢,就提供了这样一种能力,而这种能力就是通过资源来实现的。我们再来看一下cooper的核心作用和重要性。首先,避免敏感信息泄露,杜绝密码密钥以明文的方式出现在配置或代码当中,从根源上降低了因配置文件意外提交或泄露引发的安全漏洞风险。
03:12
再看第二,解耦配置和代码,遵循现代应用的设计最佳实践,将代码啊不对,将敏感设计和业务代码进行分离,实现无需重构镜像即可灵活的更新密钥和凭证。也就是说它有一个热更新的能力,你这边破D还在运行是吧,我这边C更新大概过一会儿10秒到20秒的时间呢,我这个破D里面就会把你这个更新的内容也给刷新一下。是吧,实现一个热更的能力,然后再看。第三,精细的访问控制,结合cooper net r BAC机制,精确的管控用户或者是服务账户对的访问权限,严格执行最小权限原则,保障数据的安全。第四,减少敏感的暴露面。Secret独立于破的生命周期管理,仅在需要的时候挂载使用,大幅减少敏感数据在日志、终端及日常运维流程中意外曝光,也就是说我这个业务代码需要使用到一些个敏感信息的时候,我才会,是吧,嗯。
04:27
变量注入也好,是吧,文件挂载也好,去使用我这些嗯,CQ的资源来获取敏感信息,好吧,这个也比较好理解。然后我们再来看一下secret和confi map的一个区别。Coopers中的con map和secret是功能相似的配置管理资源,均用于结耦配置和应用代码。他们的核心差异不在能不能存,而在于该不该存,即数据是否具备敏感性。首先来看secret用于存储密码、密钥、令牌等敏感数据,默认以被16、14的编码形式来存储,具备更严格的权限控制和审计策略,通常挂载为只读卷,防止数据泄露。然后再看conveer map用于存储应用运行的非敏感参数,比如端口号、日志、级别、配置文件,以明文的形式来存储。权限呢,相对宽松,适合管理普通的无需加密的配置信息。
05:36
然后再看,嗯,Base斯64编码不等于加密,当你创建cooperbert时,数据呢,就会被自动的转换为BASE64的编码。这是一种相当于二进制或特殊字符转换为纯文本的编码方式,目的是方便在压目中传输,它本身不提供任何的加密保护。
06:02
好,然后核心认知secret的安全性,杜绝绝不依赖这个贝斯64,其真正的安全保障是来自于cooper nettis的RBAC访问控制,以及对后端etcd存储的静态加密配置。好吧,嗯,在后期呢,我们也会详细的对这个RBAC访问控制去做一个讲解哈,这里我们需要知道有这么一个东西,然后再往下看secret的主要类型,Secret的有其实有好多种类型,这里呢,我们就先举几个例子,第一个就是opaque通用型,Secret最常用的最通用的基础类型,用于存储任意的建值对数据,例如数据库的用户名密码或者第三方服务的API密钥,数据呢以被64编码形式来存储。然后再看第二种类型docker coner杰森用于存储访问docker HUB等私有容器仓库所需的认证信息,本质上是存了那个叫呃加目录下的一个一个隐藏文件哈,然后里面有个叫卡菲杰son的内容,然后再看第三个TLS,这个用作7层的比较多,这里就不再深入展开了,如果说后期有这个同学需要的话,我们可以来,嗯。
07:28
加入一期这个视频。然后再看创建C的资源的方法,有这么几种方法,1、从字面量直接创建,也就是通过CTL的方式来指定杠杠from-lateral。写上键和值的方式来创建,这个可以写多个键和值。好吧,然后再看方法2,从文件读取创建还是通过cooper CTR命令,只不过这次我们的选项改了,我们用刚刚from刚fell,然后后面指定我们的嗯键,然后再指定一下这个文件的来源就可以了。
08:10
然后创建secret security的资源的方法二,使用这个yab文件,但是呢,这个yab文件呢,也有两种方法,第一个就使用data字段来声明我这个键和值,还有一种方法是使用string data, 这两种方法有什么区别呢?如果说我们使用的是data塔,那么你在写这个,嗯。值的时候,需要提前把你的编码给编好,然后再把你的编码复制到这个值的这个嗯文文本当中,对吧,这样去使用。但是这种呢,有一个缺点就是容易出现格式错误,好吧,然后的话,嗯,增加1的其实就还增加了一个操作的成本,因为你需要提前把这些东西都前编码好,然后才能去做使用嘛,然后再看第二使用string data, 这个是目前比较推荐的哈,因为你这个在写的时候可以直接写铭文,然后呢,你写完以后,诶保存退出,Secret会自动把你的这个铭文呢,它会做一个编码,在这个创建成本上和这个使用上都会比较方便一些。
09:29
好吧,就不会像data塔那么繁琐,当然了,这个没有绝对的好坏啊,还是按照我们的实际情况来做选择。然后再往下看在port中如何应用secret方式1、作为环境变量来注入,这个和computer map是不是有有点类似呀?Con map我们在学习的时候,它是不是也可以通过这种变量注入的方式去使用呢?Secret也可以将secret中的键值映射为容器内的环境变量,是最直观的使用方式,非常适合应用程序通过读取环境变量来获取配置参数,比方说,嗯,用户名、密码、API密钥等场景,好吧。
10:16
然后再看第二个在po中如何使用呢?方法2,作为文件挂载。将CQ的挂载为容器内的一个或者多个文件是最常使用的方式之一,尤其是适合应用程序需要读取配置文件的时候,C中的每个键值会自动映射为挂载目录下的一个文件,键名呢就是文件名,值呢就是文件的内容,好吧,而且它还有一个热更新的机制,也就是说你CCTV的内容更新以后,大概要过一个10秒左右的时间,也不需要重启po啊,它就会刷新一下,把你最新的呃敏感数据给加载到我们当前的这个容器当中。
11:06
然后看一下两种方式的对比,一种是变量注入,一种是文件挂载,还是那句话啊,这个嗯,使用方式没有好坏之分,只有我是看你具体的一个使用场景,好吧,变量注入的方式呢,就是简单直观,完全符合12要素应用的配置规范,潜在不足是更新不及时,且敏感数据可能暴露在进程列表当中,有泄露的风险。嗯,变量之路这种方式它不支持热更新,也就是说如果说你更新了secret里面的内容,你需要重启board,它才能重新的加载渲染。然后再看文件挂载,优势是支持配置的自动更新,适合管理复杂的配置数据,安全性的也相对较高,潜在不足是配置方式稍微复杂,且要求应用程序自身支持配置文件的热加载能力,这个也很重要,因为有很多的应用程序,它本身目前啊还不支持这种热更新热加载的一种方式,所以说嗯。
12:14
这个还是根据实际情况来使用吧,当然了,如果说你这个应用程序本身不能够热加载,那其实你这个是应用程序本身的问题,而不是cooper nets的问题,好吧,Cooper nets是提供了这种热更新的能力的。然后再看使用场景案例,就比方说哈,我这里给大家整了一个场景,你有一个外B应用,你外B应用的名字叫做my web APP, 你需要连接postscript数据库。这个时候呢,你需要有一个用户名密码了,对吧,这肯定的。那这时候应该怎么办?我们就可以通过引入这个C的对象来把这个敏感数据,敏感敏感信息作为一个使用,然后去连接这个数据库。
13:02
好吧,这个也比较好理解,当然了,这种引用的方式也可以通过变量,也可以通过那种,呃,挂载数据卷。然后案例验证和总结,验证总结这块儿内容我就不详细展开了,在后边的实验环节的话,我会带着大家来看到效果的,好吧,然后使用CK的最佳实践这块呢,也是根据很多很多身边朋友以及当前部署方案当中遇到的一些问题做了做了一个总结啊,避免后期我们在二次的一个裁坑。首先来看开启etcd静态加密,默认情况下C的请以BASE64编码存储,存在被解码的风险。开启Etcd静态加密是保障数据机密性的核心步骤,能确保密钥在存储层面的真正安全。好吧,至于什么是那个机密性是吧?机密性还其实还有一个别的一个应用和操作啊,这个我们放到后边来讲,这里我需要提到,然后让大家知道有这么一个东西啊,不是仅仅是BASE64。然后再看实施最小权限原则,为创建专属的account,授予其访问所需的必要权限,通过RBAC严格控制访问范围,防止权限过大导致的密钥泄露风险。它和第一个开启etcd静态加密是可以配合使用的,是吧?到底怎么配合使用呢?咱们后边详聊。然后再看第三,隔离敏感工作负载,将处理敏感数据的PD部署在独立的命名空间当中,并为该命名空间配置严格的网络策略和访问控制策略,然后实现敏感。
14:57
业务和普通业务的物理和逻辑隔离是吧?核心思路是从存储加密全线管控到环境隔离,构建全链路的secret的安全防护体系,确保密钥全生命周期的安全可控。我们再往下看,然后使用secret的最佳事件2,第一个是严禁将CK的压某提交至代码仓库,因为你本身就是存的是一些敏感数据,对吧?如果说你还是把这种敏感的数据暴露在这么不敏感的环境当中,是极易造成敏感信息泄露的。然后再看下面这个引入企业级外部密钥管理系统,其实现在有很多的云厂商都是有这么一个KMS管理系统的,是吧?它其实也提供了一种嗯,管理敏感信息的这种这种能力,当然了,这种情况我们后边如果有机会的话会带大家来看一下啊。
15:57
然后再往下看,定建立定期的密钥轮换机制,定期更新密码和密钥是基础安全防线,利用文件挂载的方式进行,嗯,更新这个secret内容,可实现应用无停机的无缝密钥轮换,实现业务的连续性。说白了就是定期改一改密码是吧,你别老用那一个,你这老用那一个的话,人家黑客想供你是吧,时间一长他都能给你猜出来,甚至是暴力破解出来,好吧。
16:30
然后再往下看,优先使用string data字段编写,压某文件时使用string data代替data字段,可以直接写入铭文配置,避免在本地环境留下贝4编码的痕迹,提升安全性和维护效率。这里也是一个小建议吧,因为你这种如果你使用data的话,你还需要手动编码啊,是吧?这个其实在你的运维成本上其实是会有所增加的。然后再看第二个严格控制挂载文件的权限,通过default mode设置文件权限,为什么呀?
17:07
这里是一个拉进指数,如果说我们需要配置的话,我们可以拿AI吧,你转换一下,把你这个我们平时的这个644或者怎么样,你转换一下,然后写到这里就可以了,确保只有运行应用的用户能读取C的内容,防止容器内其他进程越权访问敏感数据。好吧,这个也比较好理解,然后再看第三,关注secret的资源大小限制,Cooper nes规定单个secret的数据总大小不能超过1兆B,避免将大文件或者大量的配置存入,建议改用外部存储或者是con管理非敏感数据。其实这里主要就是一点哈,你这个CQ的总大小你不能超过1兆B,虽然我们的敏感数据可能达不到1兆比,但是这里要做一个提示。
18:01
好吧,然后再往下看,掌握更新的生效机制,环境变量方式需要重启破的才能生效,文件的挂载方式会自动更新secret文件,但应用程序需实现热加载的逻辑才能获取实时的最新内容,就像是刚才我们已经提到的,如果说你使用变量注入的方式的话,那么更新以后你需要重启portd才能用,因为变量注入它本身不能够实现热加载到pod当中,所以就是说你需要增加一个重启po的一个步骤,但是呢,文件挂载的话,它会实时的更新到这个pod当中,但是需要你的应用程序。也能是也能有一个热加载的这个逻辑,不然的话我加载进去了,你应用程序本身你不支持,那不还是白搭吗?好吧,这里呢,就是总结的一些个问题,PPT部分呢,就到这里结束了。
19:01
下面开始我们的实验环节。好,下面就开始我们的实验环节,嗯,在做这个实验之前呢,我先准备两个文件,好吧,待会儿我们要引用,我们要输出一个。用户名。到这个目录下的URL文件好,然后再输出一个密码。到这个目录下的pass文件。这样的话我。看一下啊。Cat user这样的话,我这个目录下呢,就多出来两个文件里面分别对应的是用户名和密码,对吧,细心的这个同学也会发现我输入的这个它没有换行。如果说我们默认哈,通过IQ不加选项的方式,我们输入进去内容,它是会带一个换行符的,这里为什么要加杠N呢?因为加上杠N就没有换行符了,没有换行符,你这个secret在给你进行编码的时候,就不会把换行符也进行一个编码。
20:08
可以理解吧,如果说你带上换行符了,那么secret在给你这个进行编码的时候,也会把换行符按做进去。好吧,这个在后期引用的时候是会有一些问题的,所以这里一定要加一个杠N的方式来将我们的这个用户名和密码输入到这个文件当中。好吧,啊,输出到这个文件当中,好吧,来我们呢,就开始创建一下C,还记得我们学过两种方式吗?第一种是通过字面量的方式。好吧,我们来一起来看一下啊,我们都操作一次好吧,嗯,SEC re, 然后。嗯,类型是generic。然后名字就叫my secret, 嗯,杠from-later啊,等于user,等于什么呢?等于苏小轩,然后还可以通过刚刚from gone later on, 等于pass pass等于什么呢?嗯,苏小轩刚pass,这个就是通过自量的方式来创建secret对象,好吧,来回车。
21:16
创建完成了,我们来看一下CTL get SE re, 刚开始我们练的时候尽量是多用手敲一下这个命令啊。也便于我们的一个理解。好,这个样就创建成功了,我们一起来输出一下库班CTL get secret.嗯,My secret-O输出一下是不是就有了呢?大家它是不是呢,我们可以来验证一下哈。64。哦,不好意思。这是64-D。我们把这个东西给输出一下,我们只是输出一个密码看一下吧。
22:00
对不对,苏小轩杠pass没有问题吧,你看苏小轩杠pass好,这样的话就算是通过自变量的方式已经创建完了,那么下面我们再通过引用文件的方式来创建。托瓣CTL ded SE, 嗯,然后买。CCT, 好,这样就把我们刚才创建的给删除掉了,下面呢,我们再通过文件引用的方式。嗯,Secret secret, 然后是类型,你接week my secret secret, 嗯,杠杠,From from什么呀?Fell fell等于什么?等于的是你的件件是什么?User等于什么?等于你的文件文件在哪里?这个目录叫user文件。好吧,还可以指定第二个文件。杠杠,From five等于。键,然后再等于。
23:02
这个文件下的pass文件。好,回车创建完成,我们来看一下SEC re, 创建成功了吧?来,我们再输出一下。嗯。My c re, 嗯,杠号O要。没问题吧,然后我们输出一下啊。杠D,杠D的话就是decode解码的意思。是不是没有问题,苏小轩刚pass对吧?好了,这里创建完M文件了,呃,不是创建完这个secret对象了,那我我我们应该怎么使用呢?这里我总结了。一个案例,我们一起来看一下哈,嗯,Deployment.看一下哦,我知道了deployment点这里我提前写了一份ma文件,我要取一个deployment控制器是吧,因为我的目的嘛,就是把我的这个。
24:07
嗯。For要引用一下这个对吧,我们一起来看一下,要起一个deployment控制器,然后呢,原数据是name name的名字是my deploy规格4副本。是吧,然后选择器要先匹配,要匹配什么呢?要匹配这个APP冒号,然后MYAPP要起一个容器,这里要起一个模板了。然后呢,Me data要匹配上这个标签是吧,一定要一一对应上来,如果你对应不上的话呢,这个容器是起的是有问题的。然后SPA描述要起一个容器,容器的名字叫做my container容器要拉取的镜像N冒号latest。容器的拉取策略,If not present, 意思是本地有就用本地的,如果本地没有就从远端仓库拉取。
25:04
然后是因为要声明变量。变量的名字就叫做user,然后是value form, 值的来源,来源于什么呢?Secret key reef, 也就是说要引用这个secret对象的king来作为它的值。哪个名字叫做MY对吧,刚才我们创建的,然后哪哪一个。呃,T呢?User对吧,因为我们一开始在创建的时候,我是不是指定那个user。然后我们再往下看,其实是一样的哈,然后。Pass, 一个变量值来源于哪儿呢?来自于这个secret king ref secret king叫什么名呢?呃,Secret的那个叫什名字呢?叫My secret, 他的king叫。好吧,这样一份yam文件呢,就定义完了,它的作用就是通过起一个deploy控制器拉起4副本的pod,然后呢,再把这个变量注入到这4个pod当中。
26:10
我们可以把它起一下,括CTLPLY、杠、fdeployment.e回声。待会儿我们可以进去看一下啊,看看到底有没有通过变量注入的方式,把我们的这个secret的信息给注入到这个破当中。Guide deployment好,4副本for city guide board, 好,全部都running了,那我随便挑一个吧,我们就来看一下CU。Ctle X e杠、it.这个。刚刚并且的。下的best。好吧,已经进来了,我们通过输出一下这个环境变量来看一下,这是我定义的两个变量,对不对?一个叫user,一个叫pass,值来源于哪儿呢?值来源于的一个K。
27:04
还记吧,还记得吗?Secret的一个king,哪个king?是不是USA king USA king的值是什么?苏晓轩。然后呢,我身边的第二个变量pass pass是不是也引用了的一个。值对不对?Secret哪个值呢?Pass的那个K的那个值,苏小轩杠,Pass没问题吧?好,当然了,这个肯定是可以输出的啊,Echo user.是吧,没问题。然后我怕。好,这样的话就是把这个C对象的变量注入到我们的port当中了,这是第一种使用方式,然后第二种使用方式是通过文件挂载的方式来将我们的这个对象挂载到这个pod当中。来,我们退出CTL,嗯。
28:00
我们把它回退一下哈,deploy1.yama好,下面我们开始看一下我们的这个文件,挂载的这个yama文件。Ploy港。好,这里我又起了一份deploying,来,我们一起来读一下吧。嗯,前面这些就不带大家赘述了哈,因为已经说过很多次了,我主要是从从这个consider这里开始讲吧。ER要起一个容对,然后呢名。容器的镜像是用in latest, 然后容器的拉取策略是if not present好,然后是卷挂载。他引用了哪个卷呢?My secret?挂载到什么位置,挂载到根下的temp下面的user。这个杠secret,也就是挂载到这个这这个目录下,然后起这个名字。
29:00
然后引用一个子路径,子路径引用的其实就是secret的一个子径。引用的是哪个呢?哎,User, 这secret好吧,这个也比较好理解,然后下面这个其实逻辑是一样的哈,就不再展开了,我们再来看一下我声明的这个眷,这个也很重要,因为我签要声明眷。你这里才能引用。那么有同学就会说,为什么你这个写到后边没有写到前面来,这样的话逻辑不是有点儿这个混乱吗?其实不是。因为这个声明是啊,在一些就像一些大厂的环境里面,它是后项的一个声明。好吧,这个也需要我们去适应的一种这个读法。你看啊,VALUE64,然后我是开始声明卷了,我的卷子名字叫什么,My secret user.然后呢,引用这个secret对吧,你secret对象了,我的名字叫什么,叫做my secret.
30:01
你这个items,你其中的一个。King.你看意思就是我要只要引用你其中的一个K,所以我引用了这个it。你个你这个黑叫什么名字更user。然后呢,我引用完以后,我要给你这个user这个值改一个名字,我要改一个什么名字呢?User-secret。然后下面这个逻辑是一模一样的。然后我们再来看一下啊,把这个逻辑再串一下,因为我这里声明了一个卷。对吧,我这个卷的名字叫做my secret user, 所以我这里你看。这样挂载嘛,我才能选择这个my secret挂载。对不对。你看,然后我这个卷名有了,那我这个值来自于哪里呢?来自于secret secret的名字是啥?是这个是吧,然后我引用secret当中的哪一个的值呢。User king的值,然后我给这个值,哎,起了个名字叫做嗯,User got secret, 对吧?这样的话一个卷就声明完毕了。
31:09
我们再来看一下这个引用怎么引用,我要是通过这个mount,那个value value mount给它挂载,对吧,我先要这个引用这个名字。你看我要挂载卷,你说我挂在哪个圈呢?是不是我要写个名字呀?My secret.对吧,MY-user Mo挂载的路径,挂载到哪里,挂载到根下的time下边的,然后叫这个名字user-secret。没错吧,为什么要写一个surpass呢?Surpass是因为我们在下面指定的我要引用其中的某一个K。对不对,我你看我只引用了这一个K,所以我这里我需要写一个sappas,如果我不写的话,那他就会把我整个的。
32:00
这个。挂载到这个目录下。好吧,这块也比较好理解,好下面就开始执行一下,我们来看一下不是CTL。嗯,PLY-flo杠回收。好,执行成功了,我们一起来进这个容器里面看一下CTL。Guide portd CT ex e、杠、it, 进到这个D里面吧。广告。并且的BASH,嗯,好,这样就加进来了。还记得我们是不是挂载到这个目录下面,对吧,是不是出现了两个文件,一个叫。Pass secret, 一个叫user secret.输出一下没问题吧。苏小轩,Pass对吧,然后再一下这个user secret对吧?苏小轩没有任何问题,这样的话,我们就已经成功的将我们CQ的对象挂载到这个破者内部了。
33:14
好,然后通过这个实验呢,是不是就可以说明。我们的这个敏感数据是可以和业务的这个逻辑进行一个解耦的,对不对,所以以后在嗯部署或者是运维的时候,我们一定要通过这种方式来去管理我们的敏感数据,好吧。今天的这个实验环节到这里呢就已经结束了,感谢大家的观看,我们再见。
我来说两句