weweaaa
4/27/2020 - 9:50 AM

VsCode Remote SSH

VsCode Remote SSH

使用 VSCode Remote 透過 SSH 進行遠端開發

作為遠端 Server 的 windows 10 OpenSSH Server 安裝

- 確認設備上是否已安裝 OpenSSH

  • 開啟 PowerShell (系統管理員權限)
  • 確認設備是否已安裝 OpenSSH Server
    • Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
    •     # This should return the following output:
      
          Name  : OpenSSH.Client~~~~0.0.1.0
          State : Installed   
      
          Name  : OpenSSH.Server~~~~0.0.1.0
          State : NotPresent  # 表示尚未安裝 OpenSSH.Server 0.0.1.0 版
      

- 安裝 OpenSSH Server

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

  •     # Both of these should return the following output:
    
        Path          :
        Online        : True
        RestartNeeded : False
    
  • 補充:如果想要解除安裝則指令如下

    • Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
    • 如果服務在解除安裝時仍在使用中,則在移除 OpenSSH 之後可能需要重新啟動 Windows
  • SSH 伺服器初始設定

    1. Start-Service sshd
      • 若要設定 OpenSSH 伺服器以在 Windows 上首次使用,請以系統管理員身分啟動 PowerShell,然後執行下列命令以啟動 SSHD 服務
    1. Set-Service -Name sshd -StartupType 'Automatic'
      • 可選設定,但是推薦設定,自動啟動
    1. Get-NetFirewallRule -Name *ssh*
      • 確認已配置防火牆規則。它應該通過安裝程序自動創建
    1. New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
      • 應該有一個名為 "OpenSSH-Server-In-TCP" 的防火牆規則,應該啟用,如果防火牆不存在,則自動創建,或請創建一個

- 測試連線到 OpenSSH Server

  • 在設備上在開一個 PowerShell 視窗
    • Ssh username@servername
      • username:使用者帳號
      • servername:可以是這台 OpenSSH Server 設備的 IP
      • 第一次連線到任何伺服器時,將會產生類似下列的訊息
        The authenticity of host 'servername (10.00.00.001)' can't be established.
        ECDSA key fingerprint is SHA256:(<a large string>).
        Are you sure you want to continue connecting (yes/no)?
        
        # 答案必須是「是」或「否」。 回答「是」會將該伺服器新增到本機系統的已知 ssh 主機清單中
        # 此時,系統會提示您輸入密碼。 作為安全性預防措施,您的密碼在您輸入時不會顯示
        
      • 連線成功後,你會看到類似如下的命令字元
        domain\username@SERVERNAME C:\Users\username>
        

作為遠端 Server 的 windows 10 OpenSSH Server 金鑰產生及設置

- 金鑰組 (可選,觀念補充)

  • 第一次使用 sshd 時,將會自動產生主機的金鑰組。 如果 ssh-agent 正在執行,金鑰會自動新增至本機存放區
    • 因為沒有與 sshd 服務相關聯的使用者,所以主機金鑰會儲存在 C:\\ProgramData\ssh 底下
    • 如果沒有金鑰的話,可以使用以下命令產生
      # Install the OpenSSHUtils module to the server. This will be valuable when deploying user keys.
      # 如果運作此命令出現 Powershell 安装 opensshutils 驗證碼簽名無效問題,可以嘗試著升級 PowerShell 版本在執行一次此命令即可
      Install-Module -Force OpenSSHUtils -Scope AllUsers
      
      # Start the ssh-agent service to preserve the server keys
      Start-Service ssh-agent
      
      # Now start the sshd service
      Start-Service sshd
      

- 部屬公開金鑰

  • 透過命令產生一組公私鑰出來,預設公私鑰會存放於 %USERPROFILE%\.ssh\ 目錄下

  • 部署方式

    • 將您的公開金鑰檔案 ~.ssh\xxxxxx.pub 移至 server/host 上 (預設通常在 C:\ProgramData\ssh\)
    • 並修改檔案名稱為 administrators_authorized_keys 的檔案 (注意沒有任何副檔名)
    • 接著對此檔案 右鍵 >> 內容 >> 安全性 >> 進階
    • 點擊 變更權限,選擇 Authenticated Users 此項目
    • 接著點擊 停用繼承
      • 注意:選擇 將繼承的權限轉換成此物件中的明確權限
    • 接著再次選擇 Authenticated Users 此項目,點擊 移除
    • 接著再選擇 Administrators (PCxxx\Administrators) 此項目,點擊 移除
    • 然後點擊新增按鈕
      • 點擊 選擇一個主體 的連結
      • 輸入用來登入 SSH Server 的 Windows 帳號
      • 選擇完全控制
      • 確定,完成新增
    • 接著複製 ~.ssh\xxxxxx 私鑰到 Client 設備上,接著參考下一段 作為 Client Server 的 windows 10 OpenSSH Client 私鑰設置 的說明

