Linux ssh協議

来源:https://www.cnblogs.com/heyongshen/archive/2022/08/01/16522798.html
-Advertisement-
Play Games

基礎知識 ssh:secure shell protocol,安全的遠程登錄 作用:是建立在應用層基礎上的安全協議,實現數據傳輸過程中數據的加密,代替telent協議 使用tcp協議,埠號為22 ssh服務具體的軟體實現: openSSH dropbear OpenSSH:ssh協議的開源實現,l ...


基礎知識

  • ssh:secure shell protocol,安全的遠程登錄

  • 作用:是建立在應用層基礎上的安全協議,實現數據傳輸過程中數據的加密,代替telent協議

  • 使用tcp協議,埠號為22

ssh服務具體的軟體實現:

  • openSSH

  • dropbear

OpenSSH:ssh協議的開源實現,linux(centos、ubuntu等)預設使用的是openssh來實現ssh這個服務的

dropbear:另一個ssh協議的開源項目的實現

ssh的通信過程:

第一次連接的時候就要進行公鑰的交換

  • 客戶端發起請求

  • 服務端返回給客戶端自己的公鑰,以及生成一個會話ID

  • 客戶端生成密鑰對:將自己的公鑰和會話ID做異或運算,然後再使用服務端的公鑰來加密異或運算的到的值

  • 服務端的到這個加密的數據後使用自己的私鑰解密得到數據

  • 服務端使用解密後得到的數據和會話ID進行異或運算得到客戶端的公鑰(伺服器得到客戶端公鑰)

最終:雙方各自持有三個秘鑰,分別為自己的一對公、私鑰,以及對方的公鑰,之後的所有通訊都會被加密

伺服器的公鑰表現為一個磁碟文件

客戶端的公鑰是臨時生成的(在連接的時候自動生成一個公鑰)

ssh加密通信原理

假如A和B通信,A是客戶端,B是服務端
A--->B
客戶端A使用服務端B的公鑰來加密數據,服務端B使用自己的私鑰來解密數據

B--->A
流程和A--->B的流程是一樣的

#第一次連接的時候會把目標主機的公鑰利用哈希演算法生成一個摘要,需要手動確認目前連接的機器是想要連接的目標主機
#確認以後會自動把對方的公鑰下載下來,下次再連接的時候就能確保是否和第一次是同一個主機。

#對方公鑰存放位置:
當前用戶的家目錄下麵一個叫做ssh的隱藏文件夾,裡面有個叫做known_hosts的文件,裡面記錄了遠程主機的公鑰。

#拿到公鑰的好處:
如果下次訪問的時候有一個假冒的主機(同樣的ip地址等信息),系統是能夠發現的。

#新的機器地址和舊地址一樣,只需要刪除舊機器對應的公鑰文件就可以重新連接上去了 .ssh/known_hosts裡面

openssh服務

OpenSSH是SSH(Secure SHell)協議的免費開源實現,一般在各種Linux版本中會預設安裝,基於C/S結構

Openssh軟體相關包組成:

  • openssh

  • openssh-clients:伺服器的配置文件帶D,客戶端的配置文件不帶D

  • openssh-server:這個包定義了伺服器的配置文件

#可以使用rpm -ql 包名 :查看軟體包中的內容

服務端:
[[email protected] CA]# rpm -ql openssh-server
/etc/pam.d/sshd  #服務端程式
/etc/ssh/sshd_config #服務端配置文件
/etc/sysconfig/sshd
...
服務端對應的unit文件:/usr/lib/systemd/system/sshd.service


客戶端:
[[email protected] ~]# rpm -ql openssh-clients
/etc/ssh/ssh_config  #客戶端的配置文件,可以更改預設埠,公鑰檢查等
/etc/ssh/ssh_config.d
/etc/ssh/ssh_config.d/05-redhat.conf
/usr/bin/scp
/usr/bin/sftp
/usr/bin/ssh
/usr/bin/ssh-add
/usr/bin/ssh-agent
/usr/bin/ssh-copy-id
/usr/bin/ssh-keyscan
...

