背景
用户在执行远程命令RunCommand(云助手)时,脚本中有时会用到密码等数据。在编写脚本命令时,明文写入密码会有泄露的风险。如果直接使用 什么是密钥管理服务服务则需要在脚本里维护加密后的值,这种方式在用户使用时相对来说较为麻烦。
系统运维管理 OOS(CloudOps Orchestration Service)中的参数仓库为用户提供了一种较为简便的方式,通过加密参数来维护用户的密码,并在RunCommand 命令中使用。这种方式的优势包括:
保证用户的密码在加密参数中,而不被泄露。
不需要在命令中维护密码明文或者给密码加密后的值,在脚本命令中只需写明引用的加密参数的名称。
如果密码变更,只需更新对应的加密参数,不需要对执行远程命令RunCommand(云助手)的脚本或者OOS模板做改动。
前置条件
执行命令的ECS实例上需要在Linux上安装阿里云CLI(如果实例上安装的aliyun-cli 版本不支持OOS GetSecretParameter需要升级到最新的版本)。
执行命令的ECS实例上需要安装 jq。
执行命令的ECS实例需要被授予实例角色,该角色至少需要包括OOS GetSecretParameter和KMS GetSecretValue 权限。
操作步骤
步骤一:创建加密参数
用户可以通过参数仓库控制台和aliyun-cli两种方式创建加密参数。
在参数仓库控制台上创建加密参数。
详细操作步骤如下:
在参数仓库控制台上创建加密参数,详细操作步骤请参考加密参数文档。若您需要更换成自己创建的KMS ID,单击KMS密钥ID下面的选择框,搜索您的目标KMS ID。(创建KMS Key 请参考本文附录一。)
使用aliyun-cli创建加密参数。
参考以下脚本示例:
aliyun oos CreateSecretParameter --Name mysql-password --Description "数据库密码加密参数" --Value "SecretMySQLPassword" --RegionId cn-hangzhou
步骤二:在RunCommand中使用加密参数
在RunCommand命令中,利用aliyun-cli 和 jq在脚本中获取加密参数的值
在Linux上安装阿里云CLI(如果实例上安装的aliyun-cli 版本不支持OOS GetSecretParameter需要升级到最新的版本)。
安装 jq。
推荐使用ECS实例角色来执行aliyun-cli,需要在实例上配置EcsRamRole(配置EcsRamRole具体步骤请参考本文附录二)。
在脚本中使用获取到的加密参数值做后续操作。
重要为了保证加密数据不被泄露,不应在脚本中打印加密参数值。
演示aliyun-cli脚本如下
# 从Parameter Store中获取加密参数mysql-password的值,保存在变量db_password中
db_password=`aliyun oos GetSecretParameter --Name mysql-password --WithDecryption true --mode EcsRamRole --ram-role-name secret-parameter-instance-role --region cn-hangzhou |jq .Parameter.Value -r`
# 用变量db_password做后续操作,例如创建一个生产用的数据库
mysql -u$db_user -p$db_password -e "create database database;"
通过系统运维管理的批量操作实例功能执行上述命令:
附录一:创建KMS
附录二:创建EcsRamRole并将其授予实例
登录RAM角色管理控制台。
单击权限管理>权限策略>创建权限策略。
填写权限策略名称,并单击脚本配置。将以下最小权限策略填充进去,单击确定,权限策略就创建完成了。最小权限策略如下:
{ "Version": "1", "Statement": [ { "Action": [ "kms:GetSecretValue" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "oos:GetSecretParameter" ], "Effect": "Allow", "Resource": "*" } ] }
完成权限策略创建后,在RAM控制台主页面,选择身份管理>角色>创建角色。在当前可信实体类型选项中,选择阿里云服务,单击下一步。如下图:
填写角色名称,并选择受信服务(云服务器)。
角色创建完成后单击为角色授权。
单击自定义策略,找到在步骤3中已经创建完成的权限策略,为此角色授权后单击确定。
将已经创建的角色赋给实例。
单台实例授权角色时,使用ECS控制台,找到创建完成的实例,授予实例角色。
使用ACS-ECS-BulkyAttachInstanceRamRole模板,直接输入角色名称,并选择需要授予角色的一台或多台实例,来给实例授予角色。模板方式如下图所示: