SSH命令行幫你實現六種“貼心”的安全應用
譯文【51CTO.com快譯】安全Shell是一種用于安全連接的網絡協議。它被大量地運用在針對各種服務器的連接、修改、上傳和最后退出的環節中。這些操作有時候可以通過工具來實現,有時甚至可以直接使用終端。在這里,您將了解到在標準的SSH之外使用終端的一些技巧。
在深入討論高級SSH技術之前,我們假設您對SSH密鑰的安全性和使用已經具有了一定的基本知識。在這篇文章中,我們將使用用戶來指代SSH的用戶,用yourserver.tld指代域名或IP地址,所以您需要自行替換成正確的用戶名和主機名信息。
為了修改SSH服務器端的配置,您需要直接以root身份登錄,或者通過sudo進行一般用戶權限的提升。而為了使得在/etc/ssh/sshd_config中的更改能在系統范圍內生效,您需要重新加載SSH服務。
根據您所使用的操作系統不同,具體操作上也會有所差異。例如在基于Debian的系統上,您需要以root身份或是做sudo提權后,在終端里輸入service ssh reload。每次當您更改了服務器端的SSH配置之后,您就得重新加載(或重新啟動)其對應的服務。
配置順序
和其他的Linux系統工具一樣,配置選項生效的順序如下:
- 在終端/應用程序中直接給出命令行的選項。
- 用戶的配置文件(~/.ssh/config)。
- 客戶端的系統范圍配置文件(/etc/ssh/ssh_config)。
這就意味著:任何通過命令行所輸入的SSH參數都比那些在配置文件中的選項有著優先的執行級別。因此對于單次性的操作而言,最好方式是直接使用命令輸入;而對于您要經常連接的特定主機,或是要用到不同用戶名的情況,最好還是保存在配置文件中。SSH守護程序本身用到的,系統范圍的配置文件被存放在etc/ssh/sshd_config處。
主機匹配
您可以在各種SSH配置文件中使用通配符,也就是說您可以把一個指令集應用到大范圍的主機上,然后對每個主機再使用一些特定的指令,例如:
在~/.ssh/config中,
- Host myhost-*
- Port 1234
- Host myhost-one
- Hostname myhost-one.yourserver.tld
- User admin
- Host myhost-two
- Hostname myhost-two.yourserver.tld
- User anotheradmin
在上面的例子中,兩臺服務器使用相同端口號1234,不同的用戶名建立不同的連接。有了這些基礎知識,我們就可以開始用SSH來實現6種應用了。
1. SFTP
我想訪問存儲在服務器上的文件,但無需安裝任何額外的軟件。
大多數FTP應用程序(例如FileZilla)都可以使用SFTP(SSH的文件傳輸協議),它是將文件傳輸到您的Web主機的首選方式。在其GUI上,您可以填寫地址、端口、用于SSH連接的用戶名以及要傳輸的文件。通常情況下,您需要進入應用程序的設置界面,禁用固定的密碼,而改用您的SSH私鑰來建立連接。
在終端上,您可以通過輸入sftp,來調出交互式控制臺。請記住,由于其SFTP只提供有限的命令選項,如:創建目錄、瀏覽訪問的目錄和下載/上傳文件,因此您無法在控制臺內使用到SSH的其他所有命令。您可以通過鏈接:https://itservices.usc.edu/sftp/cline/來了解更多的SFTP命令行操作。
2. KeepAlive
我的防火墻老是關閉我的連接!
有時候,您的防火墻可能會中斷掉一些正常的連接。下面就有三個指令能夠防止SSH連接被過早地掐斷。
- TCPKeepAlive可以在SSH的客戶端和守護進程的配置文件中使用。它決定了是否需要發送保持連接的TCP消息。TCPKeepAlive的默認值為yes。它會發出TCP消息,提醒防火墻注意到連接的繼續,而不要掐斷它。當然有些用戶在不需要的時候可以將TCPKeepAlive設置為no。
- ServerAliveInterval驗證其連接是否存活。在客戶端配置中,您可以指定客戶端在發送數據包給服務器之前所需等待的秒數。如果將該值設置為0,即禁用此選項,則會在一段空閑的時間之后斷開SSH會話。而指令ServerAliveCountMax指定了從發送數據包,到該連接由于沒有來自服務器的響應而被取消的反復嘗試次數(一般為整數)。
- ClientAliveInterval是在SSH守護進程的服務配置文件/etc/ssh/sshd_config中所使用的指令。它指定了服務器在發送數據包給客戶端之前所需等待的秒數。您可以將該值設置為0,即禁用該選項。而指令ClientAliveCountMax指定了從發送數據包,到該連接由于沒有來自客戶端的響應而被取消的反復嘗試次數(一般為整數)。
所有主機都使用相同的客戶端SSH配置文件,來設置keep alive的參數:
在~/.ssh/config中
- Host *
- ServerAliveInterval 30
- ServerAliveCountMax 10
這樣的配置意味著客戶在發送一個空包之前要等待30秒,并且要嘗試多達10次,以確認在服務器無響應的情況下中斷連接。
3. SSH代理
我覺得每次輸入密碼短語很繁瑣,也許我應該生成一些密鑰而非密碼短語?
一種常見且有效的安全做法是加密您的SSH私鑰,并用密碼短語來進行解密。這種方法的缺點是:您每次都必須繁瑣地重新輸入密碼以初始化SSH連接,而這本質上就是反復輸入密碼的過程。
為了解決這個問題,您可以使用ssh-agent。它是一種能在會話期間將私鑰保持在內存之中的工具。當代理啟動后,所有需要SSH連接的窗口和應用程序都將通過該代理來獲得您的私鑰,因此您只需要在會話開始的時候一次性輸入密碼短語便可。
在大多數Linux操作系統上,SSH代理是默認運行的,因此不需要額外進行安裝。如果您想檢查ssh代理是否正在運行,您可以在終端里輸入:
- ps x | grep ssh-agent
如果還沒有運行的話,您可以這樣啟動它:
- eval $(ssh-agent)
一旦它運行起來,您就可以羅列出ssh代理當前可用的所有密鑰:
- ssh-add –L
如果要用的密鑰丟失,您可以通過ssh-add /path/to/your/ssh/privatekey來添加它。當您想連接一臺主機,卻碰到Too many authentication failures for user的錯誤時,這就意味著SSH代理正在試圖檢查所有可用的密鑰。因此最好的方法是在您的配置文件中定義一個IdentityFile /path/to/your/ssh/privatekey/forthishost。如果您要確保只能使用由IdentityFile所定義的連接,則可以在配置中使用指令IdentitiesOnly yes,它會告訴SSH只使用由終端或配置文件所提供的密鑰。請看如下的例子:
在~/.ssh/config中,
- Host yourserver
- HostName yourserver.tld
- IdentityFile ~/.ssh/yourprivatekeyname
- IdentitiesOnly yes
- User user
(1) 代理轉發
我就只想在最開始的時候輸入一次密碼短語,之后就算我從一臺主機連接到另一臺主機的時候,也不要提示我再次輸入。
為了能夠在互連的主機之間共用相同的信任憑證,代理也是可以被轉發的。雖然這樣的轉發非常方便,但是請記?。捍韮H能將您的私鑰保存在內存之中。一旦某個惡意程序攻破了聯網的一臺主機,就能使用您的密鑰在其他主機上執行各種命令??梢?,代理轉發是一種不安全的方法,只能在您所連接的信任主機上被使用。
為了用到代理轉發,您需要在客戶端的ssh_config上設置ForwardAgent yes,并在任何需要用到轉發代理的服務器上的/etc/ssh/sshd_config里設置AllowAgentForwarding yes。
4. 通過本地端口轉發的隧道
我想要做的事情,本地電腦不允許,但我知道哪里會有一臺電腦是允許的。
隧道是SSH的一種最常見的高級使用案例。它在SSH連接內通過加密應用的流量,從而實現安全保護。這對于傳統軟件或其他安全性欠佳的應用和系統來說是非常有用的,它為軟件設置了一個不能也無法改變的安全包裝,以抵御不安全網絡環境。
(1) 服務器端
服務器端可以修改文件/etc/ssh/sshd_config中的配置。由于以#開頭的行是被注釋掉的,因此如果您想使用該選項的話,只要復制出另外一行進行修改或者直接取消掉注釋便可。對于端口轉發式的隧道,為了使其工作,您需要開啟TCP的轉發。
在/etc/ssh/sshd_config中,
- AllowTcpForwarding yes
如果您修改了服務器的配置文件,請記得重新加載SSH服務。至于如何重載或重新啟動您的服務端的服務,則取決于操作系統的類型。在大多數情況下,應該是如下命令:
- service ssh reload
(2) 客戶端
在客戶端有好幾種方法來使用SSH隧道。大多數情況下,您會這樣來實現SSH隧道:
- 如果您想對一個僅供另一臺機器訪問的數據庫來執行查詢操作,那么就需要用隧道來連接那臺機器。下面的例子展示了如何運用yourserver.tld來隧道連接到一臺PostgreSQL數據庫服務器,并且在那里使用基于終端的psql frontend。
- ssh -L 5000:psql.server.ip:5432 user@yourserver.tld
- psql -p 5000 -h 127.0.0.1 -U postgres
- ssh -L 1337:yourwebsite.com:80
5. X11轉發
我并沒有一些昂貴軟件的許可證,我只能在連上服務器后,顯示在我家里的屏幕上。
您可以通過SSH來初始化X11轉發,這就意味著你可以顯示遠程的計算機桌面環境,并將各種X11包轉發到您所使用的計算機上。X11轉發有著廣泛的適用性,特別是在您必須使用某個特定軟件的GUI時。在下面的例子中,我們將測試用X11來轉發xclock。
(1) 先決條件
為了能將X11包轉發給客戶端,xauth包必須被預先安裝在服務器上。所以如果你想測試xclock的話,就必須提前安裝好它。
(2) 服務器
在服務器上,您需要在/etc/ssh/sshd_config里啟用X11Forwarding。具體操作是:定位到具有X11Forwarding的一行,將其設置為yes,也就是說:如果該行已經存在,并被注釋掉了的話,您直接刪除前面的#便可。
在/etc/ssh/sshd_config中,
- X11Forwarding yes
在修改了配置文件之后,請不要忘記重新加載SSH服務。
(3) 客戶端
- ssh -X
現在,您可以使用X11來將服務器轉發到客戶端的計算機上了。通過輸入xclock,一個時鐘窗口會在您的桌面電腦上彈出,如截圖所示。
X11轉發的偉大之處在于:當你想使用一個由于授權方面的原因而只能安裝在一臺服務器上的軟件,或是與您的普通電腦有著不同的性能需求時,都可以用到X11轉發。
6. 代理跳轉(ProxyJump)
我想訪問與外界相隔離的專用網絡,我會搭建一臺能夠連接的服務器,然后跳轉到我要去的那些機器上。
SSH的一種常見訪問策略是連接到一臺堡壘主機上,然后從那里跳轉到沒有公共路由的設備上。該堡壘主機被稱為代理鏈上的第一跳主機。ProxyJump是OpenSSH的一個新功能,它簡化了所用到的跳躍主機。在您不希望被公開暴露時,它為主機添加了一層額外的安全。
這方面的一個用例是:用一臺小機器作為路由器后面的堡壘實體機,您在上面運行sshd,并從那里跳轉到其他主機上??梢?,這對于家庭網絡是很實用的。這與從端口轉發和從一臺主機隧道到下一臺上并沒什么不同,只是現在這種情況下,用關鍵字ProxyJump描述的是在指定的多臺主機間跳躍,參照的是含有逗號分隔的列表。在終端上,請使用參數-J,如下所示:
- ssh -J proxy.server.tld:22 yourserver.tld
對于更為復雜的、需要使用不同的用戶名來實現的若干臺主機間的跳轉,可以使用:
- ssh -J [email protected]:port1,[email protected]:port2
由于您可能會經常使用到主機間的跳轉,因此最好把它們包含在您的用戶或系統常規SSH配置之中。如下的配置文件就適用于上述的用例:
在~/.ssh/config中,
- Host yourserver.tld
- HostName yourserver.tld
- ProxyJump user1@proxy.server1.tld:port1,user2@proxy.server2.tld:port2
- User user
你也可以為每一個主機的跳轉指定SSH配置,并使用ProxyJump字段來指定它們的別稱。
在~/.ssh/config中,
- Host firstproxy
- HostName proxy.server1.tld
- Port 1234
- User user1
- Host secondproxy
- HostName proxy.server2.tld
- Port 5678
- User user2
- Host yourserver.tld
- HostName yourserver.tld
- ProxyJump firstproxy,secondproxy
- User user
注意,新添加的ProxyJump和那些舊的ProxyCommand指令都完全遵守“先到先得”的原則,這就意味著先設定的會被先執行、以此類推下去。如果您的SSH客戶端并不支持ProxyJump的話,您可以改用ProxyJump的指令:ProxyCommand ssh firstproxy -W %h:%p。
原文標題:Advanced Secure Shell: 6 Things You Can Do With SSH,作者: Sanja Bonic
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】