客戶端:openssh-clients

Linux Client: ssh, scp, sftp,slogin  #linux的openssh-clients經常使用的工具

Windows Client: xshell, MobaXterm, putty, securecrt, sshsecureshellclient

客戶端 ssh命令

ssh命令:是ssh客戶端的一個工具,允許實現對遠程系統經驗證地加密安全訪問

#ssh客戶端配置文件:
/etc/ssh/ssh_config

ssh命令使用格式

ssh [[email protected]]host [COMMAND] 或者 ssh -l user host [COMMAND]
#後面加COMMAND,在遠程主機上執行對應的命令

選項:
-p port    #指定openssh-server使用的埠

-X          #支持x11轉發(遠程顯示的圖形界面在本機顯示(前提是雙方都是圖形界面))

-t          #強制偽tty分配,通過間接的方式連接到目標主機
            #如:ssh -t remoteserver1 ssh -t remoteserver2   ssh remoteserver3 

-o option   #如:-o StrictHostKeyChecking=no #表示登錄的時候不用確認,直接下載公鑰

-i <file>   #指定私鑰文件路徑,實現基於key驗證,預設使用文件: ~/.ssh/xxx
範例: 利用windows 顯示 Linux 的圖形工具
使用到了x協議,x協議是用來實現圖形處理的。
#windows的圖形界面和操作系統綁在一起的,linux裡面圖形界面只是一個組件,不輸入操作系統本身。
	x_server組件:一個伺服器,是真正畫圖的組件
	x_client組件:圖形界面客戶端,比如firefox等

	x_client代指圖形工具,運行一個x_client的時候,藉助x協議把請求發送給x_server。
	x_server再連接圖形顯卡進行界面的顯示。
	#兩者可以屬於不同的主機,可以使用不同的協議。

#利用windows 顯示 Linux 的圖形工具
在linux上裝x_client,在windows上裝x_server。
在linux運行客戶端軟體,通過x協議發送給windows的伺服器,實現了windows顯示linux上的圖像。

#windeows的x_server軟體: xmanager(用的比較多)
#linux的x_client:firefox

ssh登錄驗證的方式

  • 口令驗證

  • 密鑰驗證

口令驗證
1. 客戶端發起ssh請求,伺服器會把自己的公鑰發送給用戶

2. 用戶會根據伺服器發來的公鑰對密碼進行加密

3. 加密後的信息回傳給伺服器,伺服器用自己的私鑰解密,如果密碼正確,則用戶登錄成功
密鑰驗證實現方式

在每次連接對方的時候就不用在輸入密碼了,可以直接連接

1. 首先在客戶端生成一對密鑰(ssh-keygen)(公鑰、私鑰)

2. 客戶端的公鑰通過ssh-copy-id命令拷貝到服務端,存放在(authorized_keys)這個文件中

3. 客戶端再次發送連接請求,用客戶端公鑰加密並傳給客戶端

4.客戶端接接收到這個加密的文件後用私鑰解密,將解密的字元用伺服器的公鑰(第一次登錄得到的)加密發給伺服器端

5.服務端用自己的私鑰解密得到結果。通過對比字元串來實現免密登錄
實現基於密鑰的登錄方式實現過程
  • 1.客戶端生成密鑰對

  • 2.客戶端把公鑰拷給服務端

1.ssh-keygen:直接回車預設使用rsa這種非對稱加密演算法生成一個公鑰私鑰對文件

-f:指定公鑰私鑰存放的路徑,不指定預設存放在家目錄下的ssh這個隱藏文件 .ssh/xxx
-t:指定加密演算法
-p: 指定密碼

2.ssh-copy-id -i 公鑰文件的路徑  目標主機

會自動拷到目標主機額度.ssh目錄下的authorized_keys這個文件中(不存在會自動創建)

