实例标识
一、背景
随着云技术的普及,越来越多的用户大到企业客户,软件供应商,小到普通创业者逐步开始将自己的基础设施搬迁到云上,同时越来越多用户对云主机的“可信任性”提出了需求,比如以下场景:
场景一: 软件license安全问题
场景描述
比如某isv想在阿里云云市场上架其软件,区别于传统的软件license计费模式,一般云计算厂商的计费模式相对复杂,isv想通过一种与云资源比如ecs协同计费的方式进行收费,比如按照该软件在ecs上的运行时间进行计费,那么对应的计费方案可能是如果运行该软件的 虚拟机是阿里云的ecs那么该软件默认license校验通过,isv通过镜像市场镜像进行收费。
问题
- isv该如何验证其软件运行环境是阿里云ecs而不是其它云主机
场景二: 向虚拟机发送敏感数据
在虚拟机启动后,可能需要向虚拟机发送一些敏感数据,比如证书等,此时用户需要一种机制来验证虚拟机的身份
问题
- 如何让用户信任该虚拟机是阿里云ecs
- 如何表达每一台ecs的“身份”
以上场景需要云计算厂商为用户提供一种机制来验证虚拟机的身份 ,“实例标识” 应运而生,其通过数字签名的方式来保障数据信息的真实性,准确性,来源 。
二、了解实例标识
2.1 基本概念
需要理解的核心概念列表:
- 实例标识文档
- 实例标识签名
- 公有证书
综上,阿里云ECS实例标识通过实例身份+动态数字签名的方式来保证数据的真实性与准确性,从而为用户提供了一种验证数据来源可靠性的有效方式。
2.2 工作原理
工作原理图
上图简单表达了一个用户app通过阿里云ecs使用实例标识的流程:
- 用户在vm内部调用
100.100.100.200/latest/dynamic/instnace-identify/document
获取实例标识文档 - 用户在vm内部调用
100.100.100.200/latest/dynamic/instnace-identify/pkcs7
获取实例标识签名 - 用户从官方渠道比如官方帮助文档获取公开证书,保存为ecs.cer
- 用户通过实例标识文档来获取ecs相关的身份信息,可以通过身份信息进行第一步认证比如:私网ip,归属aliuid,mac等
- 通过openssl工具验证签名有效性
- smime -verify -in signature -inform PEM -content document -certfile ecs.cer -noverify > /dev/null
附上简单的验证脚本代码
#!/usr/bin/env bash
function verify_signature_without_audience(){
curl 100.100.100.200/latest/dynamic/instance-identity/document > document
echo "-----BEGIN CERTIFICATE-----" > signature
curl 100.100.100.200/latest/dynamic/instance-identity/pkcs7 >> signature
echo "" >> signature
echo "-----END CERTIFICATE-----" >> signature
openssl smime -verify -in signature -inform PEM -content document -certfile ecs.cer -noverify > /dev/null
}
verify_signature_without_audience
需要在脚本运行目录提前将官网证书保存为ecs.cer
三、audience参数高阶用法
如上所述“实例标识” 提供了一种简单的ecs身份签名验证机制,为了提供更高的可扩展性来满足用户更高的安全需求,我们在签名计算上提供了一个可扩展参数audience,用户可以自定义audience来增强安全性,比如使用动态生成的md5值作为audience参数传入可以降低服务伪造的风险。
推荐用法
- 使用方式:100.100.100.200/latest/dynamic/instance-identity/pkcs7?audience=xxx
- audience参数最好是变化值且最好是通过不可逆加密算法生成的比如md5等加密算法
以下提供一个简单的随机数作为audience参数传入的demo
#!/usr/bin/env bash
function verify_signature_with_changeable_audience(){
audience=$RANDOM
document=$(curl 100.100.100.200/latest/dynamic/instance-identity/document)
audience_json=',"audience":''"'${audience}'"}'
echo -n ${document%?}${audience_json} > document
echo "-----BEGIN CERTIFICATE-----" > signature
curl 100.100.100.200/latest/dynamic/instance-identity/pkcs7?audience=${audience} >> signature
echo "" >> signature
echo "-----END CERTIFICATE-----" >> signature
openssl smime -verify -in signature -inform PEM -content document -certfile cert.cer -noverify > /dev/null
}
verify_signature_with_changeable_audience
四、典型场景最佳实践
4.1 镜像市场镜像通过实例标识进行license控制
背景
isv在阿里云云市场上架其软件,以镜像市场收费镜像的方式进行计费,比如按量付费模式,isv通过实例标识识别虚拟机身份进行license控制。
方案
- 获取实例标识文档与签名,参考如上实现
- 验证实例标识文档正确性,验证私网ip,mac,instanceID等信息(可选)
- 通过openssl或者其它方式验证签名有效性(建议增加audience参数)
- 获取云市场镜像相关的metadata,根据付费类型(meta-data/image/market-place/charge-type )及商品code(meta-data/image/market-place/product-code )做license控制判断