保护云账号,防止凭据泄露

云账号是登录和管理云资源的核心身份凭证,一旦泄露,将带来极高的安全风险。因此,必须妥善保护云账号的各类凭据,防止其被非法获取和滥用。

安全风险

云账号面临的主要安全威胁包括口令被暴力破解、AccessKey(AK)等长期凭据泄露以及RAM Role STS Token泄露等,攻击者一旦掌握这些凭据,便可冒充合法用户登录系统,进行资源操作或访问敏感数据,可能导致以下严重后果:

  • 非法使用资源,造成直接账号损失。

  • 基础设施被破坏或服务中断,影响业务可用性。

  • 敏感数据泄露或被加密,面临信息泄露与勒索风险。

  • 被植入恶意程序或后门,长期威胁系统安全与数据完整性。

最佳实践

保护账号口令,启用多因子认证(MFA)

  • 设置复杂口令:弱口令是账户被入侵的主要原因之一。为防止口令被猜测或暴力破解,应避免使用弱口令。

  • 定期修改口令:建议每 90 天更换一次密码,以降低因长期使用同一口令而带来的泄露风险。

  • 启用多因子认证(MFA):为主账号绑定MFA,在密码认证基础上增加动态验证码(如手机Token、硬件密钥),防止密码泄露后的未授权访问。

使用 ECS RAM 角色替代 AccessKey

当应用程序部署在 ECS 实例中并需要调用云服务 API(如 ECS 扩缩容)时,推荐使用 RAM 角色(RAM Role),而非使用AccessKey。

创建RAM用户并绑定

当前账号需具备 sts:AssumeRole 权限,才能为实例绑定角色,防止权限滥用。

控制台

  1. 创建并授权RAM用户

  2. 为 ECS 实例绑定 RAM 角色。

    创建时绑定

    通过实例购买页创建实例时,在高级选项选择实例RAM角色

    建议在元数据访问模式中选择仅加固模式,防止因实例漏洞或配置错误导致 STS Token 泄露。更多信息,请参见使用仅加固模式访问实例元数据

    已有实例绑定

    1. 访问ECS控制台-实例,切换至目标地域。

    2. 找到目标ECS实例,单击实例ID进入实例详情页。

    3. 在其他信息,单击授予 / 收回 RAM 角色

    4. 在对话框中选择RAM角色,单击确定

    重要

    一个 ECS 实例只能绑定一个 RAM 角色。若应用需要多种权限,请将所有权限统一授予该角色。

    例如:实例已绑定AliyunECSDiskEncryptDefaultRole,还需网络接口管理权限,可在 RAM 控制台为该角色添加 AliyunECSNetworkInterfaceManagementAccess策略。

API

通过 API 实现角色绑定与解绑:

应用使用 RAM 角色访问云服务

应用运行在 ECS 实例中,可通过实例元数据服务自动获取临时 STS Token,并使用该 Token 调用云服务 API:

示例代码

from alibabacloud_credentials.client import Client as CredClient
from alibabacloud_credentials.models import Config as CredConfig
from alibabacloud_tea_openapi.models import Config
from alibabacloud_ecs20140526.client import Client as EcsClient
from alibabacloud_ecs20140526 import models as ecs_models
from alibabacloud_tea_util.models import RuntimeOptions

# Step 1: 获取STS Token
def get_sts_token():
    config = CredConfig(
        type="ecs_ram_role",
        enable_imds_v1=False
    )
    cred_client = CredClient(config)
    credential = cred_client.get_credential()
    return {
        "AccessKeyId": credential.get_access_key_id(),
        "AccessKeySecret": credential.get_access_key_secret(),
        "SecurityToken": credential.get_security_token()
    }

# Step 2: 初始化ECS客户端
def create_ecs_client(sts_token):
    config = Config(
        access_key_id=sts_token["AccessKeyId"],
        access_key_secret=sts_token["AccessKeySecret"],
        security_token=sts_token["SecurityToken"],
        endpoint="ecs.cn-hangzhou.aliyuncs.com"
    )
    return EcsClient(config)

# Step 3: 构建创建实例请求
def build_create_instance_request():
    return ecs_models.RunInstancesRequest(
        region_id="cn-hangzhou",
        image_id="aliyun_3_x64_20G_scc_alibase_20220225.vhd",
        instance_type="ecs.e-c1m2.xlarge",
        security_group_id="sg-bp1esyhwfbqeyudt****",
        v_switch_id="vsw-bp1nzprm8h7mmnl8t****",
        instance_name="sdk-test",
        instance_charge_type="PostPaid",
        key_pair_name="sdk-key-pair",
        system_disk_category="cloud_essd"
    )

