[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:设置密码提示