云助手默认以最高权限(Linux 的 root、Windows 的 system)执行命令,存在安全合规风险。本文介绍如何通过 RAM 权限策略限制执行身份,以普通用户运行云助手命令,并提供 Windows 环境下安全传递用户凭据的方案。
前提条件
-
ECS 实例中已创建普通用户,本文以
user01、user02为例。 -
ECS 实例已安装云助手 Agent,且状态为运行中。
-
如需使用 Windows 凭据加密功能(方案二),云助手 Agent 版本需不低于 2.x.3.421 。
基础权限配置
通过 RAM 自定义策略,限制 RAM 用户在调用云助手接口时只能以指定用户身份执行命令,适用于 Linux 和 Windows 实例。
-
RAM用户信息示例如下所示:
名称
示例
登陆名称
commandUser
显示名称
commandUser
访问方式
本文中提供阿里云控制台方式和OpenAPI方式使用云助手,此处选中控制台访问和使用永久 AccessKey 访问。
说明您可以根据实际使用情况,选择对应的一种访问方式,实现权限最小化管理。
设置密码
选择自动生成密码。
需要重置密码
选择用户在下次登录时必须重置密码。
MFA 多因素认证
选择不要求。
创建完成后,保存 RAM 用户的登录信息和 AccessKey。
-
创建自定义权限策略
commandUserPolicy。具体操作,请参见创建自定义权限策略。
根据需求选择以下任一策略模式:
-
白名单模式(推荐):仅允许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" }
-
-
为 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 实例无需托管密码,在执行命令时声明用户身份即可。
配置 Windows 实例的普通用户执行云助手命令
Windows 实例以普通用户执行命令时必须同时传递密码。根据安全需求选择以下任一方案:
|
对比项 |
方案一:OOS + KMS 托管密码 |
方案二:云助手数据加密 |
|
依赖服务 |
OOS、KMS |
无 |
|
适用场景 |
大规模密码管理,密码长期有效 |
高安全性场景,密码临时加密传输 |
|
额外权限 |
需要 OOS、KMS 相关权限和 RAM 角色 |
仅需基础权限配置中的权限 |
方案一:使用 OOS + KMS 托管密码
-
为 Windows 实例设置 RAM 角色。
-
创建自定义权限策略,包含
kms:GetSecretValue和oos:GetSecretParameter权限。具体操作,请参见创建自定义权限策略。{ "Version": "1", "Statement": [ { "Action": ["kms:GetSecretValue"], "Resource": "*", "Effect": "Allow" }, { "Action": ["oos:GetSecretParameter"], "Effect": "Allow", "Resource": "*" } ] } -
创建类型为阿里云服务、受信服务为云服务器 ECS / ECS 的 RAM 角色(如
AxtSecretRamRole),并授予上述策略。具体操作,请参见创建可信实体为阿里云服务的RAM角色和管理RAM角色的权限。 -
将该 RAM 角色授予目标 ECS 实例。具体操作,请参见授予实例 RAM 角色。
-
-
创建加密参数,在 OOS 中创建加密参数,托管 Windows 用户密码。
重要OOS加密参数所在地域必须和ECS实例所在地域一致,否则ECS实例无法使用此托管密码。
示例:为 user01 创建名为
axtSecretPassword的加密参数,KMS 密钥 ID 使用默认的 Default Service CMK,值填入 user01 的登录密码。 -
执行云助手命令并验证。
方案二:使用云助手数据加密功能
通过 RSA-OAEP 非对称加密实现密码的端到端传输,无需依赖 KMS 和 OOS。更多信息,请参见云助手命令内容加密。
-
在目标实例上生成临时密钥对。
通过
RunCommandAPI 或控制台,在目标实例上运行公共命令生成 RSA 密钥对:-
Linux 实例:
ACS-ECS-GenerateRsaKeypair-linux.sh -
Windows 实例:
ACS-ECS-GenerateRsaKeypair-windows.ps1
记录返回的
id和publicKey字段值。具体操作,请参见云助手命令内容加密中的步骤一。说明私钥仅存于实例内存中,不会在网络中传输或落盘。密钥对默认 60 秒后自动销毁,可通过
-t参数延长有效期。 -
-
在本地加密用户密码。
使用上一步获得的公钥,通过 RSA-OAEP 算法加密 Windows 用户密码,生成 Base64 编码的密文。具体操作,请参见云助手命令内容加密中的步骤二。
-
在目标实例上创建加密参数。
通过
RunCommandAPI 或控制台执行以下命令。也可使用公共命令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的值,下一步执行命令时需要使用。 -
在加密参数有效期内执行云助手命令。
通过
RunCommandAPI 或 CLI 执行命令,将--Username设置为user01,--WindowsPasswordName设置为上一步创建的加密参数名称(SecretName的值)。



