火山引擎云服务器实践教程-控制台内嵌--在外部系统中使用ECS Terminal登录实例

axin 2025-04-06 26人围观 ,发现0个评论 火山引擎云服务器云服务器云服务器教程

👉点击这里申请火山引擎VIP帐号,立即体验火山引擎产品>>>

云服务器ECS提供控制台内嵌功能,支持将实例登录页面嵌入到外部系统的自建Web页面中,您可以在外部系统中通过ECS Terminal登录云服务器实例并进行相关操作。本文介绍如何将实例登录页面嵌入到外部系统。

背景信息

控制台内嵌功能通过安全令牌服务STS实现用户的自定义身份代理,您可以授予IAM用户相关数据和页面的访问权限,以此身份通过STS服务创建临时访问凭证,并获取临时登录Token。您访问内嵌的火山引擎控制台页面时,通过URL中封装的临时登录Token进行鉴权,访问过程无需使用IAM用户账密,且登录无感知。涉及的鉴权流程如下:

操作步骤

步骤一:获取临时安全令牌

  1. 创建IAM角色并授权。

    1. 创建IAM角色

    1. 为IAM角色授予ECS服务权限。根据业务需求,为IAM角色授予的权限策略如下所示。如何新建权限策略并授权。

{    "Statement": [        {            "Effect": "Allow",            "Action": [                "ecs:DescribeInstanceECSTerminalUrl",                "ecs:DescribeInstanceVncUrl",                "ecs:DescribeInstancesIamRoles"            ],            "Resource": [                "*"            ]        }    ]}
  1. 创建IAM用户并授权。

    1. 创建IAM用户,用于扮演IAM角色,便于后续获取临时安全令牌。

    1. 为IAM用户添加以下权限:

      • 扮演IAM角色的权限:创建IAM角色时,默认的可信实体为火山引擎账号,您需要修改IAM角色的信任策略,将Principal(信任身份)中的账号配置修改为您在上一步中创建的IAM账号ID,表示该角色可以被指定的IAM用户扮演。

{    "Statement": [        {            "Effect": "Allow",            "Action": [                "sts:AssumeRole"            ],            "Principal": {                "IAM": [                    "trn:iam::账号ID:user/角色名"                ]            }        }    ]}

      • 调用AssumeRole的权限:为IAM角色授予STSAssumeRoleAccess系统策略后,您才能使用IAM用户的访问密钥调用AssumeRole接口申请临时安全令牌。

  1. 调用AssumeRole接口获取临时安全令牌。

说明AssumeRole接口的请求参数DurationSeconds用于指定临时安全令牌的有效期,过期之后需要重新调用此接口获取新的临时安全令牌,并以此请求获取登录Token。

步骤二:获取登录Token

调用STS(临时安全凭证)的getSigninTokenWithSTS接口获取登录Token,调用时需要指定accessKeyIdsecretAccessKeysessionToken,均为步骤一中获取的临时安全令牌。登录Token(SigninToken)是STS服务提供的临时访问Token,外部系统的服务端需要通过登录Token构建ECS服务免密访问链接。说明

  • 登录Token的有效期默认为15分钟且不可更改,请在Token到期前完成访问链接的构建与鉴权登录,到期后需要重新请求getSigninTokenWithSTS获取新的登录Token。

  • 通过登录Token完成一次登录后,登录Token随即失效,如果您刷新页面,则需要重新请求获取登录Token。

请求示例:

https://console.volc-embed.com/api/passport/login/getSigninTokenWithSTS                    &accessKeyId=<通过AssumeRole获取的临时AK>                    &secretAccessKey=<通过AssumeRole获取的临时SK>                    &sessionToken=<通过AssumeRole获取的临时Token>                    &sessionDuration=<登录态的持续时长,超期后需要重新登录。单位为秒,取值为900 ~ 43200>

步骤三:构建免密访问链接

ECS云服务器控制台的免密访问链接格式如下所示。

