由 Vault 支持的 KES 的 MinIO Operator

news2024/11/25 9:03:54

为了提供安全锁定和擦除的合规性功能,MinIO 使用服务器端加密 (SSE) 在存储层加密对象,以保护对象作为写入操作的一部分。MinIO 以极高的效率做到这一点——基准测试表明 MinIO 能够以接近线速进行加密/解密。

MinIO 使用的秘诀是单指令多数据 (SIMD)。通常,一次只能发送一条 CPU 指令,等待响应后再发送下一条指令。这是非常低效的,尤其是在每秒执行数千条(如果不是数百万条)加密和解密指令时。MinIO 利用 SIMD,因此它可以在单个请求中发送多条指令,由 CPU 处理。我们在 GoLang 中编写了汇编内容,因此我们尽可能靠近硬件层,以充分利用通常未充分利用的 CPU 能力来大规模执行加密操作。

在上一篇文章中,我们向您展示了如何使用 KES 在裸机环境中开始使用 MinIO 和 Vault。在这篇文章中,我们将向您展示如何在 Kubernetes 中以云原生方式使用 KES(密钥加密系统)和 Vault 配置 MinIO Operator。这将使你能够在扩展并使用 Kubernetes 资源来配置它们时自动执行该过程。

先决条件

在开始之前,请确保满足以下先决条件:

  • Kubernetes 集群(在本教程中,我们将使用 kind 创建本地集群)

  • 本地计算机上安装的 kubectl 命令行工具

  • git 用于克隆必要的存储库

步骤 1:使用 kind 部署 Kubernetes 集群

首先,我们将使用 kind 创建一个 Kubernetes 集群。这将为我们提供一个本地环境来部署和测试我们的 MinIO 设置。

首先,创建一个使用以下命令命名 kind-config.yaml 的 kind 配置文件:

$ cat > kind-config.yaml <<EOF

kind: Cluster

apiVersion: kind.x-k8s.io/v1alpha4

nodes:

  - role: control-plane

  - role: worker

  - role: worker

  - role: worker

  - role: worker

EOF


$ kind create cluster --config kind-config.yml

步骤 2:部署 MinIO Operator

随着 Kubernetes 集群的启动和运行,我们现在可以使用该 kustomization 插件部署 MinIO Operator。MinIO Operator 简化了 Kubernetes 环境中 MinIO 实例的部署和管理。

执行以下命令,在集群中kind部署 MinIO Operator:

$ kubectl apply -k github.com/minio/operator

等待所有 Pod 在 minio-operator 命名空间中联机,然后再继续下一步。

第 3 步:设置 HashiCorp Vault

HashiCorp Vault 是一个强大的机密管理工具,我们将使用它来安全地存储和管理我们的加密密钥。要在我们的 Kubernetes 集群中设置 Vault,我们将使用 kubernetes-vault 存储库。

通过运行以下命令克隆存储库:

$ git clone https://github.com/scriptcamp/kubernetes-vault.git

$ cd kubernetes-vault/vault-manifests

接下来,设置必要的 RBAC(基于角色的访问控制)规则,创建 Vault 配置映射,部署 Vault 服务,并设置有状态集:

$ kubectl apply -f rbac.yml

创建 Vault 配置映射

$ kubectl apply -f configmap.yaml

部署 Vault 服务

$ kubectl apply -f services.yaml

由于 Vault 是有状态服务,因此我们需要为其设置一个有状态集。为此执行以下命令

$ kubectl apply -f statefulset.yaml

Vault 设置完成后,解封并初始化 Vault。

$ kubectl exec vault-0 -- vault operator init -key-shares=1 -key-threshold=1 -format=json > keys.json


$ VAULT_UNSEAL_KEY=$(cat keys.json | jq -r ".unseal_keys_b64[]")

$ echo $VAULT_UNSEAL_KEY


$ VAULT_ROOT_KEY=$(cat keys.json | jq -r ".root_token")

$ echo $VAULT_ROOT_KEY


