目录

  1. 1. 前言
  2. 2. 云计算概念
    1. 2.1. 模式
    2. 2.2. 分类
  3. 3. 攻击面
    1. 3.1. 公有云
    2. 3.2. 私有云
  4. 4. AWS
    1. 4.1. LocalStack 搭建本地环境
    2. 4.2. S3 对象存储
      1. 4.2.1. 基本概念
      2. 4.2.2. Bucket Policy 基础结构
      3. 4.2.3. aws-cli 操作
        1. 4.2.3.1. 创建存储桶
        2. 4.2.3.2. s3api 存储桶策略操作
        3. 4.2.3.3. 存储桶文件操作
      4. 4.2.4. webapi 检索
    3. 4.3. SQS 消息队列
      1. 4.3.1. 创建标准队列
      2. 4.3.2. 列出队列
      3. 4.3.3. 发布消息
      4. 4.3.4. 接收消息
      5. 4.3.5. 删除消息
      6. 4.3.6. 删除队列
    4. 4.4. SNS
    5. 4.5. Cognito
      1. 4.5.1. sts
        1. 4.5.1.1. assume-role-with-web-identity

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

云安全入门

2025/8/28 Web 云安全
  |     |   总文章阅读量:

前言

参考:

https://wiki.teamssix.com/CloudService/

https://github.com/bfengj/Cloud-Security?tab=readme-ov-file

https://lzcloudsecurity.gitbook.io/yun-an-quan-gong-fang-ru-men/


云计算概念

云计算是一种计算模型,它提供了一种通过互联网远程使用共享计算资源的方式。这些计算资源包括计算机处理能力、存储空间、数据库和软件等。这样,用户就可以在需要时随时随地获取这些资源,而不用自己拥有和维护这些硬件和软件。

模式

  • IaaS (Infrastructure-as-a-Service):基础设施即服务。这种模式提供了基础设施层的服务,如虚拟机、存储、网络等,用户可以根据需要自己搭建和管理系统。
  • PaaS (Platform-as-a-Service):平台即服务。这种模式提供了平台层的服务,如数据库、编程框架等,用户可以在这个平台上开发和部署自己的应用程序。
  • SaaS (Software-as-a-Service):软件即服务。这种模式提供了应用层的服务,如电子邮件、协作工具等,用户可以直接使用这些软件。优点是减少安装、减少的繁琐升级操作、统一管理。

分类

  • 公有云:公有云是由云服务提供商提供的服务,可以由多个客户共享。常见的公有云服务包括亚马逊云(AWS)、谷歌云(GCP)、微软云(Azure)等。公有云通常提供自动化、弹性和可伸缩性,适用于应用程序和数据的开发和部署。
  • 私有云:私有云是由单个组织拥有和管理的云服务,只能由该组织的员工使用。私有云常用于保护敏感数据和满足特殊需求。私有云提供了更高的安全性和控制性,适用于数据中心的迁移和现有应用程序的升级。
  • 混合云:混合云是私有云和公有云的结合。它允许组织在公有云和私有云之间进行数据和应用程序的流动。混合云可以提供最佳的安全性和灵活性,适用于多种业务场景。

建立云环境时会用到虚拟化(KVM、Vmware)和容器化(K8S、Docker)技术


攻击面

公有云

需要先了解对应公有云的文档:

AWS:https://docs.aws.amazon.com/
GCP:https://cloud.google.com/docs?hl=zh-cn
Azure:https://azure.microsoft.com/zh-cn/
阿里云:https://help.aliyun.com/
腾讯云:https://cloud.tencent.com/document/api

攻击主要分为两类:

针对租户的攻击:对于在云上的目标,依然存在常见的Web漏洞,SQL注入、弱口令、文件上传、SSRF,除此之外上云还出现了新的攻击方式,例如:AccessKey泄露接管服务器、存储桶配置不当、传统漏洞结合云特性获取实例元数据。

针对云平台的攻击:

  1. 云产品进行文件处理属性时引发漏洞
  2. 攻击中间件
  3. 数据库产品配置
  4. 开源产品已知问题
  5. 虚拟化逃逸

私有云

除了公有云的攻击点以外,还有:

  1. 私有云缺乏有效隔离,可横向攻击
  2. 使用的开源组件列表漏洞
  3. 虚拟化逃逸取得宿主机控制权
  4. 常规应用漏洞(Shiro、Fastjson 等…)

