天天看點

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

點選檢視第一章 點選檢視第二章

第3章

遠端連接配接:安全通路聯網的計算機

本章内容提要

  • 加密并保護遠端連接配接
  • 使用systemd管理Linux系統程序
  • 非常安全和友善的免密碼SSH接入
  • 使用SCP在遠端位置之間安全地拷貝檔案
  • 在SSH連接配接上使用遠端圖形程式

人們常說,抵達目的地隻是樂趣的一半。好吧,當在分布式計算的世界裡工作時,無法通路你的伺服器和遠端資源會是一個很嚴重的問題。因為現在的很多工作都是由你在上一章中看到的虛拟機承擔的,而你們又不能走到一台虛拟伺服器旁邊,按下電源按鈕然後登入,你需要一些其他的通路路徑。歡迎來到安全Shell(Secure Shell,SSH)的世界。

3.1 加密的重要性

最開始時,Telnet被用于在網絡上以任意速率登入連接配接。Telnet協定速度快且可靠,而且,在由諸多更小、更簡單的網絡組成的單純世界裡,完美可用。在那時,Telnet會話以不加密的方式發送資料包并不是什麼大事。

然而,我明白在過去的幾十年裡事情已經發生了些許變化。如今,所有酷孩子們使用的網際網路較之前更大了,而且,網絡管理者也不再以最初的名字互相認識。很顯然,現在安全性已經成為一個被熱烈讨論的話題。或者,換句話說,如果你在不安全的網絡上正使用Telnet以純文字的方式傳輸包含密碼和個人資訊的私有資料,那你就該假定它們不再是私有的。實際上,在網絡上使用諸如Wireshark等免費可用的抓包軟體,任何人都可以輕松讀取到你發送和接收的任何資料。

因為每個人都定期在公共網絡上移動敏感資料,那麼可憐的管理者要做什麼?解決方案是加密将要傳輸的資料。但什麼是加密呢?

要想保護資料的隐私,即使資料落入他人之手,安全軟體可以使用加密密鑰(encryption key),即包含随機字元序列的小檔案。如圖3-1所示,密鑰可用為加密算法的一部分應用,以将純文字的、可讀的資料轉換為相當于完全亂碼的資料。至少在該密鑰被應用于相同算法的逆應用之前,這些資料看起來是亂碼的。在檔案的加密版本上使用密鑰将把這些亂碼資料恢複為最初形式。如果隻有你和你信任的朋友擁有該密鑰,應該就沒有其他人能夠擷取資料的含義,即使資料被攔截。

當你登入到一個遠端伺服器時,你所做的隻是讓包含會話資訊的資料包在兩台計算機之間來回地傳送。安全(secure)通信的關鍵是在傳輸每個資料包之前快速地對其加密,之後,在接收端快速地将其解密。事實上,SSH網絡協定可以快速且無形地進行這一處理,進而讓曾經使用Telnet會話進行連接配接的使用者感受不到任何差異。

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

20世紀90年代設計的SSH是面向UNIX類作業系統的、安全加密傳輸遠端登入資料的一個簡單方式。該協定的OpenSSH實作如今非常流行,以緻微軟公司近期已在Windows中提供了該協定。

3.2 OpenSSH入門

在本節,你将要檢查OpenSSH是否已經安裝在你的計算機上并處于活動狀态。之後,如果需要的話,你會安裝該軟體。因為對軟體包活動狀态的測試需要了解當今Linux發行版如何管理程序,是以你将會繞進systemd的世界。當一切就緒,你就可以使用OpenSSH打開遠端伺服器上的登入會話。

如果你還沒有安裝該軟體包,在Ubuntu或Debian主機上運作apt install openssh-server指令将為你提供所需的全部軟體。但Linux發行的許多版本都至少提供了現成的最小化SSH功能。要想檢視你的系統中已有什麼(至少在基于Debian/Ubuntu的機器上),可以使用包管理器dpkg。

dpkg指令行工具管理和查詢進階包工具(Advanced Package Tool,APT)系統中的軟體包。運作帶有-s标志和軟體包名字的dpkg指令會傳回目前安裝及更新的狀态。如果該軟體包已被安裝(就像gedit示例中軟體已安裝一樣),輸出看起來将類似如下内容:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

注意:在第2章,你曾見過使用apt search packagename查找尚未安裝的可用軟體包。

