用参数仓库的加密参数和aliyun-cli管理执行命令中的密码

背景

用户在执行远程命令RunCommand(云助手)时,脚本中有时会用到密码等数据。在编写脚本命令时,明文写入密码会有泄露的风险。如果直接使用 什么是密钥管理服务服务则需要在脚本里维护加密后的值,这种方式在用户使用时相对来说较为麻烦。

系统运维管理 OOS(CloudOps Orchestration Service)中的参数仓库为用户提供了一种较为简便的方式,通过加密参数来维护用户的密码,并在RunCommand 命令中使用。这种方式的优势包括:

  1. 保证用户的密码在加密参数中,而不被泄露。

  2. 不需要在命令中维护密码明文或者给密码加密后的值,在脚本命令中只需写明引用的加密参数的名称。

  3. 如果密码变更,只需更新对应的加密参数,不需要对执行远程命令RunCommand(云助手)的脚本或者OOS模板做改动。

重要

前置条件

  1. 执行命令的ECS实例上需要在Linux上安装阿里云CLI(如果实例上安装的aliyun-cli 版本不支持OOS GetSecretParameter需要升级到最新的版本)。

  2. 执行命令的ECS实例上需要安装 jq

  3. 执行命令的ECS实例需要被授予实例角色,该角色至少需要包括OOS GetSecretParameter和KMS GetSecretValue 权限。

操作步骤

步骤一:创建加密参数

用户可以通过参数仓库控制台和aliyun-cli两种方式创建加密参数。

  1. 在参数仓库控制台上创建加密参数。

    详细操作步骤如下:

    参数仓库控制台上创建加密参数,详细操作步骤请参考加密参数文档。若您需要更换成自己创建的KMS ID,单击KMS密钥ID下面的选择框,搜索您的目标KMS ID。(创建KMS Key 请参考本文附录一。)runcommand-secret-03

  2. 使用aliyun-cli创建加密参数。

    参考以下脚本示例:

    aliyun oos CreateSecretParameter --Name mysql-password --Description "数据库密码加密参数" --Value "SecretMySQLPassword" --RegionId cn-hangzhou

步骤二:在RunCommand中使用加密参数

  1. 在RunCommand命令中,利用aliyun-cli 和 jq在脚本中获取加密参数的值

    1. 在Linux上安装阿里云CLI(如果实例上安装的aliyun-cli 版本不支持OOS GetSecretParameter需要升级到最新的版本)。

    2. 安装 jq

    3. 推荐使用ECS实例角色来执行aliyun-cli,需要在实例上配置EcsRamRole(配置EcsRamRole具体步骤请参考本文附录二)。

    4. 在脚本中使用获取到的加密参数值做后续操作。

    重要

    为了保证加密数据不被泄露,不应在脚本中打印加密参数值。

  2. 演示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;"

通过系统运维管理的批量操作实例功能执行上述命令:runcommand-secret-15

附录一:创建KMS

  1. 登录KMS控制台

  2. 在页面的左上角,选择需要创建加密参数所在的地域。

  3. 单击创建密钥。

    runcommand-secret-01

  4. 参考创建密钥文档的规则步骤,来创建具体的密钥。

附录二:创建EcsRamRole并将其授予实例

  1. 登录RAM角色管理控制台

  2. 单击权限管理>权限策略>创建权限策略

  3. 填写权限策略名称,并单击脚本配置。将以下最小权限策略填充进去,单击确定,权限策略就创建完成了。最小权限策略如下:

    runcommand-secret-16

    {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "kms:GetSecretValue"
                ],
                "Resource": "*",
                "Effect": "Allow"
            },
            {
                "Action": [
                    "oos:GetSecretParameter"
                ],
                "Effect": "Allow",
                "Resource": "*"
            }
        ]
    }
  4. 完成权限策略创建后,在RAM控制台主页面,选择身份管理>角色>创建角色。在当前可信实体类型选项中,选择阿里云服务,单击下一步。如下图:image.png

  5. 填写角色名称,并选择受信服务(云服务器)。runcommand-secret-05

  6. 角色创建完成后单击为角色授权runcommand-secret-18

  7. 单击自定义策略,找到在步骤3中已经创建完成的权限策略,为此角色授权后单击确定。runcommand-secret-19

  8. 将已经创建的角色赋给实例。

    1. 单台实例授权角色时,使用ECS控制台,找到创建完成的实例,授予实例角色。runcommand-secret-20runcommand-secret-21

    2. 使用ACS-ECS-BulkyAttachInstanceRamRole模板,直接输入角色名称,并选择需要授予角色的一台或多台实例,来给实例授予角色。模板方式如下图所示:

      runcommand-secret-07