TSF微服务治理实战系列(四)——服务安全

news2024/11/17 17:07:14

一、导语

**道路千万条,安全第一条。治理不规范,老板两行泪”。**当企业从单体架构逐渐转向微服务架构时, 服务安全 的需求也随之分散到了整个微服务体系的各个部分中。这就需要构建一套配置活、成本低的安全防控体系,覆盖请求链路中的各个部分,满足用户的安全诉求。本章将从安全的视角介绍TSF相关的能力,包括服务和网关的鉴权机制、如何保证应用配置的安全、权限管理及事件审计等方面。

二、作者介绍

崔凯腾讯云 CSIG 微服务产品中心产品架构师多年分布式、高并发电子商务系统的研发、系统架构设计经验,擅长主流微服务架构技术平台的落地和实施。目前专注于微服务架构相关中间件的研究推广和最佳实践的沉淀,致力于帮助企业完成数字化转型。

三、安全攻防与零信任

针对系统的攻击手段层出不穷,可谓道高一尺,魔高一丈。黑客们总有方法绕过系统的种种防御机制,窃取系统权限、用户重要信息等。比如常见的 SQL 注入、XSS、CSRF,比较暴力的 DDOS 或代码开发引入的业务逻辑漏洞,还有序列化漏洞、文件上传漏洞和框架组件漏洞(如fastjson、log4j2)等。

对于已知的安全风险或者漏洞,我们可以提前进行防御,但是理论上没有一个系统可以做到100%不被攻破。所以,在系统安全建设方面,防御方需要通过较少的投入提高攻击方成本。另外,也需要减少整个系统的攻击面,比如通过 WAF 防火墙过滤恶意 URL、规范代码开发减少业务逻辑漏洞、减少使用安全漏洞频发的组件或框架等。

不过,头痛医头脚痛医脚的防御方式,往往顾此失彼。那么,有没有相关的标准和最佳实践经验来帮助系统提高架构的安全性呢?

追述到2010年,Forrester 的分析师 John Kindervag 提出的零信任(Zero Trust),其核心思想为:默认情况下,企业内外部的任何人、事、物均不可信,应在授权前对任何试图接入网络和访问网络资源的行为进行验证,简单来说就是 “永不信任、始终验证”

之后,Google在2014年发表了一系列论文,并在BeyondCrop项目中将零信任大规模落地。同时,国内也嗅到了零信任的重要性,中国信通院在2020年8月发布了《网络安全先进技术与应用发展系列报告——零信任技术》报告,其中对零信任相关原则、架构、场景等均进行了详细阐述。

There are several ways that an enterprise can enact a ZTA for workflows. These approaches vary in the components used and in the main source of policy rules for an organization. Each approach implements all the tenets of ZT but may use one or two (or one component) as the main driver of policies. A full ZT solution will include elements of all three approaches. The approaches include enhanced identity governance–driven, logical micro segmentation, and network-based segmentation.

此外,NIST(National Institute of Standards and Technology)在2020年8月也发布了《SP800-207.Zero Trust Architecture》的终稿(片段如上),其中详细描述了3条零信任架构主流的技术实现路径,包括增强的身份治理(Enhanced Identity Governance)、微隔离(Micro-Segmentation)、网络基础设施和软件定义边界(Network Infrastructure and Software Defined Perimeters),且这3种技术解决的问题域并不完全相同,组合起来才能形成完整的 ZTA 解决方案。(原文可从附录中查阅)

四、微服务ZTA参考模型

腾讯云 TSF 基于上述零信任架构相关参考文献及微服务领域多年的经验积累,梳理总结了微服务 ZTA 参考模型。其主要用于抽象描述微服务架构场景中,零信任各组成元素间的关系和逻辑。

其中,数字化访问主体包含微服务架构中的人员、终端、服务等,且服务作为微服务架构的核心元素,所以其重要程度更高。

访问主体发送不受信的请求后,必须由数据面的可信代理进行验证和授权。可信代理在微服务ZTA模型中主要以 Agent、Sidecar 和 SDK 等方式作为实现,其验证时会联动管控引擎,根据动态策略和实时信任评估进行动态判定。

信任评估除了实时接收控制面的日志、身份、权限等内部信息变动,还可以接收外部分析及信任评估平台提供的外部风险信息。

