当前位置: 首页 > news >正文

Windows PowerShell的安全目标——安全警报

Windows PowerShell的安全目标——安全警报

1. 保证Shell安全

​ 自从2006年年底PowerShell发布以来,微软在安全和脚本方面并没有取得很好的名声。毕竟那个时候,**VBScript和Windows Script Host(WSH)**是两个最流行的病毒和恶意软件的载体,它们经常成为臭名昭著的“I Love You“ "Melissa"等其他病毒的攻击点。当PowerShell团队宣布他们创造了一种新的、能提供前所未有强大的功能与可编程能力的命令行Shell语言时,我们认为,警报来临,人们将对这种新的命令行Shell避之不及。但是,没关系。Power Shell时在比尔·盖茨先生在微软发起的一个“可信赖计算计划”之后才进行开发的。

2. Windows PowerShell的安全目标

​ 我们需要明确,当谈及安全时,PowerShell会做什么,又不会做什么;最好的办法是列出一些PowerShell的安全目标。首先,PowerShell不会给被处理的对象任何额外的权限。也就是说,PowerShell仅会在你已拥有的权限主体下处理对象。其次,PowerShell无法绕过既有的权限。比如,想为你的用户部署某个脚本,并希望该脚本能完成某些操作——正常情况下这些用户会由于权限不足无法完成的某些操作,那么该脚本同样不能运行。如果希望用户可以完成某些操作,那么必须给他们赋予对应的权限;PowerShell仅能完成这些用户凭借现有权限执行命令或者脚本可以完成的工作。PowerShell的安全并不是针对恶意软件的防护。一旦在你的系统上存在恶意软件,那么恶意软件可以做你权限范围内的任何事情。它可能使用PowerShell去执行一些恶意命令,也有可能非常轻易地使用多种其他技术损坏你的电脑。一旦在你的系统中存在恶意软件,那么你就被”挟持“了。当然,PowerShell也并不是第二道防御系统。此时,首先你需要杀毒软件来阻止恶意软件进入你的系统。对大部分人而言,可能忽略这样的一个重要概念:即使恶意软件可能借助PowerShell去完成一些危害行为,也不应该将恶意软件问题归咎于PowerShell。杀毒软件必须阻止恶意软件运行。再次申明,PowerShell设计出来并不是为了保护一个已经受损的系统。

3. 执行策略和代码签名

PowerShell中第一个安全措施是执行策略。执行策略是用来管理PowerShell执行脚本的一种计算机范围的设置选项。该策略主要用作防止用户被注入,从而执行一些非法脚本。

3.1 执行策略设置

​ 默认设置是Restricted,该策略会阻止正常脚本的运行。也就是说,默认情况下,你可以使用PowerShell进行交互式执行命令,但是你不能使用PowerShell执行脚本。如果你尝试执行脚本,你会得到下面的错误。

无法加载文件 C:\test.ps1,因为在此系统中禁止执行脚本。有关详细信息,请参阅”get -help about_signing"。
所在位置 行:1 字符:11
+ .\test.ps1 <<<+ CategoryInfo			: NotSpecified: (:) [], PSSecurityException+ FullyQualifiedErrored :RuntimeException			

​ 你可以通过Get-ExecutionPolicy命令来查看当前的执行策略。另外,如果你想修改当前的执行策略,可以采用下面3种方式之一。

  • 运行Set-ExecutionPolicy命令。该命令会修改Windows注册表重点HKEY_LOCAL_MACHINE部分,但是需要在管理员权限下才能执行该命令,因为一般用户没有修改注册表的权限。
  • 使用组策略对象(GPO)。从Windows Server 2008 R2开始,Windows PowerShell相关的设置已经包含在内。如果因为某些原因你不得不继续使用老版本的域,可以通过访问网站http://download.microsoft.com,之后在搜索框中搜索PowerShell ADM进行查找。如图所示,我们可以在“本地计算机策略” → 用户配置 →管理模板→Windows组件→Windows PowerShell中找到PowerShell的设置选项。
    在这里插入图片描述

我们将该策略设置为”启用“的状态。当通过组策略对象来配置时,组策略中的设定会覆盖本地的任何设置值。实际上,如果你试图运行Set-ExecutionPolicy,命令可以正常执行,但是会返回一个警告。该警告会告知由于组策略覆盖的原因,新修改的设定值不会生效。如图所示。

