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
使用你的管理員帳戶登入Linux伺服器。
使用編輯器打開
/etc/ssh/sshd_config
文件。例如,使用nano
:sudo nano /etc/ssh/sshd_config
在文件中尋找或新增以下設定:
PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no
PubkeyAuthentication yes
:允許使用公鑰認證。AuthorizedKeysFile .ssh/authorized_keys
:指定公鑰文件的位置。PasswordAuthentication no
:禁止使用密碼認證。如果你還想保留密碼登入的選項,可以設定為yes
。
儲存並關閉文件。
重新啟動SSH守護程式以應用更改:
sudo systemctl restart sshd
驗證設定:從另一台電腦嘗試使用SSH金鑰登入伺服器。如果你能夠成功登入,那麼設定就是正確的。如果你保留了密碼認證,也可以嘗試使用密碼登入。根據你的
sshd_config
設定,你應該可以或無法使用密碼登入。檢查SSH守護程式的日誌以查看任何錯誤或警告:sudo journalctl -u sshd
這些步驟應該幫助你設定和驗證你的SSH伺服器配置,以便使用SSH金鑰認證。