$ kubectl exec vault-0 -- vault operator unseal $VAULT_UNSEAL_KEY

现在,输入 vault-0 POS 以执行其他配置:

$ kubectl exec -it vault-0 -- /bin/sh

在容器内,启用 K/V 后端,创建策略,启用 AppRole 身份验证,创建 KES 角色,并生成应用角色 ID 和密钥:

$ vault secrets enable -version=1 kv

创建策略

$ cat > kes-policy.hcl <<EOF

path "kv/*" {

   capabilities = [ "create", "read", "delete" ]

}


$ vault policy write kes-policy kes-policy.hcl

启用 AppRole 身份验证

$ vault auth enable approle

创建 KES 角色并向其附加策略

$ vault write auth/approle/role/kes-server token_num_uses=0  secret_id_num_uses=0  period=5m

$ vault write auth/approle/role/kes-server policies=kes-policy

生成应用角色 ID 和机密,并记下值

$ vault read auth/approle/role/kes-server/role-id

Key    	Value

---    	-----

role_id	b484633b-8965-08dd-0e24-d6973e6be2d2


$ vault write -f auth/approle/role/kes-server/secret-id

Key               	Value

---               	-----

secret_id         	7fd44d44-a3f1-a013-1f40-e1952496c416

secret_id_accessor	b5ee0c97-5ffc-b9a7-fe0b-763757fe1033

secret_id_ttl     	0s

记下生成的应用角色 ID 和机密,因为我们将在下一步中用到它们。

第 4 步:使用 kustomization 插件部署 KES

要使用 kustomization 插件部署 KES(密钥加密服务),我们首先需要克隆 MinIO 存储库:

$ git clone https://github.com/minio/operator.git

$ cd operator

使用适当的 KES 值更新 examples/kustomization/tenant-kes-encryption/kes-configuration-secret.yaml 文件,包括 Vault 端点、命名空间、前缀以及生成的应用角色 ID 和密钥。

keystore:

  	## KES configured with fs (File System mode) doesnt work in Kubernetes environments and it's not recommended

  	## use a real KMS

  	# fs:

  	#   path: "./keys" # Path to directory. Keys will be stored as files. Not Recommended for Production.

  	vault:

    	endpoint: "http://vault.default.svc.cluster.local:8200" # The Vault endpoint

    	namespace: "default" # An optional Vault namespace. See: https://www.vaultproject.io/docs/enterprise/namespaces/index.html

    	prefix: "my-minio"	# An optional K/V prefix. The server will store keys under this prefix.

    	approle:	# AppRole credentials. See: https://www.vaultproject.io/docs/auth/approle.html

      	id: "b484633b-8965-08dd-0e24-d6973e6be2d2"  	# Your AppRole Role ID

      	secret: "7fd44d44-a3f1-a013-1f40-e1952496c416"  # Your AppRole Secret ID

      	retry: 15s  # Duration until the server tries to re-authenticate after connection loss.

    	tls:    	# The Vault client TLS configuration for mTLS authentication and certificate verification

      	key: "" 	# Path to the TLS client private key for mTLS authentication to Vault

      	cert: ""	# Path to the TLS client certificate for mTLS authentication to Vault

      	ca: ""  	# Path to one or multiple PEM root CA certificates

    	status: 	# Vault status configuration. The server will periodically reach out to Vault to check its status.

      	ping: 10s   # Duration until the server checks Vault's status again.
        

现在,将 KES 服务与 MinIO 租户一起部署:

$ kubectl apply -k operator/examples/kustomization/tenant-kes-encryption

这将部署 KES 和 MinIO pod,如下所示

$ kubectl get pods -n tenant-kms-encrypted

NAME           	READY   STATUS	RESTARTS   	AGE

myminio-kes-0  	1/1 	Running   0          	104m

myminio-kes-1  	1/1 	Running   0          	104m

myminio-pool-0-0   2/2 	Running   0          	101m

