RAM用户执行云助手命令

更新时间:
复制为 MD 格式

云助手默认以最高权限(Linux 的 root、Windows 的 system)执行命令,存在安全合规风险。本文介绍如何通过 RAM 权限策略限制执行身份,以普通用户运行云助手命令,并提供 Windows 环境下安全传递用户凭据的方案。

前提条件

  • ECS 实例中已创建普通用户,本文以 user01user02 为例。

  • ECS 实例已安装云助手 Agent,且状态为运行中

  • 如需使用 Windows 凭据加密功能(方案二),云助手 Agent 版本需不低于 2.x.3.421

基础权限配置

通过 RAM 自定义策略,限制 RAM 用户在调用云助手接口时只能以指定用户身份执行命令,适用于 Linux 和 Windows 实例。

  1. 使用阿里云账号登录RAM 控制台创建RAM用户

    RAM用户信息示例如下所示:

    名称

    示例

    登陆名称

    commandUser

    显示名称

    commandUser

    访问方式

    本文中提供阿里云控制台方式和OpenAPI方式使用云助手,此处选中控制台访问使用永久 AccessKey 访问

    说明

    您可以根据实际使用情况,选择对应的一种访问方式,实现权限最小化管理。

    设置密码

    选择自动生成密码

    需要重置密码

    选择用户在下次登录时必须重置密码

    MFA 多因素认证

    选择不要求

    创建完成后,保存 RAM 用户的登录信息和 AccessKey。

  2. 创建自定义权限策略 commandUserPolicy。具体操作,请参见创建自定义权限策略

    RAM权限策略创建

    根据需求选择以下任一策略模式:

    • 白名单模式(推荐):仅允许ECS实例普通用户 user01 和 user02 执行命令。

      如需允许其他用户,修改或增加 Condition 中的用户名。
      {
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "ecs:InvokeCommand",
                      "ecs:RunCommand"
                  ],
                  "Resource": [
                      "acs:ecs:*:*:instance/*",
                      "acs:ecs:*:*:command/*"
                  ],
                  "Condition": {
                      "StringEquals": {
                          "ecs:CommandRunAs": [
                              "user01",
                              "user02"
                          ]
                      }
                  }
              }
          ],
          "Version": "1"
      }
    • 黑名单模式:禁止ECS实例的用户 root 和 system 执行命令。

      如需限制其他用户,修改或增加 Condition 中的用户名。
      {
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "ecs:InvokeCommand",
                      "ecs:RunCommand"
                  ],
                  "Resource": [
                      "acs:ecs:*:*:instance/*",
                      "acs:ecs:*:*:command/*"
                  ],
                  "Condition": {
                      "StringNotEqualsIgnoreCase": {
                          "ecs:CommandRunAs": [
                              "system",
                              "root"
                          ]
                      }
                  }
              }
          ],
          "Version": "1"
      }
  3. 为 RAM 用户授权。具体操作,请参见RAM用户授权

    授权

    授予以下权限:

    • ECS 只读权限:AliyunECSReadOnlyAccess

    • 云助手权限:上一步创建的 commandUserPolicy

    如果 Windows 实例使用方案一:使用 OOS + KMS 托管密码,还需额外授予 AliyunOOSReadOnlyAccess 和自定义的 kmsPolicy 权限策略。kmsPolicy 的创建方式参见常见的授权策略示例,策略内容示例:

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "kms:List*", "kms:Describe*",
            "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey"
          ],
          "Resource": ["*"]
        }
      ]
    }

配置 Linux 实例的普通用户执行云助手命令

Linux 实例无需托管密码,在执行命令时声明用户身份即可。

  1. 使用 RAM 用户 commandUser 登录阿里云控制台,或通过其 AccessKey 调用 CLI/API。

  2. 运行云助手命令并验证。

    • 控制台:创建/执行命令,将执行用户(Username)设置为 user01

      user01用户能够正常执行云助手命令,root用户执行云助手命令报错。

      Linux 实例设置执行用户

    • CLI:在 RunCommand 中指定 --Username user01,user01用户能够正常执行云助手命令,以 root 用户执行命令会报错。

      Linux CLI 验证结果

配置 Windows 实例的普通用户执行云助手命令

Windows 实例以普通用户执行命令时必须同时传递密码。根据安全需求选择以下任一方案:

对比项

方案一:OOS + KMS 托管密码

方案二:云助手数据加密

依赖服务

OOS、KMS

适用场景

大规模密码管理,密码长期有效

高安全性场景,密码临时加密传输

额外权限

需要 OOS、KMS 相关权限和 RAM 角色

仅需基础权限配置中的权限

方案一:使用 OOS + KMS 托管密码

  1. 为 Windows 实例设置 RAM 角色。

    1. 创建自定义权限策略,包含 kms:GetSecretValueoos:GetSecretParameter 权限。具体操作,请参见创建自定义权限策略

      {
          "Version": "1",
          "Statement": [
              {
                  "Action": ["kms:GetSecretValue"],
                  "Resource": "*",
                  "Effect": "Allow"
              },
              {
                  "Action": ["oos:GetSecretParameter"],
                  "Effect": "Allow",
                  "Resource": "*"
              }
          ]
      }
    2. 创建类型为阿里云服务、受信服务为云服务器 ECS / ECS 的 RAM 角色(如 AxtSecretRamRole),并授予上述策略。具体操作,请参见创建可信实体为阿里云服务的RAM角色管理RAM角色的权限

    3. 将该 RAM 角色授予目标 ECS 实例。具体操作,请参见授予实例 RAM 角色

  2. 创建加密参数,在 OOS 中创建加密参数,托管 Windows 用户密码。

    重要

    OOS加密参数所在地域必须和ECS实例所在地域一致,否则ECS实例无法使用此托管密码。

    示例:为 user01 创建名为 axtSecretPassword 的加密参数,KMS 密钥 ID 使用默认的 Default Service CMK填入 user01 的登录密码。

  3. 执行云助手命令并验证。

    1. 控制台:使用RAM用户登录阿里云控制台创建/执行命令时,设置执行用户user01密码名称填入上一步创建的加密参数 axtSecretPassword

      Windows OOS 托管密码设置

      CLI方式:在 RunCommand 中指定 --Username user01--PasswordName axtSecretPassword。user01 用户能够正常执行云助手命令,system 用户执行云助手命令报错。

      Windows CLI 验证结果

方案二:使用云助手数据加密功能

通过 RSA-OAEP 非对称加密实现密码的端到端传输,无需依赖 KMS 和 OOS。更多信息,请参见云助手命令内容加密

  1. 在目标实例上生成临时密钥对。

    通过 RunCommand API 或控制台,在目标实例上运行公共命令生成 RSA 密钥对:

    • Linux 实例:ACS-ECS-GenerateRsaKeypair-linux.sh

    • Windows 实例:ACS-ECS-GenerateRsaKeypair-windows.ps1

    记录返回的 idpublicKey 字段值。具体操作,请参见云助手命令内容加密中的步骤一。

    说明

    私钥仅存于实例内存中,不会在网络中传输或落盘。密钥对默认 60 秒后自动销毁,可通过 -t 参数延长有效期。

  2. 在本地加密用户密码。

    使用上一步获得的公钥,通过 RSA-OAEP 算法加密 Windows 用户密码,生成 Base64 编码的密文。具体操作,请参见云助手命令内容加密中的步骤二。

  3. 在目标实例上创建加密参数。

    通过 RunCommand API 或控制台执行以下命令。也可使用公共命令 ACS-ECS-CreateSecret-for-windows.ps1

    aliyun_assist_service data-encryption --create-secret --keypair-id <keypair-id> --text <cipher-text> --param-name <param-name> --timeout <timeout>

    参数

    说明

    --keypair-id

    步骤 1 中生成的密钥对 ID。

    --text

    步骤 2 中得到的 Base64 密文。

    --param-name

    自定义的加密参数名称。

    --timeout

    加密参数的有效时间(秒),默认 60 秒后自动销毁。

    输出示例:

    {
        "SecretName": "t-hz06gya7****",
        "CreatedTimestamp": 1775363628,
        "ExpiredTimestamp": 1775363688
    }

    记录 SecretName 的值,下一步执行命令时需要使用。

  4. 在加密参数有效期内执行云助手命令。

    通过 RunCommand API 或 CLI 执行命令,将 --Username 设置为 user01--WindowsPasswordName 设置为上一步创建的加密参数名称(SecretName 的值)。