如圖3-2所示,當你登入到一台遠端計算機,你的本地計算機就是該遠端伺服器的一個客戶,是以,你就要使用openssh-client軟體包。然而,你正在登入的遠端伺服器的作業系統就扮演了該shell會話的主作業系統,是以伺服器必須運作openssh-server軟體包。

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

你可以運作dpkg -s openssh-client或dpkg -s openssh-server來确認計算機上已經安裝了正确的軟體包。因為這些軟體包被用來承載遠端的shell會話,Linux容器通常會預設地安裝整套軟體包。

伺服器版本同樣包括了可在用戶端軟體包中找到的所有工具。這意味着,在安裝了openssh-server軟體包的計算機上,操作人員也可以通過SSH登入到其他伺服器。是以,即使你的計算機上還沒有安裝用戶端軟體包,安裝伺服器軟體包将可以完全覆寫所需要的所有功能。

另一方面,安全性最佳實踐告訴我們要将基礎設施中的通路路由限制在絕對必要的範圍内。如果你認為你不需要登入到你的桌上型電腦或筆記本上,那麼,僅需安裝openssh-client軟體包即可:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

僅正确地安裝了軟體包并不意味着該軟體包是立即可用的。有時候,配置檔案被預設設定為不活動的。在閱讀本書的過程中,你将看到大量關于設定配置的示例,而且,在本章稍後的内容中,你将看到OpenSSH的配置檔案。但是,Linux程式不能正常工作可能還有另一個共同的原因—它并沒有運作。你可以使用systemctl status指令來檢查計算機中SSH是否正在運作:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

如你從輸出的Active行所見,一切都很好。如果确實需要你自己動手進行處理,需再次使用systemctl,但這次是用start代替status。

對你的新玩具感到厭倦了嗎?systemctl stop指令可以快速地将其停止:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

你可以使用systemctl enable ssh強制系統啟動時自動加載一個程序(如SSH),或者使用systemctl disable ssh來禁止自動加載。如下代碼片段啟用了SSH功能:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

systemctl看起來很不錯,但你幾乎沒有機會見到它。現在OpenSSH正在等着我們,但在本章的末尾,我将更為深入地解釋程序管理。

3.3 使用SSH登入一台遠端伺服器

啟動遠端會話要比想象的簡單一些。請確定已有第二台計算機在某個地方運作,該計算機加載了openssh-server且可以通過網絡進行通路。例如,你可以采用上一章的方法來啟動一個LXC容器。

現在,查找計算機的IP位址。如果你正在使用LXC容器,就可以通過lxc-ls --fancy指令擷取任何需要的資訊。如下示例中給出了一個名為test且未運作的容器,以及一個正在運作的base容器,使用的IP位址是10.0.3.144。

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

或者,如果你正好登入了你的伺服器,你就可以使用ip addr指令擷取伺服器的公有位址,該指令會亂糟糟地輸出一大堆羅列本地網絡接口的字元。這些字元看上去如下形式:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

本例中,接口中标号為8的inet行是我們主要關注的。其給出了IP位址10.0.3.144。

擁有這些資訊後,要進行連接配接,你将需要使用登入伺服器的賬号名和IP位址來執行ssh指令。如果這是你第一次從自己的計算機登入該伺服器,将會要求你輸入yes來确認伺服器上OpenSSH程式發回的認證資訊(說明一下,是yes,而不是字母y)。最後,你要輸入該賬号的密碼(在我的例子中是ubuntu),然後你登入了伺服器:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

是否沒有按照你的預期執行?看起來你要擁有一個極好的學習體驗了!你可能遇到的最常見的問題包括網絡連接配接問題,這樣的話,為什麼不先偷偷看一下第14章的内容呢?現在,請使用ping指令測試兩台計算機是否互相可達。假定你在自己的計算機上測試到IP位址為10.0.3.144的遠端伺服器的連通性,成功的ping操作的結果看起來應該是這樣的:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

失敗的結果可能如下。為了便于說明,我ping了一個未被使用的IP位址:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

3.4 免密碼SSH通路

密碼總是讓人感到有些沮喪。它們幾乎從未被正确地使用過。它們要麼太短、太容易被猜出,要麼就是在多個賬号中被過度使用。而且,人們似乎會以驚人的速度忘記它們。如果保護資料的唯一方法是密碼,那麼資料極有可能并未得到很好的保護。

