使用curl从OCI VM下载OCI Object storage对象的认证问题
OCI 同账号VM访问私有对象存储的认证问题解答
核心结论
- 私有状态(非公开)的OCI对象存储资源,所有请求强制要求认证,不存在"同账号下VM自动免鉴权"的逻辑。哪怕请求发起的VM和对象存储归属于同一租户,不带合法认证信息的curl请求会直接被服务端返回401/403错误,无法下载对象。
- 你不想手动构造auth headers、同时不开放对象公共访问的需求完全可以实现,本质是把手动传认证头的逻辑换成VM自动获取凭证的认证方式,不是跳过认证。
常见认知误区澄清
很多人误以为同账号资源内网访问免认证,实际混淆了两种不需要手动传auth headers的场景:
- 存储桶/对象被设置为公共读权限:这种场景确实不需要带任何认证信息即可下载,但会导致所有能访问到对象存储端点的用户都能拉取对象,存在数据泄露、流量盗刷风险,不符合你的需求。
- 为VM配置实例主体(Instance Principal)授权:这是OCI官方推荐的VM访问同租户服务的方案,你不需要在VM里硬编码长期AK/SK,也不需要手动计算签名构造Authorization头,VM会自动和OCI元数据服务交互获取临时安全凭证完成认证,全程你不需要手动处理认证逻辑。
无手动构造auth头的curl下载实现步骤
- 先完成权限配置:创建动态组包含目标VM实例,编写IAM策略授予该动态组对目标存储桶/对象的读权限。
- 在VM内通过元数据服务获取临时会话token:
# 获取元数据服务认证token TOKEN=$(curl -s -X PUT -H "Authorization: Bearer Oracle" http://169.254.169.254/opc/v2/identity/token) - 携带该临时token直接请求对象存储下载接口即可,不需要手动计算签名:
curl -H "Authorization: Bearer $TOKEN" \ https://<你的对象存储命名空间>.objectstorage.<区域标识符>.oci.customer-oci.com/n/<命名空间>/b/<存储桶名>/o/<对象名> \ --output <本地保存的文件路径>
如果你的VM上已经安装了OCI CLI,操作会更简单:直接给CLI配置实例主体认证后,用oci os object get命令即可下载,CLI会自动处理所有认证流程,不需要你写任何认证相关的请求头。
注意:不要为了简化流程将私有对象设置为公共读,实例主体方案既可以保持存储桶的私有访问权限,又能免去手动构造签名头的麻烦,同时临时凭证自动轮转,安全性远高于硬编码长期密钥。
内容的提问来源于stack exchange,提问作者Prashanth
相关产品推荐
相关产品推荐