myminio-pool-0-1   2/2 	Running   0          	102m

myminio-pool-0-2   2/2 	Running   3 (102m ago)   103m

myminio-pool-0-3   2/2 	Running   4 (102m ago)   104m

使用 KES 的 MinIO 部署现已启动并运行。

步骤 5:验证部署

为了确保我们的部署顺利运行,让我们检查一下 MinIO 租户 pod、KES pod 和操作员 pod 的状态:

$ kubectl get pods -n minio-operator                                                                                                                        	NAME                          	READY   STATUS	RESTARTS   AGE

console-6459d44b76-fgwbt      	1/1 	Running   0      	5h29m

minio-operator-5668d46f98-9p2wm   1/1 	Running   0      	5h29m

minio-operator-5668d46f98-pm98s   1/1 	Running   0      	5h29m


$ kubectl get pods -n tenant-kms-encrypted

NAME           	READY   STATUS	RESTARTS   	AGE

myminio-kes-0  	1/1 	Running   0          	116m

myminio-kes-1  	1/1 	Running   0          	116m

myminio-pool-0-0   2/2 	Running   0          	113m

myminio-pool-0-1   2/2 	Running   0          	114m

myminio-pool-0-2   2/2 	Running   3 (114m ago)   115m

myminio-pool-0-3   2/2 	Running   4 (114m ago)   116m


$ k get pods -n default

NAME     	READY   STATUS	RESTARTS   AGE

vault-0  	1/1 	Running   0      	4h39m

验证 KES Pod 日志以确保没有错误,并且 Pod 按预期运行,如下所示:

$ kubectl logs myminio-kes-0 -n tenant-kms-encrypted                                                                                                        	Copyright   MinIO, Inc.       	https://min.io

License 	GNU AGPLv3        	https://www.gnu.org/licenses/agpl-3.0.html

Version 	2023-04-18T19-36-09Z  linux/amd64


KMS     	Hashicorp Vault: http://vault.default.svc.cluster.local:8200

Endpoints   https://127.0.0.1:7373

        	https://10.244.3.55:7373


Admin   	_                 	[ disabled ]

Mem Lock	off               	Failed to lock RAM pages. Consider granting CAP_IPC_LOCK


{"time":"2024-03-08T07:51:31.333681336Z","request":{"ip":"10.244.1.47","path":"/v1/key/create/my-minio-key","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":400,"time":2871000}}

{"time":"2024-03-08T07:51:32.191375099Z","request":{"ip":"10.244.3.54","path":"/v1/identity/self/describe","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":200,"time":18000}}

{"time":"2024-03-08T07:51:32.191784146Z","request":{"ip":"10.244.3.54","path":"/v1/key/create/my-minio-key","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":400,"time":1739000}}

{"time":"2024-03-08T07:52:01.890935905Z","request":{"ip":"10.244.3.54","path":"/v1/key/generate/my-minio-key","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":200,"time":1888000}}

{"time":"2024-03-08T07:52:02.145905494Z","request":{"ip":"10.244.1.47","path":"/v1/key/generate/my-minio-key","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":200,"time":62000}}

{"time":"2024-03-08T07:52:02.162627602Z","request":{"ip":"10.244.1.47","path":"/v1/key/generate/my-minio-key","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":200,"time":62000}}

{"time":"2024-03-08T07:52:04.850766874Z","request":{"ip":"10.244.3.54","path":"/v1/key/decrypt/my-minio-key","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":200,"time":68000}}

{"time":"2024-03-08T07:52:04.857285115Z","request":{"ip":"10.244.3.54","path":"/v1/key/decrypt/my-minio-key","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":200,"time":53000}}

{"time":"2024-03-08T07:52:07.753077729Z","request":{"ip":"10.244.2.35","path":"/v1/identity/self/describe","identity":"f9daf353b4bb9bba772a369b621a258c9464322c85d1ac9d2aafd29afdb96ea6"},"response":{"code":200,"time":7000}}

步骤 6:测试部署

