SSH基礎
1.ssh協議概述
- SSH(Secure Shell)是一種安全通道協議,主要用來實現字元介面的遠端登入、遠端 複製等功能;
- SSH 協議對通訊雙方的資料傳輸進行了加密處理,其中包括使用者登入時輸入的使用者口令;
- SSH 為建立在應用層和傳輸層基礎上的安全協議。對資料進行壓縮,加快傳輸速度。
- SSH使用傳輸層TCP協議的22號埠。
SSH客戶端<--------------網路---------------->SSH服務端
2.ssh協議優點
- 資料傳輸是加密的,可以防止資訊洩露
- 資料傳輸是壓縮的,可以提高傳輸速度
3.ssh服務的最佳實踐
- 建議使用非預設埠 22
- 禁止使用protocol version 1
- 限制可登入使用者 白名單
- 設定空閒會話超時時長
- 利用防火牆設定ssh訪問策略
- 僅監聽特定的IP地址 公網 內網
- 基於口令認證時,使用強密碼策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs
- 使用基於金鑰的認證
- 禁止使用空密碼
- 禁止root使用者直接登入
- 限制ssh的訪問頻度和併發線上數
- 經常分析日誌 分離
4.Openssh
penSSH 是 SSH 協議的免費開源實現。是 Centos7 上自帶的軟體,幫助我們實現遠端連線。OpenSSH 常用配置檔案有兩個 /etc/ssh/ssh_config 和 /etc/ssh/sshd_config 。
客戶端相關資訊
- 客戶端主程式 :/usr/bin/ssh
- 客戶端配置檔案:/etc/ssh/ssh_config
服務端相關資訊
- 服務端主程式:/usr/sbin/sshd
- 服務端配置檔案:/etc/ssh/sshd_config
金鑰的存放位置:
- 自己的金鑰:/etc/ssh/
- 其他人的金鑰:~/.ssh/known_hosts
SSH原理
透過公鑰加密,再透過私鑰解密
1.ssh第一次通訊的原理
- 客戶端(Client)首先發起連線請求給服務端(Server);
- Server收到請求後,將自己的公鑰,以及一個會話ID發給Client(這一步客戶端得到服務端公鑰);
- Client生成金鑰對;
- Client用自己的公鑰異或會話ID,計算出一個值Res,並用Server的公鑰加密;
- Client傳送加密後的值到服務端,Server用私鑰解密,得到Res;
- Server用解密後的值Res異或會話ID,計算出Client的公鑰(這一步服務端得到客戶端公鑰);
- 最終:雙方各自持有三個秘鑰,分別為自己的一對公、私鑰,以及對方的公鑰,之後的所有通訊都會被加密
2.命令格式
點選檢視程式碼
1. ssh [遠端主機使用者名稱]@[遠端伺服器主機名或IP地址] -p port
當在 Linux 主機上遠端連線另一臺 Linux 主機時,如當前所登入的使用者是 root 的話,
當連線另一臺主機時也是用 root 使用者登入時,可以直接使用 ssh IP,埠預設即可;
如果埠不是預設的情況下,需要使用-p 指定埠。
2. ssh -l [遠端主機使用者名稱] [遠端伺服器主機名或IP 地址] -p port
-l :-l 選項,指定登入名稱。
-p: -p 選項,指定登入埠(當服務端的埠非預設時,需要使用-p 指定埠進行登入)
3. ssh -t 跳板連線
4. ssh ip 後面直接跟上命令
[root@localhost ~]# ssh 192.168.91.101 ifconfig
3.known_hosts檔案
known_hosts是Linux系統中一個儲存已知主機公鑰的檔案,用於SSH客戶端驗證遠端主機的身份。當你連線到遠端主機時,SSH客戶端會檢査該主機的公鑰是否存在於 known_hosts檔案中,以確保你連線到的是正確的主機而不是惡意主機。
known_hosts檔案的路徑通常在使用者的家目錄下的.ssh資料夾內,檔名為known_hosts,即 ~/.ssh/known_hosts。每個記錄包含主機名、公鑰、演算法等資訊以及用於驗證主機的指紋。當你首次連線到一個新的遠端主機時,SSH會將該主機的公鑰新增到known_hosts檔案中。如果主機公鑰發生變化,SSH會發出警告,因為這可能意味著連線到了不安全的主機。
點選檢視程式碼
思考:有臺伺服器年久失修,換了一臺新的伺服器,依舊使用舊機器的ip地址,現在ssh遠端連線失敗是為什麼?怎麼解決?
以舊換新需要重新傳送金鑰。刪除之前伺服器的公鑰rm-rf known_hosts ,重新獲取公鑰。
sshd客戶端配置
客戶端配置檔案位置:/etc/ssh/ssh_config
客戶端首次連線服務端時,系統詢問是否交換公鑰,進行安全確認。這是由客戶端配置檔案預設的,可以修改配置檔案ssh_config取消詢問。
點選檢視程式碼
[root@localhost ~]# vim /etc/ssh/ssh_config #修改客戶端配置檔案
# StrictHostKeyChecking ask
StrictHostKeyChecking no #取消註釋,並將ask改成no,則首次連線時,系統不會進行確認詢問
注意:這種做法只在內網中使用,如果伺服器暴露在外網中,不建議這樣操作,非常危險。
sshd服務端配置
服務端配置檔案位置:/etc/ssh/sshd_config
1.常用配置項
點選檢視程式碼
[root@localhost ~]# cat -n /etc/ssh/sshd_config
--------------------
17 #Port 22 //埠號,生產環境建議修改埠號
18 #AddressFamily any
19 #ListenAddress 0.0.0.0 //監聽地址設定SSHD伺服器繫結的IP 地址,0.0.0.0 表示偵聽所有地址安全建議:如果主機不需要從公網ssh訪問,可以把監聽地址改為內網地址。
20 #ListenAddress ::
37 #LoginGraceTime 2m //用來設定如果使用者登入失敗,在切斷連線前伺服器需要等待的時間,單位為秒
38 #PermitRootLogin yes //是否允許root使用者登入,ubantu不允許root遠端ssh登入
39 #StrictModes yes //#檢查.ssh/檔案的所有者,許可權等
40 #MaxAuthTries 6 //最多允許輸錯幾次密碼(centos7預設3次,修改也無效)
41 #MaxSessions 10 //同一時間最多允許10個遠端連線
65 PasswordAuthentication yes //基於key驗證
68 #ChallengeResponseAuthentication yes //是否允許空密碼使用者登入
69 ChallengeResponseAuthentication no //基於使用者和密碼驗證
115 #UseDNS no //禁用反向解析,提高速度可設定為no
#以下可以限制可登入使用者的辦法:白名單 黑名單
AllowUsers user1 user2 user3@ip(限制主機)
DenyUsers user1 user2 user3
如果不設定白名單,則所有使用者都可以登入訪問。一旦設定了白名單,那麼只有白名單內的使用者可以訪問。
2.實際操作
修改預設埠
點選檢視程式碼
[root@node2 ~]# vim /etc/ssh/sshd_config //編輯服務端配置檔案
Port 9527 //修改埠號為9527
[root@node2 ~]# systemctl restart sshd //重啟服務
[root@localhost ~]# ssh 172.16.235.100 -p 9527 //在客戶端進行遠端連線
root@172.16.235.100's password:
Last login: Mon Apr 29 20:30:57 2024 from 172.16.235.1 //連線成功
禁止root使用者登入
點選檢視程式碼
[root@node2 ~]# vim /etc/ssh/sshd_config //編輯服務端配置檔案
PermitRootLogin no //改為no,不允許root登入
[root@node2 ~]# systemctl restart sshd //重啟服務
[root@localhost ~]# ssh 172.16.235.100 -p 9527 //在客戶端進行遠端連線
root@172.16.235.100's password:
Permission denied, please try again.
root@172.16.235.100's password:
Permission denied, please try again.
root@172.16.235.100's password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). //連線失敗
注意!!!雖然阻止了root,但是普通使用者可以使用su root 進行遠端連線。
[root@localhost ~]# ssh lisi@172.16.235.100 -p 9527 //lisi為遠端主機使用者
lisi@172.16.235.100's password:
Last failed login: Mon Apr 29 21:11:53 CST 2024 from 172.16.235.55 on ssh:notty
[lisi@node2 ~]$ su root
密碼:
[root@node2 lisi]#
怎樣解決來提高安全性呢?修改服務端的pam認證模組!
[root@node2 ~]# vim /etc/pam.d/su //編輯pam配置檔案
6 auth required pam_wheel.so use_uid //開啟第六行
[root@localhost ~]# ssh lisi@172.16.235.100 -p 9527 //在客戶端進行遠端連線
lisi@172.16.235.100's password:
Last login: Mon Apr 29 21:13:26 2024 from 172.16.235.55
[lisi@node2 ~]$ su root
密碼:
su: 拒絕許可權 //無法使用su root連線服務端
[lisi@node2 ~]$
白名單黑名單列表
點選檢視程式碼
1.設定白名單
[root@node2 ~]# vim /etc/ssh/sshd_config
AllowUsers zhangsan@172.16.235.55 lisi
只允許 172.16.235.55 登入我的張三 ; 任何人可以登入我的lisi
[root@node2 ~]# systemctl restart sshd
用服務端1(172.16.235.10)進行測試:
[root@node1 ~]# ssh zhangsan@172.16.235.100 -p 9527 //遠端登入到zhangsan
zhangsan@172.16.235.100's password:
Permission denied, please try again.
zhangsan@172.16.235.100's password:
Permission denied, please try again.
zhangsan@172.16.235.100's password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). //登入失敗
[root@node1 ~]# ssh lisi@172.16.235.100 -p 9527 //遠端登入到lisi
lisi@172.16.235.100's password:
Last login: Mon Apr 29 21:21:23 2024 from 172.16.235.55
[lisi@node2 ~]$ //登入成功
用服務端2(172.16.235.55)進行測試:
[root@localhost ~]# ssh zhangsan@172.16.235.100 -p 9527 //遠端登入到zhangsan
zhangsan@172.16.235.100's password:
Last login: Mon Apr 29 21:40:18 2024 from 172.16.235.55
[zhangsan@node2 ~]$ //登入成功
2.設定黑名單
DenyUsers liwu@192.168.91.100 //只拒絕192.168.91.100登入伺服器的liwu使用者
免密登入
1.使用金鑰對及免互動驗證登入
客戶端如果想免密登入,進行兩步操作即可:
第一步:生成金鑰
第二步:傳金鑰給對方
實驗步驟:
1.客戶端使用命令 ssh-keygen 生成金鑰(預設使用rsa演算法);
點選檢視程式碼
[root@localhost ~]# 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:
SHA256:aA9uuLdOnvTs1DuT3lDcrveeU9bT1OAyZDXp3ABgbpg root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
| o..oo. |
| = o +. |
| E oo + +.|
| . . .o.+ +|
| + S oo..o|
| + o . . . .=|
| . = o o. ..o|
| *.= ++ ....|
| .o=o+.ooo. ++|
+----[SHA256]-----+
2.使用命令 ssh-copy-id -i 自己金鑰檔案 對方地址 將客戶端的公鑰檔案複製到服務端(注意路徑不要寫錯);
點選檢視程式碼
[root@localhost ~]# cd /root/.ssh
[root@localhost .ssh]# ls // 家目錄 ~/.ssh/ 下會生成兩個金鑰檔案,一個公鑰一個私鑰,.pub結尾的是公鑰
id_rsa id_rsa.pub known_hosts
[root@localhost .ssh]# ssh-copy-id -i id_rsa.pub 172.16.235.100 //將金鑰複製到服務端(注意埠號)
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "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
root@172.16.235.100's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '172.16.235.100'"
and check to make sure that only the key(s) you wanted were added.
3.測試遠端連線服務端時,是否免密碼。
點選檢視程式碼
[root@localhost .ssh]# ssh 172.16.235.100 //遠端登入到服務端
Last login: Mon Apr 29 22:29:53 2024 from 172.16.235.1
[root@node2 ~]# //免密登入
2.同網段主機免密登入指令碼
生產環境中,多臺主機間想要免密登入,可以供用金鑰
點選檢視程式碼
[root@localhost ~]# cd /data
[root@localhost data]# vim ssh_log.sh //編寫免密登入指令碼
#!/bin/bash
PASS=123123 //密碼自行修改
#設定網段最後的地址,4-255之間,越小掃描越快
END=254
IP=`ip a s ens33 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.
rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1 ${NET}$i &> /dev/null && echo "${NET}$i" >> SCANIP.log &
done
wait
ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP
AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done
輕量級自動化運維工具pssh
pssh基於python編寫,可在多臺伺服器上執行命令的工具,也可實現檔案複製,提供了基於ssh和scp的多個並行工具。
點選檢視程式碼
yum install epel-release.noarch -y #推薦安裝方式
[root@ky15-1 yum.repos.d]#yum clean all
#清除快取
[root@ky15-1 yum.repos.d]# pssh
[root@ky15-1 yum.repos.d]# ssh-keygen
#一路回車
[root@ky15-1 yum.repos.d]# ssh-copy-id 192.168.91.102
[root@ky15-1 yum.repos.d]# ssh-copy-id 192.168.91.105
#上傳秘鑰對
[root@ky15-1 yum.repos.d]# pssh -H 192.168.91.102 hostname -i
[1] 02:10:10 [SUCCESS] 192.168.91.102
#管理多臺,寫入一個檔案
[root@ky15-1 yum.repos.d]#vim hosts.txt
[root@ky15-1 yum.repos.d]#cat hosts.txt
10.0.0.8
10.0.0.6
[root@ky15-1 yum.repos.d]#pssh -i -h hosts.txt hostname //注意-i寫在前面