這就是為什麼當涉及安全(如Amazon Web Service,AWS)時,最可信的行業從業人員會在預設情況下完全禁用其雲執行個體上的密碼驗證。如果你擔心未經授權的伺服器通路風險,那麼你可能需要考慮跟随他們的步伐。以下是在亞馬遜Linux執行個體上,/etc/ssh/sshd_config檔案中關于EC2服務的設定:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

OpenSSH配置檔案

與Linux中的任何其他事物一樣,OpenSSH在計算機中的運作方式很大程度上取決于它的純文字配置檔案。而且,和大多數其他程式一樣,我們可以在/etc目錄體系中找到這些配置檔案。目前情況下,配置檔案存放在/etc/ssh/目錄中。

配置檔案/etc/ssh/sshd_config中的設定參數控制遠端客戶(remote client)登入到你的計算機的方式。另一方面,/etc/ssh/sshd_config控制本機使用者作為客戶登入到遠端主機(remote host)的方式。除了限制使用者如何通過SSH登入你的計算機,這些檔案中的設定也可被用作控制所有類型的行為,包括是否允許遠端GUI通路本地程式。

代替SSH密碼授權的一個方式是建立一個特定的密鑰對,之後将公共部分拷貝到遠端主機,即要登入的計算機。當連接配接兩端都有加密密鑰時,在主機上運作的OpenSSH現在就可以知道是哪個使用者而無須要求輸入密碼。這并不是說在基礎設施安全中密碼沒有積極的作用。實際上,你将很快看到是什麼情況。理想情況下,你應該建立一個密碼(passphrase)并在你使用密鑰對之前在本地進行授權。

注意:類似于密碼,密碼是你選擇的加密文本串。但密碼常常會包括空格,由一系列真正的單詞組成。像3Kjsi&*cn@PO這樣的密碼是不錯的,但像“fully tired cares mound”這樣的密碼會更好,因為其長度更長而且更易于記憶。

3.4.1 生成新的密鑰對

當然,解決問題的方法不止一種。但是,由于所有優秀的系統管理者都是經過訓練的懶人,我将采用按鍵最少的方法。該選擇的一個意外但令人愉快的結果是,我将向你介紹管道字元(|)的更複雜的用法。

你會從使用ssh-keygen程式在客戶計算機上建立一個新的公鑰/私鑰對開始。你将被詢問密鑰對的名字,但是,除非你已經得到了一個名為id_rsa的密鑰對,否則我将按下Enter鍵(Enter)并使用預設值。如之前所見,在提示時建立一個密碼通常會更好,特别是在你将計算機與他人共享的時候。請記住,如果你選擇增加一個密碼,那麼每當你使用密鑰時都會提示你輸入密碼。以下給出了所有的相關資訊:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章
帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

現在你擁有了一個嶄新的基于RSA加密的密鑰對。繼續前進,使用ls -l指令以長格式顯示.ssh/目錄中的内容。注意,這裡有兩個名為id_rsa的檔案,但隻有一個檔案的擴充名為.pub。這個檔案是密鑰對的公鑰部分,也是你最終要複制到會話主機遠端計算機的檔案:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

應該使用哪種算法?

除了RSA(Ron Rivest、Adi Shamir和Leonard Adleman三位研究者率先提出該算法,故以他們姓氏的首字母縮寫來命名該算法),OpenSSH還支援ECDSA和ED25519簽名算法。你将發現預設的RSA算法與ECDSA和ED25519算法之間的技術差異非常模糊,它們都具有基于橢圓曲線的優勢。它們都被認為是相當安全的。對于ECDSA和ED25519算法,要記住的是在較早的實作中它們可能并未被完全支援。

不要再假設所有的OpenSSH實作都支援DSA。鑒于對DSA源頭理論的質疑,在任何情況下都要盡可能地避免使用該算法。

3.4.2 在網絡上複制公鑰

在你将公鑰複制到主控端之前,免密碼SSH通路是不能工作的。如你在圖3-3中看到的,密鑰對通常在客戶計算機上建立。這是因為私鑰的确應該是私有的。你應該盡可能地避免對其進行不必要的移動,并且将其暴露給那些不友好的眼睛。

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