虚拟化

云原生


AWS

全称 Amazon web service (亚马逊网络服务),是亚马逊公司旗下云计算服务平台,为全世界各个国家和地区的客户提供一整套基础设施和云解决方案。

以 AWS 为例,具有如下云服务(各个厂商叫法可能有所区别):

  • S3:对象存储 Simple Storage Service,简单的说就是一个类似网盘的东西,当然跟网盘是有一定区别的。

  • EC2:弹性计算服务 Elastic Compute Cloud,简单的说就是在云上的一台虚拟机。

  • RDS:云数据库 Relational Database Service,简单的说就是云上的一个数据库。

  • IAM:身份和访问管理 Identity and Access Management,简单的说就是云控制台上的一套身份管理服务,可以用来管理每个子账号的权限。

从存储来说,AWS 提供了 S3 作为对象存储工具,可以帮助我们存储大量的数据,并且 S3 可以被 AWS 的其他服务所访问

从服务器资源来说,AWS 提供了 EC2 作为虚拟化的云服务器,提供各种类型的主机,如计算型、通用型、内存计算型、GPU 计算型,等等来满足业务对服务器的需要

在数据库方面,AWS 提供了如 RDS(包含 Mysql、MariaDB、Postgresql)作为关系型存储以及分布式大型关系型数据库 Aurora,同时提供了多种 Nosql 数据库,如 DynamoDB 等,以及数仓如 RedShift


LocalStack 搭建本地环境

总之是一个能在本地起云服务环境的工具

https://docs.localstack.cloud/aws/getting-started/installation/

https://www.freebuf.com/articles/container/409775.html

https://juejin.cn/post/7116453600338903048

https://blog.csdn.net/mzl87/article/details/140460913

这里用 docker compose 起了

services:
  localstack:
    container_name: "${LOCALSTACK_DOCKER_NAME:-localstack-main}"
    image: localstack/localstack
    ports:
      - "127.0.0.1:4566:4566"            # LocalStack Gateway
      - "127.0.0.1:4510-4559:4510-4559"  # external services port range
    environment:
      # LocalStack configuration: https://docs.localstack.cloud/references/configuration/
      - DEBUG=${DEBUG:-0}
    volumes:
      - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"
docker compose up

进入容器,安装 aws-cli,具体安装版本见:https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html

curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install
# 我这里是root用户所以直接安装

配置 aws-cli,这里 ak 和 sk 都直接填 test 了,区域填 us-east-1,格式填 json

aws configure

然后去 ~/.aws/config 下添加一个端点 url,指向本地搭建的 LocalStack 服务,这样后面就不用加 endpoint_url 参数了

[default]
region = us-east-1
output = json
endpoint_url = http://172.18.0.2:4566   

S3 对象存储

对象存储(Object-Based Storage),也可以叫做面向对象的存储,现在也有不少厂商直接把它叫做云存储。

Amazon S3 (Simple Storage Service) 简单存储服务,是 Amazon 的公开云存储服务,与之对应的协议被称为 S3 协议,目前 S3 协议已经被视为公认的行业标准协议,因此目前国内主流的对象存储厂商基本上都会支持 S3 协议。

在 Amazon S3 标准下中,对象存储中可以有多个桶(Bucket),然后把对象(Object)放在桶里,对象又包含了三个部分:KeyDataMetadata

  • Key 是指存储桶中的唯一标识符,例如一个 URL 为:https://teamssix.s3.ap-northeast-2.amazonaws.com/flag,这里的 teamssix 是存储桶 Bucket 的名称,/flag 就是 Key

  • Data 就很容易理解,就是存储的数据本体

  • Metadata 即元数据,可以简单的理解成数据的标签、描述之类的信息,这点不同于传统的文件存储,在传统的文件存储中这类信息是直接封装在文件里的,有了元数据的存在,可以大大的加快对象的排序、分类和查找。

操作 S3 的方式:

  • AWS 控制台
  • AWS-cli
  • AWS SDK
  • REST API

基本概念

Bucket:存储桶,默认不公开

特点:

  • 命名需全球唯一。每个帐号默认可建 100 个,可申请至最多 1000 个
  • 创建者的拥有权不可转让,也不可以从一个 Region 转去别的 Region
  • 没有对象存储数量限制

Object:Bucket 里面每一个存储的数据就是对象,由对象名(键),和数据(值)组成

