本文介绍Linux操作系统的ECS如何快速集成KMS Agent。
使用限制
仅Linux操作系统的ECS支持快速集成KMS Agent。
步骤一:在ECS部署Agent
登录密钥管理服务控制台,在顶部菜单栏选择地域后,在左侧导航栏单击 。
定位到目标ECS,单击操作列的安装Agent。
在安装Agent面板完成各项配置,然后单击确定,默认安装在
/usr/local/alibabacloudkmsagent/
目录下。配置项
说明
可操作实例
ECS的实例ID,不支持修改。
本地主机HTTP端口号
默认值为2025。KMS Agent的HTTP服务默认监听地址为 127.0.0.1:2025。
重要请在ECS上的安全组中放行该端口。具体操作,请参见管理安全组。
最大并发数、KMS地域、访问KMS服务域名
可以通过配置不同域名,选择不同网关访问。
共享网关
支持通过公网和VPC网络访问。
专属网关
支持通过KMS私有网络访问。
最大并发数:应用访问Agent时,Agent能处理的最大请求数。默认值为800,最大1000。
KMS地域:KMS实例所在地域,例如cn-hangzhou。可以和ECS同地域,也可以不同地域。
同地域:KMS实例和ECS属于同一个VPC,网络默认互通。属于不同VPC时,请您将ECS所属VPC绑定到KMS实例,即可实现网络互通,具体操作,请参见同地域多VPC访问KMS实例。
访问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),从而调用KMS的OpenAPI。
具体操作,请参见实例RAM角色。
步骤三:获取凭据
本文以本地主机HTTP端口号取默认值2025为例,如果您设置为其他端口号,请将示例中的2025修改为实际使用端口号。
KMS Agent默认获取凭据的ACSCurrent
版本。要获取其他版本的凭据值,您可以设置 versionStage
或 versionId
。
KMS Agent只监听127.0.0.1,即仅允许同一台机器上的应用或进程与其通信,外部网络设备无法连接。访问地址仅支持localhost或127.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))
}