身份认证平台及设施是整个微服务架构ZTA参考模型的基石,它需要有提供整个验证和授权流程必须的身份和权限管理的能力。

五、TSF的零信任实现

腾讯云 TSF 以微服务为视角,通过网关鉴权、服务鉴权、配置安全、权限管理、行为审计5个安全点,以点带面的形成了一套针对微服务架构安全的解决方案。

从整个架构安全体系建设的角度看,在常见的WAF防火墙、入侵检测、动态感知、漏洞扫描、主机防护、加密机、安全审计等多种安全防护手段中, 服务安全 虽然只是架构安全中的一个环节,但其重要性不言而喻,因为服务和数据是最重要的保护对象。

以上图为例,假设一个用户想要访问 DB 数据,首先通过网关对所有的请求进行鉴权并监控访问行为。TSF 微服务网关通过 JWT、OAuth、密钥对等插件,使用户方便的将原有应用和鉴权方式快速集成到 TSF 体系中,同时针对网关提供了详细的监控指标和可视化视图;通过收集 TSF 平台中的资源、发布、服务、配置等类型的事件,并统一汇聚到 TSF 事件中心和操作记录中,使得每一个用户行为都有迹可循;服务安全通过黑名单、白名单两种鉴权方式,让用户简单配置后就可以获得服务鉴权的能力;在权限管理方面,通过角色+数据集的方式,实现了多租户场景下用户对于 TSF 各功能项的权限分配和管控;针对配置安全,TSF 提供了即插即用的加解密组件,可以适配本地文件配置和分布式配置;

TSF 通过自身支撑侧中服务、接口、人员等元数据信息,统一管理访问主体和受访对象,以标签化的方式构建了 TSF 身份认证平台。通过业务应用侧和支撑侧长连接通讯,一方面可将控制面中的信任评估及动态策略下沉到可信代理,提高可信代理逻辑判断的效率;另一方面可将数据面产生的各类信息、记录、事件等上传到控制面,帮助更准确、更高效的优化管理引擎策略。

网关鉴权

微服务网关作为后端服务的入口,主要提供路由转发、API 管理、Filter 过滤等作用,是微服务体系中的重要组件。

从 ZTA 的角度分析,网关由于主要处理外部请求,所以受访主体主要是人员和终端。同时 TSF 基于插件的形式,对JWT、OAuth、密钥对等常见的鉴权方法热插拔化,使得可信代理的能力可以根据使用场景灵活配置。最后网关也可以通过原有的 Filter 机制,对接外部分析及信任评估平台,如对接自建 OAuth 平台实现高度定制化鉴权管控。

网关分组

分组为 TSF 微服务网关自有概念,其将微服务网关中托管的后端服务 API 进行分类管理,以分组作为 API 的管理单元。如同一个分组下的 API 集合都使用相同的鉴权方法(JWT、OAuth、密钥对等),或者相同业务的不同终端(PC端、H5端、APP端)需要独立监控,都可以分别创建不同的分组进行管理。

创建分组时,每一个分组都需要一个固定的 Context 用以互相区别,同时可以在分组中配置多个密钥对,或挂载 JWT、OAuth 插件。

密钥对鉴权

密钥对需要在控制台中手动创建,包含 SecretId 和 SecretKey,值由 TSF 随机生成。SecretKey 是公钥,SecretId 是用来索引 SecretKey 的,可以认为是 SecretKey 的 ID 编号。密钥对会绑定在微服务网关分组上,建议针对自身安全需求,制定对应的密钥更新计划。网关开启密钥对鉴权后,所有流经网关的请求都需通过密钥对验证。常见使用场景包括:外部服务通过微服务网关访问网关内部服务的接口时需要鉴权的情况。此处注意,网关密钥对是使用对称加密进行签名验证,即虽然网关生成 SecretId 和 Secretkey 时是成对的,但并不是非对称加密的公钥和私钥。

用户的客户端请求时需要在 Header 中携带 SecretId、加密算法、Sign数字签名、Nonce 随机数参数,其中 Sign 的计算方式如下(以 HmacSha256 举例),然后在服务端通过客户端指定的算法重新计算 Sign 并比对。

数字签名的计算公式:sign=Base64(hmacSha256(secretkey,noce+secretId+secretKey))。