为了测试我们的部署,我们将创建一个示例存储桶,并从安装了 mc(MinIO 客户端)的调试 Pod 中加载/检索对象。

首先,启动一个新终端并运行以下命令以执行到调试 pod 中:

kubectl exec -it pod/ubuntu-pod -n default -- bash

在调试 Pod 中,执行以下命令创建存储桶、创建加密密钥、上传文件并验证加密,如下所示:

mc alias ls myminio
mc ls myminio
mc mb myminio/encryptedbucket
mc admin kms key create myminio encrypted-bucket-key

echo "Hello" >> file1.txt
mc cp file1.txt myminio/encryptedbucket
mc ls myminio/encryptedbucket
mc cat myminio/encryptedbucket/file1.txt
mc admin kms key status myminio encrypted-bucket-key
mc stat myminio/encryptedbucket/file1.txt

如果所有设置都正确,您应该会看到上传的文件已加密,并且加密密钥状态有效。

下面演示了此过程,如预期的那样:

$ kubectl exec -it pod/ubuntu-pod -n default -- bash                                                                                              	 


root@ubuntu-pod:/# mc alias ls myminio

myminio

  URL   	: https://myminio-pool-0-0.myminio-hl.tenant-kms-encrypted.svc.cluster.local:9000

  AccessKey : minio

  SecretKey : minio123

  API   	: s3v4

  Path  	: auto


root@ubuntu-pod:/# mc ls myminio


root@ubuntu-pod:/# mc mb myminio/encryptedbucket

Bucket created successfully `myminio/encryptedbucket`.


root@ubuntu-pod:/# mc admin kms key create myminio encrypted-bucket-key

Created master key `encrypted-bucket-key` successfully


root@ubuntu-pod:/# echo "Hello" >> file1.txt


root@ubuntu-pod:/# mc cp file1.txt myminio/encryptedbucket

/file1.txt:                        	6 B / 6 B ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 344 B/s 0sroot@ubuntu-pod:/# mc ls myminio/encryptedbucket

[2024-03-08 10:25:01 UTC] 	6B STANDARD file1.txt


root@ubuntu-pod:/# mc cat myminio/encryptedbucket/file1.txt

Hello


root@ubuntu-pod:/# mc admin kms key status myminio encrypted-bucket-key

Key: encrypted-bucket-key

   - Encryption ✔

   - Decryption ✔


root@ubuntu-pod:/# mc stat myminio/encryptedbucket/file1.txt

Name  	: file1.txt

Date  	: 2024-03-08 10:25:01 UTC

Size  	: 6 B    

ETag  	: 27e775e1a5d22463e4cd39f12ce14ea0

Type  	: file

Metadata  :

  Content-Type: text/plain

Encrypted :

  X-Amz-Server-Side-Encryption           	: aws:kms

  X-Amz-Server-Side-Encryption-Aws-Kms-Key-Id: arn:aws:kms:encrypted-bucket-key

如果所有设置都正确,您应该会看到上传的文件已加密,并且加密密钥状态为有效,确认对象已加密。

最后的思考

在这篇博文中,我们探讨了如何在 Kubernetes 环境中部署具有 Vault 支持的 KES 的 MinIO Operator,重点关注服务器端加密 (SSE)。通过利用 Kubernetes 和 kustomization 插件的强大功能,我们可以自动化部署过程,并根据需要轻松扩展我们的 MinIO 设置。

我们采用“左移”方法,强调从开发和规划的最初阶段就嵌入安全和数据保护实践的重要性。其意图很明确:将安全性从单纯的考虑提升为基础架构的基本要素。通过强调 SSE 的简单性和可访问性,我们的目标是鼓励将其作为所有 MinIO 部署的标准采用。实现强大安全性的道路既简单又可实现,为更安全、更可靠的数字环境铺平了道路。

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

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

相关文章

【头歌】HBase扫描与过滤答案 解除复制粘贴限制

