Windows Azure存储使用对称密钥认证系统,一般来说,我们都采用256位密钥签署访问存储系统的每个HTTP请求,为了访问存储,你需要证明你知道这个密钥,这意味着你必须保护好这个密钥,这是一个全有或全无的例子,如果你有这个密钥,你可以做任何事,相反,如果你没有这个密钥,你什么事都做不了。
对于大多数人来说,当他们了解到这个模式时,自然会问“我如何给别人授权访问,但不影响我的主密钥?”,解决办法就是使用Windows Azure中的共享访问签名( Shared Access Signatures ,SAS),SAS通过指定几个查询字符串参数工作,对它们做哈希算法,然后在查询字符串中签署哈希值,这样不仅可以创建一个唯一可安全访问的URL,而且可以证明是由拥有主密钥的人创建的,查询字符串中的参数包括:
st:签名生效的开始时间,它是可选的,如果不提供,它将使用现在的时间。
se:失效日期和时间,所有签名都是有时间限制的,这个参数是必需的。
sr:签名应用的资源,要么是Blob,要么是容器,这个参数也是必需的。
sp:这是你授予的权限设置,包括读(r),写(w),删除(d)和列表(l),这个参数是必需的。
si:这是一个签名标识符,或一个策略,它是可选的。
sig:这是签署的查询字符串的哈希值和证明它是使用主密钥创建的URI,这个参数是必需的。
还有另一个重要的警告需要在这里重申一下,除非你使用签名标识符(我指的是一个策略),是没有办法让创建的签名寿命超过1小时的,如果使用超长的寿命错误地创建一个SAS URL,不使用签名标识符(策略)就不能撤销它,如果这个URL又被泄露出去了,你签署的资源将会长时间开放,存在被滥用的可能,通过签名限制最长的寿命为1小时,可以将暴露的时间范围控制住。
如果你想创建一个长寿命的SAS,必需创建一个策略,这个策略是非常有趣的,因为这个策略包含了上述所有参数,并且是存储在服务中的,这意味着我们可以取消那些权限,或立即改变权限。
我们以 MyAzureStorage.com 为例,当我登录到这个网站时,从顶部导航栏选择Blob选项,它将会显示我的所有容器,然后我选择一个容器的“行为”菜单,点击“管理策略”。
接下来,我要创建两个策略(签名标识符),分别取名为Read和Write,它们有不同的生存周期和权限设置,注意我没有指定一个签名生效的开始时间,因此会立即生效。
接下来我选择该容器下某个Blob的“行为”菜单,并点击“共享”,页面跳转到“共享Blob”,在这里我从策略下拉列表中选择一个前面创建的策略(这里选择了Read),应用给该Blob。
你会发现除了可以选择策略外,其它如结束时间和权限都是不能修改的,其原因是策略就象一个模板,如果你在策略中没有设置某个参数值,在共享时还有最后的机会,如果在策略中设定了某个参数的值,在共享时就不能再做修改,要修改只能修改策略。从上图可以看出,我们要共享的资源类型是Blob,这里唯一可再修改的参数是开始时间,因为它是可选的,因此我打算保持默认值。
当我点击“获得URL”按钮时,我会获得一个类似下面这样的URL:
http://.blob.core.windows.net/shared/blobname?sr=b&si=read&sig=hIbD%.=
假设这个URL不小心被泄露出去了,我希望不再提供该Blob上的读权限,这时我只需要删除“Read”策略或修改失效日期即可,它将会立即失效,下面是使用相同签名但没有使用策略创建的URL,可以对比一下:
http://.blob.core.windows.net/shared/blobname?se=2010-02-13T02%3A17%3A46Z&sr=b&sp=r&sig=bYfBBb1yf.=
这个签名是无法撤销的,必须等到它自然过期,或是我重新生成了主密钥为止。
如果你想在你的Windows Azure存储账号中共享Blob或容器,或想查看SAS究竟是如何工作的,可以多试用一下 MyAzureStorage.com 。