本節索引:
一、SSH協議相關概念
二、實驗:實現基于key登錄認證
三、實驗:實現多臺機器間互相基于key登錄認證
四、實驗:實現100臺機器基于key登錄驗證
五、實驗:利用pssh工具實現集群操作
一、SSH協議相關概念
SSH:secure shell,protocal,22/tcp,安全的遠程登錄;
利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題,用來代替早期不安全的telnet
具體的軟件實現:
OpenSSH:ssh協議的開源實現。CentOS默認安裝
dropbear:另一個開源實現
SSH協議版本:
v1: 基于CRC-32做MAC,不安全;man-in-middle
v2:雙方主機協議選擇安全的MAC方式
基于DH算法做密鑰交換,基于RSA或DSA實現身份認證
相關包:
openssh
openssh-clients
openssh-server
工具:
基于C/S結構:
Client:
????? Linux:ssh,scp,sftp,slogin
??? Windows:xshell,putty,securecrt,sshsecureshellclient
Server:sshd
客戶端組件:
ssh, 配置文件:/etc/ssh/ssh_config
Host PATTERN
StrictHostKeyChecking no 首次登錄不顯示檢查提示
格式:
ssh [user@]host [COMMAND]
ssh [-l user] host [COMMAND]
-p port????????????? 遠程服務器監聽的端口
-b????????????? 指定連接的源IP
-v????????????? 調試模式
-C????????????? 壓縮方式
-X????????????? 支持x11轉發,跨網絡的圖形界面顯示;例如:xclock
-Y????????????? 支持信任x11轉發
ForwardX11Trusted yes
-t?????????????? 強制偽tty分配;堡壘機可用
ssh -t remoteserver1 ssh remoteserver2
兩種方式的用戶登錄認證:
基于password:
只要你知道自己帳號和口令,就可以登錄到遠程主機。所有傳輸的數據都會被加密,但是不能保證你正在連接的服務器就是你想連接的服務器。可能會有別的服務器在冒充真正的服務器,也就是受到“中間人”這種方式的攻擊。
大致流程:
1.客戶端發起ssh請求,服務器會把自己的公鑰發送給用戶
2.用戶會根據服務器發來的公鑰對密碼進行加密
3.加密后的信息回傳給服務器,服務器用自己的私鑰解密,如果密碼正確,則用戶登錄成功
基于key:
需要依靠密匙,也就是你必須為自己創建一對密匙,并把公用密匙放在需要訪問的服務器上。如果你要連接到SSH服務器上,客戶端軟件就會向服務器發出請求,請求用你的密匙進行安全驗證。服務器收到請求之后,先在該服務
器上你的主目錄下尋找你的公用密匙,然后把它和你發送過來的公用密匙進行比較。如果兩個密匙一致,服務器就用公用密匙加密“質詢”(challenge)并把它發送給客戶端軟件??蛻舳塑浖盏健百|詢”之后就可以用你的
私人密匙解密再把它發送給服務器。
大致流程:
1.首先在客戶端生成一對密鑰
2.并將客戶端的公鑰ssh-copy-id拷貝到服務器端
3.當客戶端再次發送一個連接請求,包括ip、用戶名
4.服務端得到客戶端的請求后,會到authorized_keys中查找,如果有響應的IP和用戶,服務器就會發出“質詢”(challenge)表現為一串隨機字符,如:acdf。
5.服務端將使用客戶端拷貝過來的公鑰對“質詢”進行加密,然后發送給客戶端
6.得到服務端發來“質詢”后,客戶端會使用私鑰進行解密,然后將解密后的字符串發送給服務端
7.服務端接受到客戶端發來的字符串后,跟之前的字符串進行對比,如果一致,就允許免密碼登錄
兩種登錄認證的對比:
基于key的認證方式,用戶必須指定自己密鑰的口令。但是,與第一種級別相比,第二種級別不需要在網絡上傳送口令。
第二種級別不僅加密所有傳送的數據,而且“中間人”這種攻擊方式也是不可能的(因為他沒有你的私人密匙)。但是整個登錄的過程會比基于passwd認證稍長,可能需要10秒
相關文件:
~/.ssh/authorized_keys????????? 存放已授權基于key登錄的主機的公鑰
~/.ssh/know_hosts????????????????? 存放本機SSH連接過的主機的公鑰
操作:加快ssh服務訪問速度
/etc/ssh/sshd_config文件
GSSAPIAuthentication yes–>no? ? ? ? ? ? ?關閉api驗證
#UseDNS ?yes|no–>UseDNS no???????????? 去掉注釋,啟用DNS
重啟sshd服務
CentOS6:
service ?sshd ? restart?
CentOS7:
systemctl restart sshd
二、實驗:實現基于key登錄認證
一、在客戶端生成一對鑰匙:
ssh-keygen -t rsa
交互式輸入:
默認路徑
輸入口令
二、發送公鑰給服務器端:
ssh-copy-id?? wang@192.168.30.7
再次連接:
ssh wang@192.168.30.7??????? 不提示輸入密碼
ssh wang@192.168.30.7? ‘id’??????遠程執行命令
利用基于key不需輸入口令登錄的特性,我們可小批量的執行一些任務:
先把需要執行任務的服務器IP放入一個文件中:
cat ip.txt
192.168.30.7
192.168.30.12
192.168.30.17
……
編寫一個腳本顯示主機名:
vim hostname.sh
hostname
chmod +x hostname.sh
執行命令:
批量傳送腳本
for ip in `cat ip.txt`;do scp -p f1.sh $ip:/data/;done
批量執行腳本顯示主機名
for ip in `cat ip.txt`;do ssh $ip “/data/f1.sh”;done
可結合expect實現批量密鑰登錄方式
三、實驗:實現多臺機器間互相基于key登錄認證
思路:多臺機器公用一套鑰匙
一、在A機器上生成一對密鑰,并對自己執行ssh-copy-id命令
ssh-keygen
ssh-copy-id A
二、將本機.ssh目錄發送給其他所有機器
scp -rp /root/.ssh? B:/root/
scp -rp /root/.ssh? C:/root/
即可實現多臺機器間互相基于key登錄
當然,如果我們覺得私鑰不加密不安全,我們還可以給私鑰重新加密
重設私鑰口令:
ssh-keygen -p
私鑰加密后,每次連接都要求輸入私鑰口令,我們可采取代理托管方式省去輸入口令這一環節:
注:代理托管重啟后失效,需重新設置
啟用代理托管口令
ssh-agent bash
ssh-add
四、實驗:實現100臺機器基于key登錄驗證
一、準備ip列表
先把需要執行任務的服務器IP放入一個文件中:
cat ip.txt
192.168.30.x
192.168.30.xx
192.168.30.xxx
……
二、編寫將公鑰推送到其他100臺機器上的腳本
#!/bin/bash
#安裝expect包
rpm -q expect &> /dev/null || yum install expect -y
#生成一對密鑰,如需加密密鑰可在-P之后寫上密碼
ssh-keygen -P “” -f “/root/.ssh/id_rsa”
#服務器登錄密碼
password=centos
while read ipaddr;do
expect <<EOF
set timeout 10
spawn ssh-copy-id $ipaddr
expect {
“yes/no” { send “yes\n”;exp_continue }
“password” { send “$password\n” }
}
expect eof
EOF
done < ip.txt
三、運行腳本,將公鑰推送到其他100臺機器上
四、實現基于密鑰驗證無密碼登錄
五、利用pssh工具實現集群管理
注:系統默認未安裝pssh工具,需使用epel源安裝,使用pssh需先建立服務器端到用戶端的基于
key驗證才可以正常使用
pssh工具:
pssh是一個python編寫可在多臺服務器上執行命令的工具,也可實現文件復制
options:
–version 查看版本
-h????????????? 指定主機文件列表,內容格式”[user@]host[:port]”
-H???????????? 指定主機,內容格式”[user@]host[:port]”
-l?????????????? 登錄使用的用戶名
-p????????????? 并發的線程數[可選]
-o????????????? 輸出的文件目錄[可選]
-e????????????? 錯誤輸入文件[可選]
-t?????????????? TIMEOUT超過時間設置。0代表無限制[可選]
-O???????????? SSH的選項
-v????????????? 查看過程
-A????????????? 手動輸入密碼模式
-x????????????? 額外的命令行參數使用空白符號,引號,反斜線處理
-X????????????? 額外的命令行參數,單個參數模式,同-x
-i?????????????? 顯示每個服務器執行結果輸出信息,默認不顯示
-P????????????? 打印出服務器返回信息
未建立基于key驗證將顯示[FAILURE]失敗
已建立基于key驗證將顯示[SUCCESS]成功
遠程連接某主機執行hostname,顯示主機名
pssh -H ?USER@192.168.x.x ?-i ?“hostname”?
批量遠程執行命令
一、將需要連接的主機寫入一個文件
cat ip.txt
192.168.30.x
192.168.30.xx
192.168.30.xxx
……
二、批量顯示文件中包含的主機名
pssh -h ?ip.txt ?-i ?“hostname”
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/98879