複製鏈接
請複製以下鏈接發送給好友

ssh

(安全外殼協議)

鎖定
安全外殼協議(Secure Shell,簡稱SSH)是一種在不安全網絡上用於安全遠程登錄和其他安全網絡服務的協議。
SSH由IETF的網絡小組(Network Working Group)所制定;SSH 為建立在應用層基礎上的安全協議。SSH 是較可靠,專為遠程登錄會話和其他網絡服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。SSH最初是UNIX系統上的一個程序,後來又迅速擴展到其他操作平台。SSH在正確使用時可彌補網絡中的漏洞。SSH客户端適用於多種平台。幾乎所有UNIX平台—包括HP-UXLinuxAIXSolaris、Digital UNIXIrix,以及其他平台,都可運行SSH。
中文名
安全外殼協議
外文名
Secure Shell
別    名
SSH
作    用
提供安全性的協議

ssh功能

傳統的網絡服務程序,如:ftp、pop和telnet在本質上都是不安全的,因為它們在網絡上用明文傳送口令和數據,別有用心的人非常容易就可以截獲這些口令和數據。而且,這些服務程序的安全驗證方式也是有其弱點的, 就是很容易受到“中間人”(man-in-the-middle)這種方式的攻擊。所謂“中間人”的攻擊方式, 就是“中間人”冒充真正的服務器接收你傳給服務器的數據,然後再冒充你把數據傳給真正的服務器。服務器和你之間的數據傳送被“中間人”一轉手做了手腳之後,就會出現很嚴重的問題。通過使用SSH,你可以把所有傳輸的數據進行加密,這樣"中間人"這種攻擊方式就不可能實現了,而且也能夠防止DNS欺騙和IP欺騙。使用SSH,還有一個額外的好處就是傳輸的數據是經過壓縮的,所以可以加快傳輸的速度。SSH有很多功能,它既可以代替Telnet,又可以為FTP、PoP、甚至為PPP提供一個安全的"通道" [1] 

ssh驗證

從客户端來看,SSH提供兩種級別的安全驗證。
第一種級別(基於口令的安全驗證)
只要你知道自己帳號和口令,就可以登錄到遠程主機。所有傳輸的數據都會被加密,但是不能保證你正在連接的服務器就是你想連接的服務器。可能會有別的服務器在冒充真正的服務器,也就是受到“中間人”這種方式的攻擊。
第二種級別(基於密匙的安全驗證)
需要依靠密匙,也就是你必須為自己創建一對密匙,並把公用密匙放在需要訪問的服務器上。如果你要連接到SSH服務器上,客户端軟件就會向服務器發出請求,請求用你的密匙進行安全驗證。服務器收到請求之後,先在該服務器上你的主目錄下尋找你的公用密匙,然後把它和你發送過來的公用密匙進行比較。如果兩個密匙一致,服務器就用公用密匙加密“質詢”(challenge)並把它發送給客户端軟件。客户端軟件收到“質詢”之後就可以用你的私人密匙解密再把它發送給服務器。
用這種方式,你必須知道自己密匙的口令。但是,與第一種級別相比,第二種級別不需要在網絡上傳送口令。
第二種級別不僅加密所有傳送的數據,而且“中間人”這種攻擊方式也是不可能的(因為他沒有你的私人密匙)。但是整個登錄的過程可能需要10秒 [2] 

ssh詳細

如果你考察一下接入ISP(Internet Service Provider,互聯網服務供應商)或大學的方法,一般都是採用Telnet或POP郵件客户進程。因此,每當要進入自己的賬號時,你輸入的密碼將會以明碼方式發送(即沒有保護,直接可讀),這就給攻擊者一個盜用你賬號的機會—最終你將為他的行為負責。由於SSH的源代碼是公開的,所以在Unix世界裏它獲得了廣泛的認可。Linux其源代碼也是公開的,大眾可以免費獲得,並同時獲得了類似的認可。這就使得所有開發者(或任何人)都可以通過補丁程序或b u g修補來提高其性能,甚至還可以增加功能。開發者獲得並安裝SSH意味着其性能可以不斷提高而無須得到來自原始創作者的直接技術支持。SSH替代了不安全的遠程應用程序。SSH是設計用來替代伯克利版本的r命令集的;它同時繼承了類似的語法。其結果是,使用者注意不到使用SSH和r命令集的區別。利用它,你還可以幹一些很酷的事。通過使用SSH,你在不安全的網絡中發送信息時不必擔心會被監聽。你也可以使用POP通道和Telnet方式,通過SSH可以利用PPP通道創建一個虛擬個人網絡( Virtual Private Network,VPN)。SSH也支持一些其他的身份認證方法,如Kerberos和安全ID卡等。
但是因為受版權和加密算法的限制,可以預計將來會有越來越多的人使用SSH而不是Telnet或者POP3等 [3] 