在这里插入图片描述

  • 通过手动运行PowerShell.exe,并且给出-ExecutionPolicy的命令行开关参数。如果采用这种方式,那么命令中指定的执行策略会覆盖本地任何设置和组策略中的设置值。你可以将执行策略设置为5种值(请注意:组策略对象中包含下面列表重点3个选项)。

  • Restricted——这是默认选项,除微软提供的一部分配置PowerShell的默认选项的脚本外,不允许执行其他任何脚本。这些脚本中附带微软的数字签名。如果修改这些数字签名,那么这些脚本就再也无法运行了。

  • AllSigned——经过受信任的证书颁发机构(CA)设计的数字证书签名后的任意脚本,PowerShell均可执行。

  • RemoteSigned——PowerShell可以运行本地任何脚本,同时也可以执行受信任的CA签发的数字证书签名之后的原创脚本。”远程脚本“是指存在于远端计算机上的脚本,经常通过通用命名规则(UNC)方式访问这些脚本。我们也会将来自于网络上的脚本称为”远程脚本“。

  • Unrestricted——可以运行所有脚本。我们并不是很喜欢或不建议使用这个设置选项,因为该设置选项无法提供足够的保护功能。

  • Bypass——这个特殊的设定主要是针对应用程序开发人员,他们会将PowerShell嵌入到他们的应用程序中。这个设定值会忽略已经设置好的执行策略,应当仅在主机应用程序提供了自身的脚本安全层时才使用该选项。你最终告诉PowerShell的是“别担心,安全问题我已经全部搞定”。

**微软强烈建议在执行脚本时使用RemoteSigned执行策略,并且仅在需要执行脚本的机器上采用该策略。**根据微软的建议,其他计算机应当继续保持Restricted的执行策略。RemoteSigned策略在安全性和功能之间取得了较好的平衡;AllSigned相对更严格,但是它要求所有脚本都需要被数字签名。

**注意:**多个专家,包括微软的一些开发人员,都建议使用Unrestricted作为执行策略。他们觉得该功能并没有提供一个安全层,并且你也不应该相信该设置可以将任何危险的行为隔离开。

3.2 数字代码签名

​ 数字代码签名,简称为代码签名,是指将一个密码签名应用到一个文本文件的过程。签名会显示在文件末端,并且类似下面的形式。

<!-- SIG # Begin signature block  -->
<!-- MiIXXAYJKoZIhvcNAQ.......... -->
<!-- ............................ -->
.....
<!-- SIG # End signature block -->

​ 签名中包含了两部分重要信息:一是列出了对脚本签名的公司或者组织;二是包含了对脚本的加密副本,并且PowerShell可以解密该副本。在创建一个数字签名之前,你需要拥有一个代码签名的证书。这些证书也被称为第三类证书。这些证书均由商业CA签发,比如Cybertrust、GoDaddy、Thawte、VeriSign等公司。当然,如果可能的话,你也可以从公司的公钥基础设施(PKI)中获取到该证书。正常情况下,第三类证书仅会签发给公司或者组织,而不会发给个人。当然,在公司内部可以签发给个人。在签发证书之前,CA需要验证接收方的身份——证书类似一种数字识别卡,该卡上列出了持有者的姓名以及其他详细信息。比如,在签发证书给XYZ公司之前,CA需要验证XYZ公司的授权代表人提交了该请求。在整个安全体系中,验证过程是其中最重要的环节,你应当仅信任能出色完成验证申请证书的公司身份工作的CA。如果你对一个CA的验证流程不熟悉,那么你不应该信任该CA。 应当在Windows的IE属性控制面板(也可以在组策略中配置)中配置信任关系。在该控制面板中,选择Content标签页,然后单击Publishers按钮。在弹出的对话框中,选择“受信任的根证书颁发机构”标签页。如图所示,你可以看到计算机信任的CA列表。
在这里插入图片描述

​ 当你信任一个CA之后,你也会信任该CA签发的所有证书。如果有人使用一个证书对恶意脚本进行签名,那么你可以通过该证书去查找该脚本的作者——这也就是为什么已签名的脚本相对于未签名的脚本更加值得“信任”。但是如果你信任一个无法很好验证身份的CA,那么一个恶意脚本的作者可能会获取一个虚假的证书,这样就无法使用该CA的证书去做追踪。这也就是为什么选择一个受信任的CA是如此重要。

​ 一旦你获取了一个三级证书(具体而言,你需要一个包装为带有验证码的证书——通常CA会针对不同的操作系统以及不同的编程语言提供不同的证书),之后将该证书安装到本地计算机。安装之后,你可以使用PowerShell的Set-AuthenticodeSignature Cmdlet将该数字签名应用到一段脚本。如果需要查看更详细的信息,你可以在PowerShell中执行Help About_Signing命令。许多商业的脚本开发环境(PowerShell Studio、PowerShell Plus以及PowerGUI等)都可以进行签名,甚至可以在你保存一段脚本时进行自动签名,这样是的签名过程中更加透明。

