要通过内网直接读取阿里云 OSS,并确保不公开公共读取以防止被盗用,您需要采取一系列的安全配置和网络连接方式。以下是详细的步骤和解释:
核心思路:
* 专有网络 (VPC) 连接: 将您的 ECS 实例、容器等计算资源部署在与 OSS 相同的 VPC 内,或者通过 VPC Peering / VPN / 智能接入网关等方式连接到 OSS 所属的 VPC。
* OSS Endpoint: 使用 VPC Endpoint,这样 OSS 的访问流量会直接在阿里云内部网络传输,不会经过公网。
* RAM 授权: 使用阿里云 RAM (Resource Access Management) 来精细化控制对 OSS Bucket 和 Object 的访问权限,而不是依赖公共读写。
详细步骤:
1. 网络连接配置
这是最关键的一步,确保您的计算资源能够访问到 OSS 的内网地址。
* 如果您在阿里云内部(ECS, ACK, ECI 等):
* 同一 VPC/交换机: 如果您的计算资源与 OSS Bucket 处于同一个 VPC 和同一个交换机下,这是最简单直接的方式。
* VPC Peering (VPC 对等连接): 如果您的计算资源在另一个 VPC,而 OSS Bucket 在另一个 VPC,可以通过 VPC Peering 将两个 VPC 连接起来,使其可以互相通信。
* VPN (IPsec VPN/SSL VPN): 如果您的计算资源在阿里云外部(例如您的本地数据中心),可以通过 VPN 连接到阿里云 VPC,然后通过 VPC Endpoint 访问 OSS。
* 智能接入网关 (Smart Access Gateway): 适用于更复杂的混合云场景,提供更稳定和高性能的网络连接。
* NAT Gateway: 如果您的计算资源在一个私有网段,并且需要通过 NAT Gateway 访问 OSS 的公网 Endpoint(注意:这仍然会走公网,但可以通过配置安全组和 OSS 的白名单来加强控制,不是最安全的内网直连方式)。强烈建议优先考虑 VPC Endpoint。
* 如果您使用 OSS 的 VPC Endpoint:
* 创建 VPC Endpoint for OSS:
1. 登录阿里云控制台。
2. 导航至 VPC -> 网络连接 -> VPC Endpoint。
3. 点击 创建 VPC Endpoint。
4. 选择 服务分类:选择 OSS (对象存储)。
5. 选择 服务名称:选择您要连接的 OSS 服务。
6. 选择 Endpoint 类型:选择 Gateway。
7. 选择 VPC ID:选择您的计算资源所在的 VPC。
8. 选择 交换机 ID:选择您的计算资源所在的交换机。
9. 安全组: 非常重要! 为 Endpoint 创建一个或多个安全组,并配置规则,只允许您的计算资源(通过其私网 IP 或所属安全组)访问 Endpoint。
10. 权限策略 (Optional): 您可以为 Endpoint 配置一个访问控制策略,进一步限制对哪些 OSS Bucket 的访问。
11. 点击 创建。
* 配置 DNS 解析:
* 当您创建了 VPC Endpoint 后,OSS 的 Endpoint 会被解析到 Endpoint 的私网 IP 地址。您需要确保您的计算资源能够正确解析 OSS 的域名到这个私网 IP。
* 方法一 (阿里云 DNS): 如果您的计算资源使用阿里云的 DNS 服务,并且您的 VPC 已经关联了 DNS PrivateZone,OSS 的 Endpoint 会自动解析到私网 IP。
* 方法二 (自定义 DNS): 您可以在您的 VPC 内的 DNS 服务器(例如 ECS 实例上的 bind)或者通过修改 /etc/hosts 文件,手动将 OSS 的域名指向 VPC Endpoint 的私网 IP。
* OSS Endpoint 地址: OSS 的 Endpoint 地址通常是 <bucket-name>.<region-id>.aliyuncs.com或 <bucket-name>.oss-<region-id>-internal.aliyuncs.com。在创建 VPC Endpoint 时,会指定服务名称,服务名称会对应到 OSS 的某个区域的 Endpoint,您需要查阅相关文档确认具体的 Endpoint Hostname。建议直接使用 oss-<region-id>-internal.aliyuncs.com 格式的内网 Endpoint,这些 Endpoint 默认是为 VPC 流量优化的。
2. RAM 权限配置
这是防止被盗用的关键,您需要为您的应用程序或服务账户授予最小必需的权限。
* 创建 RAM 用户/RAM 角色:
* RAM 用户: 如果您的应用程序直接在 ECS 实例上运行,并且该 ECS 实例具有 RAM 实例配置文件,您可以通过该配置文件自动获取 RAM 用户身份,无需手动创建 RAM 用户。
* RAM 角色: 对于 ACK (容器服务)、ECS 实例(通过实例角色)、函数计算等,推荐使用 RAM 角色。RAM 角色是一种更安全的方式,允许您的计算资源临时获取权限,而无需长期存储 AccessKey。
* 登录阿里云控制台,导航至 身份管理 (RAM) -> 角色。
* 点击 创建角色。
* 选择 可信实体类型:通常选择 ECS 实例 或 Kubernetes 集群(如果使用 ACK)。
* 选择 场景:根据您的实际情况选择。
* 为角色命名。
* 附加权限策略:
* 点击 创建自定义权限策略。
* 策略编辑器 (JSON 格式): 编写一个 JSON 策略,精确指定允许的操作和资源。
* 编写精细化的 RAM 策略:
示例:只允许读取名为 my-secure-bucket 的 Bucket 下所有 Object 的 GetObject 操作。
json
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:GetObject"
],
"Resource": [
"acs:oss:*:*:my-secure-bucket/*" // 允许访问 my-secure-bucket 下的所有 Object
]
}
]
}
重要字段解释:
* Action: 列出允许的操作,例如 oss:GetObject (读取 Object)、oss:ListObjects (列出 Object)。永远不要给 oss:* 这种通配符权限,除非你非常清楚风险。
* Resource: 指定允许操作的资源。
* acs:oss:*:*:my-secure-bucket: 允许访问 my-secure-bucket 这个 Bucket 本身(例如 ListObjects 操作)。
* acs:oss:*:*:my-secure-bucket/*: 允许访问 my-secure-bucket 内的所有 Object(例如 GetObject 操作)。
* *:*: 在 Resource 中,第一个 * 代表 Account ID,第二个 * 代表 Region ID,第三个 * 代表 Bucket Name。您应该尽量精确指定。
* 将 RAM 策略附加到 RAM 用户/角色:
* 创建好自定义策略后,将其附加到您创建的 RAM 用户或 RAM 角色上。
* 如果使用 ECS 实例角色,将该角色附加到您的 ECS 实例上。
3. 应用程序配置
在您的应用程序中使用阿里云 SDK,并配置以下参数:
* Endpoint: 使用 OSS 的内网 Endpoint。
* 通常格式为:oss-<region-id>-internal.aliyuncs.com
* 例如:oss-cn-hangzhou-internal.aliyuncs.com
* 不要使用公网 Endpoint,如 oss-cn-hangzhou.aliyuncs.com。
* AccessKey ID 和 AccessKey Secret (不推荐直接使用):
* 最佳实践: 如果您的应用程序运行在 ECS、ACK、函数计算等阿里云服务上,优先使用实例角色 (Instance Role) 或服务关联的角色 (Service-linked Role)。SDK 会自动从元数据服务获取临时凭证。
* 如果必须使用 AccessKey,请将 RAM 用户创建的 AccessKey ID 和 Secret 配置在环境变量、配置文件或密钥管理服务中,切勿硬编码在代码中。
* Bucket Name: 指定您要访问的 OSS Bucket 名称。
示例 (使用 Python SDK):
“`python
import oss2
import os
endpoint = “oss-cn-hangzhou-internal.aliyuncs.com”
bucket_name = “my-secure-bucket”
auth = oss2.StsAuth(
os.environ.get(‘ALIBABA_CLOUD_ACCESS_KEY_ID’),
os.environ.get(‘ALIBABA_CLOUD_ACCESS_KEY_SECRET’),
os.environ.get(‘ALIBABA_CLOUD_SECURITY_TOKEN’)
)
bucket = oss2.Bucket(auth, endpoint, bucket_name)
try:
# 读取 Object
object_content = bucket.get_object(“path/to/your/object.txt”).read()
print(“Successfully read object:”)
print(object_content.decode(‘utf-8’))
# 列出 Bucket 中的 Object (如果策略允许)
# for object_key in oss2.ObjectIterator(bucket):
# print(object_key)
except oss2.exceptions.OssError as e:
print(f”Error accessing OSS: {e}“)
“oss:GetObject` 等最小必需权限。
**4. 安全加固**
* **安全组规则:** 严格配置 ECS 实例、VPC Endpoint 等的安全组规则,只允许必要的端口和 IP 地址访问。
* **OSS Bucket ACL:** **禁用或删除 Bucket 的公共读写 ACL (Access Control List)**。使用 RAM 策略进行权限控制是更先进和推荐的方式。
* **OSS Bucket 域名:** **不要**为 Bucket 配置 CDN 或启用公共访问 URL。
* **日志审计:** 开启 OSS 的访问日志和阿里云的安全审计服务,以便监控和追溯访问行为。
* **定期审查权限:** 定期检查 RAM 策略和授权,移除不再需要的权限。
* **敏感数据加密:** 如果存储敏感数据,考虑使用 OSS 的服务端加密或客户端加密。
**总结步骤:**
1. **网络:** 确保您的计算资源与 OSS 位于同一 VPC,或通过 VPC Peering/VPN/智能接入网关连接。**强烈推荐使用 OSS 的 VPC Endpoint。**
2. **RAM 授权:**
* 创建 RAM 角色(推荐)或 RAM 用户。
* 编写精细化的 RAM 策略,只授予
* 将策略附加到角色/用户。
* 将角色/用户关联到您的计算资源(例如 ECS 实例角色)。
3. 应用配置:
* 在 SDK 中使用 内网 Endpoint。
* 使用 RAM 角色获取临时凭证(推荐),或使用安全的方式管理 AccessKey。
4. 安全加固: 禁用公共读写 ACL,配置安全组,开启日志审计。
遵循以上步骤,您可以实现通过内网安全地访问阿里云 OSS,同时避免公共读取导致的潜在风险。