Secure Shell
Secure Shell
SSH(Secure Shell)是一種通用的、功能強大的、基於軟體的網路安全解決方案。計算機每次向網路發送數據時,SSH都會自動對其進行加密。數據到達目的地時,SSH自動對加密數據進行解密。整個過程都是透明的,使用OpenSSH工具將會增進你的系統安全性。談到網路安全訪問,相信大家首先想到的就是安全Shell,也就是Secure Shell,通常簡寫為SSH。這是因為SSH安裝容易、使用簡單,而且比較常見,一般的Unix系統、Linux系統、FreeBSD系統都附帶有支持SSH的應用程序包。
SSH為Secure Shell的縮寫,由IETF的網路工作小組(Network Working Group)所制定;SSH為創建在應用層和傳輸層基礎上的安全協議。
傳統的網路服務程序,如FTP、POP和Telnet其本質上都是不安全的;因為它們在網路上用明文傳送數據、用戶帳號和用戶口令,很容易受到中間人(man-in-the-middle)攻擊方式的攻擊。就是存在另一個人或者一台機器冒充真正的伺服器接收用戶傳給伺服器的數據,然後再冒充用戶把數據傳給真正的伺服器。
而SSH是目前較可靠,專為遠程登錄會話和其他網路服務提供安全性的協議。利用SSH協議可以有效防止遠程管理過程中的信息泄露問題。通過 SSH可以對所有傳輸的數據進行加密,也能夠防止DNS欺騙和IP欺騙。
SSH之另一項優點為其傳輸的數據是經過壓縮的,所以可以加快傳輸的速度。SSH有很多功能,它既可以代替Telnet,又可以為FTP、POP、甚至為PPP提供一個安全的“通道”。
傳統的網路服務程序,如FTP、Pop和Telnet在傳輸機制和實現原理上是沒有考慮安全機制的,其本質上都是不安全的;因為它們在網路上用明文傳送數據、用戶帳號和用戶口令,別有用心的人通過竊聽等網路攻擊手段非常容易地就可以截獲這些數據、用戶帳號和用戶口令。而且,這些網路服務程序的簡單安全驗證方式也有其弱點,那就是很容易受到"中間人"(man-in-the-middle)這種攻擊方式的攻擊。所謂"中間人"的攻擊方式,就是"中間人"冒充真正的伺服器接收你的傳給伺服器的數據,然後再冒充你把數據傳給真正的伺服器。伺服器和你之間的數據傳送被"中間人"一轉手做了手腳之後,就會出現很嚴重的問題。
SSH是英文Secure Shell的簡寫形式。通過使用SSH,你可以把所有傳輸的數據進行加密,這樣"中間人"這種攻擊方式就不可能實現了,而且也能夠防止DNS欺騙和IP欺騙。使用SSH,還有一個額外的好處就是傳輸的數據是經過壓縮的,所以可以加快傳輸的速度。SSH有很多功能,它既可以代替Telnet,又可以為FTP、Pop、甚至為PPP提供一個安全的"通道"。
最初的SSH是由芬蘭的一家公司開發的。但是因為受版權和加密演演算法的限制,現在很多人都轉而使用OpenSSH。OpenSSH是SSH的替代軟體包,而且是免費的,可以預計將來會有越來越多的人使用它而不是SSH。
最後,SSH在運行方式上也很有特色。不像其他的TCP/IP應用,SSH被設計為工作於自己的基礎之上,而不是利用包裝(wrappers)或通過Internet守護進程inetd。但是許多人想通過TCP包裝來運行SSH守護進程。雖然你可以通過tcpd(從inetd上運行啟動)來運行SSH進程,但這完全沒有必要。
SSH協議是建立在應用層和傳輸層基礎上的安全協議,它主要由以下三部分組成,共同實現SSH的安全保密機制。
傳輸層協議,它提供諸如認證、信任和完整性檢驗等安全措施,此外它還可以任意地提供數據壓縮功能。通常情況下,這些傳輸層協議都建立在面向連接的TCP數據流之上。
用戶認證協議層,用來實現伺服器的跟客戶端用戶之間的身份認證,它運行在傳輸層協議之上。
連接協議層,分配多個加密通道至一些邏輯通道上,它運行在用戶認證層協議之上。
當安全的傳輸層連接建立之後,客戶端將發送一個服務請求。當用戶認證層連接建立之後將發送第二個服務請求。這就允許新定義的協議可以和以前的協議共存。連接協議提供可用作多種目的通道,為設置安全交互Shell會話和傳輸任意的TCP/IP埠和X11連接提供標準方法。
從客戶端來看,SSH提供兩種級別的安全驗證。
第一種級別(基於口令的安全驗證),只要你知道自己的帳號和口令,就可以登錄到遠程主機,並且所有傳輸的數據都會被加密。但是,這種驗證方式不能保證你正在連接的伺服器就是你想連接的伺服器。可能會有別的伺服器在冒充真正的伺服器,也就是受到"中間人"這種攻擊方式的攻擊。
第二種級別(基於密匙的安全驗證),需要依靠密匙,也就是你必須為自己創建一對密匙,並把公有密匙放在需要訪問的伺服器上。如果你要連接到SSH伺服器上,客戶端軟體就會向伺服器發出請求,請求用你的密匙進行安全驗證。伺服器收到請求之後,先在你在該伺服器的用戶根目錄下尋找你的公有密匙,然後把它和你發送過來的公有密匙進行比較。如果兩個密匙一致,伺服器就用公有密匙加密"質詢"(challenge)並把它發送給客戶端軟體。客戶端軟體收到"質詢"之後就可以用你的私人密匙解密再把它發送給伺服器。
與第一種級別相比,第二種級別不需要在網路上傳送用戶口令。另外,第二種級別不僅加密所有傳送的數據,而"中間人"這種攻擊方式也是不可能的(因為他沒有你的私人密匙)。但是整個登錄的過程可能慢一些。
首先,SSH最常見的應用就是,用它來取代傳統的Telnet、FTP等網路應用程序,通過SSH登錄到遠方機器執行你想進行的工作與命令。在不安全的網路通訊環境中,它提供了很強的驗證(authentication)機制與非常安全的通訊環境。實際上,SSH開發者的原意是設計它來取代原UNIX系統上的rcp、rlogin、rsh等指令程序的;但經過適當包裝后,發現它在功能上完全可以取代傳統的Telnet、FTP等應用程序。
傳統 BSD 風格的 r 系列指令(如 rcp,rsh,rlogin)往往都被視為不安全的,很容易就被各種網路攻擊手段所破解,幾乎所有找得到有關UNIX安全的書或文件,都會一而再、再而三地警告系統管理者,留心r系列指令的設定,甚至要求系統管理者將r系列指令通通關閉。
而用來替代r系列指令的SSH,則在安全方面做了極大的強化,不但對通訊內容可以進行極為安全的加密保護,同時也強化了對身份驗證的安全機制,它應用了在密碼學(Cryptography)中已發展出來的數種安全加密機制,如 Symmetric Key Cryptography,Asymmetric Key Cryptography, One-way Hash Function,Random-number Generation等,來加強對於身份驗證與通訊內容的安全保護。通訊時資料的加密有IDEA,three-key triple DES,DES,RC4-128,TSS,Blowfish 等數種多種安全加密演演算法可供選擇,加密的key則是通過 RSA 進行交換的。資料的加密可以對抗IP spoofing,RSA這種非對稱性的加密機制則可用來對抗DNS spoofing與IP routing spoofing,同時RSA也可以進行對主機身份的驗證。
其次,通過使用用SSH可以在本地主機和遠程伺服器之間設置"加密通道",並且這樣設置的"加密通道"可以跟常見的Pop應用程序、X應用程序、Linuxconf應用程序相結合,提供安全保障。
SSH的"加密通道"是通過"埠轉發"來實現的。你可以在本地埠(沒有用到的)和在遠程伺服器上運行的某個服務的埠之間建立"加密通道"。然後只要連接到本地埠。所有對本地埠的請求都被SSH加密並且轉發到遠程伺服器的埠。當然只有遠程伺服器上運行SSH伺服器軟體的時候"加密通道"才能工作。
OpenSSH 是 SSH (Secure SHell)協議的免費開源實現。它用安全、加密的網路連接工具代替了 telnet、ftp、 rlogin、rsh 和 rcp 工具。OpenSSH 支持 SSH 協議的版本 1.3、1.5、和 2。自從 OpenSSH 的版本 2.9 以來,默認的協議是版本 2,該協議默認使用 RSA 鑰匙。
1. 為什麼使用 SSH?
使用 OpenSSH 工具將會增進你的系統安全性。所有使用 OpenSSH 工具的通訊,包括口令,都會被加密。 telnet 和 ftp 使用純文本口令,並被明文發送。這些信息可能會被截取,口令可能會被檢索,然後未經授權的人員可能會使用截取的口令登錄進你的系統而對你的系統造成危害。你應該儘可能地使用 OpenSSH 的工具集合來避免這些安全問題。
另一個使用 OpenSSH 的原因是,它自動把 DISPLAY 變數轉發給客戶機器。換一句話說,如果你在本地機器上運行 X 窗口系統,並且使用 ssh 命令登錄到了遠程機器上,當你在遠程機器上執行一個需要 X 的程序時,它會顯示在你的本地機器上。如果你偏愛圖形化系統管理工具,卻不能夠總是親身訪問該伺服器,這就會為你的工作大開方便之門。
2. 配置 OpenSSH 伺服器
要運行 OpenSSH 伺服器,你必須首先確定你安裝了正確的 RPM 軟體包。openssh-server 軟體包是必不可少的,並且它依賴於 openssh 軟體包的安裝與否。
OpenSSH 守護進程使用 /etc/ssh/sshd_config 配置文件。Red Hat Linux 9 安裝的默認配置文件在多數情況下應該足以勝任。如果你想使用沒有被默認的 sshd_config 文件提供的方式來配置守護進程,請閱讀 sshd 的說明書(man)頁來獲取能夠在配置文件中定義的關鍵字列表。
要啟動 OpenSSH 服務,使用 /sbin/service sshd start 命令。要停止 OpenSSH 伺服器,使用 /sbin/service sshd stop 命令。如果你想讓守護進程在引導時自動啟動,請參閱相關資料來獲取關於如何管理服務的信息。
如果你重新安裝了 Red Hat Linux 系統,任何在它被重裝前使用 OpenSSH 工具連接到這個系統上的客戶在它被重裝后將會看到下列消息:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
重裝后的系統會為自己創建一組新的身份標識鑰匙;因此客戶會看到 RSA 主機鑰匙改變的警告。如果你想保存系統原有的主機鑰匙,備份 /etc/ssh/ssh_host*key* 文件,然後在系統重裝后恢復它。該過程會保留系統的身份。當客戶機在該系統重裝后試圖連接它,它們就不會看到以上的警告信息。(還有一種解決方法見:http://chinaunix.net/forum/viewtopic.php?t=109562&start=0)
3. 配置 OpenSSH 客戶
要從客戶機連接到 OpenSSH 伺服器上,你必須在客戶機器上裝有 openssh-clients 和 openssh 軟體包。
3.1. 使用 ssh 命令
ssh 命令是 rlogin、rsh 和 telnet 命令的安全替換。它允許你在遠程機器上登錄並在其上執行命令。
使用 ssh 來登錄到遠程機器和使用 telnet 相似。要登錄到一個叫做 penguin.example.net 的遠程機器,在 shell 提示下鍵入下面的命令:
ssh penguin.example.net
第一次使用 ssh 在遠程機器上登錄時,你會看到和下面相仿的消息:
The authenticity of host 'penguin.example.net' can't be established.
DSA key fingerprint is 94:68:3a:3a:bc:f3:9a:9b:01:5d:b3:07:38:e2:11:0c.
Are you sure you want to continue connecting (yes/no)?
鍵入 yes 來繼續。這會把該伺服器添加到你的已知主機的列表中,如下面的消息所示:
Warning: Permanently added 'penguin.example.net' (RSA) to the list of known hosts.
下一步,你會看到向你詢問遠程主機口令的提示。在輸入口令后,你就會在遠程主機的 shell 提示下了。如果你沒有指定用戶名,你在本地客戶機器上登錄用的用戶名就會被傳遞給遠程機器。如果你想指定不同的用戶名,使用下面的命令:
你還可以使用 ssh -l username penguin.example.net。
ssh 命令可以用來在遠程機器上不經 shell 提示登錄而執行命令。它的語法格式是: ssh hostname command。譬如,如果你想在遠程主機 penguin.example.net 上執行 ls /usr/share/doc 命令,在 shell 提示下鍵入下面的命令:
ssh penguin.example.net ls /usr/share/doc
在你輸入了正確的口令之後, /usr/share/doc 這個遠程目錄中的內容就會被顯示,然後你就會被返回到你的本地 shell 提示下。
3.2. 使用 scp 命令
scp 命令可以用來通過安全、加密的連接在機器間傳輸文件。它與 rcp 相似。
把本地文件傳輸給遠程系統的一般語法是:
scp localfile username@tohostname:/newfilename
localfile 指定源文件,username@tohostname:/newfilename 指定目標文件。
要把本地文件 shadowman 傳送到你在 penguin.example.net 上的賬號內,在 shell 提示下鍵入(把 username 替換成你的用戶名):
scp shadowman [email protected]:/home/username
這會把本地文件 shadowman 傳輸給 penguin.example.net 上的 /home/username/shadowman 文件。
把遠程文件傳輸給本地系統的一般語法是:
scp username@tohostname:/remotefile /newlocalfile
remotefile 指定源文件,newlocalfile 指定目標文件。
源文件可以由多個文件組成。譬如,要把目錄 /downloads 的內容傳輸到遠程機器 penguin.example.net 上現存的 uploads 目錄,在 shell 提示下鍵入下列命令:
scp /downloads/* [email protected]:/uploads/
3.3. 使用 sftp 命令
sftp 工具可以用來打開一次安全互動的 FTP 會話。它與 ftp 相似,只不過,它使用安全、加密的連接。它的一般語法是:sftp [email protected]。一旦通過 驗證,你可以使用一組和使用 FTP 相似的命令。請參閱 sftp 的說明書頁(man)來獲取這些 命令的列表。要閱讀說明書頁,在 shell 提示下執行 man sftp 命令。sftp 工具只在 OpenSSH 版本 2.5.0p1 以上才有。
3.4. 生成鑰匙對
如果你不想每次使用 ssh、scp 或 sftp 時都要輸入口令來連接遠程機器,你可以生成一對授權鑰匙。
鑰匙必須為每個用戶生成。要為某用戶生成鑰匙,用想連接到遠程機器的用戶身份來遵循下面的步驟。如果你用根用戶的身份完成了下列步驟,就只有根用戶才能使用這對鑰匙。
從 OpenSSH 版本 3.0 開始,~/.ssh/authorized_keys2、~/.ssh/known_hosts2 和 /etc/ssh_known_hosts2 就會過時。SSH 協議 1 和 2 共享 ~/.ssh/authorized_keys、~/.ssh/known_hosts 和 /etc/ssh/ssh_known_hosts 文件。
Red Hat Linux 9 默認使用 SSH 協議 2 和 RSA 鑰匙。
竅門
如果你重裝了 Red Hat Linux,但是想保留現有的鑰匙對,備份你的主目錄中的 .ssh 目錄。重裝后,把該目錄複製回主目錄。該進程可為系統上的所有用戶進行,包括根用戶。
3.4.1. 為版本 2 生成 RSA 鑰匙對
使用下列步驟來為 SSH 協議的版本 2 生成 RSA 鑰匙對。從 OpenSSH 2.9 開始,它已成為默認設置。
1. 要生成 RSA 鑰匙對與協議的版本 2 合作,在 shell 提示下鍵入下列命令:
ssh-keygen -t rsa
接受 ~/.ssh/id_rsa 的默認位置。輸入一個與你的帳號口令不同的口令句,再輸入一次來確認。
公鑰被寫入 ~/.ssh/id_rsa.pub。密鑰被寫入 ~/.ssh/id_rsa。決不能把密鑰出示給任何人。
2. 使用 chmod 755 ~/.ssh 命令改變你的 .ssh 目錄的許可許可權。
3. 把 ~/.ssh/id_rsa.pub 的內容複製到你想連接的機器上的 ~/.ssh/authorized_keys 文件中。如果 ~/.ssh/authorized_keys 不存在,你可以把 ~/.ssh/id_rsa.pub 文件複製到那個機器上的 ~/.ssh/authorized_keys 文件中。
4. 如果你運行的是 GNOME,跳到第 3.4.4 節。如果你沒在運行 X 窗口系統,跳到第 3.4.5 節。
3.4.2. 為版本 2 生成 DSA 鑰匙對
使用下面的步驟來為 SSH 協議的版本 2 生成 DSA 鑰匙對。
1. 要生成用於協議的版本 2 的 DSA 鑰匙對,在 shell 提示下鍵入下面的命令:
ssh-keygen -t dsa
接受 ~/.ssh/id_dsa 的默認位置。輸入一個與你的帳號口令不同的口令句,再輸入一次來確認。
竅門
口令句是用來驗證用戶的一串辭彙和字元。口令句和一般口令的不同之處在於:在口令句中你可以使用空格或製表符。口令句通常比一般口令長,因為它們通常使用短語而不僅僅用一個詞。
公鑰被寫入 ~/.ssh/id_dsa.pub。密鑰被寫入 ~/.ssh/id_dsa。決不能把密鑰出示給任何人,這一點很重要。
2. 使用 chmod 755 ~/.ssh 命令改變你的 .ssh 目錄的許可許可權。
3. 把 ~/.ssh/id_dsa.pub 的內容複製到你想連接的機器中的 ~/.ssh/authorized_keys 文件中。如果文件 ~/.ssh/authorized_keys 不存在,你可以把 ~/.ssh/id_dsa.pub 文件複製到那個機器上的 ~/.ssh/authorized_keys文件中。
4. 如果你運行的是 GNOME,跳到第 3.4.4 節。如果你沒在運行 X 窗口系統,跳到 第 3.4.5 節。
3.4.3. 為版本 1.3 和 1.5 生成 DSA 鑰匙對
使用下面的步驟來生成用於 SSH 協議版本 1 的 RSA 鑰匙對。如果你只在使用 DSA 的系統間連接,則不需要 RSA 版本 1.3 或 RSA 版本 1.5 鑰匙對。
1. 要生成 RSA (版本 1.3 和 1.5 協議)鑰匙對,在 shell 提示下鍵入下列命令:
ssh-keygen -t rsa1
接受默認的位置(~/.ssh/identity)。輸入和你的帳號口令不同的口令句。再輸入一次來確認。
公鑰被寫入 ~/.ssh/identity.pub。密鑰被寫入 ~/.ssh/identity。不要把你的密鑰出示給任何人。
2. 使用 chmod 755 ~/.ssh 和 chmod 644 ~/.ssh/identity.pub 命令改變你的 .ssh 目錄和密鑰的許可許可權。
3. 把 ~/.ssh/identity.pub 的內容複製到你想連接的機器中的 ~/.ssh/authorized_keys 文件中。如果文件 ~/.ssh/authorized_keys 不存在,你可以把 ~/.ssh/identity.pub 文件複製到遠程機器上的 ~/.ssh/authorized_keys 文件中。
4. 如果你運行的是 GNOME,跳到第 3.4.4 節。如果你沒在運行 GNOME,跳到第 3.4.5 節。
3.4.4. 在 GNOME 中配置 ssh-agent
ssh-agent 工具可以用來保存你的口令句,因此你不必在每次引發 ssh 或 scp 連接時都輸入口令。如果你在使用 GNOME,openssh-askpass-gnome 工具可以用來在你登錄到 GNOME 時提示你輸入口令句,並把它一直保留到你從 GNOME 中註銷之時。你不必為本次 GNOME 會話中任何 ssh 或 scp 連接輸入口令或口令句。如果你不打算使用 GNOME,請參閱第 3.4.5 節。
要在 GNOME 會話中保存口令句,遵循下列步驟:
1. 你需要安裝 openssh-askpass-gnome 軟體包;你可以使用 rpm -q openssh-askpass-gnome 命令來判定該軟體包是否已被安裝。如果它沒有被安裝,從你的 Red Hat Linux 光碟集合、Red Hat FTP 鏡像站點、或使用 Red Hat 網路 來安裝它。
2. 點擊「主菜單」(在面板上)=> 「首選項」 => 「更多首選項」 => 「會話」。然後點擊「啟動程序」標籤。點擊「增加」,在「啟動命令」文本欄位內輸入 /usr/bin/ssh-add。把它的優先順序設為比任何現存命令都高的數字以確保它最後才執行。ssh-add 的優先順序數字最好是 70 或更高。優先順序數字越高,優先順序越低。如果你列出了其它程序,該程序的優先順序應該最低。點擊「關閉」來退出該程序。
3. 註銷后再登錄進 GNOME;換一句話說,重新啟動 X 伺服器。在 GNOME 啟動后,一個提示你輸入口令句的對話框就會出現。輸入要求的口令句。如果你把 DSA 和 RSA 兩者都配置了,你會被提示兩者都輸入。從現在起,你就不會被 ssh、 scp 或 sftp 提示輸入口令了。
3.4.5. 配置 ssh-agent
ssh-agent 可以用來儲存你的口令句,因此你在每次使用 ssh 或 scp 連接時就不必總是輸入它。如果你不在運行 X 窗口系統,則在 shell 提示中遵循這些步驟。如果你在運行 GNOME,但是不想配置它來在你登錄時提示你輸入口令(參閱第 3.4.4 節),這個過程可以在類似 xterm 的終端窗口中進行。如果你在運行 X 卻不是 GNOME,這個過程可以在終端中進行。可是,你的口令只能在該終端窗口中被記住,它不是全局設置。
1. 在 shell 提示下,鍵入下面的命令:
exec /usr/bin/ssh-agent $SHELL
2. 然後,鍵入下面的命令:
ssh-add
接著,輸入你的口令。如果你配置了不止一個鑰匙對,你會被提示輸入每個口令。
3. 當你註銷后,口令句就會被忘記。你必須在每次登錄到虛擬控制台或打開終端窗口時都執行這兩條命令。
4. 其它資料
OpenSSH 和 OpenSSL 工程處於不斷地開發中,因此關於它們的最新信息通常位於它們的官方網站中。OpenSSH 和 OpenSSL 工具的說明書(man)頁也是個獲取詳細信息的好地方。
4.1. 安裝了的文檔
* ssh、scp、sftp、sshd 和 ssh-keygen 的說明書(man)頁 — 關於它們的說明書頁包括如何使用這些命令的信息,以及所有能與它們一起使用的參數。
4.2. 有用的網站