客户端header请求头参数说明:

名称位置是否必选说明
x-mg-traceid请求/响应请求响应 ID,用于跟踪异常请求调用。
x-mg-secretid请求授权的 SecretID,用于加签,开启密钥对鉴权时需要,从控制台获取。
x-mg-alg请求/响应加密算法,开启密钥对鉴权时需要,由客户端自行指定。0:hmac_md5 1:hmac_sha_1 2:hmac_sha_256 3:hmac_sha_512 4:国密sm3
x-mg-sign请求/响应签名值。开启密钥对鉴权时需要。
x-mg-nonce请求/响应随机数。开启密钥对鉴权时需要。
x-mg-code响应响应码。

用户请求需在 x-mg-alg 参数中需指明算法。且 TSF 除了支持常见的 HMAC,还 支持国密SM3算法(在SHA-256基础上改进的一种密码杂凑算法),提高了在某些政务加密场景中的适配程度

应用(Service/APP)生成签名的规则:

第一步:组装摘要字符串digestValue = (x-mg-noce)+secretId+secretKey

第二步:使用签名算法加密摘要,得到签名signValue = Base64String(签名算法(secretKey, digetValue ),“utf-8”)

服务端校验签名

第三步:将客户端请求头中的 x-mg-sign 与服务端根据生成签名规则(同客户端)计算的 SignValue 进行比对,如果两值相同则认为鉴权通过,不同则认为鉴权失败。

场景:跨业务线调用鉴权

在大型金融场景中,由于原有业务线需要和系统管理权限对应,会形成各业务线各自分管自己所属微服务的资源、权限配置。那么,在业务线、子公司之间访问时的权限管控问题,就需要借助密钥对鉴权的功能来实现。

微服务 Service 5 通过微服务网关 Gateway A 调用 Service 3,调用成功流程如下图:

调用失败流程如下图:

基于如上场景,需要联合使用鉴权白名单+微服务网关分组+密钥对鉴权,配置步骤如下:

  • 应用部署:如上图完成 Business A 和 Business B 两条业务线中全部 Gateway 和 Service 的部署。* 配置业务线内白名单:完成 Business A 中 Service1-4 的白名单配置,即各 Service 只允许 Business A 内的 Gateway A 和 Service1-4 访问。* 创建网关分组:创建属于 Business A 的网关分组,注意部署组选择属于本业务线的微服务网关。

  • 发布分组 API:控制台进入创建的分组 Business-A,点击 API 列表,点击导入 API,选择 Service 3 需要被 Service 5 访问的 API,返回网关分组列表,点击发布分组,完成所选 API 在 Gateway A 网关上的发布。

  • 配置密钥对鉴权:从微服务网关 Gateway 进入刚创建的网关分组 Business-A,在访问信息页下方密钥管理中新建密钥。
  • 复制密钥到使用方:将刚生成的密钥的 SecretId 和 SecretKey 复制出来,并配置在调用方 Service 5 中的代码应用配置中。* 使用方通过密钥编写数字签名代码:通过代码计算 Sign 签名,然后将 Sign、SecretId、Nonce、AlgType 参数封装在调用请求的 Header 中。* 完成服务调用:使用 Service 5 调用 Gateway A 所暴露出的 API。### JWT鉴权

JWT(JSON Web Token)的表现形式是一个 Token,可将其理解为一个 Json 对象,对象中包含 Header、Payload、Sign 三部分。如用户登录换取 Token 时,该 Token 除了代表用户已登录,还可用来代表用户所具有的权限。因 JWT 中的 Sign 使得通信内容是经过加密签名的,保证了通信双方的数据真实性和完整性,常使用在有通信加密的场景。

JWT 的原理是,客户端通过 JWT 认证服务器认证以后,会返回给客户端一个 JWT 令牌(Token),示例如下(真实长度会更长)。

JWT 分为三部分:Header(头部)、Payload(负载)、Signature(签名),中间用点(.)分隔成三个部分。

  • Header:Header 部分描述 JWT 的元数据。* Payload:Payload 部分用来存放实际需要传递的数据,包括官方定义的字段和用户自定义字段。* Signature:Signature 部分是对前两部分的签名,防止数据篡改。用户使用JWT进行整体流程验证的过程如下:

