为保证用户日志数据的安全,日志服务API的所有HTTP请求都必须经过安全验证。
验证流程
安全验证基于阿里云的访问密钥,使用对称加密算法完成。
验证操作流程如下:
- 确认哪位用户在做API请求。
因为在发送请求前需要用户指定生成数字签名的密钥对,在服务端即可通过该密钥对确定用户身份,进而可做访问权限管理。
- 确认用户请求在网络传输过程中是否被篡改。
因为服务端会对接收到的请求内容重新计算数字签名,若请求内容在网络上被篡改,则无法通过数字签名比对。
签名API请求
Authorization = "LOG" + AccessKeyId + ":" + Signature
如上格式所示,Authorization头的值包含用户访问密钥对中的AccessKeyId,且与之对应的AccessKeySecret将用于Signature值的构造。下面将详细解释如何构造该Signature值。
请求签名过程示例
AccessKeyId = "bq2sjzesjmo86kq*********"
AccessKeySecret = "4fdO2fTDDnZPU/L7CHNd********"
- 示例一
您需要发送如下GET请求列出ali-test-project项目下的所有Logstore,其HTTP请求如下:
GET /logstores?logstoreName=&offset=0&size=1000 HTTP 1.1 Mon, 09 Nov 2015 06:11:16 GMT Host: ali-test-project.regionid.example.com x-log-apiversion: 0.6.0 x-log-signaturemethod: hmac-sha1
如上Log Service API请求生成的签名字符串为:GET\n\n\nMon, 09 Nov 2015 06:11:16 GMT\nx-log-apiversion:0.6.0\nx-log-signaturemethod:hmac-sha1\n/logstores?logstoreName=&offset=0&size=1000
由于是GET请求,该请求无任何HTTP Body,所以生成的签名字符串中CONTENT-TYPE与CONTENT-MD5域为空字符串。如果以前面指定的AccessKeySecret做签名运算后得到的签名为:jEYOTCJs2e88o+y5F4/S5IsnBJQ=
最后发送经数字签名的HTTP请求内容如下:GET /logstores?logstoreName=&offset=0&size=1000 HTTP 1.1 Mon, 09 Nov 2015 06:11:16 GMT Host: ali-test-project.regionid.example.com x-log-apiversion: 0.6.0 x-log-signaturemethod: hmac-sha1 Authorization: LOG bq2sjzesjmo86kq35behupbq:jEYOTCJs2e88o+y5F4/S5IsnBJQ=
- 示例二
您需要给同上例ali-test-project项目中名为test-logstore的Logstore写入下面的日志:
topic="" time=1447048976 source="10.10.10.1" "TestKey": "TestContent"
为此,按照Log Service API定义需要构建如下HTTP请求:POST /logstores/test-logstore HTTP/1.1 Date: Mon, 09 Nov 2015 06:03:03 GMT Host: test-project.regionid.example.com x-log-apiversion: 0.6.0 x-log-signaturemethod: hmac-sha1 Content-MD5: 1DD45FA4A70A9300CC9FE7305AF2C494 Content-Length: 52 x-log-apiversion:0.6.0 x-log-bodyrawsize:50 x-log-compresstype:lz4 x-log-signaturemethod:hmac-sha1 <日志内容序列化成ProtoBuffer格式的字节流>
在这个HTTP请求中,写入的日志内容首先被序列化成ProtoBuffer格式(请参见数据编码方式了解该格式的更多细节)后作为请求Body。所以该请求的Content-Type头的值指定为application/x-protobuf。类似,Content-MD5头的值是请求body对应的MD5值。按照上面的签名字符串构造方式,这个请求对应的签名字符串为:POST\n1DD45FA4A70A9300CC9FE7305AF2C494\napplication/x-protobuf\nMon, 09 Nov 2015 06:03:03 GMT\nx-log-apiversion:0.6.0\nx-log-bodyrawsize:50\nx-log-compresstype:lz4\nx-log-signaturemethod:hmac-sha1\n/logstores/test-logstore
同样,以前面示例中的AccessKeySecret做签名运算,得到的最终签名为:XWLGYHGg2F2hcfxWxMLiNkGki6g=
最后发送经数字签名的HTTP请求内容如下:POST /logstores/test-logstore HTTP/1.1 Date: Mon, 09 Nov 2015 06:03:03 GMT Host: test-project.regionid.example.com x-log-apiversion: 0.6.0 x-log-signaturemethod: hmac-sha1 Content-MD5: 1DD45FA4A70A9300CC9FE7305AF2C494 Content-Length: 52 x-log-apiversion:0.6.0 x-log-bodyrawsize:50 x-log-compresstype:lz4 x-log-signaturemethod:hmac-sha1 Authorization: LOG bq2sjzesjmo86kq35behupbq:XWLGYHGg2F2hcfxWxMLiNkGki6g= <日志内容序列化成ProtoBuffer格式的字节流>