SSH基本概述
SSH是一個安全協議,在進行數據傳輸時,會對數據包進行加密處理,加密后在進行數據傳輸。確保了數據傳輸安全。那SSH服務主要功能有哪些呢?
1.提供遠程連接服務器的服務
2.對傳輸的數據進行加密
那么除了SSH協議能提供遠程連接服務,Telnet也能提供遠程連接服務, 那么分別的區別是什么呢?
ssh服務會對傳輸數據進行加密, 監聽在本地22/tcp端口, ssh服務默認支持root用戶登錄
telnet服務不對數據進行加密, 監聽在本地23/tcp端口, Telnet默認不支持root用戶登錄
服務連接方式服務數據傳輸服務監聽端口服務登陸用戶ssh加密22/tcp默認支持root用戶登陸telnet明文23/tcp不支持root用戶登陸
企業面試題:
下列服務,分別使用的那個端口?
ftp DNS ssh telnet MySQL http https
案例: 使用wireshark驗證telnet明文傳輸與ssh加密傳輸
1.安裝telnet服務并運行
[root@m01 ~]# yum install telnet-server -y [root@m01 ~]# systemctl start telnet.socket
2.使用wireshark檢測vmnet8網卡上telnet的流量
?
3.telnet是無法使用root用戶登錄linux系統,需要創建普通用戶
[root@m01 ~]# useradd zls [root@m01 ~]# echo "1"| passwd --stdin zls
4.使用普通用戶進行telnet登錄
?
5.搜索wireshark包含telnet相關的流量
?
?
?
6.使用wireshark分析ssh流量
?
?
?
?
?
SSH相關命令
SSH有客戶端與服務端,我們將這種模式稱為C/S架構,ssh客戶端支持windows、Linux、mac等平臺。
在ssh客戶端中包含 ssh|slogin遠程登陸、scp遠程拷貝、sftp文件傳輸、ssh-copy-id秘鑰分發等應用程序。
ssh遠程登錄服務器命令示例
ssh -p22 root@10.0.0.61 # -p指定連接遠程主機端口,默認22端口可省略 # root@remotehost # "@"前面為用戶名,如果用當前用戶連接,可以不指定用戶 # "@"后面為要連接的服務器的IP
scp復制數據至遠程主機命令(全量復制)
# -P 指定端口,默認22端口可不寫 # -r 表示遞歸拷貝目錄 # -p 表示在拷貝文件前后保持文件或目錄屬性不變 # -l 限制傳輸使用帶寬(默認kb) #推:將本地/tmp/oldboy推送至遠端服務器10.0.0.61的/tmp目錄,使用對端的root用戶 [root@m01 ~]# scp -P22 -rp /tmp/oldboy oldboy@10.0.0.61:/tmp #拉:將遠程10.0.0.61服務器/tmp/oldboy文件拉取到本地/opt/目錄下 [root@m01 ~]# scp -P22 -rp root@10.0.0.61:/tmp/oldboy /opt/ #限速 [root@m01 ~]# scp /opt/1.txt root@172.16.1.31:/tmp root@172.16.1.31 password: test 100% 656MB '83.9MB/s' 00:07 #限速為8096kb,換算為MB,要除以 8096/8=1024KB=1MB [root@m01 ~]# scp -rp -l 8096 /opt/1.txt root@172.16.1.31:/tmp root@172.16.1.31s password: test 7% 48MB '1.0MB/s' 09:45
結論:
1.scp通過ssh協議加密方式進行文件或目錄拷貝。
2.scp連接時的用戶作為為拷貝文件或目錄的權限。
3.scp支持數據推送和拉取,每次都是全量拷貝,效率較低。
Sftp遠程數據傳輸命令
#默認可以通過sftp命令連接sftp服務 sftp root@10.0.0.61 sftp -oPort=52113 root@10.0.0.61 #sftp的特殊端口連接 # sftp使用get下載文件至于本地服務器 sftp> get conf.txt /tmp/ # sftp使用put上傳本地服務器文件至遠程服務器 sftp> put /root/t1.txt /root/
SSH驗證方式
1.基于賬戶密碼遠程登錄
知道服務器的IP端口,賬號密碼,即可通過ssh客戶端命令登陸遠程主機。
? ~ ssh -p22 root@10.0.0.61 root@10.0.0.61 password: [root@m01 ~]#
2.基于秘鑰遠程登錄
默認情況下,通過ssh客戶端命令登陸遠程服務器,需要提供遠程系統上的帳號與密碼,但為了降低密碼泄露的機率和提高登陸的方便性,建議使用密鑰驗證方式。
?
1.在服務器上生成非對稱密鑰,使用-t指定密鑰類型, 使用-C指定用戶郵箱
[root@m01 ~]# ssh-keygen -t rsa -C 133411023@qq.com ... #默認一路回車即可 ...
2.將A服務器上的公鑰推送至B服務器
#命令示例: ssh-copy-id [-i [identity_file]] [user@]machine ssh-copy-id #命令 -i #指定下發公鑰的路徑 [user@] #以什么用戶身份進行公鑰分發(root),如果不輸入,表示以當前系統用戶身份分發公鑰 machine #下發公鑰至那臺服務器, 填寫遠程主機IP地址 #分發秘鑰,[將A服務器的公鑰寫入B服務器~/.ssh/authorized_keys文件中] [root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
3.A服務器連接B服務器是無需密碼的,如果能直接連接無需密碼則表示秘鑰已配置成功
#遠程登錄對端主機方式 [root@m01 ~]# ssh root@172.16.1.41 [root@nfs ~]# #不登陸遠程主機bash,但可在對端主機執行命令 [root@m01 ~]# ssh root@172.16.1.41 "hostname -i" 172.16.1.41
SSH場景實踐
實踐場景,用戶通過Windows/MAC/Linux客戶端連接跳板機免密碼登錄,跳板機連接后端無外網的Linux主機實現免密登錄,架構圖如下。
實踐多用戶登陸一臺服務器無密碼
實踐單用戶登陸多臺服務器免密碼
?
1.windows客戶端使用Xshell生成秘鑰對,并下發公鑰至跳板機
1) Xshell-->選擇工具->新建密鑰生成工具
?
2) 生成公鑰對,選擇下一步
?
3) 填寫秘鑰名稱。秘鑰增加密碼則不建議配置
?
4) Windows會提示密碼,繼續即可
?
5) 生成秘鑰后,點擊Xshell->工具->用戶秘鑰管理者->選擇對應秘鑰的屬性
?
6) 選擇對應秘鑰的公鑰,將其復制
?
7) 將從WIndows下復制好的公鑰粘貼至跳板機~/.ssh/authorized_keys中,然后測試
[root@m01 ~]# cd ; umask 077; mkdir -p .ssh ;cd .ssh [root@m01 .ssh]# vim authorized_keys #添加windows公鑰
2.跳板機下發公鑰至后端主機
1) 在跳板機上生成秘鑰對
[root@m01 ~]# ssh-keygen -t rsa -C manager@qq.com
2) 拷貝跳板機上的密鑰至后端主機,如果SSH不是使用默認22端口, 使用-p指定對應端口
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub "-p22 root@172.16.1.31" [root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub "-p22 root@172.16.1.41"
3) 在m01管理機上測試是否成功登陸兩臺服務器
[root@m01 ~]# ssh root@172.16.1.41 [root@nfs01 ~]# exit [root@m01 ~]# ssh root@1172.16.1.31 [root@backup ~]# exit
3.通過跳板機能實現scp拷貝文件免密碼
[root@m01 ~]# scp zls.txt root@172.16.1.31:/tmp zls.txt 100% 0 0.0KB/s 00:00 [root@m01 ~]# scp zls.txt root@172.16.1.41:/tmp zls.txt 100% 0 0.0KB/s 00:00
4.通過跳板機獲取所有機器的load,CPU,Memory等信息(思考:如果服務器數量多,如何并發查看和分發數據)
[root@m01 ~]# cat all.sh #!/usr/bin/bash [ $# -ne 1 ] && echo "請輸入執行的命令" && exit 1 for i in 31 41 do echo "#########172.16.1.$i#####" ssh root@172.16.1.$i "$1" done
5.腳本實現(跳板機)
#!/bin/bash #jumpserver lb01=10.0.0.5 lb02=10.0.0.6 web01=10.0.0.7 web02=10.0.0.8 web03=10.0.0.9 nfs=10.0.0.31 backup=10.0.0.41 db01=10.0.0.51 m01=10.0.0.61 zabbix=10.0.0.71 menu(){ cat <<-EOF +-------------------------+ | 1) lb01 | | 2) lb02 | | 3) web01 | | 4) web02 | | 5) web03 | | 6) nfs | | 7) backup | | 8) db01 | | 9) m01 | | 10) zabbix | | h) help | +-------------------------+ EOF } #菜單函數 menu #連接函數 connect(){ ping -c 1 -w 1 $1 &>/dev/null if [ $? -eq 0 ];then ssh root@$1 else echo -e "33[5;4;40;31m 別連了,我的哥,$2:$1機器都沒開!!!33[0m" fi } #控制不讓輸入ctrl+c,z trap "" HUP INT TSTP while true do read -p "請輸入要連接的主機編號:" num case $num in 1|lb01) connect $lb01 lb01 ;; 2|lb02) connect $lb02 lb02 ;; 3|web01) connect $web01 web01 ;; 4|web02) connect $web02 web02 ;; 5|web03) connect $web03 web03 ;; 6|nfs) connect $nfs nfs ;; 7|backup) connect $backup backup ;; 8|db01) connect $db01 db01 ;; 9|m01) connect $m01 m01 ;; 10|zabbix) connect $zabbix zabbix ;; h|help) clear menu ;; close) break ;; esac done
SSH安全優化
SSH作為遠程連接服務,通常我們需要考慮到該服務的安全,所以需要對該服務進行安全方面的配置。
1.更改遠程連接登陸的端口
2.禁止ROOT管理員直接登錄
3.密碼認證方式改為密鑰認證
4.重要服務不使用公網IP地址
5.使用防火墻限制來源IP地址
SSH服務登錄防護需進行如下配置調整,先對如下參數進行了解
Port 6666 # 變更SSH服務遠程連接端口 PermitRootLogin no # 禁止root用戶直接遠程登錄 PasswordAuthentication no # 禁止使用密碼直接遠程登錄 UseDNS no # 禁止ssh進行dns反向解析,影響ssh連接效率參數 GSSAPIAuthentication no # 禁止GSS認證,減少連接時產生的延遲
將如下具體配置添加至/etc/ssh/sshd_config文件中,參數需根據實際情況進行調整
###SSH### #Port 6666 #PasswordAuthentication no #PermitRootLogin no GSSAPIAuthentication no UseDNS no ###END###
免交互expect[擴展]
1.安裝expect
[root@m01 ~]# yum install -y expect
2.編寫expect腳本
#!/usr/bin/expect
set ip 10.0.0.51
set pass 123456
set timeout 30
spawn ssh root@$ip
expect {
"(yes/no)" {send "yesr"; exp_continue}
"password:" {send "$passr"}
}
expect "root@*" {send "df -hr"}
expect "root@*" {send "exitr"}
expect eof
免交互sshpass[擴展]
1.安裝sshpass
[root@m01 ~]# yum install -y sshpass
2.使用sshpass命令
[root@m01 ~]# sshpass -p 123456 ssh root@10.0.0.51 [option] -p:指定密碼 -f:從文件中取密碼 -e:從環境變量中取密碼 -P:設置密碼提示