可见,客户端与服务端通信的时候,都要携带这个 JWT 令牌(Token)。微服务网关 JWT 插件凭此令牌(Token)来校验客户端权限,同时可从 Payload 中获取用户信息,服务端就不再保存任何 Session 数据。此时服务端变成无状态了,比较容易实现横向扩展。

场景:JWT登录校验

在登录场景中,可以使用 JWT 进行登录的令牌验证,同时可以在 JWT 中携带一些可用信息,可以在服务接口调用过程中提高调用效率。

如下图所示为登录场景下 JWT 生成及业务调用的逻辑流程:

详细配置步骤如下:

  • 完成认证代码编写:Auth Server 验证Username、Password及生成 JWT 逻辑。* 在微服务网关中配置 JWT 插件:根据使用的密钥对文件,如下图配置 JWT 插件。

  • 绑定插件对象:将创建的 JWT 插件绑定到某个微服务网关分组,即可针对访问此分组中 API 进行 JWT 鉴权。

OAuth 鉴权

OAuth 插件提供了简单的第三方鉴权对接的能力。外部待鉴权请求先到网关,网关再向第三方鉴权服务请求校验。所以,OAuth 插件需要在已具备 OAuth 验证服务的场景下使用,且插件仅帮助转发 OAuth 认证的请求。

OAuth 插件的时序图如下:

外部请求到业务 API 的请求,会在通过微服务网关时,由网关转发到认证服务器进行认证,认证服务器将认证结果返回给网关,由网关决定外部请求是否继续向下转发。

服务鉴权

TSF 的服务鉴权的对象是在注册中心已注册的微服务,鉴权的方式分为 黑名单和白名单 ,通过 TSF 注册中心与 SDK 的下发通道下发鉴权规则到 TSF-SDK 中(下发通道详见本系列第一篇《治理蓝图》)。当请求到来时,TSF-SDK 通过本地鉴权规则进行判断,通过则交由后续流程继续处理请求,不通过则返回鉴权失败(状态码403 Forbidden)。

当某一个服务配置了多个鉴权规则时,会对多个鉴权规则进行顺序匹配。对于白名单鉴权,顺序匹配时满足某一条规则,请求即被放行。所有规则都不满足,则拒绝请求;对于黑名单鉴权,顺序匹配时满足某一条规则,则拒绝请求,所有规则都不满足,则请求被放行。

同样的,TSF 服务鉴权依托标签化整体能力,通过粗粒度的系统标签和细粒度的自定义标签,灵活对微服务体系内南北流量和东西流量进行权限管理。其基本原理如下图:

服务提供者通过配置中心下发的鉴权规则来判断是否处理服务消费者的请求。TSF-SDK 在收到鉴权规则后,会将鉴权规则缓存下来。当控制台中更新鉴权规则时,本地缓存也会进行准实时更新。

参考微服务 ZTA 参考模型,服务鉴权中的访问主体、受访对象、身份认证、信任评估、动态策略等部分,均以微服务为核心。TSF 增强的点在于基于标签化抽象访问主体和受访对象,并且拉齐了语言、通讯协议、微服务框架、资源、操作系统、CPU 架构等差异,拓宽了服务鉴权可落地范围。

场景:服务间接口访问鉴权

黑名单鉴权常被用于服务间的接口鉴权场景中,比如 Consumer 服务调用 Provider 服务的 /Echo 接口,但 Consumer 服务有两个同时在维护的版本V1和V2,要求只有 Consumer 的V1版本可以访问 /Echo 接口。

此时就可以通过在 Provider 服务上配置黑名单来实现 API 粒度的鉴权。如下图所示,在 Provider 服务中创建黑名单鉴权规则,同时满足上游服务为 Consumer 且版本为V2,访问 Provider 服务的 /Echo 接口时,就会被拒绝访问。

场景:白名单放行部分IP

在传统企业内部的财务部门,对于企业内访问安全及保密程度较高,一般对财务部门会采取物理隔离的方式实现财务部门的数据保密。但是特殊情况下,财务部门需要被国家机关监管,这就要求财务部门的服务可以被外部访问。