对象的键(Key)可以很长,甚至按照一定前缀格式来指定,从而模拟文件夹的层级结构,比如 Photo/Family/2020-01-25-new-year/altogether.jpg

每一个对象其实还包含一些元信息(Meta-data),包括系统指定的文件类型,创建时间,加密算法等,和用户上传时指定的元信息。元信息在对象创建后都无法更改。

我们也可以为对象指定最多 10 个标签(Tag),标签的键和值的最大长度是 128 和 256 个字符。这个标签和元信息有什么不同呢?标签是可以修改和新增的。它最大的好处,是可以结合权限控制,生命周期管理,和数据分析等使用。

单个文件上传最大是 5GB。超过的话,需要使用 multipart upload API。最大支持 5TB。

一致性特性:

  • 没有锁的功能。如果同时(几乎)发起两个更新对象的 PUT 请求,键相同,那么,以到达 S 3 时间先后处理更新。
  • 不同对象的更新,没法做到原子操作。
  • 对全新的对象来说,它是 Read-after-Write Consistency 的。也就是写了之后马上读,肯定就是你刚才上传的数据。
  • 如果你要更新数据,那就变成 Eventual Consistency 了。也就是说,更新后马上读,可能是旧的数据,也可能是新的。

如果你先调用 GET 请求访问一个不存在的资源,S3 告诉你它不存在。然后你马上上传数据,再调用一个 GET,这时候是有可能仍然请求不到的


版本控制:一经启用无法暂停


Bucket Policy 基础结构

{
  "Version":"2012-10-17",          // 必须,当前固定
  "Statement":[
    {
      "Sid":"可选唯一标识符",
      "Effect":"Allow"|"Deny",
      "Principal":{
        "AWS":"arn:aws:iam::<AWS_ACCOUNT_ID>:root"          // 或者 {"AWS":["arn1","arn2"]} 等
        // 也可以是 "*"(匿名)或 "Service":"s3.amazonaws.com"
      },
      "Action":[
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject",
        "s3:ListBucket",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource":[
        "arn:aws:s3:::bucket-name",                      // bucket 本身
        "arn:aws:s3:::bucket-name/*"                    // bucket 下所有对象
      ],
      "Condition":{                                    // 可选字段
        "StringEquals":{ "s3:x-amz-server-side-encryption":"AES256" }
      }
    },
    ...                                            // 也可以添加 Deny 语句或多条 Allow
  ]
}
字段 作用 备注
Version 策略语法版本 固定为 2012-10-17
Statement 权限声明列表 至少一条
Sid 语句 ID 可选,主要用于日志跟踪/排查
Effect 结果 AllowDeny
Principal 主体 AWSFederatedService,或 "*"(所有人)
Action 可执行接口 s3:*(全部)或细粒度如 s3:GetObject
Resource 资源 ARN Bucket 或对象范围
Condition 进一步限制 基于 IP、时间、加密方式等

aws-cli 操作

https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli_s3_code_examples.html

部分操作 s3 和 s3api 都有对应的命令

创建存储桶

aws s3 mb s3://amzn-s3-demo-bucket
aws s3api create-bucket \
    --bucket amzn-s3-demo-bucket \
    --region us-east-1

s3api 存储桶策略操作

写入存储桶策略:

aws s3api put-bucket-policy --bucket amzn-s3-demo-bucket --policy file://policy.json

policy.json:

