ECS(Linux)快速集成

本文介绍Linux操作系统的ECS如何快速集成KMS Agent。

使用限制

Linux操作系统的ECS支持快速集成KMS Agent。

步骤一:在ECS部署Agent

  1. 登录密钥管理服务控制台,在顶部菜单栏选择地域后,在左侧导航栏单击应用接入 > Agent 快速安装

  2. 定位到目标ECS,单击操作列的安装Agent

  3. 安装Agent面板完成各项配置,然后单击确定,默认安装在/usr/local/alibabacloudkmsagent/ 目录下。

    配置项

    说明

    可操作实例

    ECS的实例ID,不支持修改。

    本地主机HTTP端口号

    默认值为2025。KMS AgentHTTP服务默认监听地址为 127.0.0.1:2025。

    重要

    请在ECS上的安全组中放行该端口。具体操作,请参见管理安全组

    最大并发数KMS地域访问KMS服务域名

    可以通过配置不同域名,选择不同网关访问。

    • 共享网关

      支持通过公网VPC网络访问。

      • 最大并发数:应用访问Agent时,Agent能处理的并发请求数。默认值为800,最大1000。

      • KMS地域:KMS实例所在地域,例如cn-hangzhou。可以和ECS同地域,也可以不同地域。属于不同地域时,如果您是通过VPC网络访问,请确保ECSKMS实例网络互通,具体请参考VPC互联连接公网连接本地IDC

      • 访问KMS服务域名:详细地址,请参见地域和接入地址

        • 通过公网访问:填写公网访问地址,例如kms.cn-hangzhou.aliyuncs.com。

        • 通过VPC网络访问:填写VPC访问地址,例如kms-vpc.cn-hangzhou.aliyuncs.com。

    • 专属网关

      支持通过KMS私有网络访问。

      • 最大并发数:应用访问Agent时,Agent能处理的最大请求数。默认值为800,最大1000。

      • KMS地域:KMS实例所在地域,例如cn-hangzhou。可以和ECS同地域,也可以不同地域。

      • 访问KMS服务域名:KMS私有网络地址,即KMS实例地址,格式为<YOUR_KMS_INSTANCE_ID>.cryptoservice.kms.aliyuncs.com,例如kst-hzz65f176a0ogplgq****.cryptoservice.kms.aliyuncs.com

    内存限制

    KMS Agent 可以缓存的凭据数,默认值1000,最大值为1000。

    缓存时间TTL(秒)

    Agent 的缓存时间TTL,建议根据凭据的轮转时间间隔设置,默认为300秒。

    高级设置

    一般情况下,高级设置中的配置项使用默认值即可。

    • SSRF请求头:应用访问Agent时携带的SSRF请求头,默认为["X-KMS-Token","X-Vault-Token"]

    • SSRF令牌环境变量:Agent使用该环境变量中的文件验证SSRF,默认为["KMS_TOKEN" ,"KMS_SESSION_TOKEN","KMS_CONTAINER_AUTHORIZATION_TOKEN"]

    • 日志级别:日志记录的级别,默认为debug。支持设置为debug、info、warn、error,建议使用默认取值debug以便调试。

    • 日志路径:日志文件存储路径,默认为./logs/

    • 日志文件大小(MB):单个日志文件的最大限制,默认取值100 MB。

    • 日志备份文件数:保留的日志文件数量,默认取值2。

步骤二:创建ECS RAM角色

ECS RAM角色是指为ECS实例授予的RAM角色,该RAM角色是一个受信服务为云服务器的普通服务角色。使用实例RAM角色可以实现在ECS实例内部无需配置AccessKey即可获取临时访问凭证(STS Token),从而调用KMSOpenAPI。

具体操作,请参见实例RAM角色

  1. 登录RAM控制台,创建可信实体为阿里云服务的RAM角色。

    • 信任主体类型:选择云服务

    • 信任主体名称:选择云服务器ECS

  2. 授予RAM角色获取KMS凭据的权限。

    KMS Agent在缓存凭据的过程中,需要向KMS获取凭据值,因此KMS Agent需要具有获取凭据值的权限,由于凭据值是加密存储的,还需要具有解密密钥的权限。

    • 方式一:设置基于身份的策略。

      具体操作,请参见创建自定义权限策略RAM角色授权

      权限策略示例

      请将${region}替换为资源实际所属地域、{account}替换为资源实际所属的阿里云账号,example-secret替换为实际使用的凭据名称,keyId-example替换为实际使用的密钥ID。

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "kms:GetSecretValue",
                  "Resource": "acs:kms:${region}:${account}:secret/example-secret"
              },
              {
                  "Effect": "Allow",
                  "Action": "kms:Decrypt",
                  "Resource": "acs:kms:${region}:${account}:key/keyId-example"
              }
          ]
      }
    • 方式二:设置基于资源的策略。

      KMS支持基于资源的策略,即为单个密钥和凭据设置访问权限,用于控制哪些阿里云账号、RAM用户、RAM角色有权限来管理或使用KMS密钥、凭据。详细介绍,请参见密钥策略凭据策略

  3. 登录ECS管理控制台,将RAM角色授予ECS实例。image

步骤三:获取凭据

本文以本地主机HTTP端口号取默认值2025为例,如果您设置为其他端口号,请将示例中的2025修改为实际使用端口号。

KMS Agent默认获取凭据的ACSCurrent 版本。要获取其他版本的凭据值,您可以设置 versionStage 或 versionId

重要

KMS Agent只监听127.0.0.1,即仅允许同一台机器上的应用或进程与其通信,外部网络设备无法连接。访问地址仅支持localhost127.0.0.1,不支持改为应用的本地IP。以下示例以localhost为例。

使用curl

实际使用时请将示例代码中的<SecretId>替换为您实际的凭据名称。

 # 从文件读取 token
 curl -v -H "X-KMS-Token:$(</var/run/kmstoken)" 'http://localhost:2025/secretsmanager/get?secretId=<SecretId>'
 
 # 直接写 token
 curl -v -H "X-KMS-Token:<token>" 'http://localhost:2025/secretsmanager/get?secretId=<SecretId>'

您可以指定versionStage 或 versionId以获取特定凭据值。以获取指定versionId的凭据值为例,使用时请将0a7513ee719da740807b15b77500****替换为您实际的凭据版本。

 # 从文件读取 token
 curl -v -H "X-KMS-Token:$(</var/run/kmstoken)" 'http://localhost:2025/secretsmanager/get?secretId=<SecretId>&versionId=0a7513ee719da740807b15b77500****'
 
 # 直接写 token
 curl -v -H "X-KMS-Token:<token>" 'http://localhost:2025/secretsmanager/get?secretId=<SecretId>&versionId=0a7513ee719da740807b15b77500****'

Go代码示例

使用时请将示例代码中的agent-test替换为您实际的凭据名称。

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	
	//支持指定versionStage或versionId以获取特定凭据值。
	//以获取指定versionId的凭据值为例,url := fmt.Sprintf("http://localhost:2025/secretsmanager/get?secretId=%s&versionId=%s", "agent-test", "version-id")。
	url := fmt.Sprintf("http://localhost:2025/secretsmanager/get?secretId=%s", "agent-test")

	token, err := ioutil.ReadFile("/var/run/kmstoken")
	if err != nil {
		fmt.Printf("error reading token file: %v\n", err)
	}

	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		fmt.Printf("error creating request: %v\n", err)
	}

	req.Header.Add("X-KMS-Token", string(token))

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		fmt.Printf("error sending request: %v \n", err)
	}
	defer resp.Body.Close()

	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Printf("status code %d - %s \n", resp.StatusCode, string(body))
}