此时,可以通过 TSF 服务鉴权中白名单机制来控制。首先,配置可以访问财务部门服务的跳板机并固定 IP。其次,在 TSF 服务鉴权中新建鉴权规则,勾选白名单并选择 系统标签-上游 IP ,填写跳板机 IP,实现仅允许配置 IP 可以访问财务服务的效果。

配置步骤如下:

  • 用户在控制台中在服务治理-服务鉴权 中点击新建鉴权规则 ,并根据如下图所示进行配置。* 通过生效状态按钮控制本条规则的生效状态。

权限管理

RBAC

TSF 的权限管理借鉴了经典的 RBAC(Role-Based Access Control)模型而进行设计,通过对于 TSF 用户、角色、权限的配置,以角色作为灵活管理的权限集合,以数据集作为可操纵的对象集合,清晰的描绘了“用户”是否对“某个动作或对象”具有“权限”的模型关系。

以微服务 ZTA 的视角观察,TSF 通过“角色”来抽象访问主体和受访对象的身份,通过“数据集”来切割数据面的管控范围,帮助控制面灵活、多样、高效的进行身份评估,解决了权限管控变更难、管理粒度粗犷等问题。

TSF语义抽象

TSF 权限管理通过多租户机制隔离各租户,同时使用角色和数据集管理租户下各用户的权限,另外配合TSF的集群和命名空间设计,实现多种组织架构下权限场景的需求。

TSF 作为一体化微服务平台,通过抽象微服务架构中各个概念,实现权限集合(角色)和控制项集合(数据集)的对应关联。

在实际使用场景中,常存在开发、运维、测试、管理者等多种角色,并且各企业中相同角色也可能拥有不同的权限。TSF 支持通过创建不同的角色,灵活的将 TSF 提供的功能关联到企业角色中。

数据集主要用于限定某个角色可管理的范围,比如业务开发一组可能只关注自身使用的集群、命名空间、应用等资源,对其它业务开发组的内容并不希望显示出来。

场景:集团公司权限管理方案

在大型集团公司中,由于组织内部人员架构的复杂性,对微服务平台的权限设计和管理会提出比较高的挑战,其中常见的诉求点如下:

  • 微服务平台的权限方案需要匹配现有集团下各子公司的人员及组织结构;* 针对不同的角色灵活配置不同的权限范围和可视范围;* 生产环境和测试环境(泛指所有测试环境)需要有严格、完整的业务隔离和资源隔离;* 权限的管控力度除了覆盖集群、命名空间等资源方面,还要覆盖到规则、策略等功能项.* …

基于上诉场景诉求,可分别通过:

  • 每个子公司配置一个租户,实现每个子公司基于租户级别的隔离,从而在资源、管理上完全隔开;* 子公司内的每个业务线一套单独的集群,方便每个业务线对资源独占,同时满足只管理自身集群资源的诉求;* 通过命名空间隔离测试、生产环境,实现不同环境间业务的完全隔离和管理;* 超级管理员负责XX集团公司的统一管理,各子公司设立自身的租户管理员,每个业务线设立业务线对应的总负责人,针对开发、测试、运维等角色分别创建角色和对应的数据集,通过如上方法让微服务平台权限体系适配到不同企业的人员组织架构中;针对一些特殊的定制化权限诉求,可以将权限和可视粒度下放到具体的功能项,甚至某个应用上.

配置安全

针对敏感信息,TSF提供了加解密的SDK工具,可通过SDK对敏感信息进行加解密保护,如数据库、消息队列、Redis等中间件的用户名密码等。

通过SDK工具进行加解密的命令格式为:

java -jar spring-cloud-tsf-encrypt-1.1.1-RELEASE.jar [operation] [content] [password]

  • operation: 加解密选项 encrypt或decrypt* content: 密文内容或明文内容* password: 自定义密钥通过如下方法进行测试:

  • 通过链接下载SDK工具:main.qcloudimg.com/raw/3ed3e6e…* 在jar包所在目录执行如下命令进行加密

java -jar spring-cloud-tsf-encrypt-1.1.1-RELEASE.jar encrypt TX_PwDemO_1hblsqT encryptPassword 
  • 在jar包所在目录执行如下命令进行解密
java -jar spring-cloud-tsf-encrypt-1.1.1-RELEASE.jar decrypt 3M7wGw2XtFc5Y+rxOgNBLrm2spUtgodjIxa+7F3XcAo= encryptPassword 