{
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": "*",
         "Action": "s3:GetObject",
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
      },
      {
         "Effect": "Deny",
         "Principal": "*",
         "Action": "s3:GetObject",
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/MySecretFolder/*"
      },
      {
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam::123456789012:root"
         },
         "Action": [
            "s3:DeleteObject",
            "s3:PutObject"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
      }
   ]
}

读取存储桶策略:

aws s3api get-bucket-policy --bucket amzn-s3-demo-bucket

存储桶文件操作

复制本地文件到 s3:

aws s3 cp /tmp/test.txt s3://amzn-s3-demo-bucket/test2.txt

直接移动文件到 s3:

aws s3 mv test.txt s3://amzn-s3-demo-bucket/test2.txt

列出 s3 下的存储桶

aws s3 ls

列出存储桶中的所有前缀和对象:

aws s3 ls s3://amzn-s3-demo-bucket

可用 --recursive 参数递归列出所有对象

s3api 下的操作:

aws s3api list-buckets --query "Buckets[].Name"
# 会跨区域列出所有存储桶

aws s3api list-objects --bucket amzn-s3-demo-bucket --query 'Contents[].{Key: Key, Size: Size}'

aws s3api list-objects-v2 --bucket amzn-s3-demo-bucket
# 这个会列出更详细的信息

aws s3api put-object \
    --bucket amzn-s3-demo-bucket \
    --key my-dir/MySampleImage.png \
    --body MySampleImage.png
# 上传文件

aws s3api get-object --bucket text-content --key dir/my_images.tar.bz2 my_images.tar.bz2
# 下载文件

直接访问 http://localhost:4566/amzn-s3-demo-bucket/test2.txt 可以读取刚才上传的文件


webapi 检索

https://blog.csdn.net/iteye_18543/article/details/81576616

四个参数:prefix、delimiter、MaxKeys、Marker


SQS 消息队列

SQS (Simple Queue Service) 可以用来帮助不同的应用程序之间进行可靠的消息传递,它就像是一个消息中转站,可以把消息从一个地方发送到另一个地方,确保消息的安全送达和处理,让应用程序之间更好地进行通信和协作。

Queue URL 的主要构成部分是 Account ID 和 Queue

{
  "Version":"2012-10-17",                                   // 固定
  "Statement":[
    {
      "Sid":"可选的语句 ID",
      "Effect":"Allow" | "Deny",
      "Principal":{
        // 账户/角色/服务/匿名
        "AWS":"arn:aws:iam::<ACCOUNT_ID>:role/<RoleName>"      // 单一主体
        // 也可以是列表或 “*”(匿名)
        // 还可以是 {"Service":"sqs.amazonaws.com"}
      },
      "Action":[
        "sqs:SendMessage",
        "sqs:ReceiveMessage",
        "sqs:DeleteMessage",
        "sqs:GetQueueAttributes",
        "sqs:ChangeMessageVisibility",
        ...                                    // 按需
      ],
      "Resource":"arn:aws:sqs:<REGION>:<ACCOUNT_ID>:<QUEUE_NAME>",
      "Condition":{                                           // 可选
        "StringEquals":{ "aws:SourceAccount":"123456789012" },
        "IpAddress":{ "aws:SourceIp":"203.0.113.0/24" },
        "ArnEquals":{ "aws:SourceArn":"arn:aws:lambda:<REGION>:<ACCOUNT_ID>:function:<NAME>" },
        "NumericGreaterThan":{ "sqs:ApproximateNumberOfMessages": "0" }
      }
    }
  ]
}

aws-cli api 文档:https://docs.aws.amazon.com/cli/latest/reference/sqs/

webapi 文档:

https://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html

https://docs.aws.amazon.com/zh_cn/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html

创建标准队列

docker 容器内需要有 less,没有的话 apt-get install less

aws --endpoint-url=http://localhost:4566 sqs create-queue --queue-name test_DocAndEvents --region us-east-1
aws --endpoint-url=http://localhost:4566 sqs create-queue --queue-name test_BusinessLayer --region us-east-1
aws --endpoint-url=http://localhost:4566 sqs create-queue --queue-name test_DocProcessor --region us-east-1
aws --endpoint-url=http://localhost:4566 sqs create-queue --queue-name test_Notifications --region us-east-1

列出队列

aws --endpoint-url=http://sqs.us-east-1.localhost.localstack.cloud:4566 sqs list-queues

发布消息

测试 test_DocAndEvents 队列是否正在运行

aws --endpoint-url=http://sqs.us-east-1.localhost.localstack.cloud:4566 sqs send-message --queue-url http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/test_DocAndEvents --message-body "hello world"

接收消息

测试是否可以使用 test_DocAndEvents 队列的消息

aws --endpoint-url=http://sqs.us-east-1.localhost.localstack.cloud:4566 sqs receive-message --queue-url http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/test_DocAndEvents

仅接收最后 10 条

aws --endpoint-url=http://sqs.us-east-1.localhost.localstack.cloud:4566 sqs receive-message --queue-url http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/test_DocAndEvents --max-number-of-messages 10

删除消息

aws sqs delete-message --queue-url http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/test_DocAndEvents --receipt-handle YWEwODNkNTgtOTk1OS00M2E3LWE1ZjctZGZmOWRiY2E2MjRjIGFybjphd3M6c3FzOnVzLWVhc3QtMTowMDAwMDAwMDAwMDA6eGhpYml0X0RvY0FuZEV2ZW50cyA4MDdiODlkNi1mNDgxLTQ2ZDItOGJmZi1hZmRkY2MyZWJkZjcgMTcxMDk0NzE0Ni42NTkwMTEx

删除队列

aws --endpoint-url=http://localhost:4566 sqs delete-queue --queue-url http://localhost:4566/000000000000/test_BusinessLayer

SNS

SNS(Simple Notification Service)可以帮助开发人员向移动设备、电子邮件、消息队列等多种终端发送通知消息,让你能够轻松地向用户传递重要信息和实时更新。简单来说,SNS 就像是一个消息广播系统,让你能够快速、可靠地将消息发送给订阅者,确保他们及时收到你发送的通知。

aws-cli:https://docs.aws.amazon.com/cli/latest/reference/sns/#cli-aws-sns

操作 命令 说明 常用参数
创建主题 aws sns create-topic --name MyTopic 返回 TopicArn --name
删除主题 aws sns delete-topic --topic-arn arn:aws:sns:REGION:ACCOUNT:MyTopic 不能再次使用 --topic-arn
订阅主题 aws sns subscribe --topic-arn arn:aws:sns:REGION:ACCOUNT:MyTopic --protocol email --notification-endpoint user@example.com 需要确认订阅 --protocol, --notification-endpoint
取消订阅 aws sns unsubscribe --subscription-arn arn:aws:sns:REGION:ACCOUNT:MyTopic:3e4fb6b2-… 之后接收不到消息 --subscription-arn
发布消息 aws sns publish --topic-arn arn:aws:sns:REGION:ACCOUNT:MyTopic --message "Hello from CLI!" 也可带 MessageStructure、Subject 等 --message, --subject, --message-structure
列出主题 aws sns list-topics 支持分页(--max-retries--page-size --max-results
列出订阅 aws sns list-subscriptions 同样分页 --max-results
获取主题属性 aws sns get-topic-attribute --topic-arn arn:… --attribute-name DisplayName 属性可读写 --attribute-name
设置主题属性 aws sns set-topic-attribute --topic-arn arn:… --attribute-name DisplayName --attribute-value NewName 替换或新增 --attribute-name, --attribute-value
删除主题属性 aws sns delete-topic-attribute --topic-arn arn:… --attribute-name DisplayName --attribute-name
发布多媒体(使用 MessageStructure json) aws sns publish --topic-arn arn:... --message '{"default":"Hello", "email":"Hello via Email"}' --message-structure json 发送多种格式 --message-structure
使用 AWS‑CLI 的 --cli-input-json aws sns publish --cli-input-json file://payload.json 适合长、复杂的消息 见 below 说明
等待主题删除完成 aws wait sns-topic-deleted --topic-arn arn:… 当你想同步流程 --topic-arn

创建主题、列出主题

aws sns create-topic --name MyTopic

aws sns list-topics

订阅主题,其中 --notification-endpoint 可以指定多种协议

aws sns subscribe --topic-arn arn:aws:sns:us-east-1:000000000000:MyTopic --protocol email --notification-endpoint user@example.com

aws sns subscribe --topic-arn arn:aws:sns:us-east-1:000000000000:MyTopic --protocol http --notification-endpoint http://192.168.65.254:23333

http 端收到的响应:

POST / HTTP/1.1
Host: 192.168.65.254:23333
User-Agent: Amazon Simple Notification Service Agent
Accept-Encoding: gzip,deflate
Accept: */*
Connection: keep-alive
Content-Type: text/plain; charset=UTF-8
x-amz-sns-message-type: SubscriptionConfirmation
x-amz-sns-message-id: 79569c97-d38d-40e3-8447-7678994a8807
x-amz-sns-topic-arn: arn:aws:sns:us-east-1:000000000000:MyTopic
Content-Length: 1171

{"Type": "SubscriptionConfirmation", "MessageId": "79569c97-d38d-40e3-8447-7678994a8807", "TopicArn": "arn:aws:sns:us-east-1:000000000000:MyTopic", "Message": "You have chosen to subscribe to the topic arn:aws:sns:us-east-1:000000000000:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.", "Timestamp": "2025-08-29T03:14:11.585Z", "Token": "75732d656173742d312ff0d80c59f0d80c59f0d80c59f0d80c59f0d80c59f0d8", "SubscribeURL": "http://localhost.localstack.cloud:4566/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-east-1:000000000000:MyTopic&Token=75732d656173742d312ff0d80c59f0d80c59f0d80c59f0d80c59f0d80c59f0d8", "SignatureVersion": "1", "Signature": "agiodi/j5SRUu13tURtpKl+YborNOE9V2SLfNviwRnG7JOPOrdCNl2SMEmlzr+qEBC6APv+2wAVg2UiQu1pYpXzTn4WW4pdDd00fqi4elq7rTPm4wEAfcytR9akdfE/dxnz/Ti2ziAjNGMLHW0vHMFcXyvNHzEr6ylTDQ7X8Nod5J8FW7czdZo3IVDkDY5Bz3u4skWATHtgtmI1dD8fMapCAs04aX9pBF690UN6MngwvAOKNE42n0K56T+sWFL2sAzzbZzX3hQ8ubE6crKAAQ4hi8IgI1u9+evbyr0W0F0UeFlrfi8AN0x4d74J54gx0Lb/T1MBeR4vdz9+r2GfiYA==", "SigningCertURL": "http://localhost.localstack.cloud:4566/_aws/sns/SimpleNotificationService-6c6f63616c737461636b69736e696365.pem"}

在进行 Subscribe 时,如果当前和订阅的主题不在一个 AWS 账号下,还需要进行确认订阅操作,在进行确认操作的时候,就需要使用主题返回的 Token 值了

aws sns confirm-subscription \
    --topic-arn arn:aws:sns:us-east-1:000000000000:MyTopic \
    --token 75732d656173742d312ff0d80c59f0d80c59f0d80c59f0d80c59f0d80c59f0d8


Cognito

AWS Cognito 是一项托管服务,可帮助开发人员轻松添加用户身份验证和授权功能到应用程序中。它提供了用于注册、登录和管理用户的功能,支持常见的身份验证方法,如用户名/密码、社交媒体登录和身份提供商集成。Cognito 还提供了用户身份验证的安全性、可伸缩性和可定制性,并与其他 AWS 服务集成,使开发人员能够构建安全可靠的应用程序。

文档:https://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/cognito-identity.html

要使用 Cognito 需要在控制台先创建一个 Amazon Cognito 身份池,然后填入创建的身份池 ID 去调用 SDK 获取临时凭证,最后通过临时凭证去操作资源

调用 SDK 的部分以 javascript 为例:https://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/getting-credentials.html

// Set the region where your identity pool exists (us-east-1, eu-west-1)
AWS.config.region = 'us-east-1';

// Configure the credentials provider to use your identity pool
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'IDENTITY_POOL_ID',
    Logins: { // optional tokens, used for authenticated login
        'graph.facebook.com': 'FBTOKEN',
        'www.amazon.com': 'AMAZONTOKEN',
        'accounts.google.com': 'GOOGLETOKEN',
        'appleid.apple.com': 'APPLETOKEN'
    }
});