範例

#使用sshpass工具實現非互動式登錄:(一般用在腳本裡面)

sshpass:實現口令的提交

前提:要實現和對方遠程通信,需要先將對方的公鑰加到自己的.ssh/known_hosts文件中

[[email protected] ~]# sshpass -p 123456 ssh -o StrictHostKeyChecking=no [email protected] #在訪問對方的時候就不需要輸入密碼了


#非互動式實現公鑰的拷貝
sshpass -p 123456 ssh-copy-id -i 本機的公鑰 -o StrictHostKeyChecking=no 10.0.0.8(需要複製到的遠程主機)
#範例:批量部署多台主機基於key驗證腳本
#!/bin/bash  #添加shebang機制
HOSTS="  #指定需要遠程連接到的主機ip地址
10.0.0.6
10.0.0.7
10.0.0.18
10.0.0.28
"
PASS=redhat #用於存儲這幾台主機的密碼
[ -f /root/.ssh/id_rsa ] || ssh-keygen  -P ""  -f /root/.ssh/id_rsa &> /dev/null #如果有私鑰了就不用再創建了
apt -y install sshpass &> /dev/null #如果沒有安裝sshpass就安裝
for i in $HOSTS;do #迴圈ip地址
{
   sshpass  -p $PASS ssh-copy-id  -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub $i &> /dev/null #使用非互動式的方式來將自己的公鑰拷貝過去  -i:指定私鑰的路徑
}& #後臺並行執行
done
wait
#實現多台主機之間彼此都能基於Key驗證
1.生成密鑰對 ssh-keygen #預設保存在.ssh下麵

2.將自己的私鑰文件保存到自己的authorized_keys文件中。 ssh-copy-id 127.0.0.1

3.使用rsync工具將.ssh文件整個複製到目標所有主機

#例如:rsync -av .ssh serverhost/.ssh/root


#原理就是所有人共用一個公鑰私鑰對。 因為使用ssh-keygen生成一個密鑰對是放在/.ssh裡面的且authorized_keys存放自己的公鑰(自己信任自己)
如果生成密鑰對的時候指定了密碼:ssh-keygen -P 。下次遠程的時候不想輸入這個密碼,
可以使用ssh-agent bash 來開啟一個代理,然後把私鑰的密碼托管給代理

ssh-keygen -p

ssh-agent bash #是一個後臺執行的程式
ssh-add #將要密碼托管給agent,下次就不需要手動輸入密碼了

其他ssh客戶端工具

他們都是基於ssh協議開發的ssh_client工具

  • scp

  • rsync

  • stfp

scp:實現跨主機的遠程拷貝

格式:
scp [選項] 源文件 目標文件
scp [選項]  /source_file [[email protected]]remote_houst/dest_file
scp [選項]  [[email protected]]remote_houst/dest_file /source_file

選項:
-r:複製文件夾
-P PORT 指明remote host的監聽的埠

#複製目錄文件後面有無斜線的區別
	有斜線:複製文件夾裡面的內容
	無斜線:複製整個文件夾

rsync:實現數據的更新(增量備份)

主要用來實現數據的增量備份、數據的更新。

工具來源:rsync包
#通信雙方都需要安裝rsync這個工具

#選項:
-a:保留源文件的屬性,但是無法保留acl和selinux屬性  -a選項自帶遞歸的功能
-v:顯示詳細的過程
--delete:保證兩邊的數據一樣,如果目標文件存在某個源文件沒有的文件,就會把目標文件的這個文件刪除掉

rsync  -av /etc server1:/tmp #複製目錄和目錄下文件
rsync  -av /etc/ server1:/tmp #只複製目錄下文件 和scp一樣

rsync -av --delete source_file host:/dest_file | dest_file  #可以跨主機備份也可以本地備份

sftp:互動式文件傳輸工具

用法和ssh工具差不多。