# Step 4: 调用API创建实例
def create_instance(client, request):
    runtime = RuntimeOptions()
    try:
        response = client.run_instances_with_options(request, runtime)
        print("实例创建成功,实例ID:", response.body.instance_id_sets.instance_id_set[0])
    except Exception as e:
        print("实例创建失败,错误信息:", e)

# 主函数
if __name__ == "__main__":
    sts_token = get_sts_token()  # 获取STS Token
    ecs_client = create_ecs_client(sts_token)  # 初始化ECS客户端
    request = build_create_instance_request()  # 构建创建实例请求
    create_instance(ecs_client, request)  # 调用API创建实例

保护 AccessKey(AK),降低泄露风险

若必须使用 AK,应在创建、存储、分发、使用等环节加强安全管理:

  • 创建阶段:遵循 “一人一 AK、一应用一 AK” 原则,避免多个用户或程序共享 AK。一旦AK泄露,可快速定位责任人,缩小影响范围,便于及时轮转。

  • 权限管理:遵循最小权限原则,按需授权。推荐使用子账号并分配职责对应权限,避免使用主账号 AK。更多信息,请参见避免使用主账号,为不同职责子账号成员授予不同权限

  • 存储安全:将 AK 存储在可信设备上如:

    • 只有 root 或特定用户可读的文件。

    • 受访问控制的数据库或密钥管理系统(KMS)。

    • 禁止将 AK 存放在本地笔记、云笔记、代码仓库、聊天记录、个人签名/状态中。

  • 分发安全:使用加密文件分发 AK。推荐通过邮件等渠道发送加密AK文件,再通过另一个独立渠道(如短信)发送解密密码。

  • 使用安全:禁止在代码中硬编码 AK。将 AK 存放在独立配置文件加密保存在可信服务器上,分发到服务器后再解密,并将文件权限设置为仅owner可读。

  • 网络访问控制:在 RAM 控制台中为 AK 配置网络访问限制策略。具体操作,请参见AccessKey网络访问限制策略

  • 定期轮转与清理

    • 定期轮转:建议每 90 天更换一次 AK,生成新 AK 并通知使用方更新。更多信息,请参见轮转RAM用户的AccessKey

    • 定期清理:在 RAM 控制台查看 AK 的操作记录,及时吊销长期未使用的 AK。具体操作,请参见删除RAM用户的AccessKey

  • 监控 AK 泄露风险:通过云安全中心的AK泄露检测可以识别出AK是否泄露,支持AK泄露告警通知。此外,AK泄露后,阿里云会进行AccessKey限制性保护,防止风险进一步扩大。

合规能力

检查:是否存在ECS实例使用AK访问云服务

通过查询AccessKey日志,可以按需查询AccessKey的基本信息、访问的云服务及相关IP地址和资源。

前提:创建ActionTrail跟踪,并将日志投递至SLS Logstore。

  • 查询通过VPC Endpoint发起的AK调用

    * | SELECT "event.eventid","event.sourceipaddress", "event.userIdentity.accessKeyId",  "event.vpcId" WHERE "event.userIdentity.accessKeyId" LIKE 'LTA%' and "event.vpcId" LIKE 'vpc%'

    结果形如:

    image.png

    通过vpcIdsourceipaddress,就可以确定调用是从哪个ECS实例发出的。再具体排查哪些程序在使用accessKeyId调用OpenAPI。

  • 查询通过公网Endpoint发起的AK调用

    * | SELECT "event.eventid","event.sourceipaddress", "event.userIdentity.accessKeyId" WHERE "event.userIdentity.accessKeyId" LIKE 'LTA%' and "event.vpcId" IS NULL

    结果形如:

    image.png

    判断sourceipaddress是否是来自ECS的公网IP。先获取自己账号名下的EIP、PublicIP,再判断上述结果中的sourceipaddress是否属于您的IP。如果EIP、PublicIP是直接绑定到ECS实例的,那么可以直接定位到具体是ECS实例并改造。

修复:将AK替换为实例绑定角色

请参考使用 ECS RAM 角色替代 AccessKey进行修复。更多信息,请参见AccessKey泄露处理方案