資應五甲 Linux 期末筆記

第十一章、遠端連線伺服器SSH / XDMCP / VNC / RDP

什麼是遠端連線伺服器

遠端連線伺服器在提供你由遠端透過文字或圖形介面的方式來登入系統,讓你在遠端的工作機前面登入 Linux 主機以取得可操控主機之介面 (shell),而登入後的操作感覺上就像坐在系統前面一樣。

以鳥哥個人為例,目前鳥哥管理十幾部的Unix-Like主機,這些主機都不放在同一個地方,分佈在南台灣各處! 那麼當有新的軟體的漏洞被發佈,或者是需要進行一些額外的設定的時候,是否鳥哥本人一定要到現場嗎?當然不需要, 只要透過網路連線到該主機上面,就可以進行任何工作了!真的就好像在主機前面工作一般的輕鬆愉快!這就是遠端連線伺服器啦!

連線伺服器的功能作用之一:分享 Unix Like 主機的運算能力

你可以將你研究室最快的那一部主機開放出來,設定一下遠端連線伺服器,讓你的學生,或者是研究室的同仁啦, 可以透過這部機器幫他們進行研究的工作,這個時候,你的主機就可以讓多人進行分享 Linux 運算的功能。
(Unix Like指的是源自於Unix的OS,如Linux, Mac OS X...等)

伺服器類型 (Server) :建議要有限度的開放連線

在一般對網際網路開放服務的伺服器中,由於開放的服務可能會有較為重要的資訊,而遠端連線程式連進主機之後, 可以進行的工作又太多了(幾乎就像在主機前面工作一般),因此伺服器的遠端連線程式通常僅針對少部分系統維護者開放而已! 除非必要,否則 Server 類型的主機還真的不建議開放連線的服務

工作站類型 (Workstation) :只對內網開放

所謂的工作站就是不提供網際網路服務的主機,因為它沒有提供常見的網路服務!不過必須要提供給使用者登入的權限,這樣大家才用的到運算功能啊!此時你就得要針對內部,或者是特定的某些來源開放他們使用你的工作站

有哪些可供登入的類型

  • 文字介面明碼: telnet, rsh 等為主,目前非常少用;
  • 文字介面密碼: ssh 為主,已經取代上述的 telnet, rsh 等明碼方式;
  • 圖形介面: Xdmcp, VNC, RDP 等較為常見

在文字介面登入的連線伺服器,主要有以『明碼』傳送資料的telnet伺服器,及以加密技術進行資料加密再傳送的 SSH 伺服器!雖然telnet可以支援的用戶端軟體比較多,不過由於它是使用明碼來傳送資料,你的資料很容易遭到有心人士的擷取! 所以近來我們都呼籲大家多使用 SSH 這一種連線方式。

資料傳送的明碼與密碼

所謂的明碼就是: 『當我們的資料封包在網路上傳輸時,該資料封包的內容為資料的原始格式』,也就是說,你使用 telnet 登入遠端主機時,不是得要輸入帳號密碼嗎?那你的帳號密碼是以原本的資料格式傳輸, 所以如果被類似 tcpdump 之類的監聽軟體擷取資料, 那你的帳密就有可能被竊取。

文字介面連線伺服器: SSH 伺服器

SSH是Secure SHell protocol的簡寫(安全的殼程式協定),它可以透過資料封包加密技術,將等待傳輸的封包加密後再傳輸到網路上, 因此,資料訊息當然就比較安全。
特別注意:這個 SSH 協定,在預設的狀態中,本身就提供兩個伺服器功能:

  1. 一個就是類似 telnet 的遠端連線使用 shell 的伺服器,亦即是俗稱的 ssh ;
  2. 另一個就是類似 FTP 服務的 sftp-server !提供更安全的 FTP 服務。

連線加密技術簡介

目前常見的網路封包加密技術通常是藉由所謂的『非對稱金鑰系統』來處理的。主要是透過兩把不一樣的公鑰與私鑰(Public and Private Key)來進行加密與解密的過程。由於這兩把鑰匙是提供加解密的功用, 所以在同一個方向的連線中,這兩把鑰匙當然是需要成對的!它的功用分別如下:

  • 公鑰 (public key):提供給遠端主機進行資料加密的行為,也就是說,大家都能取得你的公鑰來將資料加密的意思;
  • 私鑰 (private key):遠端主機使用你的公鑰加密的資料,在本地端就能夠使用私鑰來進行解密。由於私鑰是這麼的重要, 因此私鑰是不能夠外流的!只能保護在自己的主機上。

由於每部主機都應該有自己的金鑰 (公鑰與私鑰),且公鑰用來加密而私鑰用來解密, 其中私鑰不可外流。但因為網路連線是雙向的,所以,每個人應該都要有對方的『公鑰』

keypair-2
如上圖所示,我們如果站在用戶端的角度來看,那麼,首先你必須要取得伺服器端的公鑰,然後將自己的公鑰發送給伺服器端,最終在用戶端上面的金鑰會是『伺服器的公鑰加上用戶端我自己的私鑰』來組成的。

目前 SSH 的協定版本有兩種,分別是version 1與version 2,其中V2由於加上了連線檢測的機制,可以避免連線期間被插入惡意的攻擊碼,因此比V1還要更加的安全。所以囉,請盡量使用V2版本即可,不要使用V1囉。

SSH 的連線行為簡介