ssh伺服器端配置

伺服器端對應的程式名稱:sshd

伺服器端的配置文件: /etc/ssh/sshd_config

伺服器端的配置文件幫助:man 5 sshd_config
Port        #埠號,生產建議修改
ListenAddress ip
LoginGraceTime 2m
PermitRootLogin yes #預設ubuntu不允許root遠程ssh登錄
StrictModes yes   #檢查.ssh/文件的所有者,許可權等
MaxAuthTries   6     #pecifies the maximum number of authentication
attempts permitted per connection. Once the number of failures reaches half this
value, additional failures are logged. The default is 6.
MaxSessions  10         #同一個連接最大會話
PubkeyAuthentication yes     #基於key驗證
PermitEmptyPasswords no      #空密碼連接
PasswordAuthentication yes   #是否支持密碼驗證
GatewayPorts no
ClientAliveInterval 10 #單位:秒
ClientAliveCountMax 3 #預設3
UseDNS yes #改為no,一般用不到,可以讓ssh連接速度加快
GSSAPIAuthentication yes #提高速度可改為no
MaxStartups    #未認證連接最大值,預設值10
Banner /path/file
#以下可以限制可登錄用戶的辦法:
AllowUsers user1 user2 user3
DenyUsers user1 user2 user3
AllowGroups g1 g2
DenyGroups g1 g2
ssh服務配置的最佳實踐
建議使用非預設埠
禁止使用protocol version 1
限制可登錄用戶
設定空閑會話超時時長
利用防火牆設置ssh訪問策略
僅監聽特定的IP地址
基於口令認證時,使用強密碼策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs
使用基於密鑰的認證
禁止使用空密碼
禁止root用戶直接登錄
限制ssh的訪問頻度和併發線上數
經常分析日誌

範例:

#設置 ssh 空閑60s 自動註銷
Vim /etc/ssh/sshd_config

	ClientAliveInterval   60
	ClientAliveCountMax   0
Service sshd restart
#註意:新開一個連接才有效
#解決ssh登錄緩慢的問題
vim /etc/ssh/sshd_config
	UseDNS no
	GSSAPIAuthentication no
#在 ubuntu 上啟用 root 遠程ssh登錄
#修改sshd服務配置文件
vim /etc/ssh/sshd_config 
	#PermitRootLogin prohibit-password 註釋掉此行
	PermitRootLogin yes 修改為下麵形式

ssh客戶端的配置

客戶端名稱:ssh

配置文件:
/etc/ssh/ssh_config  #客戶端的配置文件,可以更改預設埠,公鑰檢查等

輕量自動運維化工具

  • sshfs

  • pssh

  • sshpass

掛載遠程ssh目錄:

sshfs:由EPEL源提供,目前CentOS8 還沒有提供,可以利用ssh協議掛載遠程目錄
輕量級自動化運維工具 pssh
#範例
sshfs 10.0.0.8:/data /mnt #將遠程主機的data目錄掛載到本地的mnt目錄

pash

pssh:批量管理目標主機,需要提前做好基於key驗證。,可在多台伺服器上執行命令的工具,也可實現文件複製,提供了基於ssh和scp的多個並行工具


選項:
-H:指定要遠程管理的主機地址
-h file:主機列表文件,內容格式”[[email protected]]host[:port]”
-A :手動輸入密碼模式
-i:每個伺服器內部處理信息輸出
範例
#預設使用ssh的key認證,通過 -A選項,使用密碼認證批量執行指令
pssh -H "192.168.1.10"   -A   hostname

#多台主機
pssh -H "192.168.1.10 192.168.1.20"  -i   hostname

#多台主機
cat hosts.txt 
10.0.0.8
10.0.0.6
pssh -h hosts.txt  -i   hostname

#將標準錯誤和標準正確重定向分別保存至本地主機的/data/stdout和/data/stderr目錄下
pssh -H 192.168.1.10 -o /data/stdout -e /data/stderr   -i “hostname”

