ssh[安全外殼協定]

ssh[安全外殼協定]

SSH 為 Secure Shell 的縮寫,由 IETF 的網路小組(Network Working Group)所制定;SSH 為建立在套用層基礎上的安全協定。SSH 是目前較可靠,專為遠程登錄會話和其他網路服務提供安全性的協定。利用 SSH 協定可以有效防止遠程管理過程中的信息泄露問題。SSH最初是UNIX系統上的一個程式,後來又迅速擴展到其他操作平台。SSH在正確使用時可彌補網路中的漏洞。SSH客戶端適用於多種平台。幾乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可運行SSH。

基本信息

功能

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

驗證

從客戶端來看,SSH提供兩種級別的安全驗證。

第一種級別(基於口令的安全驗證)

只要你知道自己帳號和口令,就可以登錄到遠程主機。所有傳輸的數據都會被加密,但是不能保證你正在連線的伺服器就是你想連線的伺服器。可能會有別的伺服器在冒充真正的伺服器,也就是受到“中間人”這種方式的攻擊。

第二種級別(基於密匙的安全驗證)

需要依靠密匙,也就是你必須為自己創建一對密匙,並把公用密匙放在需要訪問的伺服器上。如果你要連線到SSH伺服器上,客戶端軟體就會向伺服器發出請求,請求用你的密匙進行安全驗證。伺服器收到請求之後,先在該伺服器上你的主目錄下尋找你的公用密匙,然後把它和你傳送過來的公用密匙進行比較。如果兩個密匙一致,伺服器就用公用密匙加密“質詢”(challenge)並把它傳送給客戶端軟體。客戶端軟體收到“質詢”之後就可以用你的私人密匙解密再把它傳送給伺服器。

用這種方式,你必須知道自己密匙的口令。但是,與第一種級別相比,第二種級別不需要在網路上傳送口令。

第二種級別不僅加密所有傳送的數據,而且“中間人”這種攻擊方式也是不可能的(因為他沒有你的私人密匙)。但是整個登錄的過程可能需要10秒 。

詳細

如果你考察一下接入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等 。

層次

SSH 主要由三部分組成:

傳輸層協定 [SSH-TRANS]

提供了伺服器認證,保密性及完整性。此外它有時還提供壓縮功能。 SSH-TRANS 通常運行在TCP/IP連線上,也可能用於其它可靠數據流上。 SSH-TRANS 提供了強力的加密技術、密碼主機認證及完整性保護。該協定中的認證基於主機,並且該協定不執行用戶認證。更高層的用戶認證協定可以設計為在此協定之上。

用戶認證協定 [SSH-USERAUTH]

用於向伺服器提供客戶端用戶鑑別功能。它運行在傳輸層協定 SSH-TRANS 上面。當SSH-USERAUTH 開始後,它從低層協定那裡接收會話標識符(從第一次密鑰交換中的交換哈希H )。會話標識符唯一標識此會話並且適用於標記以證明私鑰的所有權。 SSH-USERAUTH 也需要知道低層協定是否提供保密性保護。

連線協定 [SSH-CONNECT]

將多個加密隧道分成邏輯通道。它運行在用戶認證協定上。它提供了互動式登錄話路、遠程命令執行、轉發 TCP/IP 連線和轉發 X11 連線。

結構

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守護進程會產生一個子進程,該子進程進行這次的連線處理 。

套用

SSH另類套用:用ssh做socks5代理

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協定框架中設計了大量可擴展的冗餘能力,比如用戶自定義算法、客戶自定義密鑰規則、高層擴展功能性套用協定。這些擴展大多遵循 IANA 的有關規定,特別是在重要的部分,像命名規則和訊息編碼方面。

SSH採用面向連線的TCP協定傳輸 套用22號連線埠 安全係數較高。

啟動方法

方法一:使用批處理檔案

在伺服器端安裝目錄下有兩個批處理檔案“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服務,這樣伺服器就處在安全環境之中了,不用再怕數據被竊取 。

SSH安全技巧

SSH 是較可靠,專為遠程登錄會話和其他網路服務提供安全性的協定。利用 SSH 協定可以有效防止遠程管理過程中的信息泄露問題。S S H最初是U N I X系統上的一個程式,後來又迅速擴展到其他操作平台。S S H在正確使用時可彌補網路中的漏洞。客戶端包含ssh程式以及像scp(遠程拷貝)、slogin(遠程登入)、sftp(安全檔案傳輸)等其他的應用程式。SSH有很多非常酷的特性,如果它是你每天的工作伴侶,那么我想你有必要了解以下10條高效使用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配置中進行設定:
Host www* mail
HostName %h
User simon
就算我的本地用戶名是 smylers,我仍然可以這樣連線我的伺服器:
$ ssh www2
SSH會使用simon賬戶連線你的伺服器,同樣,Putty可以保存這個信息在你的session中。

主機別名

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

省略主機名

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

然後你需要重啟網路:$ sudo restart network-manager
不同的系統,這兩條命令可能會略有差異。

連線中轉

有時候你可能需要從一個伺服器連線另外一個伺服器,比如在兩個伺服器之間直接傳輸數據,而不用通過本地電腦中轉:
www1 $ scp -pr templates www2:$PWD
(順便說一下,當你需要在兩台伺服器間拷貝檔案時,$PWD變數時非常有用的),因為即使你已經在兩台伺服器上添加了你本地電腦的公鑰,scp默認仍然會提示你輸入密碼:這是因為你用來作為跳板的那台伺服器上並沒有你的私鑰,所以,第二台伺服器會拒絕你的公鑰,但是一定不要通過將你的私鑰拷貝到中轉伺服器上來解決這個問題,你可以使用agent forwarding來解決這個問題,只要在你的.ssh/config檔案中加入下面這行代碼就可以了:ForwardAgent yes或者是在Putty中勾上“Allow agent forwarding”選項,本地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伺服器,或是拷貝檔案,是不是已經不需要再輸入密碼了?

長連線

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

多條連線共享

如果你需要在多個視窗中打開到同一個伺服器的連線,而不想每次都輸入用戶名,密碼,或是等待連線建立,那么你可以配置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等等也同樣有效。

加速連線

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

減少延遲

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

相關詞條

相關搜尋

熱門詞條

聯絡我們