ssh層次

SSH 主要由三部分組成:
傳輸層協議 [SSH-TRANS]
提供了服務器認證,保密性及完整性。此外它有時還提供壓縮功能。 SSH-TRANS 通常運行在TCP/IP連接上,也可能用於其它可靠數據流上。 SSH-TRANS 提供了強力的加密技術、密碼主機認證及完整性保護。該協議中的認證基於主機,並且該協議不執行用户認證。更高層的用户認證協議可以設計為在此協議之上。
用户認證協議 [SSH-USERAUTH]
用於向服務器提供客户端用户鑑別功能。它運行在傳輸層協議 SSH-TRANS 上面。當SSH-USERAUTH 開始後,它從低層協議那裏接收會話標識符(從第一次密鑰交換中的交換哈希H )。會話標識符唯一標識此會話並且適用於標記以證明私鑰的所有權。 SSH-USERAUTH 也需要知道低層協議是否提供保密性保護。
連接協議 [SSH-CONNECT]
將多個加密隧道分成邏輯通道。它運行在用户認證協議上。它提供了交互式登錄話路、遠程命令執行、轉發 TCP/IP 連接和轉發 X11 連接。

ssh結構

SSH是由客户端和服務端的軟件組成的,有兩個不兼容的版本分別是:1.x和2.x。 用SSH 2.x的客户程序是不能連接到SSH 1.x的服務程序上去的。OpenSSH 2.x同時支持SSH 1.x和2.x。
服務端是一個守護進程(daemon),他在後台運行並響應來自客户端的連接請求。服務端一般是sshd進程,提供了對遠程連接的處理,一般包括公共密鑰認證、密鑰交換、對稱密鑰加密和非安全連接。
客户端包含ssh程序以及像scp(遠程拷貝)、slogin(遠程登陸)、sftp(安全文件傳輸)等其他的應用程序。
他們的工作機制大致是本地的客户端發送一個連接請求到遠程的服務端,服務端檢查申請的包和IP地址再發送密鑰給SSH的客户端,本地再將密鑰發回給服務端,自此連接建立。SSH 1.x和SSH 2.x在連接協議上有一些差異。
一旦建立一個安全傳輸層連接,客户機就發送一個服務請求。當用户認證完成之後,會發送第二個服務請求。這樣就允許新定義的協議可以與上述協議共存。連接協議提供了用途廣泛的各種通道,有標準的方法用於建立安全交互式會話外殼和轉發(“隧道技術”)專有 TCP/IP 端口和 X11 連接。
SSH被設計成為工作於自己的基礎之上而不利用超級服務器(inetd),雖然可以通過inetd上的tcpd來運行SSH進程,但是這完全沒有必要。啓動SSH服務器後,sshd運行起來並在默認的22端口進行監聽(你可以用 # ps -waux | grep sshd 來查看sshd是否已經被正確的運行了)如果不是通過inetd啓動的SSH,那麼SSH就將一直等待連接請求。當請求到來的時候SSH守護進程會產生一個子進程,該子進程進行這次的連接處理 [4] 

ssh應用

SSH另類應用:用ssh做socks5代理 [5] 
1. 下載MyEntunnel。
2.下載PuTTY,解壓到MyEntunnel程序的目錄下。
3.運行MyEntunnel.exe,設置:SSH Server裏頭填上ssh ftp的地址或IP,填好用户名和密碼,點Connect,系統欄裏面的小鎖變成綠色就連接成功了。
4.設置瀏覽器。IE是不支持socks代理的,用firefox好了,打開firefox的代理設置頁,在socks主機處填上127.0.0.1端口填原先設置的,默認7070。
Win主機環境運行SSH命令的方法
對於Win主機用户,可以下載工具putty來進行shell管理。具體的命令依賴於登錄到遠端主機所使用的系統和Shell。
一些常用的shell命令如下:
cd[目錄名]轉換路徑
cd.. 返回上級目錄
ls顯示當前目錄下所有文件
rm[-r]-f[][文件名]刪除文件,加[-r]可以刪除文件下所有子文件,如rm[ -r]-f [abc]刪除abc文件夾及文件夾下的所有文件
tar -xzf [解壓下載的壓縮包]
unzip[文件名]解壓文件
cp -rpf .A/* B 將A文件夾中的所有文件拷貝到其上級目錄B中
wget(遠程下載文件到服務器上)

ssh擴展

SSH協議框架中設計了大量可擴展的冗餘能力,比如用户自定義算法、客户自定義密鑰規則、高層擴展功能性應用協議。這些擴展大多遵循 IANA 的有關規定,特別是在重要的部分,像命名規則和消息編碼方面。
SSH採用面向連接的TCP協議傳輸 應用22號端口 安全係數較高。

ssh啓動方法

方法一:使用批處理文件
在服務器端安裝目錄下有兩個批處理文件“start-ssh.bat”和“stop-ssh.bat”。運行“start-ssh.bat”文件就可以啓動SSH服務,要停止該服務只要執行“stop-ssh.bat”文件即可。
方法二:使用SSH服務配置程序
在安裝目錄下,運行“fsshconf.exe”程序,它雖是SSH服務器的配置程序,但也可以用來啓動和停止SSH服務。在彈出的“F-Secure SSH Server Configuration”窗口中,點擊左面列表框中的“Server Settings”後,在右邊的“Service status”欄中會顯示服務器狀態按鈕,如果服務器是停止狀態,則按鈕顯示為“Start service”,點擊該按鈕就可啓動SSH服務,再次點擊可停止SSH服務。
方法三:使用NET命令
在服務器端的“命令提示符”窗口中,輸入“net start ″F-secure SSH Server″”命令,就可以啓動SSH服務,要停止該服務,輸入“net stop ″F-Secure SSH Server″”命令即可。其中“F-Secure SSH Server”為SSH服務器名,“net start”和“net stop”為Windows系統啓動和停止系統服務所使用的命令。
啓動了SSH服務後,一定要關閉Telnet服務,這樣服務器就處在安全環境之中了,不用再怕數據被竊取 [6] 

sshSSH安全技巧

SSH 是較可靠,專為遠程登錄會話和其他網絡服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。S S H最初是U N I X系統上的一個程序,後來又迅速擴展到其他操作平台。S S H在正確使用時可彌補網絡中的漏洞。客户端包含ssh程序以及像scp(遠程拷貝)、slogin(遠程登陸)、sftp(安全文件傳輸)等其他的應用程序。SSH有很多非常酷的特性,如果它是你每天的工作伴侶,那麼我想你有必要了解以下10條高效使用SSH的秘籍,它們幫你節省的時間肯定會遠遠大於你用來配置它們的時間。

ssh服務器間跳轉

有些時候,你可能沒法直接連接到某台服務器,而需要使用一台中間服務器進行中轉,這個過程也可以自動化。首先確保你已經為服務器配置了公鑰訪問,並開啓了agent forwarding,可以通過2條命令來連接目標服務器,不會有任何提示輸入:
$ ssh gateway
gateway $ ssh db
然後在你的本地SSH配置中,添加下面這條配置:
Host db
HostName
ProxyCommand ssh gateway netcat -q 600 %h %p
可以通過一條命令來直接連接目標服務器了:
$ ssh db
這裏你可能會需要等待長一點的時間,因為SSH需要進行兩次認證,注意netcat也有可能被寫成nc或者ncat或者前面還需要加上g,你需要檢查你的中間服務器來確定實際的參數。

ssh省去用户名

如果你在遠程服務器上的用户名和你本地的用户名不同,你同樣可以在SSH配置中進行設置:
Host www* mail
HostName %h
User simon
就算我的本地用户名是 smylers,我仍然可以這樣連接我的服務器:
$ ssh www2
SSH會使用simon賬户連接你的服務器,同樣,Putty可以保存這個信息在你的session中。

ssh主機別名

你也可以在你的SSH配置中直接定義主機別名,就像下面這樣:
Host dev
HostName
你還可以使用通配符來進行分組:
Host dev intranet backup
HostName %h
Host www* mail
HostName %h
在Putty中你可以為每個主機名保存單獨的session,然後雙擊建立連接(但是它可能沒辦法支持通配符)。

ssh省略主機名

輸入服務器的完整主機名來建立一個新的SSH連接實在是太乏味無聊了,尤其是當你有一組擁有相同域名但是子域名不同的服務器需要管理時。
或許你的網絡已經配置了可以直接使用短域名,比如intranet,但是如果你的網絡不支持,實際上你可以自己搞定這個問題,而不用求助網絡管理員。
解決辦法根據你用的操作系統而略有差異,下面是我的Ubuntu系統的配置:
prepend domain-search
然後你需要重啓網絡:$ sudo restart network-manager
不同的系統,這兩條命令可能會略有差異。

ssh連接中轉

有時候你可能需要從一個服務器連接另外一個服務器,比如在兩個服務器之間直接傳輸數據,而不用通過本地電腦中轉:
www1 $ scp -pr templates www2:$PWD
(順便説一下,當你需要在兩台服務器間拷貝文件時,$PWD變量時非常有用的),因為即使你已經在兩台服務器上添加了你本地電腦的公鑰,scp默認仍然會提示你輸入密碼:這是因為你用來作為跳板的那台服務器上並沒有你的私鑰,所以,第二台服務器會拒絕你的公鑰,但是一定不要通過將你的私鑰拷貝到中轉服務器上來解決這個問題,你可以使用agent forwarding來解決這個問題,只要在你的.ssh/config文件中加入下面這行代碼就可以了:ForwardAgent yes或者是在Putty中勾上“Allow agent forwarding”選項,本地SSH就變成了第一台服務器的SSH代理,從第一台服務器在連接其它服務器就變和和在你本地一樣簡單,注意,如果要開啓這個選項,前提是這個中間服務器值得你信任。

ssh別再輸入密碼

如果你還在通過密碼方式登錄SSH,那麼你或許應該試試SSH Keys,首先使用OpenSSH為自己生成一對密鑰:
$ ssh-keygen
跟隨指示,完成之後,你應該可以在你的.ssh目錄下看到兩個文件,id_rsa就是你的私鑰,而id_ras.pub則是你的公鑰,現 在你需要將你的公鑰拷貝到服務器上,如果你的系統有ssh-copy-id命令,拷貝會很簡單:
$ ssh-copy-id
否則,你需要手動將你的公鑰拷貝的服務器上的~/.ssh/authorized_keys文件中:
$ < ~/.ssh/id_rsa.pub ssh ‘mkdir -p .ssh; cat >> .ssh/authorized_keys; chmod go-w .ssh .ssh/authorized_keys’
試試重新連接到SSH服務器,或是拷貝文件,是不是已經不需要再輸入密碼了?

ssh長連接

如果你發現自己每天需要連接同一個服務器無數次,那麼長連接選項就是為你準備的:
ControlPersist 4h
你每次通過SSH與服務器建立連接之後,這條連接將被保持4個小時,即使在你退出服務器之後,這條連接依然可以重用,因此,在你下一次(4小時之內)登錄服務器時,你會發現連接以閃電般的速度建立完成,這個選項對於通過scp拷貝多個文件提速尤其明顯,因為你不在需要為每個文件做單獨的認證了。

ssh多條連接共享

如果你需要在多個窗口中打開到同一個服務器的連接,而不想每次都輸入用户名,密碼,或是等待連接建立,那麼你可以配置SSH的連接共享選項,在本地打開你的SSH配置文件,通常它們位於~/.ssh/config,然後添加下面2行:
ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r
試試斷開你與服務器的連接,並建立一條新連接,然後打開一個新窗口,再創建一條連接,你會發現,第二條連接幾乎是在瞬間就建立好了。
Windows用户
如果你是Windows用户,很不幸,最流行的開源SSH客户端Putty並不支持這個特性,但是Windows上也有OpenSSH的實現,比如這個Copssh,如果你覺得下面的一些技巧對你很有幫助,或許你應該試試Copssh。
文件傳輸
連接共享不止可以幫助你共享多個SSH連接,如果你需要通過SFTP與服務器傳輸文件,你會發現,它們使用的依然是同一條連接,如果你使用的Bash,你會發現,你甚至SSH甚至支持Tab對服務器端文件進行自動補全,共享連接選項對於那些需要藉助SSH的工具,比如rsync,git等等也同樣有效。

ssh加速連接

如果你確保你和某個服務器之間的連接是安全的(比如通過公司內網連接),那麼你就可以通過選擇arcfourencryption算法來讓數據傳輸更快一些:
Host dev
Ciphers arcfour
注意這個加速是以犧牲數據的“加密”性為代價的,所以如果你連接的是位於網上的服務器,千萬不要打開這個選項,並且確保你是通過VPN建立的連接。

ssh減少延遲

如果每次連接服務器都意味着你需要等待幾十秒而無所事事,那麼你或許應該試試在你的SSH配置中加入下面這條:
GSSAPIAuthentication no
如果這條命令有效的話,你應該通知你的系統管理員讓他在服務器上禁用這個選項,這樣其他人就不用再分別添加這條配置到它們的本地配置了。 [5] 
參考資料