-o:輸出的文件目錄
-e:錯誤輸出文件

#使用pssh的時候 變數 *號等通配符需要使用單引號括起來

pscp.pssh命令

是將本地文件批量複製到遠程主機

#選項:
-v 顯示覆制過程
-r 遞歸複製目錄

#將本地curl.sh 複製到/app/目錄
pscp.pssh -H 192.168.1.10 /root/test/curl.sh   /app/
pscp.pssh -h host.txt /root/test/curl.sh   /app/

#將本地多個文件批量複製到/app/目錄
pscp.pssh -H 192.168.1.10 /root/f1.sh /root/f2.sh   /app/

#將本地目錄批量複製到/app/目錄
pscp.pssh -H 192.168.1.10  -r /root/test/   /app/

pslurp命令

將遠程主機的文件批量複製到本地

#批量下載目標伺服器的passwd文件至/app下,並更名為user
pslurp -H 192.168.1.10 -L /app /etc/passwd user

#選項
-L 指定從遠程主機下載到本機的存儲的目錄,local是下載到本地後的名稱
-r 遞歸複製目錄

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 公司業務歷史悠久且複雜,資料庫的表更是多而繁雜,每次基於老業務做功能開發都需要去翻以前的表和業務代碼。需要理解舊的表的用途以及包含的欄位的含義,表少還好說,但是表一多這就很浪費時間,而且留下來的文檔都是殘缺不全,每次查一些表的含義都要捯飭很久。在網上搜索關於資料庫文檔管理工具搜到最多的就是Screw... ...
  • 目 錄 1. 概述... 2 2. 設備運維業務... 3 3. “低代碼”表單開發工具... 6 1. 概述 iNeuOS工業互聯網操作系統增加了設備運維業務大屏統計功能和所謂的“低代碼”表單開發工具。 設備運維業務大屏統計功能主要統計當前系統設備數量、預警設備數量、通訊正常、通訊干擾、通訊中斷及 ...
  • head.s 參考 [github這個博主的][ https://github.com/sunym1993/flash-linux0.11-talk ] 改變棧頂位置 _pg_dir: startup_32: movl $0x10,%eax mov %ax,%ds mov %ax,%es mov % ...
  • 曾經的“小霸王”游戲機,讓我們許多80年後、90後度過了一個歡樂愉快的童年,雖然如今這類游戲機和卡帶幾乎已經退出游戲市場,但經典永遠留在了我們這一代人心中。今天給大家分享的小霸王FC經典游戲600合集,帶你回顧童年,重溫經典!希望大家喜歡! 詳情:FC紅白機游戲600合集for mac(小霸王游戲) ...
  • 哪裡有專業級的NTFS格式讀寫工具?Tuxera NTFS 2021 mac中文版是一款非常好用的NTFS讀寫工具,可以讓您完整的讀寫相容NTFS格式驅動器,對磁碟進行訪問、編輯、存儲和傳輸文件等操作。同時還包括開源磁碟管理器等簡單的格式和硬碟維修檢查和修複。 詳情:Tuxera NTFS 2021 ...
  • RAR Extractor是一款非常優秀的壓縮解壓工具,可以幫助用戶提取和預覽多種格式的包(超過 40 種格式),支持解壓RAR、ZIP、7Z、TAR、GZIP、GZ、BZIP2、LZIP、ACE、ISO、PAX、PKG、APK、LBR、MSI、JAR、XZ、LZMA、BZ、LZH、CAB、CPIO ...
  • 拉取nacos docker pull nacos/nacos-server 創建文件夾 日誌文件夾 mkdir -p /root/apply/docker/apply/nacos/logs/ 配置文件夾 mkdir -p /root/apply/docker/apply/nacos/init.d/ ...
  • Xmind 2022 for Mac是一款非常便捷的製作思維導圖的軟體,它有非常豐富的模板可以使用,製作思維導圖可以幫助用戶更高效的進行學習,理清相關學習內容的思路和大體框架,用戶可以根據自己的需求進行自主設計,也可以直接添加模板。 詳情:Xmind 2022 for Mac(思維導圖軟體) 軟體介 ...
一周排行
    -Advertisement-
    Play Games
  • 一:背景 1.講故事 在分析的眾多dump中,經常會遇到各種奇葩的問題,僅通過dump這種快照形式還是有很多問題搞不定,而通過 perfview 這種粒度又太粗,很難找到問題之所在,真的很頭疼,比如本篇的 短命線程 問題,參考圖如下: 我們在 t2 時刻抓取的dump對查看 短命線程 毫無幫助,我根 ...
  • 在日常後端Api開發中,我們跟前端的溝通中,通常需要協商好入參的數據類型,和參數是通過什麼方式存在於請求中的,是表單(form)、請求體(body)、地址欄參數(query)、還是說通過請求頭(header)。 當協商好後,我們的介面又需要怎麼去接收這些數據呢?很多小伙伴可能上手就是直接寫一個實體, ...
  • 許多情況下我們需要用到攝像頭獲取圖像,進而處理圖像,這篇博文介紹利用pyqt5、OpenCV實現用電腦上連接的攝像頭拍照並保存照片。為了使用和後續開發方便,這裡利用pyqt5設計了個相機界面,後面將介紹如何實現,要點包括界面設計、邏輯實現及完整代碼。 ...
  • 思路分析 註冊頁面需要對用戶提交的數據進行校驗,並且需要對用戶輸入錯誤的地方進行提示! 所有我們需要使用forms組件搭建註冊頁面! 平時我們書寫form是組件的時候是在views.py裡面書寫的, 但是為了接耦合,我們需要將forms組件都單獨寫在一個地方,需要用的時候導入就行! 例如,在項目文件 ...
  • 思路分析 登錄頁面,我們還是採用ajax的方式提交用戶數據 唯一需要學習的是如何製作圖片驗證碼! 具體的登錄頁面效果圖如下: 如何製作圖片驗證碼 推導步驟1:在img標簽的src屬性里放上驗證碼的請求路徑 補充1.img的src屬性: 1.圖片路徑 2.url 3.圖片的二進位數據 補充2:字體樣式 ...
  • 哈嘍,兄弟們! 最近有許多小伙伴都在吐槽打工好難。 每天都是執行許多重覆的任務 例如閱讀新聞、發郵件、查看天氣、打開書簽、清理文件夾等等, 使用自動化腳本,就無需手動一次又一次地完成這些任務, 非常方便啊有木有?! 而在某種程度上,Python 就是自動化的代名詞。 今天就來和大家一起學習一下, 用 ...
  • 作者:IT王小二 博客:https://itwxe.com 前面小二介紹過使用Typora+PicGo+LskyPro打造舒適寫作環境,那時候需要使用水印功能,但是小二在升級LskyPro2.x版本發現有很多不如人意的東西,遂棄用LskyPro使用MinIO結合代碼實現自己需要的圖床功能,也適合以後 ...
  • OpenAI Gym是一款用於研發和比較強化學習演算法的工具包,本文主要介紹Gym模擬環境的功能和工具包的使用方法,並詳細介紹其中的經典控制問題中的倒立擺(CartPole-v0/1)問題。最後針對倒立擺問題如何建立控制模型並採用爬山演算法優化進行了介紹,並給出了相應的完整python代碼示例和解釋。要... ...
  • python爬蟲瀏覽器偽裝 #導入urllib.request模塊 import urllib.request #設置請求頭 headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, l ...
  • 前端代碼搭建 主要利用的是bootstrap3中js插件里的模態框版塊 <li><a href="" data-toggle="modal" data-target=".bs-example-modal-lg">修改密碼</a></li> <div class="modal fade bs-exam ...