const target_url = https://console.volc-embed.com/api/passport/login/loginWithSigninToken?signinToken=${signinToken}&redirectURI=${target_console_url}
参数说明
signinToken步骤二中获取的登录Token。
redirectURI支持内嵌的ECS实例登录页面的URL,如下所示:
https://iaas-api.console.volc-embed.com/ecs/connect/xterm/?Id=${实例ID}&Region=${Region}&Name=${实例名称}&Ip=${实例私网 IP}&Env=volc&lang=zh
参数介绍:
  • xterm支持非Windows实例使用。如果是Windows实例,请将xterm替换为guac。

  • IdRegionNameIP:分别为实例ID、实例所属地域ID、实例名称、以及实例的私网IP地址。相关信息的获取方式,请参考查看实例信息地域和可用区介绍。

注意在使用如上redirectURI链接前,需先使用encodeURL转码链接。即您需要先根据实际值替换链接中的xtermIdRegionNameIP等参数,再通过encodeURL转码链接。转码后的链接示例如下:https://iaas-api.console.volc-embed.com/ecs/connect/xterm/?Id=i-xxxxxxxxxxx&Region=cn-beijing&Name=terminal%E6%B5%8B%E8%AF%95&Ip=192.168.**.**&Env=volc&lang=zh

步骤四:在外部系统中嵌套页面

以iFrame方式或者直接跳转URL的方式将ECS服务控制台嵌入到第三方自建Web页面中。您可以参考以下示例,在外部系统中嵌入ECS服务控制台页面。其中src或者href的值应指定为步骤三中构建的免密访问链接(target_url)。注意为避免因浏览器兼容性导致访问失败,推荐使用Chrome浏览器访问该页面。

  • iFrame方式:

<body>       <iframe src="target_url" width="1200" height="800" id="tlsIframePage"></iframe> </body>
  • URL方式:

<body>       <a href="target_url" target="_blank">远程连接</a></body>

常见问题

如何设置内嵌页面的登录态时长?通过第三方系统的Web页面免密登录ECS服务控制台页面之后,登录状态会维持一段时间,超期之后应用服务端需要重新获取并刷新Token,以便用户侧重新登录。

内嵌页面的登录态时长由getSigninTokenWithSTS接口的可选参数sessionDuration 指定,单位为秒,取值范围为900 ~ 43200。不传入该参数时,将默认维持AssumeRole接口的DurationSeconds参数设置,而DurationSeconds默认为1 小时。即默认情况下,AssumeRole接口返回的ExpiredTime既是临时安全令牌的有效期截止时间,也是登录状态的结束时间。

示例代码(Node.js)

const {Service} = require('@volcengine/openapi');const axios= require("axios");class StsService extends Service {    constructor(props) {        super({            ...props,            defaultVersion: "2018-01-01",            serviceName: "sts",        });    }}async function main() {    const  stsService = new StsService()    stsService.setAccessKeyId('xxx');    stsService.setSecretKey('yy')    stsService.setHost('sts.volcengineapi.com')    // 调用 assumeRole 获取临时安全令牌。const assumeRole = stsService.createAPI('AssumeRole', {        method: 'GET',    });    const  token = await assumeRole({        RoleTrn: 'trn:iam::${accountId}:role/${角色名}',        RoleSessionName: 'test'    })    const { AccessKeyId, SecretAccessKey, SessionToken } = token.Result.Credentials;    // 根据临时安全令牌获取登录 token。const  signinResp = await axios.post('https://console.volc-embed.com/api/passport/login/getSigninTokenWithSTS', {        "accessKeyId": AccessKeyId,        "secretAccessKey": SecretAccessKey,        "sessionToken": SessionToken    })    const  signinToken = signinResp.data.Result.SigninToken;    // 根据登录 signinToken 生成免登录连接。const url = `https://console.volc-embed.com/api/passport/login/loginWithSigninToken?signinToken=${signinToken}&redirectURI=${encodeURIComponent(`https://iaas-api.console.volc-embed.com/ecs/connect/xterm/?Id=${实例ID}&Region=${Region}&Name=${实例名称}&Ip=${实例私网 IP}&Env=volc&lang=zh`)}`    console.log(url)}main();


请关注微信公众号
微信二维码
不容错过
Powered By TOPYUN 云产品资讯