SSH遠程管理服務實戰

[toc]linux

SSH遠程管理服務實戰

1.SSH基本概述

SSH是一個安全協議,在進行數據傳輸時,會對數據包進行加密處理,加密後在進行數據傳輸。確保了數據傳輸安全。那SSH服務主要功能有哪些呢?web

1.提供遠程鏈接服務器的服務2.對傳輸的數據進行加密shell

那麼除了SSH協議能提供遠程鏈接服務,Telnet也能提供遠程鏈接服務, 那麼分別的區別是什麼呢?ssh服務會對傳輸數據進行加密, 監聽在本地22/tcp端口, ssh服務默認支持root用戶登陸telnet服務不對數據進行加密, 監聽在本地23/tcp端口, Telnet默認不支持root用戶登陸vim

Linux遠程連接:ssh協議(加密) telnet(明文)windows

windows遠程鏈接:RDP協議 (remote desktop)後端

協議 端口
ssh 22
telnet 23
RDP 3389
http 80
https 443
FTP 20 21
POP3 110
MySQL 3306
Rsync 873
DNS 53

案例: 使用wireshark驗證telnet明文傳輸與ssh加密傳輸安全

1.安裝telnet服務並運行bash

[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流量

2.SSH相關命令

*SSH有客戶端與服務端,咱們將這種模式稱爲C/S架構,ssh客戶端支持Windows、Linux、Mac等平臺。在ssh客戶端中包含 ssh|slogin遠程登錄、scp遠程拷貝、sftp文件傳輸、ssh-copy-id祕鑰分發等應用程序。

[root@m01 ~]# ssh root@10.0.0.41
ssh:客戶端命令
root:系統用戶名
@:分割用戶和主機
10.0.0.41:主機的IP(能夠是公網也能夠是內網)

3.Xshell鏈接不上虛擬機

1.檢查網絡

#連誰ping誰
ping 10.0.0.41
tcping 10.0.0.41 22

2.檢查端口

telnet 10.0.0.41 22
tcping 10.0.0.41 22

3.若是能夠ping通,端口不通

#檢測sshd服務是否啓動
netstat -lntup|grep 22

#防火牆 selinux
systemctl stop firewalld
setenforce 0

4.scp命令

# -P 指定端口,默認22端口可不寫
# -r 表示遞歸拷貝目錄
# -p 表示在拷貝文件先後保持文件或目錄屬性不變
# -l 限制傳輸使用帶寬(默認kb)

#推:將本地/tmp/oldboy推送至遠端服務器10.0.0.31的/tmp目錄,使用對端的root用戶
[root@m01 ~]# scp -P22 -rp /tmp/oldboy root@10.0.0.31:/tmp

#拉:將遠程10.0.0.31服務器/tmp/oldboy文件拉取到本地/opt/目錄下
[root@m01 ~]# scp -P22 -rp root@10.0.0.31:/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支持數據推送和拉取,每次都是全量拷貝,效率較低。

5.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/

6.SSH驗證方式

1.基於帳戶密碼遠程登陸

知道服務器的IP端口,帳號密碼,便可經過ssh客戶端命令登錄遠程主機。

[root@m01 ~]# ssh -p22 root@10.0.0.61
root@10.0.0.61 password:

2.基於祕鑰遠程登陸

默認狀況下,經過ssh客戶端命令登錄遠程服務器,須要提供遠程系統上的賬號與密碼,但爲了下降密碼泄露的機率和提升登錄的方便性,建議使用密鑰驗證方式。

1.在服務器上生成非對稱密鑰,使用-t指定密鑰類型, 使用-C指定用戶郵箱

[root@m01 ~]# ssh-keygen -t rsa -C 861962063@qq.com
...
#默認一路回車便可
...

或者簡單的方法,不加參數:
[root@m01 ~]# 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:P6UswOccoZSLunZ0gekcQ/gDzhFNkH/+I1WHhtwQro8 root@m01
The key's randomart image is:
+---[RSA 2048]----+
|  oB.   ..       |
|  = o  o.        |
| o * oo.o+ .     |
|  o O+o+o.= .    |
|   o.**.So ..    |
|   .+ oB.+ o     |
|  .. .Eo= =      |
|  ... . o. .     |
| ...   . .       |
+----[SHA256]-----+

[root@m01 ~]# ll .ssh/
total 8
-rw------- 1 root root 1679 Aug  8 19:07 id_rsa			#私鑰(寶塔鎮河妖)
-rw-r--r-- 1 root root  390 Aug  8 19:07 id_rsa.pub		#公鑰(天王蓋地虎)

2.將A服務器上的公鑰推送至B服務器

方式一(手動):
#在要鏈接的服務器上家目錄下建立.ssh目錄(用哪一個用戶連,就建立在哪一個家目錄下)
[root@backup ~]# mkdir /root/.ssh
#受權700
[root@backup ~]# chmod 700 /root/.ssh

#在m01上查看公鑰文件內容
[root@m01 ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDuxyeePaQr6cI6KMINgW7262dDdfgiiwspNjKYEoEj7cfjpMBPBCpqTO4H5+E8U/GcxsFcj2S2fHlRevPMa8vXYqOvX3O0Xp/C9zNMJrNdT+NdpCnDHRpsF4/Egr0xxKju7LPC1qz/Gu6ksx1VqUmcX2RKrQdV2BYi+pqu/2SQYOUUjKpen0zWxnhjuVmZMV+hPHgs4ILbGwwmYxqY+ldvP0guviQ2CeK1JtQIbP2Q5bBSlMwPxr4P303LUkIBsI3pHRoCMnDT0YI9x9JjdRkkUNjeFoTAE4APsTgICd6nzRBfRRf/VOYk5REuub367yxrOZpfNXOcJ6QCRLYQl6Xn root@m01

#建立公鑰文件authorized_keys
[root@backup ~]# vim ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDuxyeePaQr6cI6KMINgW7262dDdfgiiwspNjKYEoEj7cfjpMBPBCpqTO4H5+E8U/GcxsFcj2S2fHlRevPMa8vXYqOvX3O0Xp/C9zNMJrNdT+NdpCnDHRpsF4/Egr0xxKju7LPC1qz/Gu6ksx1VqUmcX2RKrQdV2BYi+pqu/2SQYOUUjKpen0zWxnhjuVmZMV+hPHgs4ILbGwwmYxqY+ldvP0guviQ2CeK1JtQIbP2Q5bBSlMwPxr4P303LUkIBsI3pHRoCMnDT0YI9x9JjdRkkUNjeFoTAE4APsTgICd6nzRBfRRf/VOYk5REuub367yxrOZpfNXOcJ6QCRLYQl6Xn root@m01

#受權600
[root@backup ~]# chmod 600 ~/.ssh/authorized_keys

方式2:

方式二:
#使用命令推送公鑰
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
---->yes--->密碼
#命令示例: 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


#不登錄遠程主機bash,但可在對端主機執行命令
[root@m01 ~]# ssh root@172.16.1.41 "hostname -i"
172.16.1.41

7.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 861962063@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
[root@m01 ~]# ssh-copy-id  -i /root/.ssh/id_rsa.pub -p22 root@172.16.1.7

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 7
do
    echo "#########172.16.1.$i#####"
    ssh root@172.16.1.$i "$1"
done
[root@m01 ~]# sh  all.sh  "free -m"      (執行free -m 命令)

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 "\033[5;4;40;31m 別連了,個人哥,$2:$1機器都沒開!!!\033[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

2.簡單的腳本測試

#!/bin/bash
read -p "請輸入ip地址或者主機名" name
case "$name" in
41|backup)
        ssh 172.16.1.41;;
31|nfs)
        ssh 172.16.1.32;;
7|web01)
        ssh 172.16.1.7;;
*)
        echo "input error"
esac

8.SH安全優化

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###

2.重啓sshd服務

[root@m01 ~]# systemctl restart sshd

3.複製一個‘m01-副本’ 回話,會顯示拒絕登錄

4.回到m01,創建普通用戶,並從新生成密鑰文件

[root@m01 ~]# useradd gjy

5.切換到普通用戶,編輯密鑰文件,重啓服務

[root@m01 ~]# su - gjy
[gjy@m01 ~]$  ssh-keygen
[gjy@m01 ~]$ vim ~/.ssh/authorized_keys
[gjy@m01 .ssh]$ chmod 600 authorized_keys 
[gjy@m01 .ssh]$ systemctl restart sshd

6.xshell m01 副本會話

7.修改好便可登錄

9.交互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 "yes\r"; exp_continue}
        "password:" {send "$pass\r"}
}
expect "root@*"  {send "df -h\r"}
expect "root@*"  {send "exit\r"}
expect eof

10.免交互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:設置密碼提示
相關文章
相關標籤/搜索