Buy Me a Coffee

SSH 是什麼?

SSH (Secure Shell) 是一種安全的網路協議,用於遠端登入伺服器。當使用SSH時,有兩種主要的登入方式:一是傳統的密碼登入,另一是使用特殊的安全金鑰。目前,大型雲端服務如Google的GCE和Amazon的EC2,都建議或強制使用金鑰登入,因為這樣不僅避免了每次輸入密碼的麻煩,還大大提高了安全性。

使用金鑰登入的安全性在於,即使你的電腦被木馬病毒感染或在公共網路中被攔截,你輸入的所有內容,包括密碼,都可能被記錄。但使用SSH金鑰,即使有人記錄了你的操作,他們也無法獲取你的私人金鑰,因此無法登入。但要注意,你的私人金鑰必須嚴格保管,絕不能外洩。

使用 C# 透過 SSH.NET 遠端控制 Linux

當我們需要遠端管理Linux伺服器的文件時,C#的SSH.NET庫提供了一個簡單而強大的解決方案。許多開發者在開發過程中都可能需要進行文件操作,如移動、重新命名或刪除。SSH.NET允許我們直接在程式碼中完成這些操作,而不是手動操作。

SSH.NET是一個專為.NET平台設計的SSH庫,支援多種SSH操作,如運行命令、列出文件等。它還提供了Linq查詢支援,使文件操作更加靈活。此外,SSH.NET具有出色的安全性,支援SSH金鑰認證,確保所有通信都是加密的。它還支援Windows和Linux,使開發者可以跨平台工作。

如何在Windows上建立SSH公私鑰

在Windows的命令提示字元中,我們可以使用以下指令來生成SSH公私鑰:

Microsoft Windows [版本 10.0.19045.3570]
(c) Microsoft Corporation. 著作權所有,並保留一切權利。

C:\Users\UserID1>ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\UserID1/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\UserID1/.ssh/id_rsa.
Your public key has been saved in C:\Users\UserID1/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:OB2SadB9OTpgfpS1Z124JS/LoSVD9Pu67JKK7xXuxRQ denni@DESKTOP-VDAN80C
The key's randomart image is:
+---[RSA 4096]----+
|    .. . o.o.  ..|
|     .+o+ +..oo..|
|     o=o.o.oo E= |
|     ..++. oo =o.|
|      o.S.  .*o+ |
|       .   ..+o. |
|            o.o .|
|         . ooo . |
|        .o+..o=. |
+----[SHA256]-----+

將公鑰添加到Linux伺服器的authorized_keys

將生成的公鑰(id_rsa.pub)的內容添加到Linux伺服器的~/.ssh/authorized_keys文件中。

C# 程式範例

以下是一個使用SSH.NET和私人金鑰進行SSH連接的C#範例:

using System;
using Renci.SshNet;

class Program
{
    static void Main()
    {
        string host = "your_server_ip_or_hostname";
        string username = "your_username";
        string privateKeyPath = @"path_to_your_private_key_file"; // 例如: @"C:\path\to\id_rsa"

        // 建立Private Key File連接資訊
        var keyFile = new PrivateKeyFile(privateKeyPath);
        var keyFiles = new[] { keyFile };
        var connectionInfo = new ConnectionInfo(host, username, new PrivateKeyAuthenticationMethod(username, keyFiles));

        // 使用連接資訊建立SSH連接
        using (var client = new SshClient(connectionInfo))
        {
            client.Connect();

            // 執行一個命令來測試連接
            var cmd = client.RunCommand("uname -a");
            Console.WriteLine(cmd.Result);

            client.Disconnect();
        }
    }
}

Linux伺服器的.ssh目錄權限設定

確保你的.ssh目錄和相關文件的權限設置正確:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys

-rwxr--r--  1 userid userid 1155 Nov 11 14:16 authorized_keys
-rw-------  1 userid userid 3247 Nov 25 17:14 id_rsa
-rw-------  1 userid userid  752 Nov 25 17:14 id_rsa.pub
-rw-------  1 userid userid 1110 Nov 10 14:48 known_hosts

如何在Linux伺服器端設定SSH

  1. 使用你的管理員帳戶登入Linux伺服器。

  2. 使用編輯器打開/etc/ssh/sshd_config文件。例如,使用nano

    sudo nano /etc/ssh/sshd_config
    
  3. 在文件中尋找或新增以下設定:

    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys
    PasswordAuthentication no
    
    • PubkeyAuthentication yes:允許使用公鑰認證。
    • AuthorizedKeysFile .ssh/authorized_keys:指定公鑰文件的位置。
    • PasswordAuthentication no:禁止使用密碼認證。如果你還想保留密碼登入的選項,可以設定為yes
  4. 儲存並關閉文件。

  5. 重新啟動SSH守護程式以應用更改:

    sudo systemctl restart sshd
    
  6. 驗證設定:從另一台電腦嘗試使用SSH金鑰登入伺服器。如果你能夠成功登入,那麼設定就是正確的。如果你保留了密碼認證,也可以嘗試使用密碼登入。根據你的sshd_config設定,你應該可以或無法使用密碼登入。檢查SSH守護程式的日誌以查看任何錯誤或警告:

    sudo journalctl -u sshd
    

這些步驟應該幫助你設定和驗證你的SSH伺服器配置,以便使用SSH金鑰認證。