// Make the call to obtain credentials
AWS.config.credentials.get(function(){

    // Credentials will be available when this function is called.
    var accessKeyId = AWS.config.credentials.accessKeyId;
    var secretAccessKey = AWS.config.credentials.secretAccessKey;
    var sessionToken = AWS.config.credentials.sessionToken;

});

由于我这里没有注册 aws,实际操作可见 The-Big-IAM-Challenge Do I know you?

sts

Security Token Service (STS) 安全令牌服务允许请求一个有限权限的凭据

aws-cli 文档:https://docs.aws.amazon.com/cli/latest/reference/sts/#cli-aws-sts

assume-role-with-web-identity

返回一组临时安全凭证,用于已在移动端或 Web 应用程序中通过了 Web 身份提供商进行身份验证的用户

assume-role-with-web-identity \
--role-arn <value> \
--role-session-name <value> \
--web-identity-token <value>

三个参数:

  • role-arn:即 arn 那串,调用者所承担的角色的 Amazon 资源名称 (ARN)
  • role-session-name:可以自定义
  • web-identity-token:身份提供商提供的 OAuth 2.0 访问令牌或 OpenID Connect ID 令牌,需要从身份池 ID 获取

获取 token 可以查看 aws-cli 文档:https://docs.aws.amazon.com/de_de/cli/latest/reference/cognito-identity/index.html