一旦建立了密鑰對,你就可以将公鑰添加到宿主計算機的.ssh/authorized_keys檔案中。在主控端上運作的OpenSSH軟體将可以驗證在客戶主機上用私鑰建立的密文消息的真實性。一旦該消息得到驗證,就可以開始SSH會話了。

首先要做的是确定要登入的主機上的使用者賬号。在我給出的示例中,使用了名為ubuntu的賬号。密鑰需要被複制到/home/ubuntu/下的.ssh/目錄中。如果該目錄不存在,可以用mkdir指令建立。

不過,首先我要介紹一個很酷的快捷方式:實際上不需要在遠端主機上打開一個完整的SSH會話。相反,你可以将指令追加到正常的SSH文法中,形式如下所示:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

你将仍需要為遠端主機提供密碼。但隻要完成了這一操作,在主機的/home/ubuntu/目錄下将會有一個.ssh/目錄。

為了便于閱讀,我用反斜杠()将下一條指令分割為三行,反斜杠()會讓Bash知道下一行是目前行指令的一部分。請确定在反斜杠後沒有其他字元(包括空格)。這肯定會讓人感到有些不舒服:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

這個多行的指令将用cat讀取檔案id_rsa.pub中的所有内容并将其存儲在記憶體中。之後,該指令通過登入到遠端宿主計算機的SSH會話以管道方式傳輸文本。最後,在宿主計算機上再一次讀取該文本,并将其添加到authorized_keys檔案中。如果該檔案不存在,>>(追加工具)會建立該檔案。如果該檔案已經存在,就将文本追加到該檔案的末尾。

就是這樣。你可以來試試。現在,當你運作相同的老版本ssh指令時,不需要輸入密碼:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

3.4.3 使用多個加密密鑰

在某些情形下(如必須登入到亞馬遜EC2服務上的一個虛拟主機執行個體),你需要為給定的會話指定一個密鑰對。當你開始為不同的主控端建構一個密鑰集合時,這種情況肯定會發生。為了讓OpenSSH知道你所用的密鑰,可以為指令添加-i标志,其後是關于私鑰檔案的名稱與位置的參數:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

是否注意到了本例中的.pem檔案擴充?這意味着該密鑰被儲存為一個所有類型虛拟機共用的格式,包括亞馬遜EC2執行個體。

3.5 使用SCP安全地拷貝檔案

我敢肯定你記得在檔案系統中cp指令如何将檔案和目錄從一個位置拷貝到另一個位置。至少在理論上,沒有理由不能在網絡上複制檔案。但這完全是瘋狂的—檔案的内容将被暴露給當時正在網絡上閑逛的人,或者是一段時間後浏覽網絡日志資料的任何人。

請忘掉這個想法,直到你可以在cp指令前加上s标志以保證安全(secure)。為了傳輸檔案,SCP程式使用SSH協定在任何位置拷貝任意類型的檔案,并采用相同的密鑰、密碼和密碼。假設在你之前工作的遠端主控端上已經存在一個.ssh/目錄,這裡給出如何将公鑰(id_rsa.pub)傳輸到遠端主控端并将其重命名為authorized_keys的示例:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

警告:如果在該目錄下已經存在authorized_keys檔案,這個操作将重寫該檔案,任何已有的内容都會被破壞。僅在你使用的使用者賬号具有某些權限時,才能拷貝和儲存檔案。是以,如果你的使用者沒有獲得根權限,請不要嘗試将檔案儲存到遠端主機的

/etc/目錄。在你提出疑問之前,我想說的是,以根使用者登入SSH會話通常是一個安全大忌。

順便說一下,你可以将遠端檔案拷貝到本地主機。下面的例子将一個檔案從AWS EC2執行個體(由一個假的IP位址表示)拷貝到指定的本地目錄:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

截至目前,你用過的指令已經說明了一些重要工具。但我需要指出的是,還有第三種(官方的)方式将密鑰拷貝到遠端主控端—名為ssh-copy-id的專用程式:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

SSH會話的優點是不存在GUI層處理的拖累,其非常快速和高效。但如果你要讓遠端宿主計算機上運作的程式具有圖形屬性,可能就會出現問題。下一節将解決這個問題。

3.6 使用SSH連接配接上的遠端圖形程式

假設你正在嘗試對一個遠端位置的使用者提供支援,該使用者報告某款桌面軟體(如LibreOffice)出錯。如果你認為啟動和運作該程式有助于診斷和解決這個問題,那麼,你就可以使用SSH上的圖形會話(使用Linux X Window管理器)來完成操作。