ssh-keypair2

  1. 伺服器建立公鑰檔: 每一次啟動 sshd 服務時,該服務會主動去找 /etc/ssh/ssh_host* 的檔案,若系統剛剛安裝完成時,由於沒有這些公鑰檔案,因此 sshd 會主動去計算出這些需要的公鑰檔案,同時也會計算出伺服器自己需要的私鑰檔;
  2. 用戶端主動連線要求: 若用戶端想要連線到 ssh 伺服器,則需要使用適當的用戶端程式來連線,包括 ssh, pietty 等用戶端程式;
  3. 伺服器傳送公鑰檔給用戶端:接收到用戶端的要求後,伺服器便將第一個步驟取得的公鑰檔案傳送給用戶端使用 (此時應是明碼傳送,反正公鑰本來就是給大家使用的!);
  4. 用戶端記錄/比對伺服器的公鑰資料及隨機計算自己的公私鑰:若用戶端第一次連接到此伺服器,則會將伺服器的公鑰資料記錄到用戶端的使用者家目錄內的~/.ssh/known_hosts。若是已經記錄過該伺服器的公鑰資料,則用戶端會去比對此次接收到的與之前的記錄是否有差異。若接受此公鑰資料,則開始計算用戶端自己的公私鑰資料;
  5. 回傳用戶端的公鑰資料到伺服器端:用戶將自己的公鑰傳送給伺服器。此時伺服器:『具有伺服器的私鑰與用戶端的公鑰』,而用戶端則是:『具有伺服器的公鑰以及用戶端自己的私鑰』,你會看到,在此次連線的伺服器與用戶端的金鑰系統 (公鑰+私鑰) 並不一樣,所以才稱為非對稱式金鑰系統喔。
  6. 開始雙向加解密: (1)伺服器到用戶端:伺服器傳送資料時,拿用戶的公鑰加密後送出。用戶端接收後,用自己的私鑰解密; (2)用戶端到伺服器:用戶端傳送資料時,拿伺服器的公鑰加密後送出。伺服器接收後,用伺服器的私鑰解密。

在上述的第 4 步驟中,用戶端的金鑰是隨機運算產生於本次連線當中的,所以你這次的連線與下次的連線的金鑰可能就會不一樣。 pic11-1

啟動 SSH 服務

目前的 Linux Distributions當中,都是預設啟動SSH的,所以一點都不麻煩,因為不用去設定,他就已經啟動了。弱要直接啟動就是以 SSH daemon ,簡稱為 sshd 來啟動的,所以,手動可以這樣啟動:
pic11-2
我們可以看到,sshd 可以同時提供 shell 與 ftp 喔!而且都是架構在 port 22 上面的。

ssh 用戶端連線程式 - Linux 用戶

ssh :直接登入遠端主機的指令
pic11-3 一般使用 ssh 登入遠端主機,都會填寫『ssh帳號@主機IP』的格式,意思是說,使用該主機的某帳號登入的意思。但是很多朋友都不喜歡寫帳號,亦即使用『ssh主機IP』的格式。如同上面的範例情況。要注意喔,如果不寫帳號的話,那麼會以本地端電腦的帳號來嘗試登入遠端。也就是說,如果近端與遠端具有相同的帳號,那麼不寫帳號也沒有關係,如上表中的範例。但是,為了以後習慣著想,還是一開始就使用類似email的方式來登入遠端主機,這樣的行為習慣比較好。

上面出現的訊息中,開頭RSA的那行後面接的就是遠端伺服器的公鑰指紋碼,如果確定該指紋碼沒有問題,那麼你就得要輸入 yes 來將該指紋碼寫入伺服器公鑰記錄檔(~/.ssh/known_hosts),以方便未來比對該伺服器的正確性之用。

由於該主機的公鑰已經被記錄,因此未來重複使用 ssh 登入此主機時,就不會出現這個指紋碼提示了。
pic11-4
上述的範例當中,第4個範例最有用!如果你想要讓遠端主機進行關機的指令,如果不加上-f 的參數,那你會等待對方主機關機完畢再將你踢出連線,這比較不合理。因此,加上-f就很重要~因為你會指定遠端主機自己跑關機, 而不需要在空空等待。例如:『ssh -f root@some_IP shutdown -h now 』之類的指令囉。

pic11-5
加上這個 StrictHostKeyChecking=no,ssh會不詢問自動加入主機的公鑰到檔案中,對於一般使用者幫助不大,對於程式腳本來說, 這玩意兒可就很不錯用了。

伺服器公鑰記錄檔: ~/.ssh/known_hosts

當你登入遠端伺服器時,本機會主動的用接收到的伺服器的public key去比對~/.ssh/known_hosts有無相關的公鑰, 然後進行底下的動作:

  • 若接收的公鑰尚未記錄,則詢問使用者是否記錄。若要記錄 (範例中回答 yes 的那個步驟) 則寫入 ~/.ssh/known_hosts 且繼續登入的後續工作;若不記錄 (回答 no) 則不寫入該檔案,並且離開登入工作;
  • 若接收到的公鑰已有記錄,則比對記錄是否相同,若相同則繼續登入動作;若不相同,則出現警告資訊, 且離開登入的動作。這是用戶端的自我保護功能,避免你的伺服器是被別人偽裝的。

雖然說伺服器的 ssh 通常可能會改變,問題是,如果是測試用的主機,因此常常在重新安裝,那麼伺服器的公鑰肯定經常不同, 果真如此的話,你就無法繼續登入了,以下是解決方案。 pic11-6

模擬 FTP 的檔案傳輸方式: sftp

如果你只是想要從遠端伺服器下載或上傳檔案呢?那就不是使用ssh啦,而必須要使用sftpscp。這兩個指令也都是使用 ssh 的通道 (port 22),只是模擬成 FTP 與複製的動作而已。
pic11-7

接下來FTP的部分老師可能不太會考,因為這章主要的重點是ssh, 如果想要準備完整點的同學,下面有連結。
http://linux.vbird.org/linux_server/0310telnetssh.php#sftp