解除复制粘贴限制 当作者遇到这个限制的时候火气起来了三分&#xff0c;然后去网上搜索答案&#xff0c;然后发现了一位【碳烤小肥肠】居然不贴代码&#xff0c;XX链接&#xff0c;贴截图&#xff0c;瞬时火气冲顶&#xff0c;怒写此文 首先启动万能的控制台&#xff0c;然后C…

帕金森综合征的预防方法

帕金森综合征是一种慢性神经退行性疾病&#xff0c;目前尚无法彻底治愈。然而&#xff0c;通过采取一些预防措施&#xff0c;可以降低患病风险或延缓病情发展。以下是一些基于最新研究和医学建议的预防方法&#xff1a; 健康饮食&#xff1a;保持低盐、低脂饮食&#xff0c;多吃…

SQL新手蜕变:掌握这20条常用SQL语句,让你也能成为高手!

序言 在现代软件开发中&#xff0c;SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;作为与数据库交互的标准编程语言&#xff0c;是每个开发者必学的基础技能。掌握SQL并在数据库管理与数据分析中应用自如&#xff0c;能显著提升开发效率和数…

语音相关算法学习整理

最近看了一下百度paddlespeech的一些公开课&#xff0c;把课程里的视频内容大体听了一下&#xff0c;现在整理一下笔记。教程链接见&#xff1a;飞桨AI Studio星河社区-人工智能学习与实训社区 语音识别的过程可以这样简单概括&#xff1a; 将声音信号经过预加重、加窗、fft等…

蓝牙数传芯片TD5325A,蓝牙5.1—拓达半导体

拓达TD5325A芯片是一款支持蓝牙BLE&SPP的纯数传芯片&#xff0c;蓝牙5.1版本。芯片的亮点在于性能强&#xff0c;支持APP端直接对芯片做设置与查询操作&#xff0c;包括修改蓝牙名、UUID、MAC地址&#xff0c;以及直接操作蓝牙芯片自身的IO与PWM口&#xff0c;还包括支持简…

开发产品要遵循这些「关键规则」

目录 简介 关键规则 第一点&#xff1a;了解产品的操作使用环境 第二点&#xff1a;尽可能计划将来的功能 第三点&#xff1a;静电 ESD 保护 第四点&#xff1a;尽早考虑 BOM 成本 第五点&#xff1a;开发文件管理&#xff08;原理图、BOM、代码等&#xff09; 产品资源…

如何使用Excel与Outlook实现邮件群发:详细教程

引言 在工作中&#xff0c;我们经常需要发送大量邮件。手动发送既费时又容易出错。本教程将教你如何使用Excel和Outlook&#xff0c;通过简单的VBA代码实现邮件的自动群发&#xff0c;提高工作效率。 准备工作 在开始之前&#xff0c;你需要确保以下工具已经安装在电脑上&am…

1969python房屋租赁管理系统mysql数据库Flask结构BootStrap布局计算机软件工程网页

一、源码特点 python Flask房屋租赁管理系统是一套完善的web设计系统mysql数据库 &#xff0c;对理解python编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 python flask 房屋租赁管理系统 开发环境pycharm mysql …

1958springboot VUE宿舍管理系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot VUE宿舍管理系统是一套完善的完整信息管理类型系统&#xff0c;结合springboot框架和VUE完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09; &#xff0c;系统具有完整的源代码和数…

QML 列表,图片展示(一)

文章目录 1.QML 列表&#xff0c;图片展示效果图2.项目基本说明3.项目详解3.1界面显示部分3.2 网络部分 4.源代码5.flickr图片查询链接&#xff0c;后面我们将调整代码&#xff0c;获取更多图片 1.QML 列表&#xff0c;图片展示效果图 2.项目基本说明 该项目来自Qt示例程序 Ph…

目前哪个充电宝品牌比较好?四款优质充电宝分享