話雖如此,還是不要期待奇迹會發生。以-X标志運作ssh指令,即使采用了所謂的X11 Forwarding,将允許你把基于主控端的程式加載到客戶計算機的桌面上。你得到的結果可能不會滿足你的期望,因為這取決于包括網絡連接配接品質在内的多種因素。對于諸如LibreOffice這樣的重資源程式來說尤其如此。然而,它通常是值得一試的。即使帶寬稍低,但也比開兩小時的車前往客戶的辦公室要好。

還有一件事:請不要在伺服器上嘗試。在大多數情況下,安裝在伺服器或虛拟機(如LXC或Docker容器)中的作業系統版本隻有簡單的圖形功能或者沒有。如果必須這樣做,你可以安裝桌面包來更新作業系統。在Ubuntu裝置上,操作類似于以下步驟:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

有了所有的免責聲明,我想是時候看看它實際上是如何工作的了。首先,打開主控端(要運作該程式的計算機)上的sshd_config。你需要確定X11 Forwarding行的值為yes(但是,出于安全考慮,請不要将該值保持超過所需要的時間):

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

在客戶機的ssh_config檔案中也有類似的行,也需要正确地進行設定:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

由于你已經編輯了該配置檔案,之後你需要在兩台計算機上重新開機SSH,以確定所做的配置生效:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

現在,你已經準備就緒。要想啟動一個圖形化使能的會話,請為ssh指令增加-X标志:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

你将看到正常的指令提示符,但是現在你可以運作一個将啟動圖形程式的指令。嘗試一些小的操作。以下指令應該會在一個Ubuntu系統上工作:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

神奇吧!你在本地桌面視窗中成功地運作了一個遠端程式。

OpenSSH帶來的價值遠遠超過了你看到的核心特性。一旦你獲得了可以工作的SSH連接配接,你就可以使用各種技巧了。嘗試将一個本地檔案系統或目錄挂載到一個遠端主機上,進而允許遠端使用者無縫地通路你的檔案。或者,通過SSH的隧道功能,使用端口轉發允許安全、私密地使用遠端的HTTP服務。

3.7 Linux程序管理

如前所述,現在我将重新讨論Linux程序管理,以使大家能夠正确地了解OpenSSH等程式是如何被處理的。從長遠看,了解工作機制可以讓一般的管理和故障排查更加高效。但是,如果你還不想一頭紮進這樣的一個相關主題,也可以安全地跳過本章的剩餘内容。學習本書的後續内容,你應該是沒有問題的。

到底什麼是systemctl,它到底在做什麼?為了正确地回答這些問題,通常你必須考慮Linux是如何管理系統程序的。因為認識新朋友總是很愉快的,是以,你也需要學習一些關于程序跟蹤的工具,以更加容易地了解其工作方式。

軟體(software),如我确定你所了解的,是包含代表使用者控制計算機硬體的指令的程式代碼。程序(process)是正在運作的軟體程式的執行個體。作業系統(operating system)是一個工具,被用于組織和管理這些執行個體/程序,以有效地使用計算機中的硬體資源。

對于複雜的多處理器、多使用者作業系統環境,組織和管理這些程序可不是一件簡單的事情。為了讓它工作,你需要某種監控工具來控制諸多運作的部件(如圖3-4)。我來為你介紹systemctl。

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

3.7.1 用ps指令檢視程序

讓我們拿出一個電子顯微鏡,看看是否能在程序的自然栖息地發現一個程序。在終端中輸入如下指令。它将在背景(&)運作10秒後停止,不做任何處理(sleep)。然而,在其運作期間,輸入ps指令:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

在本例中,你會看到由該指令生成的兩個運作的程序,其PID分别是19829和19832。如果等待10秒後再次運作ps指令,你會看到這兩個程序都将不再運作。你也會看到sleep指令成功執行的回報:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章
帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

通常情況下,如果你僅輸入并執行ps指令,你可能隻得到兩個結果。首先,名為bash的程序表示目前shell會話使用的是bash指令解釋器,以及最近使用的指令(當然,就是ps指令)。但是,通過觀察配置設定給bash的PID(在之後的例子中為7447),你知道在系統中已經有許許多多的其他程序正在全力運作。這些程序由父程序shell建立,并一直回到init程序:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