配置加密内容时,可以配置在本地yaml/properties、TSF应用配置/全局配置中,推荐yaml文件中配置,示例如下:

tsf:  inventory:    password:      encrypt2: ENC(3M7wGw2XtFc5Y+rxOgNBLrm2spUtgodjIxa+7F3XcAo=) 

配置密钥内容时,可以在环境变量、JVM参数、启动参数中配置,推荐环境变量中配置,密钥泄露的风险最小,示例如下:

tsf_config_encrypt_password=encryptPassword 

行为审计

操作记录

TSF可以在控制台操作记录中观察到每个租户在什么时间进行了什么样的操作,操作项几乎涵盖了所有TSF控制台功能。并且操作记录支持对资源模块、操作类型的筛选和关键字的搜索,方便用户更快速的针对性查找。

事件中心

TSF可以帮助用户在运维、开发等场景,通过事件驱动的方式管理自身系统。其中,事件类型主要包括资源、发布、服务、弹性方面的变更,还可以基于事件的变化趋势对系统状态进行预判。

最新事件可以及时查看当前发生的事件,同时在事件详情中可以根据时间段查看历史发生过的事件。

另外,事件中心还可以与事件总线联动进行事件告警,当触发预设事件后,通过云函数、传统消息、消息队列等方式进行通知或转发。

六、结语

以上简要介绍了ZTA相关概念,以及TSF是如何依托微服务架构ZTA参考模型理念实现自身服务安全的。未来对于微服务架构安全体系建设的挑战仍有很多,比如身份的智能分析和自动化响应、无口令认证、特权访问管理等。在新技术、新环境下,我们也将持续关注微服务架构在ZTA方面的落地案例和经验。

引用

cloud.tencent.com/document/pr…cloud.tencent.com/developer/a…www.caict.ac.cn/kxyj/qwfb/z…www.weforum.org/agenda/2021…csrc.nist.gov/publication…

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

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

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

相关文章

基于javaweb(springboot)城市地名地址信息管理系统设计和实现

基于javaweb(springboot)城市地名地址信息管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文…

日志门面和日志框架(SpringBoot日志实现)

一、Springboot日志实现简介 SpringBoot是现今市场上最火爆用来简化spring开发的框架,springboot日志也是开发常用的日志系统。SpringBoot默认就是使用SLF4J作为日志门面,Logback作为日志实现来记录日志。 二、application.yml修改日志相关的配置 appl…

Spring入门-IOC/DI相关配置与使用(1)

文章目录Spring入门1,Spring介绍1.1 为什么要学?1.2 学什么?1.3 怎么学?2,Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线2.3 Spring核心概念2.3.1 目前项目中的问题2.3.…

修改RT-Thread 的启动流程,实现显式调用rtthread_startup

一、STM32 单片机的启动流程 单片机上电后,会首先执行定义在startup 文件 中的Reset_Handler 函数,Reset_Handler 函数会首先执行SystemInit 函数,执行完之后,再执行我们常见的main 函数。 二、RT-Thread 启动函数是怎么被调用的…

什么是最少知识原则?-外观模式

外观模式将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。 构建自己的家庭影院 //打开爆米花机,开始爆米花 popper.on(); popper.pop();//调整灯光亮度 lights.dim(10);//把屏幕放下 screen.down();//打开投影仪 projector.on();…

【阶段三】Python机器学习32篇:机器学习项目实战:关联分析的基本概念和Apriori算法的数学演示

本篇的思维导图: 关联分析模型:Apriori算法 关联分析的基本概念和Apriori算法 关联分析是数据挖掘中一种简单而实用的技术,它通过深入分析数据集,寻找事物间的关联性,挖掘频繁出现的组合,并描述组合内对象同时出现的模式和规律。例如,对超市购物的数据进行关联…

缓存Cache-Control

可缓存性指定哪些地方可以缓存publichttp请求返回的过程中,http请求返回的内容所经过的任何路径包括:中间的代理服务器,发出请求的客户端浏览器,都可以对返回的内容进行缓存。private发起请求的浏览器可以缓存。no-cache任何节点都…

【程序员高效率工具】PlantUML —— 使用代码快速绘制时序图、思维导图