在电量成为现代生活不可或缺的生产资源的时代&#xff0c;选择一款优质的充电宝无疑是保证移动设备持续运作的关键。面对市场上众多品牌和型号的充电宝&#xff0c;消费者在选择时可能会感到困惑和迷茫。本文将为您揭示哪些品牌真正代表了耐用性和质量的典范&#xff0c;让自己…

使用 LangServe 构建和部署 MinIO 支持的 LangChain Agent API

我们在LangChain的创新世界中的旅程揭示了其在转变数据管理和应用程序功能方面的强大能力。 通过之前的讨论&#xff0c;我们深入探讨了几个主题&#xff0c;同时探索了LangChain的复杂功能。在本文中&#xff0c;我们将以“使用 MinIO 赋能 Langchain 代理”中涵盖的概念为基…

数学建模系列(4/4):Matlab建模实战

目录 引言 1. Matlab简介与安装 1.1 Matlab简介 1.2 Matlab的安装 2. Matlab基础操作 2.1 Matlab基础语法和常用命令 2.2 Matlab中的数据类型和数据结构 3. 用Matlab进行建模 3.1 矩阵运算与线性代数 矩阵运算 3.2 Matlab中的绘图功能 绘制2D图形 绘制3D图形 3.3…

AI视频教程下载-用LangChain 开发 OpenAI、 LLAMA 、 Gemini 等AI应用

LangChain MasterClass- OpenAI LLAMA 2 GPT LLM Apps__ Python&#xff08;LangChain MasterClass-Develop 7 OpenAI LLM Apps using Python&#xff09; 探索LangChain、Pinecone、OpenAI、LLAMA 2及Google Gemini Pro LLM在现实世界中的应用。构建AI应用——拥抱脸&#xff…

VirtualBox出错,从主机复制文件,乱改内容

昨天烧录机器&#xff0c;测试对方更新的一个库&#xff1a; 开始正确。后来莫名其妙崩溃。反复烧了几次&#xff0c;都错误。复制了老版本的库&#xff0c;正常。再改回新版本&#xff0c;崩溃。 于是把整个打包目录给了对方&#xff0c;他一对比&#xff0c;发现文件不对&am…

Linux驱动开发(三)--新字符设备驱动开发 LED驱动开发升级

1、新字符设备驱动原理 使用 register_chrdev 函数注册字符设备的时候只需要给定一个主设备号即可&#xff0c;但是这样会 带来两个问题 需要我们事先确定好哪些主设备号没有使用 会将一个主设备号下的所有次设备号都使用掉&#xff0c;比如现在设置 LED 这个主设备号为200&…

Java学习笔记(一)Java内容介绍、程序举例、DOS命令、Java跨平台特性的本质

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍Java内容介绍、程序举例、DOS命令、Java跨平台特性的本质详细介绍以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言 目录 1、内容介绍…

U盘格式化后数据能恢复吗?1分钟了解答案!

“想问问大家如果不小心把u盘格式化后&#xff0c;还有机会恢复吗&#xff1f;一个不小心就按下了格式化按钮&#xff0c;现在后悔莫及&#xff0c;不知道应该怎么操作呢。” U盘就像是一个记忆小盒子&#xff0c;里面装满了珍贵的回忆、重要的文件和无数的心血。但某一天&…

Element 进度条样式优化

在开发后台管理系统时&#xff0c;经常会用到进度条这样一个控件&#xff0c;Element UI中提供了progress这样一个组件&#xff0c;如下图所示&#xff1a; 该组件默认的颜色会比较单一&#xff0c;为此时常需要对该组件的样式进行一些优化&#xff0c;以满足实际项目的需求。 …

世界奇观短视频制作,AI加持,新手也能月入上万

在这个数字化的时代&#xff0c;短视频已经成为了人们获取信息和娱乐的重要途径。特别是那些展示世界奇观的短视频&#xff0c;如极端的气候、危险的动物、美丽的自然景观等&#xff0c;这些主题具有很强的吸引力&#xff0c;能够引起观众的兴趣和好奇心。那么&#xff0c;如何…