​ 签名不仅会提供脚本作者的身份信息,也会确保在作者对脚本签名之后,不会被他人更改。实现原理如下。

(1)脚本作者持有一个数字证书,该密钥包含两个密钥:一个公钥、一个私钥。

(2)当对脚本进行签名时,该签名会被私钥加密。私钥仅能被脚本开发者访问,同时仅有公钥能对该脚本进行解密。在签名中会包含脚本的副本。

(3)当PowerShell运行该脚本时,它会使用作者的公钥(包含在签名中)解密该签名。如果解密失败,则说明签名被篡改,那么该脚本就无法被运行。如果签名中的脚本副本与明文文本不吻合,那么该签名就会被识别为损坏,该脚本也无法被允许。

当执行脚本时,PowerShell处理的整个流程如下图所示。
在这里插入图片描述

4. 其他安全措施

​ PowerShell包含另外两种总是一直有效的重要安全设置。一般情况下,它们应该保持默认值。首先,Windows不会将PS1文件扩展名(PowerShell会将PS1识别为PowerShell的脚本)视为可执行文件类型。双击打开PS1文件,默认会使用记事本打开进行编辑,而不会被执行。该配置选项会保证即使PowerShell的执行策略允许执行该脚本,用户也不会在不知晓的情况下运行某段脚本。

​ 其次,在Shell中不能通过键入脚本名称执行该脚本。Shell不会在当前目录中搜索脚本,也就是说,如果有一个test.PS1的脚本,切换到该脚本路径下,键入test或者test.PS1都不会运行该脚本。比如下面的例子。

PS C:\> test无法将“test"项识别为Cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后重试。
所在位置行:1 字符:5
+ test<<<+ CategoryInfo			:  ObjectNotFound: (test:String) [], CommandNotFoundException+ FullyQualifiedErrorId :CommandNOtFoundExceptionsuggestion [3,General]:未找到命令test,但它确实存在于当前位置。Windows PowerShell默认情况下不从当前位置加载命令。如果信任此命令,请改为键入 ”.\test"。有关更多详细
信息,请参阅“get-help about_Command_Procedence"。
PS C:

​ 如你所见,你可以发现,PowerShell会检测该脚本,但是会给出警告信息:必须通过绝对路径或者相对路径来运行该脚本。因为test.PS1脚本位于C:目录下,所以你可以键入C:\test(绝对路径)或者运行.\test(指向当前路径的相对路径)。

​ 该安全功能的目的是为了防止成为”命令劫持“的攻击类型。在该攻击中,它会将一个脚本文件放入到一个文件夹中,然后将它命名为某些内置的命令名,比如Dir。在PowerShell中,如果你在一个命令前面没有加上路径——比如运行Dir命令,那么你很明确运行的这个命令的功能;但是如果运行的是.\Dir,那么你就会运行一个名为Dir.PS1的脚本。

5. 其他安全漏洞

​ PowerShell的安全主要是在于防止用户在不知情的情况下运行不受信任的脚本。没有什么安全措施可以阻止用户向Shell手动键入命令或者拷贝一个脚本的全部内容,然后粘贴进Shell中(尽管以该种方式运行脚本,可能不会有相同的作用)。恶意脚本很难让用户去手动执行,以及指导用户如何去做,这也就是为什么微软并没有将该种场景作为一个潜在的攻击因素。但是请记住,PowerShell并不会给与用户额外的权限——用户仅能做权限允许的事情。某些人可能会通过电话联系用户或者发送邮件方式,让用户打开PowerShell程序,然后键入一些命令,最后损坏他们的 计算机。但是这些人也可以不通过PowerShell而是其他方式去攻击某些用户。说服一个用户打开资源管理器,选择Program Files文件夹,然后按键盘上的Delete键是非常容易的(当然, 视你自己的真实情况,也可能比较困难)。在某些方面,比起让用户执行相同功能的PowerShell命令,这会更加容易。指出这一点,是因为人们总是倾向于对命令行以及其看起来具备无限多功能以及功能延伸到焦虑不安,但是事实上,你和你的用户如果通过其他方式无法完成某些工作,那么在PowerShell中你也是无法完成的。

6. 安全建议