作為 Client Server 的 windows 10 OpenSSH Client 私鑰設置

- 設定流程

  • 將從 Server 上複製出來的私鑰放到 %USERPROFILE%\.ssh\ 目錄路徑下即完成 SSH 基本設定

VSCode Remote SSH 連線設定

- 編輯 Remote SSH 設定檔

  • 使用 Ctrl+Shift+P 開啟快捷命令視窗輸入 remote
  • 選擇 Remote-SSH: Open Configuration File 選項
  • 接著選擇剛剛 公鑰產生目錄路徑下的 config 檔案
  • 設定檔格式說明如下
      Host LabServer         #填寫別名例如 LabSever
      HostName 172.31.00.00  #主機名稱或是ip位置
      User root              #登入的使用者名稱
      Port                   #如果有指定的Port號
    
  • 儲存後完成設定

- Remote SSH 連線

  • 上述設定完成後,點擊左邊的 Remote-SSH 工具圖案,connection 下就會有剛剛設定好的遠端主機,點擊右邊的已新視窗開啟
  • 如果沒設定沒問題的話就會跳出新視窗進行連線了,會在右下角顯示目前的連接狀況
  • 連接完成左下角會顯示目前連線的主機

- Remote SSH 使用

  • 成功連上之後就可以開始進行遠端開發
  • 左側點選到檔案總管>開啟資料夾
  • 就可以看到遠端機器上的檔案了,選擇做為開發的資料夾進行開啟就可以使用

轉送連接埠

  • 這樣的需求是,當我們在 VSCode 上運行專案時,假設預設啟動的服務在 4200 Port 上
  • 但是在 Client 是無法直接打網址 localhost:4200 來開啟網站的
  • 因為啟動的服務是在遠端 Server 上的 localhost:4200
  • 所以這時候我們就會需要使用專送 連接埠的技術
  • 設定方式如下,在 VSCode 上完成 Remote SSH 連線後,在左側選單點選 Remote SSH 的圖示
  • 接著選單的下方就會有轉送連接埠的選項,點擊後直接輸入連接埠號碼後,Enter 輸入
  • 如此就可以直接在 Client 端使用 localhost:4200 開啟專案運行的網站了

補充:產出一組公私鑰作法

- 確認設備上是否已安裝 OpenSSH Client

  • 開啟 PowerShell (系統管理員權限)
  • 確認設備是否已安裝 OpenSSH Client
    • Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
    •     # This should return the following output:
      
          Name  : OpenSSH.Client~~~~0.0.1.0
          State : Installed   # 表示已安裝 OpenSSH.Client 0.0.1.0 版
      
          Name  : OpenSSH.Server~~~~0.0.1.0
          State : NotPresent
      

- 安裝 OpenSSH Client

  • Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
  •     # Both of these should return the following output:
    
        Path          :
        Online        : True
        RestartNeeded : False
    

- 產生使用者使用的公私鑰 (.pub 檔案是公開金鑰,其餘則是私密金鑰)

  • 在作為 Client 的 Server 設備上開啟 PowerShell 執行以下命令
    • ssh-keygen -t rsa -b 4096
      • 執行時會有兩個問題
        1. 金鑰的放置路徑,預設產生路徑:%USERPROFILE%\.ssh\id_rsa.pub
        2. 金鑰的短密碼,需要輸入兩次
      • 請記住,私密金鑰檔案相當於密碼,應該與保護密碼的方式一樣加以保護

- 透過命令將公鑰部屬至遠端 Server 上

  • OpenSSH 工具中包含 scp,這是安全的檔案傳輸公用程式,接下來會使用到此命令工具協助進行此工作

  • ssh user1@domain1@contoso.com mkdir C:\users\user1\.ssh\

    • 首先需要先 SSH 連線到遠端的 SSH Server 上
  • scp C:\Users\user1\.ssh\id_ed25519.pub user1@domain1@contoso.com:C:\Users\user1\.ssh\authorized_keys

    • 使用scp將先前生成的公共密鑰文件複製到服務器上的authorized_keys
  • ssh --% user1@domain1@contoso.com powershell -c $ConfirmPreference = 'None'; Repair-AuthorizedKeyPermission C:\Users\user1\.ssh\authorized_keys

    • 適當地對服務器上的authenticated_keys文件進行ACL

參考資料