如果您使用第三方SSH工具以密鑰對的方式認證登錄Linux實例,您可以向實例中注冊有效期60秒的臨時公鑰,然后在60秒之內使用私鑰登錄實例,該方式相比永久密鑰對更加安全。本文為您介紹如何通過會話管理CLI(ali-instance-cli)向實例注冊臨時公鑰并免密登錄。
什么是臨時公鑰?
臨時公鑰認證是一種安全連接實例的方案,您可以不在實例中設置密鑰對,然后在每次通過SSH連接實例前,向實例中注冊一個有效期60秒的臨時公鑰,然后通過與之對應的私鑰免密登錄實例。
臨時公鑰存儲在云助手服務端。
準備工作
開啟會話管理服務
在使用ali-instance-cli之前,需要先確保當前阿里云賬號已開啟會話管理服務。開啟會話管理服務僅可以在控制臺操作,具體操作如下:
| |
|
檢查實例運行狀態是否為運行中
僅支持通過會話管理連接到運行中狀態的實例。
控制臺
阿里云CLI
如果您已經配置好了阿里云CLI,您可以通過以下命令查詢實例運行狀態。關于該API的更多參數說明,請參見DescribeInstanceStatus - 查詢實例的狀態信息列表。
以查詢杭州地域下實例ID為i-bp1******
實例為例,輸入以下命令查詢實例運行狀態。
aliyun ecs DescribeInstanceStatus --region cn-hangzhou --RegionId 'cn-hangzhou' --InstanceId.1 'i-bp1******'
如果查詢出對應實例的Status
為Running
則實例為運行中。
{
"TotalCount": 1,
"RequestId": "A413****-****-****-****-****611B",
"PageSize": 1,
"PageNumber": 1,
"InstanceStatuses": {
"InstanceStatus": [
{
"Status": "Running",
"InstanceId": "i-bp1******"
}
]
}
}
除此API外,您還可以通過其他API查詢實例運行狀態,請參見DescribeInstances - 查詢實例的詳細信息列表。
API
如果需要通過API查詢實例運行狀態,請參見DescribeInstanceStatus - 查詢實例的狀態信息列表、DescribeInstances - 查詢實例的詳細信息列表。
檢查實例云助手Agent是否已安裝
會話管理基于云助手的功能實現,您可以通過以下方式查詢實例是否已經安裝云助手Agent。
2017年12月01日之后使用官方公共鏡像創建的ECS實例,默認預裝了云助手Agent。如果您的實例是2017年12月01日之前購買的或使用自行上傳的自定義鏡像創建的實例,需自行安裝云助手Agent,請參見安裝云助手Agent。
控制臺
會話管理基于云助手的功能實現,需要在實例中安裝云助手Agent。云助手Agent狀態可以在ECS控制臺的云助手模塊查看,已經安裝云助手的實例如圖所示:
2017年12月01日之后使用官方公共鏡像創建的ECS實例,默認預裝了云助手Agent。如果您的實例是2017年12月01日之前購買的或使用自行上傳的自定義鏡像創建的實例,需自行安裝云助手Agent,請參見安裝云助手Agent。
查看云助手Agent狀態以及處理異常狀態的具體操作,請參見查看云助手狀態及異常狀態處理。
阿里云CLI
如果您已經配置好了阿里云CLI,您可以通過以下命令查詢實例是否安裝云助手且云助手版本是否支持使用會話管理。具體參數說明,請參見DescribeCloudAssistantStatus - 查詢云助手安裝狀態。
以查詢杭州地域下實例ID為i-bp1******
實例為例,輸入以下命令查詢實例運行狀態。
aliyun ecs DescribeCloudAssistantStatus --region cn-hangzhou --RegionId 'cn-hangzhou' --InstanceId.1 'i-bp1******'
如果查詢出CloudAssistantStatus
(云助手運行狀態)為true
且SupportSessionManager
(是否支持會話管理)也為true
,即該實例支持通過會話管理連接實例。
{
"TotalCount": 1,
"PageSize": 1,
"RequestId": "DB34****-****-****-****-****A749",
"NextToken": "",
"PageNumber": 1,
"InstanceCloudAssistantStatusSet": {
"InstanceCloudAssistantStatus": [
{
"CloudAssistantVersion": "2.2.3.857",
"SupportSessionManager": true,
"InstanceId": "i-bp1******",
"InvocationCount": 4,
"OSType": "Linux",
"CloudAssistantStatus": "true",
"LastHeartbeatTime": "2024-12-10T02:38:04Z",
"LastInvokedTime": "2024-12-08T16:02:45Z",
"ActiveTaskCount": 0
}
]
}
}
API
如果需要通過API查詢實例云助手Agent狀態,請參見DescribeCloudAssistantStatus - 查詢云助手安裝狀態。
準備用于使用會話管理的RAM用戶的憑證
在使用 ali-instance-cli
工具時,配置階段要求設置RAM用戶的AccessKey、STS Token。當通過會話管理操作連接實例時,系統會驗證此憑證對應的RAM用戶是否擁有ecs:StartTerminalSession
權限,這是允許通過會話管理建立與ECS實例連接的必要權限。
此外,在自定義權限策略時,可以通過指定Resource
字段來限定RAM用戶能夠通過會話管理連接的具體ECS實例。權限策略示例如下:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "ecs:StartTerminalSession",
"Resource": "*"
}
]
}
關于CredentialsURI、STS Token的更多說明,請參見創建AccessKey、什么是STS。
為RAM用戶授權,請參見為RAM用戶授權。
1. 安裝&配置會話管理CLI
如果您已經安裝并配置完成會話管理CLI,可跳過本步驟。
1.1 安裝
首先需要在您的個人計算機中安裝會話管理CLI(ali-instance-cli),不同操作系統安裝方式不同,具體操作如下。
Windows
點擊下載Windows版ali-instance-cli,并保存到本地文件夾中。
本文以將ali-instance-cli.exe保存在C:\Users\test
文件夾中為例。
macOS
在macOS的終端中,輸入以下命令下載mac版ali-instance-cli。
curl -O https://aliyun-client-assist.oss-accelerate.aliyuncs.com/session-manager/mac/ali-instance-cli
下載完成后,輸入以下命令為ali-instance-cli賦予可執行權限。
chmod a+x ali-instance-cli
Linux
輸入以下命令安裝Linux版ali-instance-cli。
curl -O https://aliyun-client-assist.oss-accelerate.aliyuncs.com/session-manager/linux/ali-instance-cli
下載完成后,輸入以下命令為ali-instance-cli賦予可執行權限。
chmod a+x ali-instance-cli
1.2 配置
在您的個人計算機使用ali-instance-cli連接阿里云實例時,需要配置相關身份憑證,即AccessKey,具體說明,請參見準備用于使用會話管理的RAM用戶的憑證。
Windows
選擇
,輸入cmd,按Enter
鍵,打開命令提示符窗口。切換到ali-instance-cli.exe所在目錄,本文以
C:\Users\test
為例。cd C:\Users\test
配置憑證。支持以下三種配置方式:
AccessKey
執行如下命令,并根據界面提示配置Access Key Id、Access Key Secret、Region Id。
ali-instance-cli.exe configure --mode AK
STS Token
執行以下命令完成配置操作:
ali-instance-cli.exe configure set --mode StsToken --region "<region>" --access-key-id "<ak>" --access-key-secret "<sk>" --sts-token "<sts_token>"
<region>
、<ak>
、<sk>
、<sts_token>
要修改為實際的Region ID、AccessKey ID、AccessKey Secret和STS Token
。CredentialsURI
執行如下命令,根據界面提示,輸入Credentials URI和Region Id。
ali-instance-cli.exe configure --mode=CredentialsURI
配置完成后,顯示如下內容證明配置完成。
macOS/Linux
進入ali-instance-cli所在目錄,本文以當前用戶根目錄
~
為例。cd ~
配置憑證。
AccessKey
執行如下命令,并根據界面提示配置Access Key Id、Access Key Secret、Region Id。
./ali-instance-cli configure --mode AK
STS Token
執行以下命令完成配置操作:
./ali-instance-cli configure set --mode StsToken --region "<region>" --access-key-id "<ak>" --access-key-secret "<sk>" --sts-token "<sts_token>"
<region>
、<ak>
、<sk>
、<sts_token>
要修改為實際的Region ID、AccessKey ID、AccessKey Secret和STS Token
。CredentialsURI
執行如下命令,根據界面提示,配置Credentials URI和Region Id。
./ali-instance-cli configure --mode=CredentialsURI
配置完成后,顯示如下內容證明配置完成。
2. 向目標實例中發送臨時公鑰
2.1 獲取待發送公鑰實例的ID
在操作前,需要先獲取待發送公鑰匙實例的ID,以供后續步驟使用。
控制臺
|
阿里云CLI
如果您已經配置好了阿里云CLI,您可以通過以下命令獲取實例ID。具體參數說明,請參見DescribeInstances - 查詢實例的詳細信息列表。
以查詢杭州地域下名稱為SessionManager-example
的實例為例。
aliyun ecs DescribeInstances --region cn-hangzhou --RegionId 'cn-hangzhou' --InstanceName 'SessionManager-example'
返回結果中InstanceId
即實例ID。
API
通過API查詢實例ID,請參見DescribeInstances - 查詢實例的詳細信息列表。
2.2 生成密鑰對
在發送臨時公鑰前,您需要先在本地生成一對密鑰文件,其中公鑰文件將用作步驟2.3中的臨時公鑰。
本機為Windows
打開命令提示符,輸入以下命令并根據界面提示,生成密鑰對。
本示例以通過OpenSSH客戶端在C:\Users\test
目錄下生成密鑰對為例。
ssh-keygen -t rsa -b 2048 -f id_rsa
-t rsa
:代表密鑰類型為rsa
密鑰對。-b 2048
:代表密鑰長度為2048位。-f id_rsa
:代表生成密鑰對的文件名以及保存位置。
執行這條命令后,系統會提示您輸入一個私鑰口令(passphrase),用于保護私鑰。設置私鑰口令后,即使私鑰被盜,攻擊者也需要私鑰口令才可以使用私鑰。
如果您不希望為私鑰設置私鑰口令,可以直接按回車鍵跳過。
命令執行完成后,會在當前命令行所在目錄(本文以C:\Users\test
為例)下生成一對密鑰文件:id_rsa.pub
(公鑰)、id_rsa
(私鑰)。
本機為macOS/Linux
打開終端,輸入以下命令并根據界面提示,生成密鑰對。
本示例以通過OpenSSH客戶端生成密鑰對為例。
ssh-keygen -t rsa -b 2048 -f id_rsa
-t rsa
:代表密鑰類型為rsa
密鑰對。-b 2048
:代表密鑰長度為2048位。-f id_rsa
:代表生成密鑰對的文件名以及保存位置。
執行這條命令后,系統會提示您輸入一個私鑰口令(passphrase),用于保護私鑰。設置私鑰口令后,即使私鑰被盜,攻擊者也需要私鑰口令才可以使用私鑰。
如果您不希望為私鑰設置私鑰口令,可以直接按回車鍵跳過。
命令執行完成后,會在當前命令行所在目錄(本文以當前用戶根目錄~為例)下生成一對密鑰文件:id_rsa.pub
(公鑰)、id_rsa
(私鑰)。
2.3 將公鑰發送到實例作為臨時公鑰
本機為Windows
打開命令提示符,進入ali-instance-cli.exe
工具所在目錄,輸入以下命令向目標實例發送臨時公鑰。
其中<instance_id>
為待發送公鑰的實例的ID,<public_key_path>
為步驟2.2中生成公鑰的文件路徑,<ecs_username>
為與該公鑰對應的用戶登錄名。
ali-instance-cli.exe send_public_key --instance <instance_id> --public-key <public_key_path> --user-name <ecs_username>
例如,向實例ID為i-bp1******
的實例的ecs-user
用戶注冊臨時公鑰,本地公鑰存儲路徑為C:\Users\test\id_rsa.pub
,可通過以下命令實現。
ali-instance-cli.exe send_public_key --instance i-bp1****** --public-key C:\Users\test\id_rsa.pub --user-name ecs-user
命令執行成功后請在60秒之內登錄實例。
本機為macOS/Linux
打開終端,進入ali-instance-cli
工具所在目錄,輸入以下命令向目標實例發送臨時公鑰。
其中<instance_id>
為待發送公鑰的實例的ID,<public_key_path>
為步驟2.2中生成公鑰的文件路徑,<ecs_username>
為與該公鑰對應的用戶登錄名。
./ali-instance-cli send_public_key --instance <instance_id> --public-key <public_key_path> --user-name <ecs_username>
例如,向實例ID為i-bp1******
的實例的ecs-user
用戶注冊臨時公鑰,本地公鑰存儲路徑為~/id_rsa.pub
,可通過以下命令實現。
./ali-instance-cli send_public_key --instance i-bp1****** --public-key ~/id_rsa.pub --user-name ecs-user
命令執行成功后請在60秒之內登錄實例。
如果執行命令時出現報錯ERROR: 'install config_ecs_instance_connect' command failed,證明實例中的云助手安裝config_ecs_instance_connect插件失敗,您可以嘗試重試命令,如果重試后依然報錯,可以通過以下方式在實例中安裝該插件。
控制臺方式
使用云助手發送如下命令到目標實例,安裝并啟用config_ecs_instance_connect
。
具體操作,請參見創建并執行命令。
acs-plugin-manager -e -P config_ecs_instance_connect --params --install
CLI方式
以下示例中的i-bp15vhvt43ciprqkxxxx請替換成實際的實例ID。
aliyun ecs RunCommand --RegionId 'cn-hangzhou' \
--Type 'RunShellScript' \
--CommandContent 'acs-plugin-manager -e -P config_ecs_instance_connect --params --install' \
--InstanceId.1 'i-bp15vhvt43ciprqkxxxx'
3. 以SSH的方式連接實例
如果在連接實例時提示輸入密碼或公鑰不正確,請確認您的公鑰是否已經過期。臨時公鑰有效期為60s。
選擇合適的SSH工具連接實例,在本機命令提示符或終端,輸入以下命令連接實例。
其中<private_key_path>
為步驟2.2中生成的私鑰文件路徑,<ecs-username>
為實例登錄名,對應步驟2.3中被設置臨時公鑰的用戶,<ecs_ip>
為您ECS實例的公網IP。
ssh -i <private_key_path> <ecs-username>@<ecs_ip>
例如,私鑰文件路徑~/id_rsa
,登錄名稱為ecs-user
,實例公網IP為223.***.***.187
可通過以下命令連接實例。
ssh -i ~/id_rsa ecs-user@223.***.***.187
此外,您也可以結合ali-instance-cli
工具的端口轉發功能,實現登錄無公網實例。具體操作,請參見通過會話管理CLI的端口轉發訪問無公網實例。
常見問題
執行命令后卡住沒反應(實例非運行中狀態)
如果執行ali-instance-cli命令后命令行卡住沒反應,可能是實例沒有處于運行中狀態,如何查看實例狀態,請參見本文準備工作章節下的檢查實例運行狀態是否為運行中。
執行命令后卡住沒反應(安全組設置問題)
如果執行ali-instance-cli命令后命令行卡住沒反應,可能是沒有在安全組出方向放通對應的端口。默認情況下普通安全組會在出方向放通所有端口的訪問,如果您更改了出方向規則或者使用了企業安全組,則可能會出現該問題。相關安全組說明如下:
通過會話管理連接ECS實例時,需要確保ECS中運行的云助手Agent與云助手服務端的網絡連通性,即在安全組出方向設置以下規則:
與SSH、RDP等連接方式不同,由于會話管理是由云助手Agent主動與會話管理服務端建立WebSocket連接,因此僅需放行出方向的云助手服務端的WebSocket端口。關于會話管理的原理,請參見會話管理工作原理。
如果使用普通安全組(包括默認安全組),默認情況下會放行所有的出方向流量,無需配置。
如果使用企業安全組,默認情況下會禁用所有出方向的流量,需要配置以下規則。更多企業安全組的說明,請參見普通安全組與企業級安全組。
添加安全組規則的具體操作,請參見添加安全組規則。
授權策略 | 優先級 | 協議類型 | 端口范圍 | 授權對象 | 描述 |
允許 | 1 | 自定義TCP | 443 |
| 用于訪問云助手服務端。 |
允許 | 1 | 自定義TCP | 443 |
| 訪問云助手Agent安裝包所在服務器,用于安裝或更新您的云助手Agent。 |
允許 | 1 | 自定義UDP | 53 |
| 用于解析域名。 |
此外,如果您計劃僅通過會話管理連接實例,為了增加ECS實例的安全性,您可以取消放行安全組入方向上的SSH端口(默認22)或者RDP端口(默認3389)的規則。
執行命令后出現DeliveryTimeout提示(云助手Agent不在線)
如圖所示,如果執行ali-instance-cli的命令時出現DeliveryTimeout
提示,可能是云助手Agent不在線,檢查云助手狀態,請參見檢查實例云助手Agent是否已安裝。
執行命令報錯session manager is disabled, please enable first
如果執行ali-instance-cli的命令出現session manager is disabled, please enable first
報錯,代表會話管理功能未開啟,請通過控制臺開啟會話管理功能,具體操作,請參見開啟會話管理服務。
長時間未連接自動斷開
使用會話管理連接到目標實例后,如果長時間沒有任何操作連接會自動斷開。默認的連接空閑時間為3分鐘,您可以通過--idle-timeout
參數自定義最大空閑時間。
例如執行以下命令連接到目標實例后,連接空閑達到10分鐘就會自動斷開。
./ali-instance-cli session --instance instance-id --idle-timeout 600
此功能需確保ali-instance-cli不低于以下版本:
Linux:
1.2.0.48
Windows:
1.1.0.48
macOS:
1.3.0.48
如何分析ali-instance-cli的日志
當使用會話管理CLI出現問題時,您可以通過查看log分析具體問題。
查看會話管理CLI工具的日志:在使用會話管理CLI(ali-instance-cli)時,會在該工具所在目錄下生成log目錄,如
~/log/aliyun_ecs_session_log.2022XXXX
,您可以進入該目錄查看相關日志。查看云助手Agent日志:
Linux
/usr/local/share/aliyun-assist/云助手版本號/log/
Windows
C:\ProgramData\aliyun\assist\云助手版本號\log