​ 微软建议针对需要运行脚本的计算机,将PowerShell的执行策略设置为RemoteSigned。当然,你也可以考虑设置为AllSigned或者Unrestricted。AllSigned选项相对来说可能比较麻烦,但是如果采用了下面两条建议,那么该选项会变得更加方便。

  • 商业CA针对一个代码签名证书,每年最多收费900美元。如果你没有一个内部的PKI可以提供免费的证书,那么你也可以自己制作。运行Help About_Signing可以查询如何获取以及使用MakeCert.exe,该工具可以用来制作一个本地计算机信任的证书。如果你仅需要在本地计算机运行脚本,那么这种方式是较快免费获取一个证书的方式。根据你所使用的PowerShell版本, 你还可以使用一个名称为New-SelfSignedCertificate的Cmdlet,也能完成同样的工作。
  • 通过上面提及的编辑器去编辑一段脚本 ,这些编辑器在你每次保存这些脚本时对脚本进行签名。通过这种方式,签名过程更加透明以及自动化,这样对用户来说更加方便。

​ 不太建议去修改.PS1文件名的关联性。曾经有人修改了Windows的一些设置,将.PS1视为一种可执行文件,也就意味着,你可以通过双击一个脚本来执行它。如果采用这样的方式,那么我们就回到使用VBScript时的糟糕日子,所以你需要避免该问题。

相关文章:

Windows PowerShell的安全目标——安全警报

Windows PowerShell的安全目标——安全警报 1. 保证Shell安全 ​ 自从2006年年底PowerShell发布以来&#xff0c;微软在安全和脚本方面并没有取得很好的名声。毕竟那个时候&#xff0c;**VBScript和Windows Script Host(WSH)**是两个最流行的病毒和恶意软件的载体&#xff0c…...

k8s笔记1- 初步认识k8s

k8s简介&#xff1a; kubernetes&#xff0c;俗称k8是&#xff0c;用于自动部署&#xff0c;扩缩和管理容器化应用程序的开源系统&#xff0c;它将组成应用程序的容器&#xff0c;组合成逻辑单元&#xff0c;便于管理和服务发现。 k8s的作用 自动化上线和回滚、存储编排…...

ARM CCA机密计算软件架构之内存加密上下文(MEC)

内存加密上下文(MEC) 内存加密上下文是与内存区域相关联的加密配置,由MMU分配。 MEC是Arm Realm Management Extension(RME)的扩展。RME系统架构要求对Realm、Secure和Root PAS进行加密。用于每个PAS的加密密钥、调整或加密上下文在该PAS内是全局的。例如,对于Realm PA…...

python基于flask实现一个文本问答系统

from flask import Flask, render_template, requestapp Flask(__name__)# 一个简单的问题-答案映射&#xff0c;实际中可以使用更复杂的存储结构&#xff08;数据库等&#xff09; qa_pairs {"什么是人工智能&#xff1f;": "人工智能是模拟人类智能的一种机…...

lambda表达式使用和示例

lambda表达式 什么是lambda 学习lamdba有两个结构十分关键&#xff0c;一个是lamdba自己&#xff0c;另一个是函数式接口 lamdba lamdba表达式本质上就是匿名方法&#xff0c;不能独立运行用于实现函数式接口定义的另一个方法&#xff0c;因此lamdba会产生一个匿名类lamdba…...

STM32学习笔记十八:WS2812制作像素游戏屏-飞行射击游戏(8)探索游戏多样性,范围伤害模式

前面我们的攻击手段比较单一&#xff0c;虽然已经分出了 EnemyT1 / EnemyT2 / EnemyT3&#xff0c; 但里面还是基本一样的。这回&#xff0c;我们尝试实现一些新的攻击方法&#xff0c;实现一些新的算法。 1、前面我们小飞机EnemyT1 的攻击方式是垂直向下发射子弹。 那么大飞机…...

C#获取windows系统资源使用情况

1.前言 之前有一篇博客介绍如何获取Linux服务器上的资源使用情况《Java 获取服务器资源&#xff08;内存、负载、磁盘容量&#xff09;》&#xff0c;这里介绍如何通过C#获取Window系统的资源使用。 2.获取服务器资源 2.1.内存 [DllImport("kernel32.dll")][retu…...

PE解释器之PE文件结构

PE文件是由许许多多的结构体组成的&#xff0c;程序在运行时就会通过这些结构快速定位到PE文件的各种资源&#xff0c;其结构大致如图所示&#xff0c;从上到下依次是Dos头、Nt头、节表、节区和调试信息(可选)。其中Dos头、Nt头和节表在本文中统称为PE文件头(因为SizeOfHeaders…...

