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