在AWS(亚马逊云服务)中,AK、SK和Session Token是三种核心的身份验证凭证,它们共同构成了AWS资源访问的安全基石。下面我将从严谨的技术定义和通俗易懂的类比两个层面,为大家详细讲解。

一、严谨的技术定义与关系

根据AWS的官方设计与实践,这三者可以定义如下:

  1. AK (Access Key ID)

    • 定义:AK,全称Access Key ID,是AWS分配给一个IAM用户或角色的唯一标识符,用于在程序化访问(如API调用、CLI命令)中标识“你是谁”。它类似于一个用户名。

    • 格式:通常以 AKIA 开头的一串字符,例如 AKIAIOSFODNN7EXAMPLE

    • 性质:它可以部分公开,但不应主动泄露。

  2. SK (Secret Access Key)

    • 定义:SK,全称Secret Access Key,是与AK配对的机密密钥。它是实际用于对API请求进行加密签名的“密码”

      。客户端使用SK对请求内容生成一个数字签名(Signature),以证明请求的完整性和来源真实性。

    • 格式:一串很长的、复杂的字符串,例如 wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

    • 性质必须绝对保密。一旦泄露,他人可能完全控制该凭证所关联的AWS资源,造成数据泄露、资源破坏或产生巨额账单

      。AWS仅在创建时显示一次,不会保存。

  3. Session Token

    • 定义:Session Token,在AWS上下文中特指通过安全令牌服务(STS)获取的临时安全凭证的一部分。它用于验证一组临时AK/SK的有效性。

    • 产生场景:当通过STS服务扮演(Assume)一个IAM角色,或获取临时凭证时,返回的凭证集中会包含一组新的临时AK、SK和一个Session Token。

    • 作用:这组临时凭证(AK+SK+Token)必须作为一个整体使用。Session Token证明了这组临时凭证是经过STS授权颁发的,且仍在有效期内。单独使用临时的AK/SK而不提供Token,请求会被拒绝。

三者关系总结(针对临时凭证):在临时安全凭证的场景下,AK用于标识身份,SK用于对请求签名,而Session Token则是这组临时凭证合法有效的“票据”或“证明”。它们三者必须一同提供才能完成认证。

二、通俗易懂的类比

为了帮助你更好地理解,我们可以用几个生活中的场景来类比:

  1. 长期AK/SK(办公室门禁卡)

    • AK 就像是门禁卡上的工号,一眼就能看到是谁的卡。

    • SK 就像是门禁卡内部的加密芯片,刷卡时门禁系统通过读取芯片信息来验证卡的真伪和权限。

    • 这套凭证是长期有效的,由公司直接颁发给员工(IAM用户)。

  2. 临时AK/SK + Session Token(访客通行证)

    • 想象一位访客要进入大楼。他需要在前台(STS服务)登记。

    • 前台会根据他的访问目的,给他颁发一张临时访客卡(这包含了临时的AK和SK)。

    • 同时,前台还会给他一张带有时间和访问区域限制的纸条,这就是 Session Token

    • 访客在楼内通行时,必须同时出示访客卡和纸条。保安(AWS服务)会检查卡的有效性,并核对纸条上的时间(是否过期)和区域(是否有权进入当前区域)。

    • 一旦纸条上的时间到期,或者访客离开了大楼,这套临时凭证就失效了,安全性更高。

三、核心区别与使用场景

特性

长期AK/SK

临时AK/SK + Session Token

有效期

长期有效,直到手动撤销或轮换。

短期有效,从几分钟到几小时(AWS STS颁发的临时凭证最长有效期为12小时

)。

安全性

风险较高。一旦泄露,在发现和撤销前会持续造成威胁。

风险较低。即使泄露,有效期过后自动失效,无需手动撤销

存储位置

与IAM用户永久关联。

动态生成,不随IAM用户存储

主要用途

用于在AWS外部环境(如本地开发机、外部服务器)进行程序化访问

用于临时、委托的访问。常见于:
1. 应用程序服务器代表用户获取临时凭证后下发


2. 跨账户访问。
3. 为第三方应用提供有限权限的访问。

最佳实践

尽量避免在代码中硬编码,优先使用IAM角色(如EC2实例角色)

推荐使用。在需要动态分配权限或避免分发长期凭证的场景下,使用临时凭证是AWS推荐的安全实践

四、技术实现示例

在代码中,使用这三者进行认证的方式如下(以Python boto3为例):

import boto3

# 使用长期AK/SK
session = boto3.Session(
    aws_access_key_id='你的AK',
    aws_secret_access_key='你的SK',
    region_name='us-east-1'
)

# 使用临时AK/SK和Session Token
session = boto3.Session(
    aws_access_key_id='临时AK',
    aws_secret_access_key='临时SK',
    region_name='us-east-1',
    aws_session_token='你的SessionToken'  # 关键区别:多了Token
)

client = session.client('s3')
# ... 后续API调用

正如示例所示,Session Token是通过 aws_session_token 参数传递的,这是使用临时凭证和长期凭证在代码配置上的关键区别。

总结:AWS的AK和SK是程序访问云资源的“用户名和密码”,而Session Token是临时安全凭证体系的“有效期票据”。理解它们的区别,尤其是用短期、带Token的临时凭证替代长期AK/SK,是构建安全、合规的AWS应用架构的重要一步。