本篇思维导图 前言 不管是在工作还是学习,特别是在项目计划初期,我们需要画大量的图将工作内容、项目方案等进行可视化描述,包括但不限于时序图、类图、思维导图等等。 但是对于不经常画图,或者经常使用键盘的孩子,手…

VMware三种网络模式的摸索

VMware三种网络模式的摸索 文章目录VMware三种网络模式的摸索前言一、桥接模式简要描述拓扑图展示配置测试优缺点二、NAT模式简要描述拓扑图展示配置测试优缺点三、仅主机模式简要描述拓扑图展示配置测试优缺点3.总结前言 注意:所有的测试请关闭虚拟机和主机的防火…

微信小程序 - 实现手机号登录--授权并获取手机号保存至本地

详细代码请见文档最下方,仅供参考,更多需要请查看官方文档 一、 微信官方文档 | 获取手机号 这是服务端的 这是我们前端获取手机号需要给接口传递的两个参数 注意: 参数一:获取access_token需要用到小程序密钥,这个…

你可能不知道的20个Git命令,但真的很实用

如果您曾经浏览过git 手册(或 run man git),那么您会注意到 git 的功能比我们大多数人每天使用的要多得多。很多这些命令都非常强大,可以让你的生活更轻松(其他命令有点小众,但仍然很高兴知道)。…

QT-QStackedWidget多窗口应用

前言: 多窗口应用,例如某微信,页面由1,2,3个布局组成。 1-基本流程 页面1控制页面2,通过选择页面1上的按钮或控件 页面2控制页面3,通过选择页面2上的按钮或控件 2-其中页面2中的页面很…

100、【树与二叉树】leetcode ——105. 从前序与中序遍历序列构造二叉树+106. 从中序与后序遍历序列构造二叉树(C++版本)

106. 从中序与后序遍历序列构造二叉树 题目描述 原题链接:106. 从中序与后序遍历序列构造二叉树 解题思路 中序的特点:左中右,后序的特点:左右中。因此可通过后序序列找到中间结点,然后再根据中间结点,分…

3、关键词与标识符

目录 一、关键词 二、标识符 一、关键词 C语言中有32个关键字: 注意:在C语言中,关键字是不允许作为标识符出现在程序中的。 二、标识符 C语言标识符的命名规则: (1)所有标识符必须由字母或下画线开头…

KMP算法 看这一篇就够了 图解刨析+代码

目录 问题背景 逐步剖析 KMP如何优化暴力做法 思考 公共前后缀 next数组 如何构建next数组: 代码实现 问题背景 给定一个字符串 S,以及一个模式串P, P 在字符串 S 中多次作为子串出现。 求出模式串 P 在字符串 S 中所有出现的位置的起始下标。 …

说话人识别中的Temporal pooling(时序池化)

概述 Temporal pooling(时序池化)是说话人识别神经网络中,声学特征经过frame-level变换之后,紧接着会进入的一个layer。目的是将维度为(bs,F,T)(bs,F,T)(bs,F,T)的特征图,变换成维度为(bs,F)(bs,F)(bs,F)的特征向量 …

再不来看看常用的PyCharm快捷键就out了,玩转PyCharm仅此一篇!

最近在学习Python的数据可视化项目,在大学有学过Python,还有一些基础的。目前虽说已经工作,但是兴趣使然,依然想在空闲时间学一些其他技能来充实自己,未雨绸缪! 在使用工具的时候,必定会对工具有…

【话题:工作生活】2021年工作总结--这些人,那些事。

Hello Everyone, 我又开始撰写自己的工作总结了。2021年的工作总结,拖得太久,拖得我也不想写了。每次写自己一年的工作总结,总是要耗费我大量的时间与心力,有时,我也真的是心好累。 好了,懒散、…

【人工智能原理自学】隐藏层:神经网络为什么Working

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔笔记来自B站UP主Ele实验室的《小白也能听懂的人工智能原理》。 🔔本文讲解隐藏层:神经网络为什么Working,一起卷起来叭! 目录一、…

深度学习 11 梯度下降算法改进

数据初始化要点: 1. 梯度下降算法的三种方式: 批量梯度下降法(batch),即同时处理整个训练集.小批量梯度下降法(Mini-Batch )每次同时处理固定大小的数据集.随机梯度下降法(stochastic gradient descent), 每次随机选…