經過前面十餘篇文章的介紹,相信已經初步入門Linux本地管理的基本方法了,後續的文章將介紹Linux中經常使用的服務部署以及如何爲外部提供相應的服務。linux
系列文章第三篇「linux入門系列3--linux遠程登錄工具」初步介紹了幾款用於Linux遠程登陸管理的工具,本文再來詳細講解下SSH協議以及對應的服務配置,從而更好的遠程管理服務器。git
提示:在進行操做以前請按前邊系列文章的方法,新裝或克隆準備2臺Linux虛擬機,假設ip地址分別爲192.168.78.100和192.168.78.104(須要根據自身實際狀況來配置),用於演示linux系統之間的ssh登陸。若是忘記如何準備2臺虛擬機的,請參考前面文章「linux入門系列1--環境準備及linux安裝」的第三節或「linux入門系列13--磁盤管理之RAID、LVM技術」中的1.3.1小節。web
SSH全稱爲Secure Shell,是一種可以以安全的方式提供遠程登陸的協議,是目前遠程管理 Linux 系統的首選方式。在SSH出現以前通常使用FTP以及Telnet來進行遠程登陸,可是他們都是以明文的形式在網絡中傳輸帳戶密碼和數據信息,所以很是不安全,這種方式很容易受到黑客發起的中間人攻擊,從而篡改數據或截取服務器帳號密碼。算法
Linux中的sshd服務是基於SSH協議開發的一款遠程管理服務程序,能夠經過配置sshd服務來遠程管理Linux系統。shell
sshd提供兩種安全驗證方法:基於口令的認證和基於密鑰的認證。apache
基於口令的驗證,是用帳號密碼來登陸系統,正如咱們前面「linux入門系列1--環境準備及linux安裝」講到,在安裝系統時會默認建立root用戶以及手動指定的test用戶,用這些用戶帳號密碼就能夠登陸使用系統。vim
基於密鑰的認證,到目前的文章爲止咱們尚未介紹過,它須要在本地生產密鑰對,而後把密鑰對中的公鑰上傳到服務器,該方式相對口令認證來講更安全。windows
下文咱們主要演示基於證書登陸的方式,在演示以前,咱們先配置sshd服務,在RHEL7中,已經默認安裝並啓用了sshd服務程序。安全
sshd服務的配置信息保存在/etc/ssh/sshd_config文件中,查看文件內容能夠看到裏邊有不少內容,可是大部分都是註釋起來的,咱們能夠根據須要靈活進行配置。bash
經常使用配置參數及做用說明以下:
參數 | 說明 |
---|---|
Port | sshd 服務端口,默認爲22 |
ListenAddress | 設定 sshd 服務器監聽的 IP 地址,默認爲0.0.0.0 |
Protocol | SSH 協議的版本號 |
HostKey | 值爲/etc/ssh/ssh_host_key,表示SSH 協議版本爲1時,DES 私鑰存放的位置;值爲/etc/ssh/ssh_host_rsa_key,表示SSH 協議版本爲2時,RSA私鑰存放的位置;值爲/etc/ssh/ssh_host_dsa_key,表示SSH 協議版本爲2時,DSA私鑰存放的位置 |
PermitRootLogin | 設定是否容許 root 管理員直接登陸,默認爲yes |
StrictModes | 當遠程用戶的私鑰改變時直接拒絕鏈接,默認爲yes |
MaxAuthTries | 最大密碼嘗試次數,默認爲6 |
MaxSessions 10 | 最大終端數,默認爲10 |
PasswordAuthentication | 是否容許密碼驗證,默認爲yes |
PermitEmptyPasswords | 是否容許空密碼登陸,默認爲no |
因爲RHEL7中已經默認安裝並啓用了sshd服務,而且參數都有默認值,所以咱們不作任何配置就能夠直接使用ssh登陸到其餘機器。
按開篇講解的方法開啓準備好的2臺linux主機,而後進行以下操做:
[root@origin ~]# hostname origin [root@origin ~]# ssh 192.168.78.100 The authenticity of host '192.168.78.100 (192.168.78.100)' can't be established. ECDSA key fingerprint is c1:b8:67:1f:1d:c0:cd:6b:37:90:42:b1:c6:5a:e8:cf. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.78.100' (ECDSA) to the list of known hosts. root@192.168.78.100's password: Last login: Sun Jan 5 11:19:40 2020 from 192.168.78.1 [root@heimatengyun ~]# hostname heimatengyun [root@heimatengyun ~]#
由此能夠見,未通過任何配置,直接經過ssh命令就能夠從origin的主機遠程登陸到到了heimatengyun這臺主機。
咱們把上邊heimatengyun這臺主機經過修改配置參數,禁止root管理員遠程登陸,再來觀察遠程登陸的效果。
[root@heimatengyun ~]# vim /etc/ssh/sshd_config ...省略部份內容 PermitRootLogin no ....省略部份內容
保存並退出。重啓sshd服務查看結果:
[root@heimatengyun ~]# systemctl restart sshd [root@heimatengyun ~]# systemctl enable sshd [root@heimatengyun ~]#
注意,修改sshd配置後,必定要重啓sshd服務纔會使配置生效。
[root@origin ~]# ssh 192.168.78.100 root@192.168.78.100's password: Permission denied, please try again. root@192.168.78.100's password:
能夠看到,root已經沒法遠程登陸進入系統了,包括外部的一切ssh工具都沒法在登陸系統,這樣就大大下降被黑客暴力破解密碼的概率。
若是想登陸這臺主機,因爲咱們目前是在虛擬機演示,所以惟一的方式就是進入虛擬機進行登陸,而生產環境中服務器通常是放在機房的,所以也就只有去機房接上顯示器,而後進行登陸。
演示完成後,咱們將來後續的演示,先經過虛擬機登陸到系統,將配置修改回來,容許root遠程登陸。
注意:以上演示的是兩臺linux主機之間的ssh登陸,直接使用的是系統自帶的ssh命令便可。而若是是windows與linux之間的ssh登陸則是藉助各類ssh工具,若是主機禁止了root登陸,任何遠程ssh工具都沒法登陸。常見的ssh登陸工具見前面系列文章第三篇「linux入門系列3--linux遠程登錄工具」。
此前的登陸都是經過帳號密碼的形式登陸,本節演示經過ssh證書進行登陸。
前邊的演示中2臺機器之間要ssh遠程登陸,須要先輸入密碼。但有時候須要linux主機能ssh免密登陸,而無需輸入帳戶的密碼,好比一臺機器上ssh到另一臺機器執行某些腳本,這個過程每每是經過shell腳本進行,而無需人工干預。所以在這種狀況下,就須要設置機器之間的互信,而免密登陸本質就是證書登陸。
仍是之前面的2臺機器爲例,假設須要從192.168.78.104(origin)免密登陸到192.168.78.100(heimatengyun),那麼origin就是客戶端主機,而heimatengyun則是服務器遠程主機。
(1)在客戶端主機生成密鑰對
經過系統自帶的ssh-keygen命令生成
[root@origin ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): 按回車或設置密鑰存儲路徑 Enter passphrase (empty for no passphrase): 按回車或設置密鑰的密碼 Enter same passphrase again: 按回車或設置密鑰的密碼 Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: bc:94:4e:e1:82:7c:4a:96:ad:a3:38:c5:d6:47:ac:94 root@origin The key's randomart image is: +--[ RSA 2048]----+ | | | | | o . | | .E+oo o | | . o*o+ S | | +oo+.= . | | o +. o | |.. . . | |... | +-----------------+ [root@origin ~]# [root@origin ~]# ls .ssh/ id_rsa id_rsa.pub known_hosts
注意,此過程須要按3次回車,不輸入信息直接按回車則採用默認值。能夠看到在當前用戶根目錄下的.ssh文件夾中生成了公鑰(id_rsa.pub)和私鑰文件(id_rsa)。
這樣就生成了密鑰對。
(2)公鑰文件發送至遠程主機
經過ssh-copy-id命令把客戶端剛生成的公鑰文件發送至遠程主機
[root@origin ~]# ssh-copy-id 192.168.78.100 /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 root@192.168.78.100's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh '192.168.78.100'" and check to make sure that only the key(s) you wanted were added. [root@origin ~]#
輸入遠程主機的密碼後,就成功把公鑰文件發送至遠程主機。實際上就是將第一步中生產的id_rsa.pub公鑰文件的內容寫入到遠程主機的.ssh/authorized_keys文件中,同時在本身的.ssh目錄下生成known_hosts文件,裏邊記錄的是遠程主機的信息。能夠自行查看2臺主機的這2個文件對比一下就知道了。另外因爲受權操做本質就是文件的操做,所以當不須要ssh無密登陸時只須要刪除.ssh目錄下的文件便可。
通過上邊操做後,此時就能夠直接遠程登陸到主機了。
[root@origin ~]# ssh 192.168.78.100 Last login: Sun Jan 5 11:36:52 2020 from 192.168.78.1 [root@heimatengyun ~]#
能夠看到沒有輸入root的密碼,直接就登陸遠程服務主機了。但此時遠程主機heimatengyun依然能夠遠程經過帳號密碼登陸。
若是在第一步中指定了證書的密鑰,則在登陸時須要輸入證書的密碼才能登陸。注意是證書密碼而不是用戶的密碼。
(3)設置遠程主機,使其只容許密鑰證書登陸,拒絕口令登陸方式
進入heimatengyun主機,禁止口令登陸
[root@heimatengyun ~]# vi /etc/ssh/sshd_config ...省略部份內容 PasswordAuthentication no ...省略部份內容 [root@heimatengyun ~]# systemctl restart sshd.service [root@heimatengyun ~]#
保存退出並重啓sshd服務。
(4)驗證遠程登陸
從origin遠程登陸到服務器主機
[root@origin ~]# ssh 192.168.78.100 Last login: Sun Jan 5 12:36:48 2020 from 192.168.78.104 [root@heimatengyun ~]#
能夠看到經過ssh證書的方式依然能夠成功正常登陸。
可是此時,經過遠程工具從window中經過遠程工具如xshell、securecrt經過帳號密碼進行登陸,則沒法登陸。因而可知即便設置容許root登陸,可是不容許經過帳號登陸,root依然沒法遠程登陸。root要想登陸也就只有去虛擬機登陸,正式環境也就只有去機房才能登陸。
說明:ssh免密登陸時單向的,經過上邊的設置能夠從origin免密登陸到heimatengyun,可是反之則不行,若是想讓其反之也能夠的話須要用一樣的方法,在heimatengyun主機上生產密鑰對,而後將其公鑰傳輸到origin主機。這樣就實現了主機之間的相互ssh免密登陸。
咱們也能夠在windows下生成密鑰對,從而在windows下經過證書登陸到linxu服務器。但在windows下是不能執行ssh-keygen生成密鑰對的。須要安裝相應的密鑰生成工具才能生成,這類工具不少,其中以前文章中講解的SecureCRT、xshell、putty等均可以生成。
每種工具的生成方法略有區別,可是因爲篇幅所限,此處僅以SecureCRT爲例進行演示
(1)windows上用securecrt生成密鑰對
工具-生成公鑰
在彈出的嚮導中點擊「下一步」
保持默認選擇RSA算法,並點擊「下一步」
輸入證書密碼,也能夠不輸入,若是輸入了,則在登陸時須要指定證書同時輸入密碼,注意此處的密碼不是用戶密碼,而是證書密碼。
保持默認長度,點擊「下一步」
點擊「下一步」
選擇密鑰類型和目錄,點擊「完成」
這樣就在指定的目錄生成了密鑰文件。
其中Identity爲私鑰文件,Identity.pub爲公鑰文件。
(2)將公鑰文件上傳到服務器
能夠經過以前講解的SecureFx或xftp上傳到服務器root目錄(若是不知道如何操做或忘記了請參看本系列教程第三篇)。
將上傳到root目錄的Identity.pub公鑰文件,拷貝到.ssh目錄下,並命名爲authorized_keys
[root@origin .ssh]# ls Identity.pub [root@origin .ssh]# cat Identity.pub >>authorized_keys [root@origin .ssh]# ls authorized_keys Identity.pub
之因此要該文件名爲authorized_keys是由於openssh不支持SecureCRT生成的密鑰格式,須要進行類型轉換。
(3)服務器禁止採用帳號密碼方式登陸
至此其實就能夠在windows上使用securecrt工具經過證書方式登陸了,可是爲了安全性以及排除演示干擾,咱們禁止服務器用帳號密碼方式登陸
[root@heimatengyun ~]# vi /etc/ssh/sshd_config ...省略部份內容 PasswordAuthentication no ...省略部份內容 [root@heimatengyun ~]# systemctl restart sshd.service [root@heimatengyun ~]#
(4)在SecureCRT中設置採用證書登陸
在會話選項中進行設置
設置證書所在的目錄
選擇剛纔第一步中生成的私鑰文件,而後點擊「Ok」,設置完成便可。
此時就能夠成功登陸了,使用的就是剛纔的證書方式登陸。
另外注意,若是securecrt工具鏈接多臺服務器,剛纔是經過全局會話選項設置的,則它默認會先用證書登陸,若是登陸失敗會在嘗試用帳號密碼登陸。以下演示,100這臺服務器並無設置證書登陸,可是因爲全局設置了證書登陸,所以他會先用證書登陸,結果提示失敗,而後,添加skip後會繼續讓用帳號密碼登陸。以下:
點擊skip以後,會再次讓選擇用帳號密碼登陸。
本地拷貝用cp命令,主機之間拷貝數據用scp命令。scp即secure copy,是一個基於ssh協議在網絡之間進行安全傳輸的命令,它傳輸的數據是通過加密處理的。
語法格式:
scp [參數] 本地文件 遠程帳戶@遠程IP地址:遠程目錄
若是主機之間已經設置免密登陸,則能夠省略遠程帳號,即簡化爲:
scp [參數] 本地文件 遠程IP地址或主機名稱:遠程目錄
參數:
參數 | 功能 |
---|---|
-v | 顯示詳細的鏈接進度 |
-P | 指定遠程主機的sshd端口號,若是是默認的22端口,能夠不指定此參數 |
-r | 遞歸傳輸文件,用於傳輸文件夾 |
案例:
(1)本地文件複製到遠程主機
[root@origin ~]# echo "local to remote">local.txt [root@origin ~]# scp local.txt 192.168.78.100:/root/ The authenticity of host '192.168.78.100 (192.168.78.100)' can't be established. ECDSA key fingerprint is c1:b8:67:1f:1d:c0:cd:6b:37:90:42:b1:c6:5a:e8:cf. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.78.100' (ECDSA) to the list of known hosts. root@192.168.78.100's password: local.txt 100% 16 0.0KB/s 00:00
本地建立一個文件,經過scp命令指定文件的相對路徑,便可傳輸到遠程主機,此時登陸遠程主機查看,文件以及傳輸過去了。
另外上邊演示是主機之間未設置ssh免密登陸因此須要輸入密碼,若是設置免密登陸後,不會要求輸入密碼。
另外本地文件不管是絕對路徑和相對路徑都是能夠的,上邊顯示的是相對路徑,咱們在下用絕對路徑來傳輸。
[root@origin ~]# scp /root/local.txt 192.168.78.100:/root/ root@192.168.78.100's password: local.txt 100% 16 0.0KB/s 00:00 [root@origin ~]#
(2)遠程主機文件下載到本地
[root@origin ~]# rm -rf local.txt [root@origin ~]# scp 192.168.78.100:/root/local.txt /root/ root@192.168.78.100's password: local.txt 100% 16 0.0KB/s 00:00 [root@origin ~]# ls local.txt ...省略部分其餘內容
因而可知,成功將遠程主機的文件拷貝到了本地。遠程拷貝文件須要指定遠程文件的絕對路徑。
你是否遇到過在遠程計算機上執行長時間運行任務的狀況,而且忽然鏈接斷開,SSH會話終止了而且你的工做丟失了。
系統管理員常常須要SSH或者telent 遠程登陸到Linux 服務器,常常運行一些須要很長時間才能完成的任務,好比系統備份、ftp 傳輸等等。一般狀況下咱們都是爲每個這樣的任務開一個遠程終端窗口,由於它們執行的時間太長了。必須等待它們執行完畢,在此期間不能關掉窗口或者斷開鏈接,不然這個任務就會被殺掉,一切半途而廢了。
screen就是爲了解決這個會話斷開致使任務終止的問題。
screen是一款可以實現多窗口遠程控制的開源服務程序,簡單來講就是爲了解決網絡異常中斷或爲了同時控制多個遠程終端窗口而設計的程序。
screen是終端多路複用器,這意味着能夠啓動 screen 會話,而後在該會話中打開任意數量的窗口(虛擬終端),即便斷開鏈接,當其窗口不可見時,在 screen 上運行的進程將繼續運行。
在RHEL7系統中,沒有默認安裝screen服務程序,須要手動安裝。
能夠經過以下命令檢測是否安裝screen
[root@origin ~]# screen --version bash: screen: command not found... [root@origin ~]#
經過yum進行安裝
[root@origin ~]# yum install screen Loaded plugins: fastestmirror, langpacks base | 3.6 kB 00:00 ...省略部份內容 Installed: screen.x86_64 0:4.1.0-0.25.20120314git3c2946.el7 Complete! [root@origin ~]# screen --version Screen version 4.01.00devel (GNU) 2-May-06 [root@origin ~]#
安裝成功後能夠看到版本爲4.01。
語法格式:
screen [參數] 會話名稱
經常使用參數:
參數 | 做用 |
---|---|
-S | 建立會話窗口 |
-r | 回覆指定會話 |
-x | 一次性恢復全部會話 |
-ls | 顯示當前已有的會話 |
執行方式:
能夠先經過screen -S建立會話窗口,而後在窗口中執行任務。也能夠直接在screen命令後邊跟上要執行的命令,這樣命令執行完自動結束screen會話。
[root@origin ~]# screen -S first
注意觀察,此時很快的會屏幕閃一下,而後就沒有動靜了,其實這已經就進入了剛纔建立的first會話窗口了。執行如下命令能夠驗證
[root@origin ~]# screen -ls There is a screen on: 48917.first (Attached) 1 Socket in /var/run/screen/S-root. [root@origin ~]#
直接在剛纔的窗口中執行exit命令,便可退出first會話
[root@origin ~]# exit exit [screen is terminating] [root@origin ~]#
另外在建立會話時,也能夠直接在命令後跟上要執行的任務,這樣就無須先建立會話,而後再開始工做,在命令中的一切操做也都會被記錄下來,當命令執行結束 後 screen 會話也會自動結束。演示以下:
[root@origin ~]# screen vim test.txt hello "test.txt" [New] 1L, 6C written [screen is terminating] [root@origin ~]#
建立一個test.txt文件,保存並退出vim後,就自動退出會話了。
所謂的會話恢復是指會話異常斷開的狀況,好比強行關閉會話窗口,斷網等,而不是經過exit正常命令退出窗口或會話。若是正常退出的話經過screen -ls是看不到會話信息的,只有在異常斷開的狀況才能看到並恢復。
先建立一個會話,並執行一個查看日誌文件的任務
[root@heimatengyun ~]# screen -S test [root@heimatengyun ~]#tail -f /var/log/messages
此時直接斷開或關閉會話窗口,模擬異常斷開的狀況。
再次遠程登陸系統,在會話窗口中經過如下命令查看上次的會話,並恢復會話
[root@origin ~]# screen -ls There is a screen on: 49170.test (Detached) 1 Socket in /var/run/screen/S-root. [root@origin ~]# screen -r test [root@origin ~]# tail -f /var/log/messages Jan 5 19:40:01 origin systemd: Starting Session 77 of user root. Jan 5 19:40:01 origin systemd: Started Session 77 of user root. Jan 5 19:42:37 origin systemd-logind: Removed session 76. Jan 5 19:42:39 origin systemd-logind: New session 78 of user root. Jan 5 19:42:39 origin systemd: Starting Session 78 of user root. ... 省略部份內容
恢復會話後,能夠看到tail命令仍然繼續在執行,牛吧?
若是是傳統方式,直接斷開或關閉會話窗口,命令必定會丟失,也就是說下次再登陸系統的時候,不會看到tail命令仍然在繼續執行。這就是screen的用處,即便會話斷開,只要服務器主機沒關閉就會繼續執行任務。
除了前面講解的會話恢復以外,screen還有其餘不少功能,咱們在來了解一下會話共享功能。
分別用securecrt登陸上邊的100和104兩臺主機,咱們以共享104屏幕主機爲例(由於104上邊已經裝了screen)
[root@heimatengyun ~]# ssh 192.168.78.104 root@192.168.78.104's password: Last login: Sun Jan 5 20:41:31 2020 from 192.168.78.1 [root@origin ~]# screen -S test
[root@origin ~]# screen -x
在104機器上執行的任何操做,在100上均可以看到,一樣,在104上執行的任何操做在100上均可以看到。
這樣就實現了屏幕共享,退出時只須要執行exit命令便可。
從下一篇文章開始講解linux下的各類服務部署,包括vsftp文件傳輸服務、Postfix郵件系統、apache web服務等,敬請期待!