Android—— MIPI屏调试

一、实现步骤 1、在kernel/arch/arm/boot/dts/lcd-box.dtsi文件中打开&dsi0节点&#xff0c;关闭其他显示面板接口&#xff08;&edp_panel、&lvds_panel&#xff09; --- a/kernel/arch/arm/boot/dts/lcd-box.dtsib/kernel/arch/arm/boot/dts/lcd-box.dtsi-5,14 …...

BLE协议—协议栈基础

BLE协议—协议栈基础 BLE协议栈基础通用访问配置文件层&#xff08;Generic Access Profile&#xff0c;GAP&#xff09;GAP角色设备配置模式和规程安全模式广播和扫描 BLE协议栈基础 蓝牙BLE协议栈包含三部分&#xff1a;主机、主机接口层和控制器。 主机&#xff1a;逻辑链路…...

yolov8知识蒸馏代码详解:支持logit和feature-based蒸馏

文章目录 1. 知识蒸馏理论2. yolov8 蒸馏代码应用2.1 环境配置2.2 训练模型(1) 训练教师模型(2) 训练学生模型baseline(3) 蒸馏训练3. 知识蒸馏代码详解3.1 蒸馏参数设置3.2 蒸馏损失代码讲解3.2.1 Feature based loss3.2.1 Logit loss3.3 获取蒸馏的feature map及channels...

03-微服务-Ribbon负载均衡

Ribbon负载均衡 1.1.负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。 那么我们发出的请求明明是http://userservice/user/1&#xff0c;怎么变成了http://localhost:8081的呢&#xff1f; 1.2.源码跟踪 为什么我们只输入…...

2023新年总结与展望

2023年总结 对Spring Cloud微服务更加熟悉&#xff0c;对consul、kafka、gateway的熟悉和掌握更近一步对docker和虚拟化部署更加熟悉对PostgreSQL数据库和JPA更加熟悉对clickhouse数据库和大数据分析更加熟悉对netty和socket网络通信更加熟悉 2024年flag 继续深入研究和学习…...

论文阅读——SG-Former

SG-Former: Self-guided Transformer with Evolving Token Reallocation 1. Introduction 方法的核心是利用显著性图&#xff0c;根据每个区域的显著性重新分配tokens。显著性图是通过混合规模的自我关注来估计的&#xff0c;并在训练过程中自我进化。直观地说&#xff0c;我们…...

常用环境部署(十三)——GitLab整体备份及迁移

一、GitLab备份 注意&#xff1a;由于我的GitLab是docker安装的&#xff0c;所以我的操作都是在容器内操作的&#xff0c;大家如果不是用docker安装的则直接执行命令就行。 1、Docker安装GitLab 链接&#xff1a;常用环境部署(八)——Docker安装GitLab-CSDN博客 2、GitLab备…...

海外数据中心代理与住宅代理:优缺点全面对比

数据中心代理和住宅代理是为了匿名而开发的&#xff0c;通过替换网站眼中您自己的 IP 地址。然而&#xff0c;它们在价格、功能、性能或最佳用例方面存在一些差异。那么&#xff0c;这些代理类型到底有什么相似点和不同点呢&#xff1f; 一、什么是数据中心代理&#xff1f; 1…...

springboot实现OCR

1、引入依赖 <dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.4</version> </dependency> 2、config Configuration public class TessOcrConfiguration {Beanpublic …...

【Scala 】注解

在 Scala 中&#xff0c;你可以使用注解来为类、方法或字段添加元数据&#xff0c;影响它们的行为。Scala 的注解使用与 Java 类似&#xff0c;但是 Scala 也支持自定义注解。 文章目录 注解的常见使用方法自定义注解 注解的常见使用方法 以下是一些 Scala 中常见的注解以及它…...

数通基础知识总结

1. 基础概念 1.1. 通信基本原理 通信基本原理涉及信息的生成、编码、传输和解码的过程。在实际应用中&#xff0c;例如电话通信&#xff0c;信息通过话筒转换成模拟信号&#xff0c;经过传输线路传递到接收端&#xff0c;再由耳机解码还原为可理解的信息。 1.2. 信道和信号 …...

机器学习深度学习面试笔记

机器学习&深度学习面试笔记 机器学习Q. 在线性回归中&#xff0c;如果自变量之间存在多重共线性&#xff0c;会导致什么问题&#xff1f;如何检测和处理多重共线性&#xff1f;Q. 什么是岭回归(Ridge Regression)和Lasso回归(Lasso Regression)&#xff1f;它们与普通线性回…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...