在Ubuntu系統中,當Linux計算機啟動時,首先啟動并做好其他一切準備的程序是init。如你即将發現的,這個名字可能是誤導性的,這也是為什麼CentOS中的第一個程序取了不同的名字。通過如下方式運作ps指令,你可以看到init就是第一個程序。我會簡要解釋相關細節:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

輸出的最右側列(第一行的/sbin/init)表示了程序之後對應檔案的位置和名稱。本例中,它是存放在/sbin/目錄中的init檔案。第一行的最左側列包含了root一詞,說明該程序的所有者是根使用者。現在唯一值得關注的資訊是數字1,即init程序的PID。要獲得值為1的PID的唯一方式是先于任何其他程序之前執行該程序。

在繼續學習之前,值得我們再花點時間來了解ps指令。如你所見,ps指令顯示所有活動程序的資訊。通常,通路與程序相關的資訊是非常重要的,這能夠讓你正确地規劃系統行為并排除故障。你會希望盡早并經常地使用ps指令。

如之前所做的那樣,為ps指令添加-e參數不僅會傳回目前子shell中運作的程序,還會傳回從所有父shell到init中的所有程序。

注意:父shell是一個shell環境,在這個環境中可以啟動新的shell(子shell),并在其中運作程式。你可以将GUI桌面會話看作一個shell,進而将接收指令行的終端看作其子shell。頂層shell(祖父shell?)是Linux啟動時率先運作的shell。

如果你想形象地呈現父、子shell及程序,可以使用pstree指令(添加-p參數來顯示每個程序的PID)。要注意的是,第一個程序(PID為1)為何是systemd。在較早的Linux版本中(例如,Ubuntu 14.04及更早版本),它反而被稱為init:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

繼續前進并在你的計算機上執行所有指令。即使是在一個安靜的系統中,你也可能看到諸多程序;在繁忙的個人電腦或伺服器上,很容易會有成百上千個程序。

3.7.2 使用systemd

關于你剛剛看到的/sbin/init檔案還有一些有趣的事情:file是一個寶貴的UNIX程式,它會為你提供一個檔案的内部資訊。如果你以/sbin/init為參數來運作file程式,你将會看到init并不是一個真的程式,而是systemd程式的一個符号連結(symbolic link)。我們将在第12章深入地讨論符号連結,但在這裡你将開始接觸systemd:

帶你讀《Linux實戰》之三:遠端連接配接:安全通路聯網的計算機第3章

在經曆了多年的分裂和激烈的紛争後,現在幾乎所有的Linux發行版都使用了相同的程序管理器systemd。這是名為init的程序的一個簡易替代,init一直是所有基于UNIX的作業系統啟動過程中啟動的第一個程序。我的意思是,通過簡易替代(drop-in replacement),即使完成工作的方式非常不同,但對于一般的觀察者而言,通常systemd的功能就像init一樣。這就是為什麼/sbin/init檔案現在隻是一個指向syetemd程式的連結。

這有點理論化,因為你可能永遠不會真的通過systemd程式的名稱來對其進行調用,無論是直接調用還是通過/sbin/init的前端調用。如你已經看到的,這是因為主要的管理任務是由systemctl代表systemd進行處理的。

從技術角度看,systemd的主要工作是控制各個程序的生成、存活及消亡方式。你之前使用的systemctl指令對于這些任務而言是一個選擇工具。但有點争議的是,systemd開發者對傳統的程序管理功能已經進行了極大的擴充,以控制不同的系統服務。在systemd體系之下存在一組工具,如登入管理器(journald)、網絡管理器(networkd)及裝置管理器(猜對了,就是udevd)。好奇嗎?字母d表示守護程序(daemon),它是背景的系統程序。

随着你完成本書的學習,你将至少與這些systemd工具中的某一些不期而遇。接下來我們将要學習如何管理和備份檔案系統和歸檔檔案,後者尤為重要。

3.8 小結

  • 加密連接配接是所有網絡通信的關鍵組成,且SSH是非常常用的工業标準。
  • 通過分享一個密鑰對的公鑰,你可以使能免密碼的SSH通路。
  • OpenSSH軟體包也允許安全的檔案拷貝和遠端的圖形化會話。
  • 在大多現代Linux發行版中,程序是由systemd通過systemctl工具來管理的。
  • 你可以在兩個指令之間使用|(管道)字元傳輸資料,同時使用grep過濾流資料。

