使用SSH訪問遠(yuǎn)程命令行
目標(biāo)
完成本節(jié)內(nèi)容后蕉毯,你能夠登錄到遠(yuǎn)程系統(tǒng)并使用ssh運(yùn)行命令示姿。
什么是openssh冕屯?
OpenSSH在Red Hat企業(yè)級(jí)Linux系統(tǒng)中實(shí)現(xiàn)了安全shell或SSH協(xié)議蟹但。SSH協(xié)議使系統(tǒng)能夠通過不安全的網(wǎng)絡(luò)以加密和安全的方式進(jìn)行通信躯泰。
您可以使用 ssh 命令創(chuàng)建一個(gè)安全的遠(yuǎn)程系統(tǒng)連接,以特定用戶的身份進(jìn)行身份驗(yàn)證华糖,并以該用戶的身份在遠(yuǎn)程系統(tǒng)上獲得交互式 shell 會(huì)話麦向。您也可以使用 ssh 命令在遠(yuǎn)程系統(tǒng)上運(yùn)行單獨(dú)的命令,而無需運(yùn)行交互式 shell客叉。
安全shell的例子
下面的 ssh 命令將使用與當(dāng)前本地用戶相同的用戶名登錄遠(yuǎn)程服務(wù)器 remotehost诵竭。在這個(gè)例子中,遠(yuǎn)程系統(tǒng)會(huì)提示你使用該用戶的密碼進(jìn)行身份驗(yàn)證兼搏。
[user01@host ~]$ ssh remotehost
user01@remotehost's password: redhat
...output omitted...
[user01@remotehost ~]$
你可以通過退出命令退出遠(yuǎn)程系統(tǒng)卵慰。
[user01@remotehost ~]$ exit logout Connection to remotehost closed.
[user01@host ~]$
接下來的ssh命令會(huì)讓你用用戶名user02登錄到遠(yuǎn)程服務(wù)器remotehost上。同樣佛呻,遠(yuǎn)程系統(tǒng)會(huì)提示你使用該用戶的密碼進(jìn)行認(rèn)證裳朋。
[user01@host ~]$ ssh user02@remotehost
user02@remotehost's password: shadowman .
..output omitted...
[user02@remotehost ~]$
這條ssh命令將以u(píng)ser02用戶的身份在遠(yuǎn)程主機(jī)的遠(yuǎn)程系統(tǒng)上運(yùn)行hostname命令,無需訪問遠(yuǎn)程交互式shell吓著。
[user01@host ~]$ ssh user02@remotehost hostname
user02@remotehost's password: shadowman
remotehost.lab.example.com
[user01@host ~]$
注意鲤嫡,前面的命令顯示的是本地系統(tǒng)終端中的輸出。
鑒別遠(yuǎn)程用戶
w命令顯示了當(dāng)前登錄到計(jì)算機(jī)的用戶列表夜矗。這對(duì)于顯示哪些用戶從哪些遠(yuǎn)程位置使用ssh登錄泛范,以及他們?cè)谧鍪裁矗貏e有用紊撕。
[user01@host ~]$ ssh user01@remotehost
user01@remotehost's password: redhat
[user01@remotehost ~]$ w
16:13:38 up 36 min, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
user02 pts/0 172.25.250.10 16:13 7:30 0.01s 0.01s -bash
user01 pts/1 172.25.250.10 16:24 3.00s 0.01s 0.00s w
[user02@remotehost ~]$
前面的輸出顯示,user02的用戶于今天16:13從172.25.250.10 IP地址的主機(jī)上登錄到偽終端0上的系統(tǒng)赡突,并在shell提示符下空閑了7分30秒对扶。前面的輸出也顯示,user01用戶在偽終端1上登錄了系統(tǒng)惭缰,并在執(zhí)行w命令后的最后三秒起浪南,一直處于空閑狀態(tài)。
SSH 主機(jī)秘鑰
SSH通過公鑰加密來保證通信安全漱受。當(dāng)SSH客戶端連接到SSH服務(wù)器時(shí)络凿,服務(wù)器會(huì)在客戶端登錄前向客戶端發(fā)送一份公鑰副本。這是用來設(shè)置通信通道的安全加密,并對(duì)服務(wù)器與客戶端進(jìn)行身份驗(yàn)證絮记。
當(dāng)用戶使用 ssh 命令連接到 SSH 服務(wù)器時(shí)摔踱,該命令會(huì)檢查它在本地已知主機(jī)文件中是否有該服務(wù)器的公鑰副本。系統(tǒng)管理員可能已經(jīng)在/etc/ssh/ssh_known_hosts中預(yù)先配置了它怨愤,或者用戶可能在其主目錄中的~/.ssh/ known_hosts文件中包含了該密鑰派敷。
如果客戶端有一個(gè)密鑰的副本,ssh會(huì)將該服務(wù)器的已知主機(jī)文件中的密鑰與它收到的密鑰進(jìn)行比較撰洗。如果密鑰不匹配篮愉,客戶機(jī)就會(huì)假設(shè)服務(wù)器的網(wǎng)絡(luò)流量可能被劫持,或者服務(wù)器已經(jīng)被入侵差导,并詢問用戶確認(rèn)是否繼續(xù)連接试躏。
如果客戶端的已知主機(jī)文件中沒有公鑰的副本,ssh命令會(huì)問你是否要登錄设褐。如果你想颠蕴,公鑰的副本將保存在你的
~/.ssh/known_hosts文件,這樣以后就可以自動(dòng)確認(rèn)服務(wù)器的身份络断。
[user01@host ~]$ ssh newhost
The authenticity of host 'remotehost (172.25.250.12)' can't be established.
ECDSA key fingerprint is SHA256:qaS0PToLrqlCO2XGklA0iY7CaP7aPKimerDoaUkv720.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'newhost,172.25.250.12' (ECDSA) to the list of known hosts.
user01@newhost's password: redhat
...output omitted...
[user01@newhost ~]$
SSH已知的主機(jī)密鑰管理
如果服務(wù)器的公鑰因?yàn)橛脖P故障導(dǎo)致的密鑰丟失裁替,或者因?yàn)橐恍┖戏ǖ脑虮桓鼡Q,那么你需要編輯已知的主機(jī)文件貌笨,確保舊公鑰的條目被替換成新公鑰的條目弱判,這樣才能登錄。
公鑰存儲(chǔ)在/etc/ssh/ssh_known_hosts和每個(gè)用戶的~/.ssh/ known_hosts文件中锥惋。每個(gè)密鑰都在一行中昌腰。第一個(gè)字段是共享該公鑰的主機(jī)名和IP地址列表。第二個(gè)字段是密鑰的加密算法膀跌。最后一個(gè)字段是密鑰本身遭商。
[user01@host ~]$ cat ~/.ssh/known_hosts
remotehost,172.25.250.11 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOsEi0e+FlaNT6jul8Ag5Nj
+RViZl0yE2w6iYUr+1fPtOIF0EaOgFZ1LXM37VFTxdgFxHS3D5WhnIfb+68zf8+w=
你連接到的每個(gè)遠(yuǎn)程SSH服務(wù)器都會(huì)在/etc/ssh目錄下的擴(kuò)展名為.pub的文件中存儲(chǔ)其公鑰。
[user01@remotehost ~]$ ls /etc/ssh/*key.pub
/etc/ssh/ssh_host_ecdsa_key.pub /etc/ssh/ssh_host_ed25519_key.pub /etc/ssh/ ssh_host_rsa_key.pub
配置基于SSH密鑰的身份驗(yàn)證
目標(biāo)
完成本節(jié)后捅伤,您能夠配置用戶賬戶劫流,使用基于密鑰的身份驗(yàn)證來安全地登錄到遠(yuǎn)程系統(tǒng),而無需密碼丛忆。
基于SSH密鑰的認(rèn)證
您可以配置 SSH 服務(wù)器祠汇,允許您通過使用基于密鑰的身份驗(yàn)證來驗(yàn)證而無需密碼。這是基于私鑰-公鑰方案熄诡。
要做到這一點(diǎn)可很,你需要生成一對(duì)匹配的加密密鑰文件。一個(gè)是私鑰凰浮,另一個(gè)是匹配的公鑰我抠。私鑰文件被用作認(rèn)證憑證苇本,和密碼一樣,必須保密和安全菜拓。公鑰被復(fù)制到用戶要連接的系統(tǒng)中瓣窄,用來驗(yàn)證私鑰。公鑰不需要保密尘惧。
你把公鑰的副本放在服務(wù)器上的賬戶中康栈。當(dāng)你嘗試登錄時(shí),SSH服務(wù)器可以使用公鑰發(fā)出一個(gè)只有使用私鑰才能正確回答的挑戰(zhàn)喷橙。因此啥么,你的SSH客戶端可以用你唯一的私鑰副本自動(dòng)驗(yàn)證你登錄到服務(wù)器上。這樣一來贰逾,你就可以以不需要每次都交互式輸入密碼的方式安全地訪問系統(tǒng)悬荣。
生成SSH密鑰
要?jiǎng)?chuàng)建一個(gè)私鑰和匹配的公鑰進(jìn)行身份驗(yàn)證,請(qǐng)使用 ssh-keygen 命令疙剑。默認(rèn)情況下氯迂,你的私鑰和公鑰分別保存在 ~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub 文件中。
[user@host ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): Enter Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase): Enter
Enter same passphrase again: Enter Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:vxutUNPio3QDCyvkYm1oIx35hmMrHpPKWFdIYu3HV+w user@host.lab.example.com The key's randomart image is:
+---[RSA 2048]----+
| |
| . . |
| o o o |
| . = o o . |
| o + = S E . |
| ..O o + * + |
|.+% O . + B . |
|=*oO . . + * |
|++. . +. |
+----[SHA256]-----+
如果你在ssh-keygen提示時(shí)沒有指定密碼言缤,那么生成的私鑰是不受保護(hù)的嚼蚀。在這種情況下,任何擁有您的私鑰文件的人都可以使用它進(jìn)行身份驗(yàn)證管挟。如果你設(shè)置了一個(gè)密碼轿曙,那么當(dāng)你使用私鑰進(jìn)行身份驗(yàn)證時(shí),你需要輸入這個(gè)密碼僻孝。(因此导帝,您將使用私鑰的口令而不是遠(yuǎn)程主機(jī)上的密碼來進(jìn)行身份驗(yàn)證。)
你可以運(yùn)行一個(gè)名為 ssh-agent 的輔助程序穿铆,它可以在會(huì)話開始時(shí)將你的私鑰口令暫時(shí)緩存在內(nèi)存中您单,以獲得真正的無密碼認(rèn)證。這將在本節(jié)后面討論荞雏。
下面的ssh-keygen命令的例子顯示了在創(chuàng)建公鑰的同時(shí)創(chuàng)建了受密碼保護(hù)的私鑰虐秦。
[user@host ~]$ ssh-keygen -f .ssh/key-with-pass
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in .ssh/key-with-pass.
Your public key has been saved in .ssh/key-with-pass.pub.
The key fingerprint is:
SHA256:w3GGB7EyHUry4aOcNPKmhNKS7dl1YsMVLvFZJ77VxAo user@host.lab.example.com The key's randomart image is:
+---[RSA 2048]----+
| . + =.o ... |
| = B XEo o. |
| . o O X =.... |
| = = = B = o. |
|= + * * S . |
|.+ = o + . |
| + . |
| |
| |
+----[SHA256]-----+
ssh-keygen 命令的 -f 選項(xiàng)決定了密鑰的保存位置。在前面的例子中凤优,私鑰和公鑰分別保存在 /home/user/.ssh/user/.ssh/keywith-pass和 /home/user/.ssh/key-with-pass.pub 文件中羡疗。
SSH密鑰生成后,默認(rèn)情況下會(huì)被存儲(chǔ)在用戶主目錄的.ssh/目錄下别洪。私鑰的權(quán)限模式必須為600,公鑰的權(quán)限模式必須為644柳刮。
共享公鑰
在使用基于密鑰的身份驗(yàn)證之前挖垛,需要將公鑰復(fù)制到目標(biāo)系統(tǒng)痒钝。ssh-copy-id 命令會(huì)將 SSH 密鑰對(duì)的公鑰復(fù)制到目標(biāo)系統(tǒng)。如果您在運(yùn)行 ssh-copy-id 命令時(shí)省略了公鑰文件的路徑痢毒,它將使用默認(rèn)的 /home/user/.ssh/id_rsa.pub 文件送矩。
[user@host ~]$ ssh-copy-id -i .ssh/key-with-pass.pub user@remotehost
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/ id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user@remotehost's password: redhat
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'user@remotehost'" and check to make sure that only the key(s) you wanted were added.
當(dāng)公鑰成功地傳輸?shù)竭h(yuǎn)程系統(tǒng)后,你可以在通過SSH登錄遠(yuǎn)程系統(tǒng)時(shí)哪替,使用相應(yīng)的私鑰認(rèn)證到遠(yuǎn)程系統(tǒng)栋荸。如果你在運(yùn)行ssh命令時(shí)省略了私鑰文件的路徑,它將使用默認(rèn)的/home/user/.ssh/id_rsa文件凭舶。
[user@host ~]$ ssh -i .ssh/key-with-pass user@remotehost
Enter passphrase for key '.ssh/key-with-pass': redhatpass
...output omitted...
[user@remotehost ~]$ exit
logout
Connection to remotehost closed.
[user@host ~]$
使用 ssh-agent 進(jìn)行非交互式身份驗(yàn)證
如果你的SSH私鑰有口令保護(hù)晌块,通常你必須輸入口令才能使用私鑰進(jìn)行認(rèn)證。但是帅霜,你可以使用一個(gè)叫ssh-agent的程序來臨時(shí)緩存密碼匆背。這樣,當(dāng)你使用SSH登錄到另一個(gè)系統(tǒng)的私鑰時(shí)身冀,ssh-agent就會(huì)自動(dòng)為你提供口令钝尸。這樣做很方便,而且可以通過提供更少的機(jī)會(huì)讓別人看到你輸入密碼的機(jī)會(huì)來提高安全性搂根。
根據(jù)本地系統(tǒng)的配置珍促,如果您最初登錄到 GNOME 圖形化桌面環(huán)境,ssh-agent 程序可能會(huì)自動(dòng)啟動(dòng)并為您配置剩愧。
如果你在文本控制臺(tái)上登錄猪叙,使用 ssh 登錄,或者使用sudo 或 su隙咸,你可能需要手動(dòng)啟動(dòng)該會(huì)話的 ssh-agent沐悦。你可以用下面的命令來完成這個(gè)操作:
[user@host ~]$ eval $(ssh-agent)
Agent pid 10155
[user@host ~]$
ssh-agent運(yùn)行后,你需要告訴它你的私鑰或密鑰的密碼五督。你可以通過ssh-add命令來完成這個(gè)操作藏否。
以下 ssh-add 命令分別從 /home/user/.ssh/user/.ssh/id_rsa(默認(rèn)值)和 /home/user/.ssh/key-with-pass 文件中添加私鑰。
[user@host ~]$ ssh-add
Identity added: /home/user/.ssh/id_rsa (user@host.lab.example.com)
[user@host ~]$ ssh-add .ssh/key-with-pass
Enter passphrase for .ssh/key-with-pass: redhatpass
Identity added: .ssh/key-with-pass (user@host.lab.example.com)
在成功將私鑰添加到ssh-agent進(jìn)程中后充包,你可以使用ssh命令調(diào)用SSH連接副签。如果你使用的是默認(rèn)的 /home/user/.ssh/id_rsa 文件以外的任何私鑰文件,那么你必須使用 ssh 命令中的 -i 選項(xiàng)來指定私鑰文件的路徑基矮。
下面的ssh命令示例使用默認(rèn)的私鑰文件驗(yàn)證到SSH服務(wù)器淆储。
[user@host ~]$ ssh user@remotehost
Last login: Fri Apr 5 10:53:50 2019 from host.example.com
[user@remotehost ~]$
下面的 ssh 命令示例使用 /home/user/.ssh/key-with-pass (nondefault) 私鑰文件來驗(yàn)證到 SSH 服務(wù)器。下面的例子中的私鑰已經(jīng)被解密并添加到其父SSH-agent進(jìn)程中家浇,所以ssh命令不會(huì)提示你通過交互式輸入密碼來解密私鑰本砰。
[user@host ~]$ ssh -i .ssh/key-with-pass user@remotehost
Last login: Mon Apr 8 09:44:20 2019 from host.example.com
[user@remotehost ~]$
當(dāng)你從啟動(dòng) ssh-agent 的會(huì)話中注銷時(shí),該進(jìn)程將退出钢悲,你的私鑰的密碼將從內(nèi)存中清除点额。
自定義openssh服務(wù)配置
目標(biāo)
完成本節(jié)后舔株,您應(yīng)該能夠限制以root身份直接登錄并禁用OpenSSH服務(wù)的密碼驗(yàn)證。
配置openssh服務(wù)器
OpenSSH服務(wù)是由一個(gè)名為sshd的守護(hù)進(jìn)程提供的还棱。它的主要配置文件是/etc/ssh/ sshd_config载慈。
OpenSSH服務(wù)器的默認(rèn)配置運(yùn)行良好。但是珍手,你可能需要做一些改變來加強(qiáng)系統(tǒng)的安全性办铡。有兩個(gè)常見的改動(dòng),你可能要做的是琳要。你可能想禁止直接遠(yuǎn)程登錄到根賬戶寡具,并且禁止基于密碼的身份驗(yàn)證(改用SSH私鑰驗(yàn)證)。
禁止超級(jí)用戶使用SSH登錄
禁止從遠(yuǎn)程系統(tǒng)直接登錄到根用戶賬戶是一個(gè)好的做法焙蹭。允許以根用戶身份直接登錄的一些風(fēng)險(xiǎn)包括:
- 每個(gè)Linux系統(tǒng)中默認(rèn)都存在用戶名root晒杈,所以潛在的攻擊者只需要猜測(cè)密碼,而不是有效的用戶名和密碼組合孔厉。這就降低了攻擊者的復(fù)雜性拯钻。
- 根用戶擁有不受限制的權(quán)限,所以它的泄露會(huì)導(dǎo)致系統(tǒng)受到最大的破壞撰豺。
- 從審計(jì)的角度來看粪般,很難跟蹤哪個(gè)授權(quán)用戶以root身份登錄并進(jìn)行了更改。如果用戶必須以普通用戶的身份登錄污桦,然后切換到根賬戶亩歹,這就會(huì)產(chǎn)生一個(gè)日志事件,可以用來幫助提供問責(zé)凡橱。
OpenSSH服務(wù)器使用/etc/ssh/ssh/ sshd_config配置文件中的PermitRootLogin配置來允許或禁止用戶以root身份登錄系統(tǒng)小作。
PermitRootLogin yes
如果把PermitRootLogin參數(shù)設(shè)置為yes,就像默認(rèn)的那樣稼钩,允許人們以root身份登錄顾稀。要防止這種情況,請(qǐng)將值設(shè)置為no坝撑。另外静秆,要防止基于密碼的驗(yàn)證,但允許基于私鑰的root驗(yàn)證巡李,可以將PermitRootLogin參數(shù)設(shè)置為without-password抚笔。
必須重新加載 SSH 服務(wù)器 (sshd) 才能生效。
[root@host ~]# systemctl reload sshd
禁止基于密碼的SSH認(rèn)證
只允許基于私鑰的遠(yuǎn)程命令行登錄有各種優(yōu)點(diǎn):
- 攻擊者無法使用密碼猜測(cè)攻擊來遠(yuǎn)程破解系統(tǒng)上的已知賬戶侨拦。
- 對(duì)于受密碼保護(hù)的私鑰殊橙,攻擊者需要密碼和私鑰的副本。對(duì)于密碼,攻擊者只需要密碼蛀柴。
- 通過使用受密碼保護(hù)的私鑰與ssh-agent配合使用螃概,由于輸入密碼的頻率較低,所以暴露的頻率較低鸽疾,用戶登錄更方便。
OpenSSH服務(wù)器使用/etc/ssh/ sshd_config配置文件中的PasswordAuthentication參數(shù)來控制用戶是否可以使用基于密碼的身份驗(yàn)證來登錄系統(tǒng)训貌。
PasswordAuthentication yes
在 /etc/ssh/ssh/ sshd_config 配置文件中制肮,PasswordAuthentication 參數(shù)的默認(rèn)值為 "yes "會(huì)使 SSH 服務(wù)器允許用戶在登錄時(shí)使用基于密碼的身份驗(yàn)證。PasswordAuthentication 參數(shù)的值為"no"递沪,則會(huì)阻止用戶使用基于密碼的身份驗(yàn)證豺鼻。
請(qǐng)記住,每次更改 /etc/ssh/sshd_config 文件時(shí)款慨,必須重新加載 sshd 服務(wù)才能生效儒飒。
總結(jié)
ssh命令允許用戶使用SSH協(xié)議安全地訪問遠(yuǎn)程系統(tǒng)。
客戶端系統(tǒng)在~/.ssh/known_hosts和/etc/ssh/ssh_known_hosts中存儲(chǔ)遠(yuǎn)程服務(wù)器的身份檩奠。
SSH支持基于密碼和基于密鑰的身份驗(yàn)證桩了。
ssh-keygen命令生成一個(gè)SSH密鑰對(duì),用于驗(yàn)證埠戳。ssh-copy-id命令將公鑰導(dǎo)出到遠(yuǎn)程系統(tǒng)井誉。
sshd服務(wù)在Red Hat Enterprise Linux系統(tǒng)上實(shí)現(xiàn)了SSH協(xié)議。
推薦的做法是將 sshd 配置為禁止以 root 身份遠(yuǎn)程登錄整胃,并要求公鑰認(rèn)證而不是基于密碼的認(rèn)證。