云助手默认以最高权限(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 云助手相关 API 权限,Action 列表包括:
ecs:DescribeInstancesecs:DescribeTagKeysecs:DescribeTagsecs:CreateCommandecs:DescribeCommandsecs:InvokeCommandecs:RunCommandecs:DeleteCommandecs:DescribeInvocationsecs:DescribeInvocationResultsecs:StopInvocationecs:DescribeCloudAssistantStatusecs:InstallCloudAssistant
Resource 设置为
acs:ecs:*:*:instance/*。根据需求选择以下任一策略模式:
白名单模式(推荐):仅允许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 实例无需托管密码,在执行命令时声明用户身份即可。
使用 RAM 用户
commandUser登录阿里云控制台,或通过其 AccessKey 调用 CLI/API。运行云助手命令并验证。
控制台:创建/执行命令,将执行用户(Username)设置为
user01。user01用户能够正常执行云助手命令,root用户执行云助手命令报错。
CLI:在
RunCommand中指定--Username user01,user01用户能够正常执行云助手命令,以root用户执行命令会报错。shell@Alicloud:~$ aliyun ecs RunCommand --RegionId 'cn-hangzhou' \ > --Name 'ping' \ > --Type 'RunShellScript' \ > --CommandContent 'ping aliyun.com' \ > --Timeout '60' \ > --ContentEncoding 'PlainText' \ > --InstanceId.1 'i-bp10s90xxxxxxxxn' \ > --Username 'user01' { "CommandId": "c-hz01ai1xxxxxxxxc", "InvokeId": "t-hz01ai18xxxxxxxx", "RequestId": "B352A46C-3CFE-4E72-9F03-BFC0C0D3C590" } shell@Alicloud:~$ aliyun ecs RunCommand --RegionId 'cn-hangzhou' \ > --Name 'ping' \ > --Type 'RunShellScript' \ > --CommandContent 'ping aliyun.com' \ > --Timeout '60' \ > --ContentEncoding 'PlainText' \ > --InstanceId.1 'i-bp10s90xxxxxxxxn' \ > --Username 'root' ERROR: SDK.ServerError ErrorCode: Forbidden.RAM Recommend: https://error-center.aliyun.com/status/search?Keyword=Forbidden.RAM&source=PopGw RequestId: 9FE8BCB7-AAFD-4401-B28D-8276411703CD Message: User not authorized to operate on the specified resource, or this API doesn't support RAM. shell@Alicloud:~$
配置 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 的登录密码。执行云助手命令并验证。
控制台:使用RAM用户登录阿里云控制台,创建/执行命令时,设置执行用户为
user01,密码名称填入上一步创建的加密参数axtSecretPassword。CLI方式:在
RunCommand中指定--Username user01和--PasswordName axtSecretPassword。user01 用户能够正常执行云助手命令,system 用户执行云助手命令报错。shell@AliCloud:~$ aliyun ecs RunCommand --RegionId 'cn-hangzhou' \ > --Name 'ping' \ > --Type 'RunPowerShellScript' \ > --CommandContent 'ping aliyun.com' \ > --Timeout '60' \ > --ContentEncoding 'PlainText' \ > --InstanceId.1 'i-bp1h21856zxxx' \ > --Username 'user01' \ > --WindowsPasswordName 'axtSecretPassword' { "CommandId": "c-hz0xxxxo2yo", "InvokeId": "t-hz01xxxxs00", "RequestId": "2D92EEDE-6FCA-47F9-81B1-2262EEB3376F" } shell@AliCloud:~$ aliyun ecs RunCommand --RegionId 'cn-hangzhou' \ > --Name 'ping' \ > --Type 'RunPowerShellScript' \ > --CommandContent 'ping aliyun.com' \ > --Timeout '60' \ > --ContentEncoding 'PlainText' \ > --InstanceId.1 'i-bp1h2lxxx_xxxl' \ > --Username 'system' \ > --WindowsPasswordName 'axtSecretPassword' ERROR: SDK.ServerError ErrorCode: Forbidden.RAM Recommend: https://error-center.aliyun.com/status/search?Keyword=Forbidden.RAM&source=PopGw RequestId: 229A382B-FA81-4115-855A-C8F52EE29FE1 Message: User not authorized to operate on the specified resource, or this API doesn't support RAM. shell@AliCloud:~$
方案二:使用云助手数据加密功能
通过 RSA-OAEP 非对称加密实现密码的端到端传输,无需依赖 KMS 和 OOS。更多信息,请参见云助手命令内容加密。
在目标实例上生成临时密钥对。
通过
RunCommandAPI 或控制台,在目标实例上运行公共命令生成 RSA 密钥对:Linux 实例:
ACS-ECS-GenerateRsaKeypair-linux.shWindows 实例:
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的值)。