主要名詞

  • 密碼(password)是一個正常字元組成的字元串,而密碼(passphrase)可以包含空格和标點符号。
  • RSA是一個流行的加密算法。
  • X11 forwarding允許在一個遠端連接配接上運作圖形化程式。
  • Linux程序(process)是所有正在進行的活動,它與一個運作的單個程式相關聯。
  • shell是一個終端環境,它提供了一個指令行解釋器(如Bash)讓使用者執行指令。當你在Linux桌面計算機或筆記本上工作時,你會通過打開一個終端程式(如GNOME終端)來通路一個shell。
  • 父shell(parent shell)是一個初始化環境,在該環境中可以啟動子shell,并在其中運作程式。總而言之,shell也是一個程序。

安全最佳實踐

  • 請永遠加密在公網上運作的遠端登入會話。
  • 避免隻是采用密碼;和人一樣,它們是不可靠的。
  • 基于密鑰的免密碼SSH會話比簡單的密碼登入要更好。
  • 永遠不要在公網上以純文字形式傳輸檔案。

指令行回顧

  • dpkg -s openssh-client檢查基于APT的軟體包的狀态。
  • systemctl status ssh檢查系統程序(systemd)的狀态。
  • systemctl start ssh啟動一個服務。
  • ip addr列出計算機上的所有網絡接口。
  • ssh-keygen生成一個新的SSH密鑰對。
  • $ cat .ssh/id_rsa.pub | ssh [email protected] "cat >> .ssh/authorized_keys"将一個本地密鑰拷貝并粘貼到遠端的計算機。
  • ssh-copy-id -i .ssh/id_rsa.pub [email protected]安全地拷貝加密密鑰(建議這樣做,也應該這樣做)。
  • ssh -i .ssh/mykey.pem [email protected]指定一個特定的密鑰對。
  • scp myfile [email protected]:/home/ubuntu/myfile安全地将一個本地檔案拷貝到一台遠端計算機。
  • ssh -X [email protected]允許以圖形化的會話登入一台遠端宿主計算機。
  • ps -ef | grep init顯示目前運作的所有系統程序,并用字元串init過濾結果。
  • pstree –p以樹形格式來顯示目前運作的所有程序。

自測題

1.加密密鑰的用途是:

a.建立一個安全的網絡連接配接
b.加密和解密資料包
c.觀察傳輸中的敏感資料
d.確定資料傳輸的可靠性
           

2.使用如下哪個指令可以檢視服務的狀态?

a. dpkg -s <servicename>
b. systemd status <servicename>
c. systemctl status <servicename>
d. systemctl <servicename> status
           

3.在一台宿主伺服器可以接受遠端SSH登入之前,必須安裝如下哪個軟體包?

a. openssh-server
b. ssh-server
c. openssh-client
d. ssh-client
           

4.在使用systemd的Linux發行版上,init的工作是由如下哪個程式執行的?

a. /lib/systemd/system
b. /bin/system
c. /sbin/init
d. /bin/init
           

5.如下哪個服務不是一個systemd服務?

a. networkd
b. journald
c. processd
d. udevd
           

6.為了使用免密碼SSH連接配接,這些密鑰必須存放在哪裡?

a.公鑰、私鑰存放在主控端,私鑰存放在用戶端
b.公鑰、私鑰存放在主控端,公鑰存放在用戶端
c.私鑰存放在主控端,公鑰存放在用戶端
d.公鑰存放在主控端,私鑰存放在用戶端
           

7.在SSH會話中,密碼的用途是什麼?

a.驗證你到遠端OpenSSH程式的身份
b.驗證你到本地OpenSSH程式的身份
c.确定要使用的密鑰對
d.認證密鑰對的狀态
           

8.如下哪條指令将一個遠端檔案拷貝到你的本地計算機的目前目錄(假設遠端目錄和檔案都存在)?

a. scp [email protected]:/home/mylogin/filename
b. scp [email protected]/home/mylogin/filename
c. scp [email protected]:/home/mylogin/filename
d. scp [email protected]:/home/mylogin/filename./home/myname/Documents           

答案

1.b 2.c 3.a 4.a 5.c 6.d 7.b 8.a

繼續閱讀