云计算绕不过的AccessKey

虽然AccessKey(AK)还不为大家所熟知,但在未来的几年里,AK将成为云计算API认证的事实标准。任何使用云计算的企业和个人,都必须首先经过AK的洗礼!

KEYWORDS: AccessKey, AWS

AK是什么

记得第一次和别人分享AK的时候,对方都先是一愣,然后调侃我怎么一个搞互联网的去搞军工了!这不是一个段子,也许你们脑海中想到的AK还是下面的这个家伙。但是今天我们的故事和它没有半毛钱关系。

AK47(图片来自网络)

虽然AccessKey(AK)还不为大家所熟知,但在未来的几年里,AK将成为云计算API认证的事实标准。任何使用云计算的企业和个人,都必须首先经过AK的洗礼!

那么AK是什么?它又有什么本事能做到人尽皆知呢?

云计算归根结底的产物就是API,也把它叫做API经济。即:云计算里面的API是产品,是能够为云计算提供商带来经济利益的。说白了,就是调用API需要花钱。这个逻辑就和用水用电需要交钱一个道理。用水的时候有水表,根据水表的编号能找到户主的身份。用电的时候有电表,根据电表的编号能找户主的身份。使用云计算API的时候,要根据什么来找到使用者的身份的呢?答案是AK。

AK的英文全称是Access Key,翻译成中文是访问密钥。它属于云计算中身份认证领域的范畴。用户在使用云计算API的时候出示AK,这样云服务提供商就能够根据AK来确定使用者的身份,进而向其收费了。

请出示证件(图片来自于网络)

关于AK的定义,AWS在其文档Understanding and Getting Your Security Credentials中有详细的阐述:

Access Key包含两部分:access key id (例如AKIAIOSFODNN7EXAMPLE)和access key secret (例如wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY)。当访问AWS API的时候,可以使用Access Key对API请求进行签名。像用户名和密码一样,在签名的过程中,必须同时使用access key id 和access key secret。从安全的角度,你需要下你个对待用户名密码一样对待你的Access Key。

AK签名的流程

正如上面的文档所述,当访问云计算API的时候,可以使用AK对API请求进行签名。签名就是给一个API请求添加认证的过程,可以简单的理解为给API请求“盖章”。有了签名的加持,云服务提供厂商就可以识别API调用是谁发起的了。使用AK进行签名的流程如下入所示。

AWS签名过程(来源AWS官网文档)

AWS V2版本签名

本文以AWS第二版签名为例,讲解下AK签名的流程。假设某用户持有AK的信息如下:

<AKIAIOSFODNN7EXAMPLE, wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY>

要发起一个API请求,访问AWS中elasticmapreduce这款云产品的DescribeJobFlows接口,基础的请求信息如下:

https://elasticmapreduce.amazonaws.com?
Action=DescribeJobFlows
&Version=2009-03-31

AWS在收到这个请求以后,并不知道请求者是谁,也不知道该向谁收费了。为此,AWS要求用户在请求中添加如下参数:

  • AWSAccessKeyId:AK中的access key id

  • SignatureMethod:本次请求的签名方法

  • SignatureVersion:本次请求的签名版本

  • Timestamp:发起本次请求的时间戳

  • Signature:签名的值

在上面的参数中,前四个参数都是可以直接获取或者设定的,最后一个参数需要请求者自己计算。在添加签名之前的请求如下:

https://elasticmapreduce.amazonaws.com?
Action=DescribeJobFlows
&Version=2009-03-31
&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE
&SignatureVersion=2
&SignatureMethod=HmacSHA256
&Timestamp=2011-10-03T15:19:30 

在一切准备就绪之后,就可以按照AWS文档Signature Version 2 Signing Process规定的方式计算签名了。首先标准化待签名的字符串如下:

GET
elasticmapreduce.amazonaws.com
/
AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31

接着使用SignatureMethod指定的算法和用户持有的access key secret进行签名,结果如下

i91nKc4PWAt0JJIdXwz9HxZCJDdiy6cf/Mj6vPxyYIs=

上面的签名值经过URL编码之后就可以添加到请求中了,最终用户向AWS发送的请求如下:

https://elasticmapreduce.amazonaws.com?
Action=DescribeJobFlows
&Version=2009-03-31
&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE
&SignatureVersion=2
&SignatureMethod=HmacSHA256
&Timestamp=2011-10-03T15:19:30 
&Signature=i91nKc4PWAt0JJIdXwz9HxZCJDdiy6cf%2FMj6vPxyYIs%3D

AK发挥的作用

虽然在上文中频繁提到,使用AK是为了云服务提供上能够知道该向谁收费。但这仅仅是AK众多意义中的一丢丢。AWS在其文档Signing AWS API Requests 中做了详细描述。使用AK对API请求进行签名有如下三个意义:

1. 帮助云服务提供商验证API请求者的身份。

签名能够保证请求的发起者持有合法的access key secret

2. 防止数据在网络传输的过程中被篡改

将请求参数作为一部分来计算hash签名,并将签名作为API请求的一部分。AWS可以在收到请求时验证签名的合法性,以保证传输的数据没有被篡改。(一旦被篡改,签名就不对了)

3. 防止重放攻击

请求的参数中添加了时间戳信息,一旦超过一定的时间限制,请求将在一段时间后不再可用(实际上用timestamp和nonce会更好)。这就降低了中间人截获API请求并进行重方的风险。

本文以AWS为例,讲解了在云计算场景中AK的基本概念、AK的使用方法、以及AK的意义和价值。正如开篇所讲,虽然AK还不为大家所熟知,但随着越来越多的人使用云计算,AK必将成为他们走上云计算的第一课。未来的几年里,AK在互联网业界的知名度会越来越高。当然,我们也要提前意识到,任何事情都有利有弊。AK的普及也必将带来一些新的值得关注的安全问题。本文就不一一赘述了。

Last updated

Was this helpful?