使用SSH訪問遠(yuǎn)程命令行
目標(biāo)
完成本節(jié)內(nèi)容后,你能夠登錄到遠(yuǎn)程系統(tǒng)并使用ssh運(yùn)行命令。
什么是openssh?
OpenSSH在Red Hat企業(yè)級Linux系統(tǒng)中實(shí)現(xiàn)了安全shell或SSH協(xié)議。SSH協(xié)議使系統(tǒng)能夠通過不安全的網(wǎng)絡(luò)以加密和安全的方式進(jìn)行通信。
您可以使用 ssh 命令創(chuàng)建一個安全的遠(yuǎn)程系統(tǒng)連接,以特定用戶的身份進(jìn)行身份驗(yàn)證,并以該用戶的身份在遠(yuǎn)程系統(tǒng)上獲得交互式 shell 會話。您也可以使用 ssh 命令在遠(yuǎn)程系統(tǒng)上運(yùn)行單獨(dú)的命令,而無需運(yùn)行交互式 shell。
安全shell的例子
下面的 ssh 命令將使用與當(dāng)前本地用戶相同的用戶名登錄遠(yuǎn)程服務(wù)器 remotehost。在這個例子中,遠(yuǎn)程系統(tǒng)會提示你使用該用戶的密碼進(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命令會讓你用用戶名user02登錄到遠(yuǎn)程服務(wù)器remotehost上。同樣,遠(yuǎn)程系統(tǒng)會提示你使用該用戶的密碼進(jìn)行認(rèn)證。
[user01@host ~]$ ssh user02@remotehost
user02@remotehost's password: shadowman .
..output omitted...
[user02@remotehost ~]$
這條ssh命令將以user02用戶的身份在遠(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ī)的用戶列表。這對于顯示哪些用戶從哪些遠(yuǎn)程位置使用ssh登錄,以及他們在做什么,特別有用。
[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ù)器時,服務(wù)器會在客戶端登錄前向客戶端發(fā)送一份公鑰副本。這是用來設(shè)置通信通道的安全加密,并對服務(wù)器與客戶端進(jìn)行身份驗(yàn)證。
當(dāng)用戶使用 ssh 命令連接到 SSH 服務(wù)器時,該命令會檢查它在本地已知主機(jī)文件中是否有該服務(wù)器的公鑰副本。系統(tǒng)管理員可能已經(jīng)在/etc/ssh/ssh_known_hosts中預(yù)先配置了它,或者用戶可能在其主目錄中的~/.ssh/ known_hosts文件中包含了該密鑰。
如果客戶端有一個密鑰的副本,ssh會將該服務(wù)器的已知主機(jī)文件中的密鑰與它收到的密鑰進(jìn)行比較。如果密鑰不匹配,客戶機(jī)就會假設(shè)服務(wù)器的網(wǎng)絡(luò)流量可能被劫持,或者服務(wù)器已經(jīng)被入侵,并詢問用戶確認(rèn)是否繼續(xù)連接。
如果客戶端的已知主機(jī)文件中沒有公鑰的副本,ssh命令會問你是否要登錄。如果你想,公鑰的副本將保存在你的
~/.ssh/known_hosts文件,這樣以后就可以自動確認(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ī)文件,確保舊公鑰的條目被替換成新公鑰的條目,這樣才能登錄。
公鑰存儲在/etc/ssh/ssh_known_hosts和每個用戶的~/.ssh/ known_hosts文件中。每個密鑰都在一行中。第一個字段是共享該公鑰的主機(jī)名和IP地址列表。第二個字段是密鑰的加密算法。最后一個字段是密鑰本身。
[user01@host ~]$ cat ~/.ssh/known_hosts
remotehost,172.25.250.11 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOsEi0e+FlaNT6jul8Ag5Nj
+RViZl0yE2w6iYUr+1fPtOIF0EaOgFZ1LXM37VFTxdgFxHS3D5WhnIfb+68zf8+w=
你連接到的每個遠(yuǎn)程SSH服務(wù)器都會在/etc/ssh目錄下的擴(kuò)展名為.pub的文件中存儲其公鑰。
[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),你需要生成一對匹配的加密密鑰文件。一個是私鑰,另一個是匹配的公鑰。私鑰文件被用作認(rèn)證憑證,和密碼一樣,必須保密和安全。公鑰被復(fù)制到用戶要連接的系統(tǒng)中,用來驗(yàn)證私鑰。公鑰不需要保密。
你把公鑰的副本放在服務(wù)器上的賬戶中。當(dāng)你嘗試登錄時,SSH服務(wù)器可以使用公鑰發(fā)出一個只有使用私鑰才能正確回答的挑戰(zhàn)。因此,你的SSH客戶端可以用你唯一的私鑰副本自動驗(yàn)證你登錄到服務(wù)器上。這樣一來,你就可以以不需要每次都交互式輸入密碼的方式安全地訪問系統(tǒng)。
生成SSH密鑰
要創(chuàng)建一個私鑰和匹配的公鑰進(jìn)行身份驗(yàn)證,請使用 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提示時沒有指定密碼,那么生成的私鑰是不受保護(hù)的。在這種情況下,任何擁有您的私鑰文件的人都可以使用它進(jìn)行身份驗(yàn)證。如果你設(shè)置了一個密碼,那么當(dāng)你使用私鑰進(jìn)行身份驗(yàn)證時,你需要輸入這個密碼。(因此,您將使用私鑰的口令而不是遠(yuǎn)程主機(jī)上的密碼來進(jìn)行身份驗(yàn)證。)
你可以運(yùn)行一個名為 ssh-agent 的輔助程序,它可以在會話開始時將你的私鑰口令暫時緩存在內(nèi)存中,以獲得真正的無密碼認(rèn)證。這將在本節(jié)后面討論。
下面的ssh-keygen命令的例子顯示了在創(chuàng)建公鑰的同時創(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)情況下會被存儲在用戶主目錄的.ssh/目錄下。私鑰的權(quán)限模式必須為600,公鑰的權(quán)限模式必須為644。
共享公鑰
在使用基于密鑰的身份驗(yàn)證之前,需要將公鑰復(fù)制到目標(biāo)系統(tǒng)。ssh-copy-id 命令會將 SSH 密鑰對的公鑰復(fù)制到目標(biāo)系統(tǒng)。如果您在運(yùn)行 ssh-copy-id 命令時省略了公鑰文件的路徑,它將使用默認(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)時,使用相應(yīng)的私鑰認(rèn)證到遠(yuǎn)程系統(tǒng)。如果你在運(yùn)行ssh命令時省略了私鑰文件的路徑,它將使用默認(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)證。但是,你可以使用一個叫ssh-agent的程序來臨時緩存密碼。這樣,當(dāng)你使用SSH登錄到另一個系統(tǒng)的私鑰時,ssh-agent就會自動為你提供口令。這樣做很方便,而且可以通過提供更少的機(jī)會讓別人看到你輸入密碼的機(jī)會來提高安全性。
根據(jù)本地系統(tǒng)的配置,如果您最初登錄到 GNOME 圖形化桌面環(huán)境,ssh-agent 程序可能會自動啟動并為您配置。
如果你在文本控制臺上登錄,使用 ssh 登錄,或者使用sudo 或 su,你可能需要手動啟動該會話的 ssh-agent。你可以用下面的命令來完成這個操作:
[user@host ~]$ eval $(ssh-agent)
Agent pid 10155
[user@host ~]$
ssh-agent運(yùn)行后,你需要告訴它你的私鑰或密鑰的密碼。你可以通過ssh-add命令來完成這個操作。
以下 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命令不會提示你通過交互式輸入密碼來解密私鑰。
[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)你從啟動 ssh-agent 的會話中注銷時,該進(jìn)程將退出,你的私鑰的密碼將從內(nèi)存中清除。
自定義openssh服務(wù)配置
目標(biāo)
完成本節(jié)后,您應(yīng)該能夠限制以root身份直接登錄并禁用OpenSSH服務(wù)的密碼驗(yàn)證。
配置openssh服務(wù)器
OpenSSH服務(wù)是由一個名為sshd的守護(hù)進(jìn)程提供的。它的主要配置文件是/etc/ssh/ sshd_config。
OpenSSH服務(wù)器的默認(rèn)配置運(yùn)行良好。但是,你可能需要做一些改變來加強(qiáng)系統(tǒng)的安全性。有兩個常見的改動,你可能要做的是。你可能想禁止直接遠(yuǎn)程登錄到根賬戶,并且禁止基于密碼的身份驗(yàn)證(改用SSH私鑰驗(yàn)證)。
禁止超級用戶使用SSH登錄
禁止從遠(yuǎn)程系統(tǒng)直接登錄到根用戶賬戶是一個好的做法。允許以根用戶身份直接登錄的一些風(fēng)險(xiǎn)包括:
- 每個Linux系統(tǒng)中默認(rèn)都存在用戶名root,所以潛在的攻擊者只需要猜測密碼,而不是有效的用戶名和密碼組合。這就降低了攻擊者的復(fù)雜性。
- 根用戶擁有不受限制的權(quán)限,所以它的泄露會導(dǎo)致系統(tǒng)受到最大的破壞。
- 從審計(jì)的角度來看,很難跟蹤哪個授權(quán)用戶以root身份登錄并進(jìn)行了更改。如果用戶必須以普通用戶的身份登錄,然后切換到根賬戶,這就會產(chǎn)生一個日志事件,可以用來幫助提供問責(zé)。
OpenSSH服務(wù)器使用/etc/ssh/ssh/ sshd_config配置文件中的PermitRootLogin配置來允許或禁止用戶以root身份登錄系統(tǒng)。
PermitRootLogin yes
如果把PermitRootLogin參數(shù)設(shè)置為yes,就像默認(rèn)的那樣,允許人們以root身份登錄。要防止這種情況,請將值設(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):
- 攻擊者無法使用密碼猜測攻擊來遠(yuǎn)程破解系統(tǒng)上的已知賬戶。
- 對于受密碼保護(hù)的私鑰,攻擊者需要密碼和私鑰的副本。對于密碼,攻擊者只需要密碼。
- 通過使用受密碼保護(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 "會使 SSH 服務(wù)器允許用戶在登錄時使用基于密碼的身份驗(yàn)證。PasswordAuthentication 參數(shù)的值為"no",則會阻止用戶使用基于密碼的身份驗(yàn)證。
請記住,每次更改 /etc/ssh/sshd_config 文件時,必須重新加載 sshd 服務(wù)才能生效。
總結(jié)
ssh命令允許用戶使用SSH協(xié)議安全地訪問遠(yuǎn)程系統(tǒng)。
客戶端系統(tǒng)在~/.ssh/known_hosts和/etc/ssh/ssh_known_hosts中存儲遠(yuǎn)程服務(wù)器的身份。
SSH支持基于密碼和基于密鑰的身份驗(yàn)證。
ssh-keygen命令生成一個SSH密鑰對,用于驗(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)證。